Skip to content

[COORD-EFF-02.C] F# supported-route preflight and batched enrollment (Design C) #4941

Closed

Description

@EHotwagner

Owner

Programme/root assigns one source owner and one independent reviewer, and integrates. Batched enrollment reuses the existing #4874 and its intake_process_fix owner.

Done when

Design C from #4730 (comment 6285960634) is delivered in F#:

Acceptance requires all of the following:

  • source with causal controls;
  • one independent review;
  • required CI;
  • coherent publication in the next coordination CLI release;
  • installed adoption;
  • one real use: a real preflight on an actual selected stage, and one real batched cohort enrollment without hand-patched wrappers;
  • telemetry reported through existing readers, with Unknowns explicit.

Parent Outcome: #4730

Current deliverable

Filed 2026-10-30 by Root/fdev under the user ruling recorded on #3010. Protected enrollment is pending (owner: Root intake).

Next action

Root dispatches the source owner after Design B's CLI registration surface is known, to avoid touching the same CLI surface concurrently. The #4874 inventory can start now.

Blocked on

Nothing external.

Acceptance evidence

None yet.

Activity

  1. EHotwagner commented on Oct 30, 2026

    @EHotwagner
    ContributorAuthor

    Root/fdev: the #4874 cohort-wrapper inventory and design proposal are dispatched as read-only preparation. Root will dispatch implementation once that proposal is in and #4940's CLI registration surface is known.

  2. EHotwagner commented on Oct 30, 2026

    @EHotwagner
    ContributorAuthor

    Root/fdev, 2026-10-30: the read-only #4874 inventory and design proposal are complete.

    Inventory findings:

    Hard stop found: the installed reader's payloadRows refuses more than 100 rows, and the enrolled population is 93. Only 7 more rows fit, including #4940 and #4941 themselves. Root decision: lifting the cap is a coordinated protocol and CLI release change and is added to this Delivery's scope, released with the batched route. Until then the preflight must report Unsupported(RowCapExceeded).

    Root decisions on the design:

    • Placement: a pure planner in FS.GG.Coord.GitHub/V2Enrollment.fs/.fsi, reusing prepareProgrammeBinding, programmeCommitment, authenticateProgrammeEnrollment and the readDeclaredPlan grammar.
    • Surface: tools/BoardV2Import stays a thin offline wrapper now. The shipped surface is the engine, registered after [COORD-EFF-02.B] F# scoped context view with bounded evidence (Design B) #4940 lands.
    • Generated inputs: prior payload bytes are spliced, not re-serialized. Native facts come from a separate online resolve-issues step. Admission is generated only as a draft, with its decision text derived from the prepared changes. The runtime binding is derived by authentication.
    • Refusals: closed typed codes, never printing payload or nonce.
    • Preflight: SupportedForNextStage | Unsupported(reason, supplier) | Unknown(gap), where Unknown never exits 0. It covers the enrollment route (including the installed plan grammar and the row cap), routine delivery and publication-writer registration.
    • Delivery in three PRs:
      1. the planner, prepare-successor and its controls (now);
      2. the preflight core and the enrollment route;
      3. the routine-delivery and publication routes, CLI registration and lifting the row cap (after [COORD-EFF-02.B] F# scoped context view with bounded evidence (Design B) #4940).

    PR 1 is dispatched now.

  3. EHotwagner commented on Oct 30, 2026

    @EHotwagner
    ContributorAuthor

    Root/fdev decision, 2026-10-30, under the user ruling recorded on #3010. Seven auto-added board cards are removed from Project 3.

    What happened

    Decision

    Process findings, owner Root

    1. Project 3's auto-add workflow silently creates unadmitted memberships whenever an issue is filed in an included repository. [COORD-EFF-02.C] F# supported-route preflight and batched enrollment (Design C) #4941's preflight should report this as Unsupported, or Root should narrow or disable auto-add.
    2. The engine's coarse refusal code hid the cause. Typed reasons are part of [COORD-EFF-02.C] F# supported-route preflight and batched enrollment (Design C) #4941's preflight scope.
  4. EHotwagner commented on Oct 30, 2026

    @EHotwagner
    ContributorAuthor

    Root/fdev, 2026-10-30: PR 1 is delivered. #4950 was merged after an independent APPROVE at fe8870b0.

    What landed:

    • the pure planner V2Enrollment, which splices bytes, authenticates the predecessor and dry-runs through the installed constructor;
    • the extracted installed plan grammar. A 600,000-case differential check against the base version found 0 mismatches;
    • the plan-successor, prepare-successor, bind-runtime and render-carrier subcommands;
    • 15 code-only refusals. The cohort 89 r1 Outcome-URL case refuses with PlanNotAdmitted, and the cap boundary holds at 98+2 accepted and 99+2 refused;
    • a private replay of cohort 89 r2, which is byte-identical.

    coord-engine passed. The only red check is the unrelated, non-required telemetry-host-package hosted-image admission, which is being repaired separately.

    Added to PR 2 scope (Root disposition of the review's O1–O5):

    • O1: prepare-successor must re-validate the appended rows with the grammar and the 3008 check, or bind an appended-row digest into the receipt. A hand-edited payload currently passes to a commitment.
    • O2: split the coarse codes, for example input-unreadable, custody-unavailable and git-read-failed. Map a CreateNew race to OutputExists.
    • O4: JSON-escape planWith/rowFragment, and keep SuccessorPlan out of %A printing.

    Next is PR 2: the preflight core plus the enrollment route, and the online resolve-issues that emits the fsgg.board-v2-native-facts/1 shape.

  5. EHotwagner commented on Oct 31, 2026

    @EHotwagner
    ContributorAuthor

    Root/fdev, 2026-10-31: coherent 0.114.0 release, step 1 (candidate) is admitted. The source is main 489571bf (#5034 merged).

    A quiet window starts now. Root stopped its armed merges, and holds every .github merge from now until the candidate artifact is retained. It holds again through the preflight and publish, once those are admitted.

    Dispatch conditions. The executor checks all of these immediately before dispatching:

    • coord-engine has finished on 489571bf with a named result; it must be success.
    • The post-merge settlement run for 489571bf has finished, and Coordination.Authority main has had no bot commits for 5 minutes or more.
    • The queue is draining, at about 30 queued or fewer.
    • origin/main and the publication-writer lock are re-read at dispatch.

    Rules: one dispatch only, attempt 1. If main moves, record the SHA and writer and stop.

    Steps 3–6 each need their own admission. Refs #4730

  6. EHotwagner commented on Oct 31, 2026

    @EHotwagner
    ContributorAuthor

    Root/fdev, 2026-10-31: the coherent 0.114.0 release is admitted end to end, at the owner's request. This supersedes the lapsed step-1 window.

    Source and preconditions

    Quiet window. It starts now and lasts until step 5's readback is accepted. Root merges nothing to .github during that time.

    Admitted steps. Each runs only if the previous one succeeded exactly:

    1. Candidate: dispatch once, with a re-read of main and the publication-writer lock at dispatch.
    2. Retain: the run id, artifact id and archive sha256, plus a local re-hash and the seven members.
    3. Preflight: publish=false with the same triple.
    4. Publish: publish=true, one dispatch, after checking that Authority main has been quiet for 5 minutes or more. Accepted irreversible effects: nuget.org 0.114.0 for FS.GG.Coord.Cli, FS.GG.Kit and FS.GG.Drivers (unlist only), the coherent-set/v0.114.0 tag, the journal, the release and assets, and the org feed. Forward re-dispatches for the same triple to the documented checkpoints (the 0.113 precedent) are admitted. Anything else stops.
    5. Readback: tag, release, assets, both feeds and the journal.
    6. Install on fdev: update-fsgg-coord-cli. Rollback is to repoint to coord-0.113.0. Telemetry wave 2 is paused, so the producer swap is safe now.

    Hard stops:

    • main moves;
    • any refusal or an unexpected approval prompt;
    • a digest mismatch;
    • a failure after genesis that isn't a documented forward checkpoint;
    • the 90-minute stage clock runs out.

    On any of these, stop and report. Nothing is retried blindly. Refs #4730

  7. EHotwagner commented on Oct 31, 2026

    @EHotwagner
    ContributorAuthor

    Coherent 0.114.0 release, steps 1–6 evidence (executor), 2026-10-31. Admission: Root's comment of 11:12Z on this issue. Source main 3c13e67f (#5034 rebind at 489571bf plus the docs-only #5104); main never moved during any run below. Nothing was retried blindly.

    1. Candidate. Run 41212952997, attempt 1, one dispatch at 15:02:56Z, success 15:09:37Z. Pre-dispatch: main and the lock re-read, queue 1, 0.114.0 absent on tags and nuget.org, coord-engine success at 489571bf.

    2. Retain. Artifact 13046712832 (6 files plus manifest = seven members: three nupkgs, release-manifest.json, previous-stable-channel.json, two standalone telemetry evidence files). Raw archive sha256 366883225c323ad9d0e04cd18bfc52fa4f4edc493a5126b1d8d1ff5eb93c7ded; GitHub's digest and my local re-hash agree. Manifest: version 0.114.0, source 3c13e67f, previous 0.113.0 (sha256:14c8ba3f…ab908), content sha256:250a010e27ebcc43007ea72bbdf01fddbabc45c2a85feabde3268d095d91d01c.

    3. Preflight. Run 41213587294, publish=false, same triple, success. No approval prompt; both feeds reported 0.114.0 absent; "no journal, tag, feed or release was changed".

    4. Publish. Three runs, all attempt 1, same triple, publish=true, Authority main quiet for hours before the first (last bot commit 09:29Z). This is the 0.113 path (#4640): two documented forward checkpoints, then promotion.

    • 41213850664 stopped at generation 4: ordinary draft lookup identity is malformed or duplicate, effects {tag: verified, draft: intent}, draft applied. Byte-identical to 0.113's first publisher result (run 39961563619).
    • 41214306162 ended as checkpoint at generation 14: nuget:FS.GG.Kit visibility probe window exhausted (the 0.113 second run).
    • 41215698288 finished 15:58:46Z: complete, publicationComplete=True, journal generation 33, all 16 effects verified, promote verified. No approval prompt in any run.

    5. Readback (my own reads and hashes).

    • Tag coherent-set/v0.114.0 is 3c13e67f.
    • Release id 430012073, published 15:57:29Z, not draft, not prerelease, latest, body release-successor:sha256:250a010e…d01c. Seven assets: the three nupkgs and both standalone evidence files are byte-identical to the candidate members; release-manifest.json is the promoted file (descriptor and contentId equal the candidate's); stable-channel.json records 0.114.0, source 3c13e67f, content 250a010e…, promotedAt 15:54:06Z.
    • nuget.org serves 0.114.0 for FS.GG.Coord.Cli, FS.GG.Kit and FS.GG.Drivers; each differs from the release nupkg only by the added .signature.p7s (no content differences).
    • Journal ref coord114-enrollment-context-20261031-01: generation 33 in the final run result; Authority shows "Release successor generation 33" at 15:57:58Z. All github:* and nuget:* effects verified.
    • Unknown from my side: the org feed itself (HTTP 403 with my token); the journal's hosted observations of github:* are the only evidence, as for 0.113.

    6. Install on fdev. /opt/fdev/bin/update-fsgg-coord-cli installed coord-0.114.0 and repointed ~/.local/bin/fsgg-coord-engine; fsgg-coord-engine --version reads 0.114.0.0. coord-0.113.0 is retained, so rollback is repointing that link. The engine now registers enrollment, route-preflight and context-view. fdev's startup script will install the newest release on restart, which is now 0.114.0.

    Local notes: /home/developer/scratch-cli-release/ (candidate zip and members, three publisher result artifacts, readback files).

  8. EHotwagner commented on Oct 31, 2026

    @EHotwagner
    ContributorAuthor

    Root/fdev, 2026-10-31: steps 5 and 6 are accepted. Coherent 0.114.0 is published, read back and installed on fdev.

    • Readback: issuecomment-6545762715.
    • Live board read: Root verified it with the 0.114.0 reader. The read (board-v2 migration-prepare) now succeeds on the 222-row board, after rebinding the scope to the executing 0.114.0 assemblies (adapter f76941b2…, CLI 2e21c9a6…, source 3c13e67f).
    • Quiet window: lifted, and .github merges resume.

    Next, still owed for this Delivery: the first real batched-enrollment use of the #4941 planner, enrolling the 124 auto-added Delivery cards.

  9. EHotwagner commented on Oct 31, 2026

    @EHotwagner
    ContributorAuthor

    #4941 first real batched enrollment: held at the first stage, 2026-10-31 17:09Z (worker for Root/fdev). No native writes, no carrier, no PR.

    Route run so far, using installed coherent 0.114.0 (FS.GG.Coord.GitHub.dll f76941b2…):

    1. enrollment resolve-issues: exit 0, "native facts resolved; issues=114; read-only". All 114 rows are issues, Project members and fully visible, with no human Roadmap. All 15 plan documents are on main.
    2. route-preflight --route ProgrammeEnrollmentSuccessor --stage PlanSuccessor --online: exit 10, Unsupported.

    Following the stop rule, I did not run enrollment plan or anything after it.

    Root decisions needed before a retry:

    Count note: the targets file has 40 Done rows (33 already Done and missing only Track/Work level, plus 7 closed with all fields empty), not 38.

    Receipts: ~/.local/share/fs-gg-private/enroll-4941-cohort90-20261031/receipts.json (fdev, private). Refs #4730

  10. EHotwagner commented on Oct 31, 2026

    @EHotwagner
    ContributorAuthor

    Cohort90 apply progress, 2026-10-31 18:54Z (worker for Root/fdev): 25 of 29 small scopes are complete. That is 100 of the 113 remaining cards, plus batch 1's 19 delivered effects.

    The apply record PR follows the last scope. Refs #4730

  11. EHotwagner commented on Oct 31, 2026

    @EHotwagner
    ContributorAuthor

    Cohort90, the first real batched enrollment through the #4941 planner: done, 2026-10-31 19:08Z (worker for Root/fdev).

    Enrollment. The planner route on installed 0.114.0 appended 114 rows to cohort 89's 93, for 207 rows, with no per-cohort wrapper or constructor rebuild. The stages were resolve-issues, route-preflight for each stage, then plan, prepare, render-carrier, the carrier PR #5116 (merged dc9ac5b0), and bind-runtime. The commitment is d2eb7066…a56a. Separate code verified the prefix, the header and both commitments.

    Board. All 114 cards now carry their decided Status, Track, Roadmap and Work level. The final per-batch GraphQL readback found 114 of 114 cards complete, with 0 wrong and 0 missing values.

    • Status: Done 38, Blocked 29, Backlog 27, In progress 9, Ready 6, In review 5.
    • 423 absent-value effects were sent (Work level 114, Track 114, Roadmap 114, Status 81). Each has an HTTP 200 receipt and a readback. Nothing was overwritten, and no raw item-edit ran.

    Root decisions:

    Excluded or held, 14 cards:

    Record. The apply record PR #5133 is with Root. Receipts are at ~/.local/share/fs-gg-private/enroll-4941-cohort90-20261031/receipts.json (fdev, private). One correction to my 16:09 comment: it was stamped 17:09Z by mistake; the actual time was about 16:09Z.

    Remaining #4941 acceptance (telemetry readout through the existing readers) stays with Root. Refs #4730

  12. EHotwagner commented on Oct 31, 2026

    @EHotwagner
    ContributorAuthor

    Root/fdev: the 11 no-Status cards excluded from cohort 90 are triaged.

    Enrollment of these cards stays held as before: SDK-PATCH under #5114, and SC2 outside the binding repositories.

  13. EHotwagner commented on Nov 1, 2026

    @EHotwagner
    ContributorAuthor
  14. EHotwagner commented on Nov 1, 2026

    @EHotwagner
    ContributorAuthor

    Coherent 0.114.1 release, evidence (executor), 2026-11-01. Authorized by programme decision 6 (#4730). Source main 6eca8110 (rebind #5157 merged on fbd36a18); main was 6eca8110 at every poll from the candidate dispatch to the last publisher run, so nothing moved it. The route first needed the rebind in #5157: the candidate workflow, CURRENT_RELEASE and the feed-readiness choice were still bound to 0.114.0 (follow-up #5156).

    Candidate. Run 41272965252, attempt 1, one dispatch 04:24:20Z, success 04:32:57Z, after coord-engine success at 6eca8110, queue 1, lock free, Authority quiet. Artifact 13069734892, archive sha256 d004b44e33da9246df1baf705ac51e287bc9ac4c34a18d671bfb2d9516315e00 (GitHub digest and my local re-hash agree), seven members. Manifest: 0.114.1, source 6eca8110, previous 0.114.0 (sha256:250a010e…d01c), content sha256:976a8119dfba1ac8b8312bc74e96df14e97e1bbe4f0ac7c1bb1d59e3e035e0f1. The new steps "Bind the pinned dispatch source and stable version" and "Refuse a changed release closure or newly occupied version before retention" both passed.

    Preflight. 41273554810, publish=false, success; both feeds report 0.114.1 absent; no approval prompt.

    Publish. Three publish=true runs, attempt 1, same triple, no approval prompt, no refusal outside the documented checkpoints.

    • 41273799443 stopped at generation 4 (ordinary draft lookup identity is malformed or duplicate; tag verified, draft intent), the 0.113/0.114.0 checkpoint.
    • 41274051028 ended as a checkpoint at generation 16: nuget:FS.GG.Drivers visibility probe window exhausted (Kit and Coord.Cli already verified). The Drivers package became visible on nuget.org about 6 minutes later, and I waited for it before the next dispatch. This is the 0.114.0 generation-14 checkpoint class, with Drivers instead of Kit.
    • 41275525551 finished 05:17:57Z: complete, publicationComplete=True, generation 33, all 16 effects verified.

    Readback. Tag coherent-set/v0.114.1 is 6eca8110. Release 430365711, published 05:16:41Z, not draft, not prerelease, latest. The three nupkgs and both telemetry evidence files are byte-identical to the candidate; release-manifest.json is the promoted file (descriptor and contentId equal the candidate's); stable-channel.json records 0.114.1, 6eca8110, 976a8119…, promotedAt 05:13:40Z. nuget.org serves 0.114.1 for Coord.Cli, Kit and Drivers, each differing from the release file only by .signature.p7s. Authority shows "Release successor generation 33" at 05:17:07Z. Unknown from my side: the org feed (403 for my token), covered by the journal's hosted receipts as for 0.113 and 0.114.0.

    Install on fdev. update-fsgg-coord-cli installed coord-0.114.1 and repointed the link; fsgg-coord-engine --version reads 0.114.1.0. coord-0.114.0 and coord-0.113.0 are retained (rollback is repointing the link). The reader identity changed by hand, as for 0.114.0 (#5120): installed FS.GG.Coord.GitHub.dll sha256 9eb9b9d3d1ec2af7e6db574df3cbf48f1128c96c246782ee6e98b1df846a9d23, embedded revision 1.0.0+6eca811012f4ccc674cfa02c751500da9edd79c8; fsgg-coord-engine.dll sha256 81e8ee97fa524227d8b6d97bfc4ec348b7b3964eb4f3683d2862e6d890c2a36d.

    • Runtime binding: new file runtime-binding207-r0114_1.json (mode 0600, original kept, only artifactSha256 and recipeRevision changed, same length): sha256 86fb8f377e3257540e6e52e8ebae3d047b7206d22eb9d5a328ce2547d246cdee (from eba7a946…f9a5).
    • Status scope: new file active-status-scope-0.114.1.json beside the original (which is unchanged): sourceRevision, artifactSha256 and cliArtifactSha256 changed; sha256 71226d4ca7137d3452cc2e1c2982ac60bbe73d44d444798d7469bd49d103f141 (from 4f0e7b23…4583). Root's tooling still points at the old name.

    207-row inspect (the #5121 test). board-v2 inspect --binding-file <207-row binding> --report-file NEW with a private TMPDIR: exit 0, 05:19:52Z to 05:21:49Z (116.7 s), no refusal, attempted 207, selected 207, mutationAttempts 0, populationGap null, membershipGap null (0.114.0 exited 3 after 2,502 reads with "bounded refresh deadline/request ceiling reached"). 21 items Verified, 186 Unknown; no Archived item. Per-item reads sum 3,079 (13–15 each); GraphQL rate fell 158 points (4888 to 4730, an upper bound, other sessions share the token). A first attempt failed in 0.1 s with "bounded binding/history input unavailable" because I had created the run directory world-readable; no native read happened, and the one re-run was with mode 0700. Report sha256 89e7b723…. selectionCoverage stays "Partial .8" (attributed action, prerequisite, intake, resource and reservation suppliers are missing), unchanged by the reader.

    Local notes: /home/developer/scratch-cli-release/ (candidate, three publisher result artifacts, readback); private files and the report under ~/.local/share/fs-gg-private/.

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

Metadata

Metadata

Assignees

No one assigned

    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