You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
P38 forge: F0 follow-ups (placeholder departure texts, git command comparison, F1 CI job) #297
Follow-ups from the P38 F0 review (PR #294) that were deliberately not done in F0. Each is cheap but only matters once sc-forge exists.
Replace placeholder message_contains words in crates/forge/conformance/departures.json ("not", "auth", "merge", "state", "rename", "branch", "password", "not found", "only refs/heads/"...) with the real texts sc-forge sends. They are marked as placeholders in each entry's reason.
Compare the recorded git command in check for git steps (a scenario that keeps its step name but changes the arguments currently still matches its fixture by name). P2 from bot review.
mergeable / html_url strictness once sc-forge computes them: mergeable is type-only by default (Gitea flips it while re-checking); pin it by value per exchange for a synchronous server.
Add sc-forge answers for the combined status of a commit with no statuses to the F4 conformance notes (recorded as departures H#0, H#48, H#49).
F1 (done in feat(forge): P38 F1 server skeleton, auth, bootstrap CLI #298): add the skip departures for the out rows of Appendix A in the spec (teams, web UI, and any extra route F4 declines), and a CI job that runs run.py check --fixtures fixtures/1.22.6 --departures departures.json against the in-tree server.
Spec: docs/superpowers/specs/2026-10-22-p38-forge-design.md (Appendix A, Conformance). ADR-0058 (Proposed).
Implementation-note follow-ups (lifecycle race, resource/cancellation evidence, authentication budgets and scope recording) are carried in #316. PR #317 completed the original checklist and merged as ad49070. Remaining implementation-note limits stay open in #316.
More follow-ups from the Codex review of f57cbc4 (PR #294), tracked here instead of another review round; the first two belong in the F1/F2 spec update before those slices start:
Spec, F2: define the default-branch reconciliation authority: on PATCH write bare HEAD first, then the row; on a mismatch at startup the row is the authority and the reconciler resets HEAD from it (a first push to a branch other than the default leaves empty: true, recorded).
Spec, F3: specify contents writes with new_branch: the protection policy applies to the target branch (a new branch has none), creating it from a protected base is allowed (recorded: 201 with new_branch where a write to the protected branch is 403), and the base ref is read once and used as the CAS old-value.
Spec, F2: make the free-space reserve a capacity reservation: admission reserves min(request length, --max-pack-size) (or the pack cap when chunked) against free space plus the owner quota before spawning receive-pack, releases it on completion, and refuses with 507/Insufficient Storage when it cannot reserve.
crates/forge/conformance/FINDINGS.md: the "22/22 per version" summary line predates scenarios W and X; update it to the current 24/24 per version (and the cross-version 2/24).
NAT64 (64:ff9b::/96) sources are keyed as plain IPv6 /64s in the password-failure budget; only matters behind a NAT64 gateway.
Failed-login delay is applied before the response is written, so a client that disconnects skips the wait; the per-source budget (30/min) is what bounds guessing.
The source budget map clears when it exceeds 10k live entries (documented shortcut: in limits.rs); move to an LRU if a distributed flood is ever seen.
check replays only A#0-5 and B#0-24 (slice-pending.json); R and X run for real once F2 adds repo creation, at which point the pending file shrinks to empty. F1 covers their recorded exchanges in crates/forge/tests/e2e_a.rs.
Windows: the crate is unix-only (empty lib, stub main); CI's Windows job compiles it as empty, not exercised locally.
Local toolchain differs from CI's pinned 1.96.1 (Homebrew 1.99); run clippy on the pinned toolchain before pushing.
F2 spec decisions (row is the default-branch authority, capacity reservation with 507, new_branch policy) and the FINDINGS 24/24 + 2/24 line: committed on the F2 branch 9e16e87, lands with the F2 PR.
Doing in F2 (git steps run for real from then on)
Compare the recorded git command in check for git steps.
Replace placeholder message_contains words for the repo, branch and ref-namespace refusals with sc-forge's real texts. Already real after feat(forge): P38 F1 server skeleton, auth, bootstrap CLI #298: password, auth, hasorgoruservisible, not found: no such API route.
F2b: compare the recorded git command in check for git steps (C and N run clones for real from then on); K, D, M can join the gate once info/refs, commits and contents exist; K#54-56 counts and the M rename departures (422) and 404-text overrides (not found placeholders in departures.json) get their reviewed departures then.
Open question: does Gitea also require a repository scope on /user/repos? Recorded labels only show write:user/read:user.
Rollout note: migration 2 has no down path; rolling back means restoring a pre-F2a forge.db, and the next startup moves every repo directory to orphans/ (recoverable).
Not tested: Linux execution of the waitid/killpg branch (compiles in CI, exercised on macOS only); power-loss durability beyond fsync ordering and injected crash points.
F2b (#304) follow-ups to track: per-user transport quotas (F5; a per-user cap would throttle Engine's single service account); default-branch PATCH vs a push that deletes the new default can leave HEAD dangling (needs a receive-pack/PATCH lease, F4); --git-memory-limit (Linux RLIMIT_DATA) is untested in CI; no test that a killed push leaves no ref lock or quarantine directory (SIGTERM-first is implemented, unverified); a test that a transport killed mid-stream (delete during a clone) gives the client an error, not a clean end; deferred git exchanges pin the step name but not the command line; the principal of a deferred HTTP exchange is not pinned.
Activity
tonibergholm-codento commentedon Oct 22, 2026
More follow-ups from the Codex review of f57cbc4 (PR #294), tracked here instead of another review round; the first two belong in the F1/F2 spec update before those slices start:
HEADfirst, then the row; on a mismatch at startup the row is the authority and the reconciler resetsHEADfrom it (a first push to a branch other than the default leavesempty: true, recorded).new_branch: the protection policy applies to the target branch (a new branch has none), creating it from a protected base is allowed (recorded: 201 withnew_branchwhere a write to the protected branch is 403), and the base ref is read once and used as the CAS old-value.min(request length, --max-pack-size)(or the pack cap when chunked) against free space plus the owner quota before spawningreceive-pack, releases it on completion, and refuses with 507/Insufficient Storagewhen it cannot reserve.crates/forge/conformance/FINDINGS.md: the "22/22 per version" summary line predates scenarios W and X; update it to the current 24/24 per version (and the cross-version 2/24).tonibergholm-codento commentedon Oct 23, 2026
F1 (#298) follow-ups, tracked here:
64:ff9b::/96) sources are keyed as plain IPv6 /64s in the password-failure budget; only matters behind a NAT64 gateway.shortcut:in limits.rs); move to an LRU if a distributed flood is ever seen.checkreplays only A#0-5 and B#0-24 (slice-pending.json); R and X run for real once F2 adds repo creation, at which point the pending file shrinks to empty. F1 covers their recorded exchanges in crates/forge/tests/e2e_a.rs.tonibergholm-codento commentedon Oct 23, 2026
Triage by slice (so this stays a checklist, not a pile):
Done
skipdepartures and the CI job that checks the in-tree server: feat(forge): P38 F1 server skeleton, auth, bootstrap CLI #298 (sc-forge conformance,--pending).new_branchpolicy) and the FINDINGS 24/24 + 2/24 line: committed on the F2 branch9e16e87, lands with the F2 PR.Doing in F2 (git steps run for real from then on)
checkfor git steps.message_containswords for the repo, branch and ref-namespace refusals with sc-forge's real texts. Already real after feat(forge): P38 F1 server skeleton, auth, bootstrap CLI #298:password,auth,hasorgoruservisible,not found: no such API route.Later slices
mergeable/html_urlstrictness, combined-status answers, the remaining placeholders (merge,state,rename).F1 follow-ups (NAT64, delay on disconnect, map reset, Windows, toolchain) stay as listed above; none block F2.
feat(forge): P38 F2a repositories API, lifecycle, collaborators, bran…
tonibergholm-codento commentedon Oct 23, 2026
F2a (#301) follow-ups:
checkfor git steps (C and N run clones for real from then on); K, D, M can join the gate onceinfo/refs, commits and contents exist; K#54-56 counts and the M rename departures (422) and 404-text overrides (not foundplaceholders in departures.json) get their reviewed departures then./user/repos? Recorded labels only showwrite:user/read:user.forge.db, and the next startup moves every repo directory toorphans/(recoverable).tonibergholm-codento commentedon Oct 23, 2026
F2b (#304) follow-ups to track: per-user transport quotas (F5; a per-user cap would throttle Engine's single service account); default-branch PATCH vs a push that deletes the new default can leave HEAD dangling (needs a receive-pack/PATCH lease, F4);
--git-memory-limit(Linux RLIMIT_DATA) is untested in CI; no test that a killed push leaves no ref lock or quarantine directory (SIGTERM-first is implemented, unverified); a test that a transport killed mid-stream (delete during a clone) gives the client an error, not a clean end; deferred git exchanges pin the step name but not the command line; the principal of a deferred HTTP exchange is not pinned.test(forge): conformance departures carry sc-forge's real refusal tex…