Skip to content

fix(coord): make Blocked by mutations set-safe - #2916

Closed
EHotwagner wants to merge 5 commits into
mainfrom
item/2907-blocked-by-set-mutations
Closed

EHotwagner wants to merge 5 commits into
mainfrom
item/2907-blocked-by-set-mutations

Conversation

@EHotwagner

@EHotwagner EHotwagner commented Aug 24, 2026 •

Copy link
Copy Markdown
Contributor

Closes #2907

Summary

  • adds explicit --add, --remove, --replace, and --clear intents for the set-valued Blocked by field
  • serializes each observation/derive/guarded-write transaction behind a server-ordered issue-comment lease so concurrent add/remove operations cannot overwrite one another
  • refuses legacy bare replacement and adds diagnostic-only BLOCKED-BY-BODY-INERT linting for empty, divergent, duplicate, or invalid body projections
  • migrates the production parity route to explicit replacement/clear syntax

Verification

  • dotnet build src/FS.GG.Coord.Cli/FS.GG.Coord.Cli.fsproj -c Release --no-restore: 0 warnings, 0 errors on the rebased recovery head
  • BoardOps tests: 257 passed; GitHub tests: 671 passed
  • focused concurrency control proves one first attempt is fenced, retry preserves both edges, and maximum concurrent actions remains one
  • scripts/generate-projections --check: current
  • fsgg-sdd analyze: implementationReady; verify: verificationReady with 14/14 observed obligations; ship: shipReady
  • the earlier full branch verification also covered Kernel, Lifecycle, CLI, Core, parity, identity-harness, signature-doc mutation sweep, and deterministic package checks
  • five bounded inversions observed red: add preservation, remove preservation, stale refusal, inert-body lint, and mutation-lease election

Verification: exact commands, outcomes, controls, and inversion evidence are recorded in work/2907-blocked-by-set-mutations/verification/verification-evidence.md; the durable 257-test TRX is readiness/2907-blocked-by-set-mutations/test-results/boardops.trx.

Recovery

The stranded claim was recovered through the typed force-claim route, the branch was rebased onto current origin/main, and its SDD generated views were refreshed with fsgg-sdd 1.2.5. The prior #2912 dependency and coherent-set 0.75.2 release are already landed and verified; this PR itself declares no delivery obligation.

@EHotwagner

EHotwagner commented Aug 24, 2026 •

Copy link
Copy Markdown
Contributor Author

No description provided.

@github-actions

Copy link
Copy Markdown

✅ This PR stays inside the touch-set its issue declared.

@EHotwagner
EHotwagner force-pushed the item/2907-blocked-by-set-mutations branch from 48d5ed7 to 7bf90b5 Compare August 24, 2026 05:38
@EHotwagner

Copy link
Copy Markdown
Contributor Author

@EHotwagner

Copy link
Copy Markdown
Contributor Author

{"acceptedExceptions":[],"baseSha":null,"claimGeneration":null,"critic":"rook-78c3","diffAuditReceipts":[],"diffAuditRequired":false,"digest":"a820887d95c45a5862d33da9b02fe45ed0b603b57bd212d868b22ee527f7c6ae","headSha":"7bf90b522961d5955a8914c8ccc1c4a74e6af65c","initialReview":null,"kind":"initial","policyVersion":"structured-decisions/1","precedingReview":null,"previousDigest":null,"repairPhaseReceipt":null,"revision":1,"round":0,"routeApplicability":"not-meaningful","routeEvidence":["No alternate production route exists for this board-operations CLI change; the built command path, parser, guarded GitHub adapter seam, lint application seam, and batch compatibility path were exercised directly."],"schema":"fsgg.coord.review-decision/v2","subject":"#2907/pr/2916","succession":null,"timestamp":"2026-08-24T05:49:42Z","verdict":"changes-required"}

@EHotwagner

Copy link
Copy Markdown
Contributor Author

@EHotwagner

Copy link
Copy Markdown
Contributor Author

@EHotwagner

Copy link
Copy Markdown
Contributor Author

{"acceptedExceptions":[],"baseSha":null,"claimGeneration":null,"critic":"crake-f274","diffAuditReceipts":[],"diffAuditRequired":false,"digest":"39717200a4dff09e3562a90f15fb5e8076acd6e89f1aa22d78b27c92af9e39bf","headSha":"6be996676ce5d33e4bb3ed10e270111615d3ded7","initialReview":"https://github.com/FS-GG/.github/pull/2916#issuecomment-5391243430","kind":"confirmation","policyVersion":"structured-decisions/1","precedingReview":"https://github.com/FS-GG/.github/pull/2916#issuecomment-5391243430","previousDigest":"a820887d95c45a5862d33da9b02fe45ed0b603b57bd212d868b22ee527f7c6ae","repairPhaseReceipt":null,"revision":2,"round":1,"routeApplicability":"not-meaningful","routeEvidence":["No alternate production route exists for this board-operations CLI change; the built command path, parser, guarded GitHub adapter seam, lint application seam, batch compatibility path, and hosted parity route were exercised directly."],"schema":"fsgg.coord.review-decision/v2","subject":"#2907/pr/2916","succession":null,"timestamp":"2026-08-24T06:38:26Z","verdict":"pass"}

