Skip to content

P38 forge: F0 follow-ups (placeholder departure texts, git command comparison, F1 CI job) #297

Closed

Description

@tonibergholm-codento

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.
  • Fixture size (done in chore(forge): store conformance fixtures compactly #300: 3.8 MB -> 2.3 MB): 3.5 MB across two versions; compact JSON would roughly halve it.

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.

Activity

  1. tonibergholm-codento commented on Oct 22, 2026

    @tonibergholm-codento
    CollaboratorAuthor

    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).
  2. tonibergholm-codento commented on Oct 23, 2026

    @tonibergholm-codento
    CollaboratorAuthor

    F1 (#298) follow-ups, tracked here:

    • 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.
  3. tonibergholm-codento commented on Oct 23, 2026

    @tonibergholm-codento
    CollaboratorAuthor

    Triage by slice (so this stays a checklist, not a pile):

    Done

    • F1 skip departures and the CI job that checks the in-tree server: feat(forge): P38 F1 server skeleton, auth, bootstrap CLI #298 (sc-forge conformance, --pending).
    • 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.

    Later slices

    • F4: mergeable/html_url strictness, combined-status answers, the remaining placeholders (merge, state, rename).
    • Not scheduled, low value: compact fixture JSON (3.5 MB). Say if you want it as a tiny separate PR.

    F1 follow-ups (NAT64, delay on disconnect, map reset, Windows, toolchain) stay as listed above; none block F2.

  4. tonibergholm-codento commented on Oct 23, 2026

    @tonibergholm-codento
    CollaboratorAuthor

    F2a (#301) follow-ups:

    • 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.
    • chore(deps): bump ctutils to 0.4.5 (RUSTSEC-2026-0385) #302 closed as superseded (the ctutils 0.4.5 bump landed in feat(forge): P38 F2a repositories API, lifecycle, collaborators, branches #301).
  5. tonibergholm-codento commented on Oct 23, 2026

    @tonibergholm-codento
    CollaboratorAuthor

    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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions