Skip to content

[coord] Separate merged from post-merge verified before projecting Done #2905

Description

@EHotwagner

Parent and finding

Child of #2903, instance 3. delivery --apply projects issue closure, Status=Done, claim release, and a delivery-completion receipt during guarded landing, before the protected/default-branch run can exist. The measured S.I.R. control had an empty intersection between PR-only and protected-branch checks, so pre-merge green evidence cannot establish the post-merge state that Done claims.

Filing-bar verdict

  1. Red today: current Delivery.decideCompletion authorizes ProjectCompletion from Merged, reachability, mutable projections, and declared obligations; it has no protected-branch verification fact. LiveHandlers.runDone then appends the completion receipt and closes/projects the issue immediately after merge.
  2. Not already derived: no scripts/check-*.py continuously derives whether a completion receipt is backed by a protected-branch run for its exact merge SHA.
  3. Class-anchored: [epic] Move deterministic development-process protocol from agent prose into fsgg-coord #2130 owns the general typed-process programme, but no open child owns this distinct merge-versus-verification transition. [cross-repo] An unclaimed item branch with an open PR is invisible to every scheduler collision check #2849 concerns invisible unclaimed work, not completion evidence.

Acceptance

  • Merged and post-merge Verified are distinct typed facts/states.
  • Done, issue closure, claim release, and the terminal completion receipt cannot claim verified completion before an exact-merge protected/default-branch receipt exists.
  • A red or unreadable protected-branch result remains visible and recoverable; it never becomes Done.
  • Inversion proves a PR-green merge with no qualifying post-merge run cannot complete, while the same merge completes after a matching green receipt.
  • The existing delivery-obligation saga remains resumable and idempotent.

Verification: src/FS.GG.Coord.Core/Delivery.fs:345-372,394-428; src/FS.GG.Coord.Cli.Lifecycle/LiveHandlers.fs:1640-1678; #2903 instance 3. Adjudicated by brant-bea2.

Class: defect
Severity: Critical
Repo Scope: .github