@EHotwagner

Copy link
Copy Markdown
Contributor Author

@EHotwagner

Copy link
Copy Markdown
Contributor Author

@EHotwagner

Copy link
Copy Markdown
Contributor Author

Host succession grant for the current #2907 review generation.

This grants critic identity succession only. It does not grant a verdict, acceptance, merge, authorization, publication, or disposition of any finding.

@EHotwagner

Copy link
Copy Markdown
Contributor Author

{"acceptedExceptions":[],"baseSha":null,"claimGeneration":null,"critic":"shrike-e6e3","diffAuditReceipts":[],"diffAuditRequired":false,"digest":"3916abd48ebc4b29c75c6751fc4276194ee0a9afcc07410dc46ff36da8777407","headSha":"f802984b44f352ced6b1e687b7713b2d7cd49262","initialReview":"https://github.com/FS-GG/.github/pull/2916#issuecomment-5391243430","kind":"confirmation","policyVersion":"structured-decisions/1","precedingReview":"https://github.com/FS-GG/.github/pull/2916#issuecomment-5391634674","previousDigest":"39717200a4dff09e3562a90f15fb5e8076acd6e89f1aa22d78b27c92af9e39bf","repairPhaseReceipt":null,"revision":3,"round":2,"routeApplicability":"not-meaningful","routeEvidence":["No alternate production route exists for this single board-write CLI boundary; the built command/parity route and direct guarded adapter seam were exercised. Material finding: the issue\u0027s atomic-add/remove acceptance remains unmet because Board.boardWriteGuarded re-reads the observed value/revision and then emits an unconditional Projects-v2 field mutation, leaving a TOCTOU window in which a concurrent edge added after the re-read is overwritten. The focused stale fixture changes only the second read and cannot represent a change between that read and the mutation. Verification: issue #2907 live body acceptance; work/2907-blocked-by-set-mutations/spec.md:29-39; src/FS.GG.Coord.GitHub/Board.fs:1463-1474; tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs:63-96,163-174; GitHub GraphQL schema introspection returned UpdateProjectV2ItemFieldValueInput fields [clientMutationId,projectId,itemId,fieldId,value] with no expected-revision/CAS input; exact-head focused tests 9/9, BoardOps 255/255, GitHub 671/671, Kernel 182/182, parity 616/616 and identity harness 14/14 passed, but none closes that post-read race. The repaired identity-harness subject passed; independently deleting only the CLAUDE_CODE_SESSION_ID scrub made its named test red, and restoring it returned green with a clean tracked diff. Producer agreement/non-vacuity: source parsing found one intake body writer, one authoritative field writer, and one lint reader for Blocked by; the relation is equality over the shared validated value with both sides non-empty, and dropping the producer field made the independent relation assertion exit 1. Workflow reachability: coord-engine is universal on pull_request and its engine job is selected by touched src/tests paths; coord-github is selected by src/FS.GG.Coord.GitHub/Board.fs; harness-identity is selected by tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs. Hosted current-head engine and mutation-sweep checks were still in progress and claim-generation was expectedly red before authorization at observation time. Verification: .github/workflows/coord-engine.yml:20-190; .github/workflows/coord-github.yml:20-85; .github/workflows/harness-identity.yml:17-68; GitHub check-runs API for f802984 at 2026-08-24T07:27:44Z."],"schema":"fsgg.coord.review-decision/v2","subject":"#2907/pr/2916","succession":{"grantUrl":"https://github.com/FS-GG/.github/pull/2916#issuecomment-5392036344","grantedBy":"osprey-b926","originalCritic":"crake-f274"},"timestamp":"2026-08-24T07:27:44Z","verdict":"changes-required"}

@EHotwagner

Copy link
Copy Markdown
Contributor Author

@EHotwagner

Copy link
Copy Markdown
Contributor Author

@EHotwagner

Copy link
Copy Markdown
Contributor Author

Superseded by #2936 at the identical candidate commit ded5b50850568537153813fac65c175535ddd3d4.

This PR's expired 8f8b0bcb…:repair-confirmation:3 wait is bound to dead claim generation 5390890035. Recovery correctly minted current generation 5406278215, after which the typed review writer refused both retirement and replacement of the old unconsumed wait—the known #2853 deadlock. A fresh PR is the documented safe recovery because the review-wait ledger is scoped to PR comments. No implementation evidence or candidate code was discarded; #2936 starts a fresh exact-head independent-review ledger.

Verification: fsgg-coord review .github#2907 --pr 2916 --json returned noVerdict, waitStatus: recoverable, claim generation changed; reacquire before mutation; review wait enter refused a preceding reviewGeneration is still unconsumed. On #2936, review wait enter converged and the live oracle returns awaitingInitialReview / dispatchCritic for the same head.

@EHotwagner EHotwagner closed this Aug 25, 2026
@EHotwagner
EHotwagner deleted the item/2907-blocked-by-set-mutations branch August 25, 2026 16:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[coord] Give the set-valued Blocked by field atomic add/remove semantics and lint inert body declarations

1 participant