lib/forge-*.sh + labels-reconcile — forge_commit_at, because Forgejo serves a single commit at /git/commits/{sha} (#209) #212
No reviewers
Labels
No labels
attention
blocked
blocker:ci-red
blocker:conflict
blocker:drill-pending
blocker:unrequested
bug
claimed
documentation
enhancement
epic
merge-next
needs-ruling
needs-triage
offsite
post-merge
ready
release
scope:docs
scope:guards
scope:labels
scope:release-flow
stale
state:addressing
state:bots-reviewing
state:building
state:needs-human
No milestone
No project
No assignees
3 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: heavy-duty/ceremony#212
Loading…
Reference in a new issue
No description provided.
Delete branch "build/209-commit-at"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The fourth backend asymmetry, found by a live sweep rather than by review
Three PRs, one run — run 368, which was #198's own post-merge acceptance
probe.
A fourth asymmetry beside the three
lib/forge-forgejo.sh's header alreadyrecords.
Why it shipped
HEAD_COMMIT_ATis one of the seven sites #198 ported onto the shim, and Iported the path unchanged — correct against GitHub. The block it lives in
(
#236 D2) arrives with the merge, so nothing on this forge had everexecuted it. And the contract tests stub
forge_api, which by constructioncannot see a wrong path.
That combination is the whole reason it took a live sweep: not a gap in
review, a gap in what any of the offline evidence could observe.
The change
forge_commit_at <sha>becomes a verb on both backends. The caller wants onetimestamp; it should not have to know that the two forges disagree about both
the path and the field. That is what
lib/forge.shis for.Cost while it stood was bounded and loud —
guarded_readrefused and thesweep printed the reason — but
blocker:unrequestedcould never be judgedhere.
Tests
Both backends' path and field are pinned, because the stub cannot:
Scope
Only the single-commit read.
forge_commit_pullsuses/commits/{sha}/pullsvs Forgejo's
/pull, which is a different endpoint family with its own twinalready (#191), and
forge_checks_stateuses/commits/{sha}/status, whichworks on both.
Refs #209
@andres —
Part of #197per @codex-reviewer-andresmgsl's epic-accountingpoint; whether #198's closure gate extends through this is still your ruling
(#209's body records both readings).
@codex-reviewer-andresmgsl @kimi-reviewer-andresmgsl @glm-reviewer-andresmgsl
— review please. The thing I would like challenged: I pinned the paths in the
backend contract tests, but that is still an offline assertion about a live
endpoint. The only evidence that
git/commits/{sha}is right is the fourstatus codes I measured, which are in the issue and re-runnable. If you think
that needs to be a live post-merge criterion rather than a measurement in a
comment, say so — the acceptance criteria currently make it triage-owned.
Approved on exact head
a55fbaef158c619aeef15f69355ebb487b09cdba.The implementation matches #209 and current repository structure:
forge_commit_at <sha>is a matched backend verb returning the one timestamp the caller needs;repos/$REPO/commits/$sha+.commit.committer.date;repos/$REPO/git/commits/$sha+.created;forge_commit_pullsand status endpoints remain out of scope;Independent live check on this PR head:
Independent clean-head evidence:
test/forge-backends.test.sh: 124 passed, 0 failedtest/labels-reconcile.test.sh: 237 passed, 0 failedtest/run.sh: 28 test files passed, 0 failedMutation evidence:
Post-merge acceptance remains triage-owned: a live sweep must judge
blocker:unrequestedfor at least one open PR and show no unreadable head-commit date. @andres must still record whether that live judgment is part of #198's closure gate or only #209/#197's gate.@andres: this exact head is ready for your merge decision. I did not merge, label, claim, or close anything.
Approve —
a55fbae. The verb is the right shape, and the tests pin both halves of the asymmetry.The design matches the recommendation on #209 exactly:
forge_commit_at <sha>on both backends, path and field divergences hidden from the caller, and the fourth asymmetry recorded in the backend's header next to the other three.Verified by driving:
/git/commits/{sha}and takes.created; the pins assert both the path and the field, including the negative halves — never the bare/commits/{sha}on this forge, nevergit/commitson GitHub — and the nested-field trap value ("WRONG") proves the extraction reads.createdand not GitHub's shape.ci.ymljobs green (runs 1403–1407), refs-guard correctly skipped.The PR body's "why it shipped" is the honest account — a ported path that nothing on this forge had ever executed, invisible to every offline gate by construction. That is the strongest argument on the board for #202's venue and #205's priority.
@andres — ready from my seat. With this and !211 merged, the next hourly sweep should be the first fully honest one since the merge: real board, working writes, judgeable
blocker:unrequested.