Paths: src/FS.GG.Coord.Core/Delivery.fs src/FS.GG.Coord.Core/Delivery.fsi src/FS.GG.Coord.Cli.Lifecycle/DeliveryApplication.fs src/FS.GG.Coord.Cli.Lifecycle/LiveHandlers.fs tests/FS.GG.Coord.Core.Tests/DeliveryTests.fs tests/FS.GG.Coord.Cli.Lifecycle.Tests/DeliveryApplicationTests.fs tests/FS.GG.Coord.Cli.Lifecycle.Tests/DoneStderrTests.fs src/FS.GG.Coord.Cli.Lifecycle/LiveHandlers.fsi work/2905-post-merge-verification/** readiness/2905-post-merge-verification/** src/FS.GG.Coord.GitHub/Reads.fs src/FS.GG.Coord.GitHub/Reads.fsi tests/FS.GG.Coord.GitHub.Tests/ReadTests.fs tests/FS.GG.Coord.GitHub.Tests/WriteTests.fs tests/FS.GG.Coord.GitHub.Tests/DoneFactsTests.fs tests/FS.GG.Coord.Cli.BoardOps.Tests/ApplicationServiceTests.fs src/FS.GG.Coord.Cli.Lifecycle/DeliveryApplication.fsi .agents/skills/fs-gg-sdd-analyze .agents/skills/fs-gg-sdd-authoring-contracts .agents/skills/fs-gg-sdd-charter .agents/skills/fs-gg-sdd-checklist .agents/skills/fs-gg-sdd-clarify .agents/skills/fs-gg-sdd-evidence .agents/skills/fs-gg-sdd-getting-started .agents/skills/fs-gg-sdd-lifecycle .agents/skills/fs-gg-sdd-plan .agents/skills/fs-gg-sdd-refresh-agents .agents/skills/fs-gg-sdd-ship .agents/skills/fs-gg-sdd-specify .agents/skills/fs-gg-sdd-tasks .agents/skills/fs-gg-sdd-troubleshooting .agents/skills/fs-gg-sdd-validate .agents/skills/fs-gg-sdd-verify .claude/skills/fs-gg-sdd-analyze .claude/skills/fs-gg-sdd-authoring-contracts .claude/skills/fs-gg-sdd-charter .claude/skills/fs-gg-sdd-checklist .claude/skills/fs-gg-sdd-clarify .claude/skills/fs-gg-sdd-evidence .claude/skills/fs-gg-sdd-getting-started .claude/skills/fs-gg-sdd-lifecycle .claude/skills/fs-gg-sdd-plan .claude/skills/fs-gg-sdd-refresh-agents .claude/skills/fs-gg-sdd-ship .claude/skills/fs-gg-sdd-specify .claude/skills/fs-gg-sdd-tasks .claude/skills/fs-gg-sdd-troubleshooting .claude/skills/fs-gg-sdd-validate .claude/skills/fs-gg-sdd-verify src/FS.GG.Coord.GitHub/Transport.fs tests/FS.GG.Coord.GitHub.Tests/HttpTransportTests.fs

Activity

  1. moved this to Backlog in Coordinationon Aug 24, 2026
  2. EHotwagner commented on Aug 24, 2026

    @EHotwagner
    ContributorAuthor
    No description provided.
  3. EHotwagner commented on Aug 24, 2026

    @EHotwagner
    ContributorAuthor

    {"schema":"fsgg.coord.route-decision/v2","subject":"#2905","revision":1,"previousDigest":null,"scope":["Separate merged from exact-merge protected-branch verification before terminal delivery completion."],"dependencies":["none"],"touchSet":["src/FS.GG.Coord.Core/Delivery.fs","src/FS.GG.Coord.Core/Delivery.fsi","src/FS.GG.Coord.Cli.Lifecycle/DeliveryApplication.fs","src/FS.GG.Coord.Cli.Lifecycle/LiveHandlers.fs","tests/FS.GG.Coord.Core.Tests/DeliveryTests.fs","tests/FS.GG.Coord.Cli.Lifecycle.Tests/DeliveryApplicationTests.fs"],"policyVersion":"structured-decisions/1","route":"sdd-required","agent":"brant-bea2","timestamp":"2026-08-24T00:31:00Z","reasonCodes":["parent-2903-priority","irreversible-completion-boundary","post-merge-evidence-contract"],"rationale":"The change adds a distinct lifecycle state and durable evidence boundary around irreversible completion projection; SDD is required to define recovery, idempotency, and exact-merge verification semantics before implementation.","sddWorkId":"2905-post-merge-verification","specHome":"work/2905-post-merge-verification/spec.md","requiredGates":["implementationReady","analyze","verify","ship"],"digest":"50589191989f4f628a2434fcfccc14c415b9f3be9002c6841478459e3868b1a5"}

  4. moved this from Backlog to Ready in Coordinationon Aug 24, 2026
  5. EHotwagner commented on Aug 24, 2026

    @EHotwagner
    ContributorAuthor
    No description provided.
  6. moved this from Ready to In progress in Coordinationon Aug 24, 2026
  7. moved this from In progress to Ready in Coordinationon Aug 24, 2026
  8. EHotwagner commented on Aug 24, 2026

    @EHotwagner
    ContributorAuthor
    No description provided.
  9. moved this from Ready to Blocked in Coordinationon Aug 24, 2026
  10. moved this from Blocked to Ready in Coordinationon Aug 25, 2026
  11. fs-gg-cross-repo-dispatch commented on Aug 25, 2026

    @fs-gg-cross-repo-dispatch
    Contributor
    No description provided.
  12. moved this from Ready to In progress in Coordinationon Aug 25, 2026
  13. moved this from In progress to In review in Coordinationon Aug 25, 2026
  14. 13 remaining items

  15. moved this from In review to Ready in Coordinationon Aug 25, 2026
  16. EHotwagner commented on Aug 25, 2026

    @EHotwagner
    ContributorAuthor
    No description provided.
  17. moved this from Ready to In review in Coordinationon Aug 25, 2026
  18. added a commit that references this issue on Aug 25, 2026
  19. EHotwagner commented on Aug 25, 2026

    @EHotwagner
    ContributorAuthor

    Merge election for this item's current claim generation, posted by delivery for pull request #2973 (.github#2395, design §4.2). Append-only: it carries no lease, is never deleted, and the lowest-id election bearing this operation key is the one whose merge this generation admits.

  20. moved this from In review to Done in Coordinationon Aug 25, 2026
  21. moved this from Done to In progress in Coordinationon Aug 25, 2026
  22. moved this from In progress to In review in Coordinationon Aug 25, 2026
  23. moved this from In review to Done in Coordinationon Aug 25, 2026
  24. moved this from Done to In progress in Coordinationon Aug 25, 2026
  25. fs-gg-cross-repo-dispatch commented on Aug 25, 2026

    @fs-gg-cross-repo-dispatch
    Contributor
    No description provided.
  26. moved this from In progress to Done in Coordinationon Aug 25, 2026
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

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions