From a9925996e22969ab8aad5654dacd222008db8e87 Mon Sep 17 00:00:00 2001 From: osprey-d90d Date: Mon, 24 Aug 2026 07:36:11 +0200 Subject: [PATCH 1/5] Add atomic Blocked by set mutations --- .../analysis.json | 582 ++++++ .../governance-handoff.json | 347 ++++ .../ship-verdict.json | 23 + .../2907-blocked-by-set-mutations/ship.json | 354 ++++ .../test-results/boardops.trx | 1841 +++++++++++++++++ .../2907-blocked-by-set-mutations/verify.json | 865 ++++++++ .../work-model.json | 1252 +++++++++++ src/FS.GG.Coord.Cli.BoardOps/Handlers.fs | 139 +- src/FS.GG.Coord.Cli.Kernel/Options.fs | 53 +- src/FS.GG.Coord.Cli.Kernel/Options.fsi | 9 + src/FS.GG.Coord.Cli/Client.fs | 19 +- src/FS.GG.Coord.Cli/Client.fsi | 4 + src/FS.GG.Coord.Cli/LintApplication.fs | 58 + src/FS.GG.Coord.Cli/LintApplication.fsi | 5 + src/FS.GG.Coord.GitHub/Board.fs | 51 + src/FS.GG.Coord.GitHub/Board.fsi | 13 + .../BlockerLintTests.fs | 137 +- tests/coord-engine-parity/run.sh | 36 +- work/2907-blocked-by-set-mutations/charter.md | 39 + .../checklist.md | 55 + .../clarifications.md | 38 + .../evidence.yml | 416 ++++ work/2907-blocked-by-set-mutations/plan.md | 62 + work/2907-blocked-by-set-mutations/spec.md | 54 + work/2907-blocked-by-set-mutations/tasks.yml | 176 ++ .../verification/verification-evidence.md | 31 + 26 files changed, 6636 insertions(+), 23 deletions(-) create mode 100644 readiness/2907-blocked-by-set-mutations/analysis.json create mode 100644 readiness/2907-blocked-by-set-mutations/governance-handoff.json create mode 100644 readiness/2907-blocked-by-set-mutations/ship-verdict.json create mode 100644 readiness/2907-blocked-by-set-mutations/ship.json create mode 100644 readiness/2907-blocked-by-set-mutations/test-results/boardops.trx create mode 100644 readiness/2907-blocked-by-set-mutations/verify.json create mode 100644 readiness/2907-blocked-by-set-mutations/work-model.json create mode 100644 work/2907-blocked-by-set-mutations/charter.md create mode 100644 work/2907-blocked-by-set-mutations/checklist.md create mode 100644 work/2907-blocked-by-set-mutations/clarifications.md create mode 100644 work/2907-blocked-by-set-mutations/evidence.yml create mode 100644 work/2907-blocked-by-set-mutations/plan.md create mode 100644 work/2907-blocked-by-set-mutations/spec.md create mode 100644 work/2907-blocked-by-set-mutations/tasks.yml create mode 100644 work/2907-blocked-by-set-mutations/verification/verification-evidence.md diff --git a/readiness/2907-blocked-by-set-mutations/analysis.json b/readiness/2907-blocked-by-set-mutations/analysis.json new file mode 100644 index 000000000..12d61c3f0 --- /dev/null +++ b/readiness/2907-blocked-by-set-mutations/analysis.json @@ -0,0 +1,582 @@ +{ + "schemaVersion": 1, + "viewVersion": "1.0", + "workId": "2907-blocked-by-set-mutations", + "stage": "analyze", + "status": "implementationReady", + "generator": "FS.GG.SDD.Artifacts/1.1.0", + "sources": [ + { + "path": ".fsgg/agents.yml", + "kind": "agentsConfig", + "digest": { + "algorithm": "sha256", + "value": "c67035b1cf31b6fa802c10f761eeb1e5bf5d198c38d159b54fac299957b5aac3" + }, + "schemaVersion": 1, + "schemaStatus": "current" + }, + { + "path": ".fsgg/project.yml", + "kind": "projectConfig", + "digest": { + "algorithm": "sha256", + "value": "ef78f002b33ce22f738bac2c0dbf716db729a7d3ae3e4a68a4ce4b93810ced66" + }, + "schemaVersion": 1, + "schemaStatus": "current" + }, + { + "path": ".fsgg/sdd.yml", + "kind": "sddConfig", + "digest": { + "algorithm": "sha256", + "value": "fe5a7c270a975153e80ab0d08a610c9b302585dcb0b5f7c654841ceced9272cb" + }, + "schemaVersion": 1, + "schemaStatus": "current" + }, + { + "path": "work/2907-blocked-by-set-mutations/checklist.md", + "kind": "checklist", + "digest": { + "algorithm": "sha256", + "value": "2799d51aeaf8b672cd72d857c78bd907426e73a20a8b7c8cda8ea1ad2c71fe95" + }, + "schemaVersion": 1, + "schemaStatus": "current" + }, + { + "path": "work/2907-blocked-by-set-mutations/clarifications.md", + "kind": "clarification", + "digest": { + "algorithm": "sha256", + "value": "29371de9aa66598f033214d6fd42665dac6d53189f32f572cdd1327bb6537bc5" + }, + "schemaVersion": 1, + "schemaStatus": "current" + }, + { + "path": "work/2907-blocked-by-set-mutations/plan.md", + "kind": "plan", + "digest": { + "algorithm": "sha256", + "value": "243f8da1ca1d80b697dcbd4c9359371b98f08f39961ec7bb1c363424b198288d" + }, + "schemaVersion": 1, + "schemaStatus": "current" + }, + { + "path": "work/2907-blocked-by-set-mutations/spec.md", + "kind": "specification", + "digest": { + "algorithm": "sha256", + "value": "bbfc8ac46a0af4e5487e6e08af4603eb9e97d26877c78774d4f96d892930802f" + }, + "schemaVersion": 1, + "schemaStatus": "current" + }, + { + "path": "work/2907-blocked-by-set-mutations/tasks.yml", + "kind": "tasks", + "digest": { + "algorithm": "sha256", + "value": "ae85b8835c2a835841d0d3ad0afbb741d36a51b524397d083b88b34203a8c540" + }, + "schemaVersion": 1, + "schemaStatus": "current" + } + ], + "sourceRelationships": [ + { + "id": "AR001", + "sourcePath": "work/2907-blocked-by-set-mutations/checklist.md", + "targetPath": "work/2907-blocked-by-set-mutations/plan.md", + "sourceId": null, + "targetId": null, + "relationship": "planSourceChecklist", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR002", + "sourcePath": "work/2907-blocked-by-set-mutations/checklist.md", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": null, + "targetId": null, + "relationship": "taskSourceChecklist", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR003", + "sourcePath": "work/2907-blocked-by-set-mutations/clarifications.md", + "targetPath": "work/2907-blocked-by-set-mutations/checklist.md", + "sourceId": null, + "targetId": null, + "relationship": "checklistSourceClarifications", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR004", + "sourcePath": "work/2907-blocked-by-set-mutations/clarifications.md", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": "DEC-001", + "targetId": null, + "relationship": "clarificationDisposition", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR005", + "sourcePath": "work/2907-blocked-by-set-mutations/clarifications.md", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": "DEC-002", + "targetId": null, + "relationship": "clarificationDisposition", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR006", + "sourcePath": "work/2907-blocked-by-set-mutations/clarifications.md", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": "DEC-003", + "targetId": null, + "relationship": "clarificationDisposition", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR007", + "sourcePath": "work/2907-blocked-by-set-mutations/clarifications.md", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": "DEC-004", + "targetId": null, + "relationship": "clarificationDisposition", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR008", + "sourcePath": "work/2907-blocked-by-set-mutations/clarifications.md", + "targetPath": "work/2907-blocked-by-set-mutations/plan.md", + "sourceId": null, + "targetId": null, + "relationship": "planSourceClarifications", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR009", + "sourcePath": "work/2907-blocked-by-set-mutations/clarifications.md", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": null, + "targetId": null, + "relationship": "taskSourceClarifications", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR010", + "sourcePath": "work/2907-blocked-by-set-mutations/plan.md", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": "PC-001", + "targetId": null, + "relationship": "contractDisposition", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR011", + "sourcePath": "work/2907-blocked-by-set-mutations/plan.md", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": "GV-001", + "targetId": null, + "relationship": "generatedViewDisposition", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR012", + "sourcePath": "work/2907-blocked-by-set-mutations/plan.md", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": "PM-001", + "targetId": null, + "relationship": "migrationDisposition", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR013", + "sourcePath": "work/2907-blocked-by-set-mutations/plan.md", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": "PD-001", + "targetId": null, + "relationship": "planDecisionDisposition", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR014", + "sourcePath": "work/2907-blocked-by-set-mutations/plan.md", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": "PD-002", + "targetId": null, + "relationship": "planDecisionDisposition", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR015", + "sourcePath": "work/2907-blocked-by-set-mutations/plan.md", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": "PD-003", + "targetId": null, + "relationship": "planDecisionDisposition", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR016", + "sourcePath": "work/2907-blocked-by-set-mutations/plan.md", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": "PD-004", + "targetId": null, + "relationship": "planDecisionDisposition", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR017", + "sourcePath": "work/2907-blocked-by-set-mutations/plan.md", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": "PD-005", + "targetId": null, + "relationship": "planDecisionDisposition", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR018", + "sourcePath": "work/2907-blocked-by-set-mutations/plan.md", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": "PD-006", + "targetId": null, + "relationship": "planDecisionDisposition", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR019", + "sourcePath": "work/2907-blocked-by-set-mutations/plan.md", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": null, + "targetId": null, + "relationship": "taskSourcePlan", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR020", + "sourcePath": "work/2907-blocked-by-set-mutations/plan.md", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": "VO-001", + "targetId": null, + "relationship": "verificationDisposition", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR021", + "sourcePath": "work/2907-blocked-by-set-mutations/spec.md", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": "AC-001", + "targetId": null, + "relationship": "acceptanceDisposition", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR022", + "sourcePath": "work/2907-blocked-by-set-mutations/spec.md", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": "AC-002", + "targetId": null, + "relationship": "acceptanceDisposition", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR023", + "sourcePath": "work/2907-blocked-by-set-mutations/spec.md", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": "AC-003", + "targetId": null, + "relationship": "acceptanceDisposition", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR024", + "sourcePath": "work/2907-blocked-by-set-mutations/spec.md", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": "AC-004", + "targetId": null, + "relationship": "acceptanceDisposition", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR025", + "sourcePath": "work/2907-blocked-by-set-mutations/spec.md", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": "AC-005", + "targetId": null, + "relationship": "acceptanceDisposition", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR026", + "sourcePath": "work/2907-blocked-by-set-mutations/spec.md", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": "AC-006", + "targetId": null, + "relationship": "acceptanceDisposition", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR027", + "sourcePath": "work/2907-blocked-by-set-mutations/spec.md", + "targetPath": "work/2907-blocked-by-set-mutations/checklist.md", + "sourceId": null, + "targetId": null, + "relationship": "checklistSourceSpec", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR028", + "sourcePath": "work/2907-blocked-by-set-mutations/spec.md", + "targetPath": "work/2907-blocked-by-set-mutations/plan.md", + "sourceId": null, + "targetId": null, + "relationship": "planSourceSpec", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR029", + "sourcePath": "work/2907-blocked-by-set-mutations/spec.md", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": "FR-001", + "targetId": null, + "relationship": "requirementDisposition", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR030", + "sourcePath": "work/2907-blocked-by-set-mutations/spec.md", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": "FR-002", + "targetId": null, + "relationship": "requirementDisposition", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR031", + "sourcePath": "work/2907-blocked-by-set-mutations/spec.md", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": "FR-003", + "targetId": null, + "relationship": "requirementDisposition", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR032", + "sourcePath": "work/2907-blocked-by-set-mutations/spec.md", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": "FR-004", + "targetId": null, + "relationship": "requirementDisposition", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR033", + "sourcePath": "work/2907-blocked-by-set-mutations/spec.md", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": "FR-005", + "targetId": null, + "relationship": "requirementDisposition", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR034", + "sourcePath": "work/2907-blocked-by-set-mutations/spec.md", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": "FR-006", + "targetId": null, + "relationship": "requirementDisposition", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR035", + "sourcePath": "work/2907-blocked-by-set-mutations/spec.md", + "targetPath": "work/2907-blocked-by-set-mutations/clarifications.md", + "sourceId": null, + "targetId": null, + "relationship": "sourceSpec", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR036", + "sourcePath": "work/2907-blocked-by-set-mutations/spec.md", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": null, + "targetId": null, + "relationship": "taskSourceSpec", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR037", + "sourcePath": "work/2907-blocked-by-set-mutations/tasks.yml", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": "T007", + "targetId": "T001", + "relationship": "taskDependency", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR038", + "sourcePath": "work/2907-blocked-by-set-mutations/tasks.yml", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": "T008", + "targetId": "T001", + "relationship": "taskDependency", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR039", + "sourcePath": "work/2907-blocked-by-set-mutations/tasks.yml", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": "T009", + "targetId": "T001", + "relationship": "taskDependency", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR040", + "sourcePath": "work/2907-blocked-by-set-mutations/tasks.yml", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": "T010", + "targetId": "T001", + "relationship": "taskDependency", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR041", + "sourcePath": "work/2907-blocked-by-set-mutations/tasks.yml", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": "T011", + "targetId": "T001", + "relationship": "taskDependency", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR042", + "sourcePath": "work/2907-blocked-by-set-mutations/tasks.yml", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": "T012", + "targetId": "T001", + "relationship": "taskDependency", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR043", + "sourcePath": "work/2907-blocked-by-set-mutations/tasks.yml", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": "T013", + "targetId": "T001", + "relationship": "taskDependency", + "state": "current", + "diagnosticIds": [] + }, + { + "id": "AR044", + "sourcePath": "work/2907-blocked-by-set-mutations/tasks.yml", + "targetPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceId": "T014", + "targetId": "T001", + "relationship": "taskDependency", + "state": "current", + "diagnosticIds": [] + } + ], + "readiness": { + "status": "implementationReady", + "readyCount": 44, + "advisoryCount": 0, + "warningCount": 0, + "blockingCount": 0, + "staleSourceCount": 0, + "missingDispositionCount": 0, + "malformedSourceCount": 0, + "generatedViewFindingCount": 0, + "acceptedDeferralCount": 0 + }, + "findings": [], + "generatedViews": [ + { + "path": "readiness/2907-blocked-by-set-mutations/work-model.json", + "kind": "workModel", + "currency": "missing", + "diagnosticIds": [] + } + ], + "optionalBoundaryFacts": [ + { + "path": ".fsgg/policy.yml", + "relationship": "optionalGovernancePolicy", + "requiredBySdd": false, + "state": "notEvaluated", + "diagnosticIds": [] + }, + { + "path": ".fsgg/capabilities.yml", + "relationship": "optionalGovernanceCapabilities", + "requiredBySdd": false, + "state": "notEvaluated", + "diagnosticIds": [] + }, + { + "path": ".fsgg/tooling.yml", + "relationship": "optionalGovernanceTooling", + "requiredBySdd": false, + "state": "notEvaluated", + "diagnosticIds": [] + } + ], + "diagnostics": [], + "nextAction": { + "actionId": "analysis.next.implement", + "command": null, + "reason": "Lifecycle sources are current and ready for implementation." + } +} \ No newline at end of file diff --git a/readiness/2907-blocked-by-set-mutations/governance-handoff.json b/readiness/2907-blocked-by-set-mutations/governance-handoff.json new file mode 100644 index 000000000..f57f340cd --- /dev/null +++ b/readiness/2907-blocked-by-set-mutations/governance-handoff.json @@ -0,0 +1,347 @@ +{ + "schemaVersion": 1, + "contractVersion": "2.0.0", + "generatorVersion": "FS.GG.SDD.Artifacts/1.1.0", + "workId": "2907-blocked-by-set-mutations", + "sources": [ + { + "path": "readiness/2907-blocked-by-set-mutations/ship.json", + "digest": "sha256:9ca471fb0157a040ce9d3a8eee5923e4b4a99f2995e5a0868767b088301cea3b", + "schemaVersion": 1 + }, + { + "path": "readiness/2907-blocked-by-set-mutations/verify.json", + "digest": "sha256:718bb70cc3793ed97fef51c7325d39af55ff36a87739738f00e0e45524768231", + "schemaVersion": 1 + }, + { + "path": "readiness/2907-blocked-by-set-mutations/work-model.json", + "digest": "sha256:08c104ba9cc7cb958d9736e2f935a5c41bf113156a9c9f8b6d6f60f73e64def8", + "schemaVersion": 1 + } + ], + "evidence": { + "nodes": [ + { + "id": "evidence:EV001", + "state": "real", + "rationale": null + }, + { + "id": "evidence:EV002", + "state": "real", + "rationale": null + }, + { + "id": "evidence:EV003", + "state": "real", + "rationale": null + }, + { + "id": "evidence:EV004", + "state": "real", + "rationale": null + }, + { + "id": "evidence:EV005", + "state": "real", + "rationale": null + }, + { + "id": "evidence:EV006", + "state": "real", + "rationale": null + }, + { + "id": "evidence:EV007", + "state": "real", + "rationale": null + }, + { + "id": "evidence:EV008", + "state": "real", + "rationale": null + }, + { + "id": "evidence:EV009", + "state": "real", + "rationale": null + }, + { + "id": "evidence:EV010", + "state": "real", + "rationale": null + }, + { + "id": "evidence:EV011", + "state": "real", + "rationale": null + }, + { + "id": "evidence:EV012", + "state": "real", + "rationale": null + }, + { + "id": "evidence:EV013", + "state": "real", + "rationale": null + }, + { + "id": "evidence:EV014", + "state": "real", + "rationale": null + }, + { + "id": "task:T001", + "state": "pending", + "rationale": null + }, + { + "id": "task:T002", + "state": "pending", + "rationale": null + }, + { + "id": "task:T003", + "state": "pending", + "rationale": null + }, + { + "id": "task:T004", + "state": "pending", + "rationale": null + }, + { + "id": "task:T005", + "state": "pending", + "rationale": null + }, + { + "id": "task:T006", + "state": "pending", + "rationale": null + }, + { + "id": "task:T007", + "state": "pending", + "rationale": null + }, + { + "id": "task:T008", + "state": "pending", + "rationale": null + }, + { + "id": "task:T009", + "state": "pending", + "rationale": null + }, + { + "id": "task:T010", + "state": "pending", + "rationale": null + }, + { + "id": "task:T011", + "state": "pending", + "rationale": null + }, + { + "id": "task:T012", + "state": "pending", + "rationale": null + }, + { + "id": "task:T013", + "state": "pending", + "rationale": null + }, + { + "id": "task:T014", + "state": "pending", + "rationale": null + } + ], + "dependencies": [ + { + "dependent": "evidence:EV001", + "dependency": "task:T001" + }, + { + "dependent": "evidence:EV002", + "dependency": "task:T002" + }, + { + "dependent": "evidence:EV003", + "dependency": "task:T003" + }, + { + "dependent": "evidence:EV004", + "dependency": "task:T004" + }, + { + "dependent": "evidence:EV005", + "dependency": "task:T005" + }, + { + "dependent": "evidence:EV006", + "dependency": "task:T006" + }, + { + "dependent": "evidence:EV007", + "dependency": "task:T007" + }, + { + "dependent": "evidence:EV008", + "dependency": "task:T008" + }, + { + "dependent": "evidence:EV009", + "dependency": "task:T009" + }, + { + "dependent": "evidence:EV010", + "dependency": "task:T010" + }, + { + "dependent": "evidence:EV011", + "dependency": "task:T011" + }, + { + "dependent": "evidence:EV012", + "dependency": "task:T012" + }, + { + "dependent": "evidence:EV013", + "dependency": "task:T013" + }, + { + "dependent": "evidence:EV014", + "dependency": "task:T014" + }, + { + "dependent": "task:T001", + "dependency": "evidence:EV001" + }, + { + "dependent": "task:T002", + "dependency": "evidence:EV002" + }, + { + "dependent": "task:T003", + "dependency": "evidence:EV003" + }, + { + "dependent": "task:T004", + "dependency": "evidence:EV004" + }, + { + "dependent": "task:T005", + "dependency": "evidence:EV005" + }, + { + "dependent": "task:T006", + "dependency": "evidence:EV006" + }, + { + "dependent": "task:T007", + "dependency": "evidence:EV007" + }, + { + "dependent": "task:T007", + "dependency": "task:T001" + }, + { + "dependent": "task:T008", + "dependency": "evidence:EV008" + }, + { + "dependent": "task:T008", + "dependency": "task:T001" + }, + { + "dependent": "task:T009", + "dependency": "evidence:EV009" + }, + { + "dependent": "task:T009", + "dependency": "task:T001" + }, + { + "dependent": "task:T010", + "dependency": "evidence:EV010" + }, + { + "dependent": "task:T010", + "dependency": "task:T001" + }, + { + "dependent": "task:T011", + "dependency": "evidence:EV011" + }, + { + "dependent": "task:T011", + "dependency": "task:T001" + }, + { + "dependent": "task:T012", + "dependency": "evidence:EV012" + }, + { + "dependent": "task:T012", + "dependency": "task:T001" + }, + { + "dependent": "task:T013", + "dependency": "evidence:EV013" + }, + { + "dependent": "task:T013", + "dependency": "task:T001" + }, + { + "dependent": "task:T014", + "dependency": "evidence:EV014" + }, + { + "dependent": "task:T014", + "dependency": "task:T001" + } + ] + }, + "performanceEvidence": [], + "governedReferences": [], + "governanceConfig": { + "policyPresent": false, + "capabilitiesPresent": false, + "toolingPresent": false + }, + "readiness": { + "shipDisposition": "shipReady", + "verificationReadiness": "verificationReady", + "counts": { + "advisory": 0, + "warning": 0, + "blocking": 0, + "classifiedObligationsUnmet": 0, + "journeyObligationsUnmet": 0 + }, + "blockingDiagnosticIds": [], + "perViewState": [ + { + "view": "ship.json", + "state": "current" + }, + { + "view": "verify.json", + "state": "current" + }, + { + "view": "work-model.json", + "state": "current" + } + ] + }, + "diagnostics": [] +} \ No newline at end of file diff --git a/readiness/2907-blocked-by-set-mutations/ship-verdict.json b/readiness/2907-blocked-by-set-mutations/ship-verdict.json new file mode 100644 index 000000000..61d526cae --- /dev/null +++ b/readiness/2907-blocked-by-set-mutations/ship-verdict.json @@ -0,0 +1,23 @@ +{ + "schemaVersion": 1, + "viewVersion": "1.0", + "workId": "2907-blocked-by-set-mutations", + "stage": "ship", + "status": "shipReady", + "generator": "FS.GG.SDD.Artifacts/1.1.0", + "sourcesDigest": { + "algorithm": "sha256", + "value": "dd4d76e7416695822555d10d065ea8a3c3de7bf12b72438a55fecb60a9e9d893" + }, + "verificationReadiness": { + "status": "verificationReady", + "evidenceSupportedCount": 14, + "evidenceSelfAttestedCount": 0, + "evidenceObservedCount": 14 + }, + "disposition": { + "state": "shipReady", + "blockingFindingIds": [] + }, + "readiness": "shipReady" +} \ No newline at end of file diff --git a/readiness/2907-blocked-by-set-mutations/ship.json b/readiness/2907-blocked-by-set-mutations/ship.json new file mode 100644 index 000000000..90729866a --- /dev/null +++ b/readiness/2907-blocked-by-set-mutations/ship.json @@ -0,0 +1,354 @@ +{ + "schemaVersion": 1, + "viewVersion": "1.0", + "workId": "2907-blocked-by-set-mutations", + "stage": "ship", + "status": "shipReady", + "generator": "FS.GG.SDD.Artifacts/1.1.0", + "sources": [ + { + "path": ".fsgg/agents.yml", + "kind": "agentsConfig", + "digest": { + "algorithm": "sha256", + "value": "c67035b1cf31b6fa802c10f761eeb1e5bf5d198c38d159b54fac299957b5aac3" + }, + "schemaVersion": 1, + "schemaStatus": "current" + }, + { + "path": ".fsgg/project.yml", + "kind": "projectConfig", + "digest": { + "algorithm": "sha256", + "value": "ef78f002b33ce22f738bac2c0dbf716db729a7d3ae3e4a68a4ce4b93810ced66" + }, + "schemaVersion": 1, + "schemaStatus": "current" + }, + { + "path": ".fsgg/sdd.yml", + "kind": "sddConfig", + "digest": { + "algorithm": "sha256", + "value": "fe5a7c270a975153e80ab0d08a610c9b302585dcb0b5f7c654841ceced9272cb" + }, + "schemaVersion": 1, + "schemaStatus": "current" + }, + { + "path": "readiness/2907-blocked-by-set-mutations/analysis.json", + "kind": "analysis", + "digest": { + "algorithm": "sha256", + "value": "3ae6df877929bd095ea483ed27cced27a3a43bcfe0acd2c4ada8c1b5411888ad" + }, + "schemaVersion": 1, + "schemaStatus": "current" + }, + { + "path": "readiness/2907-blocked-by-set-mutations/verify.json", + "kind": "source", + "digest": { + "algorithm": "sha256", + "value": "718bb70cc3793ed97fef51c7325d39af55ff36a87739738f00e0e45524768231" + }, + "schemaVersion": 1, + "schemaStatus": "current" + }, + { + "path": "readiness/2907-blocked-by-set-mutations/work-model.json", + "kind": "workModel", + "digest": { + "algorithm": "sha256", + "value": "08c104ba9cc7cb958d9736e2f935a5c41bf113156a9c9f8b6d6f60f73e64def8" + }, + "schemaVersion": 1, + "schemaStatus": "current" + }, + { + "path": "work/2907-blocked-by-set-mutations/checklist.md", + "kind": "checklist", + "digest": { + "algorithm": "sha256", + "value": "2799d51aeaf8b672cd72d857c78bd907426e73a20a8b7c8cda8ea1ad2c71fe95" + }, + "schemaVersion": 1, + "schemaStatus": "current" + }, + { + "path": "work/2907-blocked-by-set-mutations/clarifications.md", + "kind": "clarification", + "digest": { + "algorithm": "sha256", + "value": "29371de9aa66598f033214d6fd42665dac6d53189f32f572cdd1327bb6537bc5" + }, + "schemaVersion": 1, + "schemaStatus": "current" + }, + { + "path": "work/2907-blocked-by-set-mutations/evidence.yml", + "kind": "evidence", + "digest": { + "algorithm": "sha256", + "value": "3fbbfb97ae508d3ecb66be3b6bcd5e52f9c4b15fb0f714b74139eff34343ddbe" + }, + "schemaVersion": 1, + "schemaStatus": "current" + }, + { + "path": "work/2907-blocked-by-set-mutations/plan.md", + "kind": "plan", + "digest": { + "algorithm": "sha256", + "value": "243f8da1ca1d80b697dcbd4c9359371b98f08f39961ec7bb1c363424b198288d" + }, + "schemaVersion": 1, + "schemaStatus": "current" + }, + { + "path": "work/2907-blocked-by-set-mutations/spec.md", + "kind": "specification", + "digest": { + "algorithm": "sha256", + "value": "bbfc8ac46a0af4e5487e6e08af4603eb9e97d26877c78774d4f96d892930802f" + }, + "schemaVersion": 1, + "schemaStatus": "current" + }, + { + "path": "work/2907-blocked-by-set-mutations/tasks.yml", + "kind": "tasks", + "digest": { + "algorithm": "sha256", + "value": "ae85b8835c2a835841d0d3ad0afbb741d36a51b524397d083b88b34203a8c540" + }, + "schemaVersion": 1, + "schemaStatus": "current" + } + ], + "lifecycleReadiness": { + "status": "shipReady", + "stages": [ + { + "stage": "analyze", + "status": "ready" + }, + { + "stage": "checklist", + "status": "ready" + }, + { + "stage": "clarify", + "status": "ready" + }, + { + "stage": "evidence", + "status": "ready" + }, + { + "stage": "plan", + "status": "ready" + }, + { + "stage": "specify", + "status": "ready" + }, + { + "stage": "tasks", + "status": "ready" + }, + { + "stage": "verify", + "status": "ready" + } + ] + }, + "verificationReadiness": { + "status": "verificationReady", + "blockingFindingIds": [], + "evidenceSupportedCount": 14, + "evidenceSelfAttestedCount": 0, + "evidenceObservedCount": 14, + "evidenceDeferredCount": 0, + "evidenceMissingCount": 0, + "evidenceStaleCount": 0, + "evidenceSyntheticCount": 0, + "evidenceInvalidCount": 0 + }, + "evidenceDispositions": [ + { + "id": "ED-EV001", + "obligationId": "EV001", + "state": "supported", + "observed": true, + "severity": "ready", + "diagnosticIds": [] + }, + { + "id": "ED-EV002", + "obligationId": "EV002", + "state": "supported", + "observed": true, + "severity": "ready", + "diagnosticIds": [] + }, + { + "id": "ED-EV003", + "obligationId": "EV003", + "state": "supported", + "observed": true, + "severity": "ready", + "diagnosticIds": [] + }, + { + "id": "ED-EV004", + "obligationId": "EV004", + "state": "supported", + "observed": true, + "severity": "ready", + "diagnosticIds": [] + }, + { + "id": "ED-EV005", + "obligationId": "EV005", + "state": "supported", + "observed": true, + "severity": "ready", + "diagnosticIds": [] + }, + { + "id": "ED-EV006", + "obligationId": "EV006", + "state": "supported", + "observed": true, + "severity": "ready", + "diagnosticIds": [] + }, + { + "id": "ED-EV007", + "obligationId": "EV007", + "state": "supported", + "observed": true, + "severity": "ready", + "diagnosticIds": [] + }, + { + "id": "ED-EV008", + "obligationId": "EV008", + "state": "supported", + "observed": true, + "severity": "ready", + "diagnosticIds": [] + }, + { + "id": "ED-EV009", + "obligationId": "EV009", + "state": "supported", + "observed": true, + "severity": "ready", + "diagnosticIds": [] + }, + { + "id": "ED-EV010", + "obligationId": "EV010", + "state": "supported", + "observed": true, + "severity": "ready", + "diagnosticIds": [] + }, + { + "id": "ED-EV011", + "obligationId": "EV011", + "state": "supported", + "observed": true, + "severity": "ready", + "diagnosticIds": [] + }, + { + "id": "ED-EV012", + "obligationId": "EV012", + "state": "supported", + "observed": true, + "severity": "ready", + "diagnosticIds": [] + }, + { + "id": "ED-EV013", + "obligationId": "EV013", + "state": "supported", + "observed": true, + "severity": "ready", + "diagnosticIds": [] + }, + { + "id": "ED-EV014", + "obligationId": "EV014", + "state": "supported", + "observed": true, + "severity": "ready", + "diagnosticIds": [] + } + ], + "generatedViews": [ + { + "path": "readiness/2907-blocked-by-set-mutations/analysis.json", + "kind": "analysis", + "currency": "current", + "diagnosticIds": [] + }, + { + "path": "readiness/2907-blocked-by-set-mutations/verify.json", + "kind": "verification", + "currency": "current", + "diagnosticIds": [] + }, + { + "path": "readiness/2907-blocked-by-set-mutations/work-model.json", + "kind": "workModel", + "currency": "current", + "diagnosticIds": [] + } + ], + "disposition": { + "state": "shipReady", + "blockingFindingIds": [], + "warningFindingIds": [], + "advisoryFindingIds": [], + "contributingStages": [], + "classifiedObligationsUnmetCount": 0, + "journeyObligationsUnmetCount": 0, + "correction": "" + }, + "findings": [], + "governanceCompatibility": [ + { + "path": ".fsgg/policy.yml", + "relationship": "optionalGovernancePolicy", + "requiredBySdd": false, + "state": "notEvaluated", + "diagnosticIds": [] + }, + { + "path": ".fsgg/capabilities.yml", + "relationship": "optionalGovernanceCapabilities", + "requiredBySdd": false, + "state": "notEvaluated", + "diagnosticIds": [] + }, + { + "path": ".fsgg/tooling.yml", + "relationship": "optionalGovernanceTooling", + "requiredBySdd": false, + "state": "notEvaluated", + "diagnosticIds": [] + } + ], + "diagnostics": [], + "readiness": "shipReady", + "nextAction": { + "actionId": "ship.next.protectedBoundary", + "command": null, + "reason": "Ship readiness is current and ready for the protected-boundary handoff." + } +} \ No newline at end of file diff --git a/readiness/2907-blocked-by-set-mutations/test-results/boardops.trx b/readiness/2907-blocked-by-set-mutations/test-results/boardops.trx new file mode 100644 index 000000000..2741c70a1 --- /dev/null +++ b/readiness/2907-blocked-by-set-mutations/test-results/boardops.trx @@ -0,0 +1,1841 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v3.1.5+1b188a7b0a (64-bit .NET 10.0.10) +[xUnit.net 00:00:00.06] Discovering: FS.GG.Coord.Cli.BoardOps.Tests +[xUnit.net 00:00:00.09] Discovered: FS.GG.Coord.Cli.BoardOps.Tests +[xUnit.net 00:00:00.12] Starting: FS.GG.Coord.Cli.BoardOps.Tests +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-be8a179582154cb2a0a8fcffd3e1afee — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-be8a179582154cb2a0a8fcffd3e1afee — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-330f610e75cd48fdb49e0593362975de — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-330f610e75cd48fdb49e0593362975de — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-d4ee25ce4e144b6a9bdbb5dfb76b4224 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-d4ee25ce4e144b6a9bdbb5dfb76b4224 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-90977e1632f048908d403a6e174eb25e — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-90977e1632f048908d403a6e174eb25e — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-0b314e3bb3d946b381f02c654a64a6ba — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-0b314e3bb3d946b381f02c654a64a6ba — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-6a12f67098a94bae917f3f04d5558d71 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-6a12f67098a94bae917f3f04d5558d71 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-dd764a6143a246ce8da448b275fb4f63 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-dd764a6143a246ce8da448b275fb4f63 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-bc9f322c545347ecbee3723e958d7041 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-bc9f322c545347ecbee3723e958d7041 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-09376b7b1e384f999ae9ea8816a0d530 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-09376b7b1e384f999ae9ea8816a0d530 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-0d76bf02c98c4c0a8036f699fdc41f8c — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-0d76bf02c98c4c0a8036f699fdc41f8c — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-b7e906e61ce2440489cc64ea678cf443 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-b7e906e61ce2440489cc64ea678cf443 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: vole-418 does not hold FS.GG.SDD#42 — nothing to release. +fsgg-coord-engine: Status=Blocked refuses an incoherent park (.github#2079). +fsgg-coord-engine: set-field --batch refuses: this call clears 'Blocked by' in the SAME batch as 'Status=Blocked' — the row would land with an EMPTY field and no 'Blocked on: human/...' sentinel (.github#2079). Pair 'Status=Blocked' with a non-empty 'Blocked by=<refs>' instead, or record a human park first: add a body line 'Blocked on: human/decision' or 'Blocked on: human/action'. Nothing written. +fsgg-coord-engine: set-field --batch refuses: this call clears 'Blocked by' in the SAME batch as 'Status=Blocked' — the row would land with an EMPTY field and no 'Blocked on: human/...' sentinel (.github#2079). Pair 'Status=Blocked' with a non-empty 'Blocked by=<refs>' instead, or record a human park first: add a body line 'Blocked on: human/decision' or 'Blocked on: human/action'. Nothing written. +fsgg-coord-engine: Status=Blocked refuses an incoherent park (.github#2079). +fsgg-coord-engine: vole-418 does not hold FS.GG.SDD#42 — nothing to release. +fsgg-coord-engine: intake apply partially completed draft 'tx-2134': issue FS-GG/.github#88 already exists; board projection is incomplete. Retry this corrected draft with the same id to resume without another issue-create POST. +fsgg-coord-engine: not found: stop after reuse binding. The server said so — this is an absence, not a failed read. +fsgg-coord-engine: intake apply partially completed draft 'tx-2134': issue FS-GG/.github#77 already exists; board projection is incomplete. Retry this corrected draft with the same id to resume without another issue-create POST. +fsgg-coord-engine: not found: stop after intent recovery. The server said so — this is an absence, not a failed read. +fsgg-coord-engine: intake apply partially completed draft 'tx-2134': issue FS-GG/.github#77 already exists; board projection is incomplete. Retry this corrected draft with the same id to resume without another issue-create POST. +fsgg-coord-engine: not found: interrupted after persisted create. The server said so — this is an absence, not a failed read. +fsgg-coord-engine: intake apply partially completed draft 'tx-2134': issue FS-GG/.github#77 already exists; board projection is incomplete. Retry this corrected draft with the same id to resume without another issue-create POST. +fsgg-coord-engine: not found: stop after recovered receipt. The server said so — this is an absence, not a failed read. +fsgg-coord-engine: malformed response reading tx-2134: a duplicate candidate matches the title; select reuse or revise the draft. That is a FAILED READ, not an empty answer — refusing to decide from it. +fsgg-coord-engine: malformed response reading tx-2134: a duplicate candidate matches the title; select reuse or revise the draft. That is a FAILED READ, not an empty answer — refusing to decide from it. +fsgg-coord-engine: intake apply partially completed draft 'ready-2134': issue FS-GG/.github#88 already exists; board projection is incomplete. Retry this corrected draft with the same id to resume without another issue-create POST. +fsgg-coord-engine: malformed response reading ready-2134: Ready is refused while the reused/live issue still declares a human choice. That is a FAILED READ, not an empty answer — refusing to decide from it. +{"schema":"fsgg.coord.intake-result/v1","kind":"applied","draftId":"tx-2134","issue":"FS-GG/.github#77","issueUrl":"https://github.com/FS-GG/.github/issues/77","dedupeDisposition":"create","board":{"owner":"FS-GG","title":"Coordination","number":1,"id":"PVT"},"status":"Backlog","fields":["Status","Class","Severity"],"projectionFresh":true,"pendingWrites":0,"judgementQuestion":null} +{"schema":"fsgg.coord.intake-result/v1","kind":"applied","draftId":"tx-2134","issue":"FS-GG/.github#77","issueUrl":"https://github.com/FS-GG/.github/issues/77","dedupeDisposition":"create","board":{"owner":"FS-GG","title":"Coordination","number":1,"id":"PVT"},"status":"Backlog","fields":["Status","Class","Severity"],"projectionFresh":true,"pendingWrites":0,"judgementQuestion":null} +fsgg-coord-engine: malformed response reading blocked-2134: Blocked dependency FS-GG/.github#42 is already resolved. That is a FAILED READ, not an empty answer — refusing to decide from it. +{"schema":"fsgg.coord.intake-result/v1","kind":"applied","draftId":"tx-2134","issue":"FS-GG/.github#77","issueUrl":"https://github.com/FS-GG/.github/issues/77","dedupeDisposition":"create","board":{"owner":"FS-GG","title":"Coordination","number":1,"id":"PVT"},"status":"Backlog","fields":["Status","Class"],"projectionFresh":true,"pendingWrites":0,"judgementQuestion":null} +{"schema":"fsgg.coord.intake-result/v1","kind":"applied","draftId":"tx-2134","issue":"FS-GG/.github#77","issueUrl":"https://github.com/FS-GG/.github/issues/77","dedupeDisposition":"create","board":{"owner":"FS-GG","title":"Coordination","number":1,"id":"PVT"},"status":"Backlog","fields":["Status","Class"],"projectionFresh":true,"pendingWrites":0,"judgementQuestion":null} +{"schema":"fsgg.coord.intake-result/v1","kind":"applied","draftId":"tx-2134","issue":"FS-GG/.github#77","issueUrl":"https://github.com/FS-GG/.github/issues/77","dedupeDisposition":"create","board":{"owner":"FS-GG","title":"Coordination","number":1,"id":"PVT"},"status":"Backlog","fields":["Status","Class"],"projectionFresh":true,"pendingWrites":0,"judgementQuestion":null} +fsgg-coord-engine: malformed response reading tx-2134: a duplicate candidate matches the title; select reuse or revise the draft. That is a FAILED READ, not an empty answer — refusing to decide from it. +fsgg-coord-engine: intake apply partially completed draft 'tx-2134': issue FS-GG/.github#77 already exists; board projection is incomplete. Retry this corrected draft with the same id to resume without another issue-create POST. +fsgg-coord-engine: not found: stop after legacy intent recovery. The server said so — this is an absence, not a failed read. +fsgg-coord-engine: malformed response reading tx-2134: intake receipt '/tmp/fsgg-intake-aafa8b46863b45ef8de2b3148936e381/intake-tx-2134.json' is unreadable: 'not-json' is an invalid JSON literal. Expected the literal 'null'. LineNumber: 0 | BytePositionInLine: 1.. That is a FAILED READ, not an empty answer — refusing to decide from it. +fsgg-coord-engine: malformed response reading tx-2134: intake receipt '/tmp/fsgg-intake-aafa8b46863b45ef8de2b3148936e381/intake-tx-2134.json' is unreadable: The given key was not present in the dictionary.. That is a FAILED READ, not an empty answer — refusing to decide from it. +paths paths do not exist in target repository FS-GG/.github: definitely/not/a/live/path-2134 +fsgg-coord-engine: intake apply partially completed draft 'tx-2134': issue FS-GG/.github#77 already exists; board projection is incomplete. Retry this corrected draft with the same id to resume without another issue-create POST. +fsgg-coord-engine: not found: stop after receipt recovery. The server said so — this is an absence, not a failed read. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-0f04c5e22f21432ba2f432bf0cfd9a4e — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +considered 3 candidate(s) — this is a measured count, not an assumption. + FS.GG.SDD#74 — Status is In progress + FS.GG.SDD#75 — Status is Blocked + FS.GG.SDD#76 — overlaps in-flight work held by otter-9c21 on FS.GG.SDD#75 (lease EXPIRED — reapable): src/Shared.fs ⇄ src/Shared.fs +this queue is BUSY, not empty. +1 item(s) are QUEUED BEHIND LIVE CLAIMS held by: otter-9c21 + soonest: lease EXPIRED — reapable + 1 of those lease(s) have EXPIRED — collect them: scripts/fsgg-coord reap --repo FS.GG.SDD --apply +wave occupancy: unavailable (no drive-board or work-board host-loop document exists) +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-ceb3cf170b2740baa7171d6b74ebadbd — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-ceb3cf170b2740baa7171d6b74ebadbd — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-dc49b74c343f476fa8717c5162c831ea — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-dc49b74c343f476fa8717c5162c831ea — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-684b52bd6400464f87e2c8ee2d56d2df — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-684b52bd6400464f87e2c8ee2d56d2df — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-1c3dab513da84de6be493ce25e118424 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-1c3dab513da84de6be493ce25e118424 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-efedc78994e34dde849601928599ba8d — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +considered 3 candidate(s) — this is a measured count, not an assumption. + FS.GG.SDD#74 — Status is In progress + FS.GG.SDD#75 — Status is In progress + FS.GG.SDD#76 — overlaps FS.GG.SDD#75, which the board says is In progress with NO claim marker (someone is working outside the protocol — there is no lease to wait out; see: scripts/fsgg-coord who): src/Shared.fs ⇄ src/Shared.fs +wave occupancy: unavailable (no drive-board or work-board host-loop document exists) +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-5a3685165e1449c39d8aba300f3c87f6 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-5a3685165e1449c39d8aba300f3c87f6 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-6f0894cfc6244aeea080591483b5849a — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-6f0894cfc6244aeea080591483b5849a — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-099c456fa89145808df8cd41085a30f4 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-099c456fa89145808df8cd41085a30f4 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-cba53d178fd3424da6e3ebf2e6f2f083 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-cba53d178fd3424da6e3ebf2e6f2f083 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-9deb853c368845538a38dbe8f340cb1d — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-9deb853c368845538a38dbe8f340cb1d — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-82497f9bf1f2490fb72e41bdb7dced92 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-82497f9bf1f2490fb72e41bdb7dced92 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-a065a1a7223f404a91a0ff51f8db4700 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-a065a1a7223f404a91a0ff51f8db4700 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-4e8832e1b7f44d8b8748c9f1f8aaee5f — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-4e8832e1b7f44d8b8748c9f1f8aaee5f — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-3b68cb791340476191700b291d287856 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-3b68cb791340476191700b291d287856 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-9d5e9f254b1c4c948bf9c26a7295c184 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-9d5e9f254b1c4c948bf9c26a7295c184 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-2ada873b7b9f43939cfed44e7235f34e — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-2ada873b7b9f43939cfed44e7235f34e — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-5a445cdb2b764d0bb228f7639f0be87f — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-5a445cdb2b764d0bb228f7639f0be87f — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-dff106ba513449178af1ef8ced6e73a9 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-dff106ba513449178af1ef8ced6e73a9 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-5048548bb7074eac9fc7297327103748 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-5048548bb7074eac9fc7297327103748 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-331323c9b0bb4159a84d959a2029dda7 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-331323c9b0bb4159a84d959a2029dda7 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-e07dc4a8a0024001a902ce42b0588f0e — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-e07dc4a8a0024001a902ce42b0588f0e — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-b6dcf331a9574fdfbd607e28d597771a — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-b6dcf331a9574fdfbd607e28d597771a — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +LIVE-CLAIM: worker ghost-777, FS.GG.SDD#42 is open and claimed by other-123; queue retained. +UNKNOWN: could not record disposition for FS.GG.SDD#42: not found: the notice could not be posted. The server said so — this is an absence, not a failed read.. Queue retained. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-8ac4c01449fa4788a18b763f98d1ffcf — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-8ac4c01449fa4788a18b763f98d1ffcf — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-61401b26b37e4d1f90ae6532cbdbad55 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-61401b26b37e4d1f90ae6532cbdbad55 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-b0eadcb0f5ab4f7795b039d2068dd223 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-b0eadcb0f5ab4f7795b039d2068dd223 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-a6a182dfd46a4ebd9df2b150c320b992 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +considered 3 candidate(s) — this is a measured count, not an assumption. + FS.GG.SDD#74 — Status is In progress + FS.GG.SDD#75 — the issue is closed (the board column says In review; /check-board reconciles it) + FS.GG.SDD#76 — overlaps in-flight work held by curlew-8afd on FS.GG.SDD#75 (lease frees in ~120m): src/Shared.fs ⇄ src/Shared.fs +this queue is BUSY, not empty. +1 item(s) are QUEUED BEHIND LIVE CLAIMS held by: curlew-8afd + soonest: lease frees in ~120m +wave occupancy: unavailable (no drive-board or work-board host-loop document exists) +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-7b4268694fd44ee8b05a4150ca9a7a6d — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-7b4268694fd44ee8b05a4150ca9a7a6d — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker curlew-8afd) + src/Shared.fs + notified worker curlew-8afd on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-d22aa1cd14df410d8f3c741abbc5d8a9 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-d22aa1cd14df410d8f3c741abbc5d8a9 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-6f92a6d4b68a4fc996f402ab3c28faa5 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-6f92a6d4b68a4fc996f402ab3c28faa5 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-5b75a245a1744c05a61a336aed5f76dc — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-5b75a245a1744c05a61a336aed5f76dc — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-9c77a63c0a7a4d05a1e9821242c864ca — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-9c77a63c0a7a4d05a1e9821242c864ca — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + could NOT notify worker otter-9c21 on FS.GG.SDD#75: not found: the notice could not be posted. The server said so — this is an absence, not a failed read. +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-7b67c99f22bb47efb50a1c5cc159310a — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-7b67c99f22bb47efb50a1c5cc159310a — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + could NOT notify worker otter-9c21 on FS.GG.SDD#75: not found: the notice could not be posted. The server said so — this is an absence, not a failed read. +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-0be22cfa4d2d4126aa033ff76cce66c5 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-0be22cfa4d2d4126aa033ff76cce66c5 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-67693fd76c684f729893aa0f113b6fbe — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-67693fd76c684f729893aa0f113b6fbe — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-50b8086babda4cc7b0e6aac0a28ec8ce — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. + FS.GG.SDD#74 — Status is In progress + FS.GG.SDD#75 — Status is Blocked +wave occupancy: unavailable (no drive-board or work-board host-loop document exists) +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-ad2099cefce4494ca7ac9a6211613413 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-ad2099cefce4494ca7ac9a6211613413 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-470d4f27a9ba469b962540a60387e1bb — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-470d4f27a9ba469b962540a60387e1bb — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-765e0eaeddd1418ab52029a20a3e7e61 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-765e0eaeddd1418ab52029a20a3e7e61 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-c5caa75e06314daeb95ffe34a99e58c1 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-c5caa75e06314daeb95ffe34a99e58c1 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-43f4bbddaa6342f7a376290eb8d37ce0 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-43f4bbddaa6342f7a376290eb8d37ce0 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-43f4bbddaa6342f7a376290eb8d37ce0 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-43f4bbddaa6342f7a376290eb8d37ce0 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +[xUnit.net 00:00:01.33] Finished: FS.GG.Coord.Cli.BoardOps.Tests + + + + \ No newline at end of file diff --git a/readiness/2907-blocked-by-set-mutations/verify.json b/readiness/2907-blocked-by-set-mutations/verify.json new file mode 100644 index 000000000..03424976f --- /dev/null +++ b/readiness/2907-blocked-by-set-mutations/verify.json @@ -0,0 +1,865 @@ +{ + "schemaVersion": 1, + "viewVersion": "1.0", + "workId": "2907-blocked-by-set-mutations", + "stage": "verify", + "status": "verificationReady", + "generator": "FS.GG.SDD.Artifacts/1.1.0", + "sources": [ + { + "path": ".fsgg/agents.yml", + "kind": "agentsConfig", + "digest": { + "algorithm": "sha256", + "value": "c67035b1cf31b6fa802c10f761eeb1e5bf5d198c38d159b54fac299957b5aac3" + }, + "schemaVersion": 1, + "schemaStatus": "current" + }, + { + "path": ".fsgg/project.yml", + "kind": "projectConfig", + "digest": { + "algorithm": "sha256", + "value": "ef78f002b33ce22f738bac2c0dbf716db729a7d3ae3e4a68a4ce4b93810ced66" + }, + "schemaVersion": 1, + "schemaStatus": "current" + }, + { + "path": ".fsgg/sdd.yml", + "kind": "sddConfig", + "digest": { + "algorithm": "sha256", + "value": "fe5a7c270a975153e80ab0d08a610c9b302585dcb0b5f7c654841ceced9272cb" + }, + "schemaVersion": 1, + "schemaStatus": "current" + }, + { + "path": "readiness/2907-blocked-by-set-mutations/analysis.json", + "kind": "analysis", + "digest": { + "algorithm": "sha256", + "value": "3ae6df877929bd095ea483ed27cced27a3a43bcfe0acd2c4ada8c1b5411888ad" + }, + "schemaVersion": 1, + "schemaStatus": "current" + }, + { + "path": "readiness/2907-blocked-by-set-mutations/work-model.json", + "kind": "workModel", + "digest": { + "algorithm": "sha256", + "value": "08c104ba9cc7cb958d9736e2f935a5c41bf113156a9c9f8b6d6f60f73e64def8" + }, + "schemaVersion": 1, + "schemaStatus": "current" + }, + { + "path": "work/2907-blocked-by-set-mutations/checklist.md", + "kind": "checklist", + "digest": { + "algorithm": "sha256", + "value": "2799d51aeaf8b672cd72d857c78bd907426e73a20a8b7c8cda8ea1ad2c71fe95" + }, + "schemaVersion": 1, + "schemaStatus": "current" + }, + { + "path": "work/2907-blocked-by-set-mutations/clarifications.md", + "kind": "clarification", + "digest": { + "algorithm": "sha256", + "value": "29371de9aa66598f033214d6fd42665dac6d53189f32f572cdd1327bb6537bc5" + }, + "schemaVersion": 1, + "schemaStatus": "current" + }, + { + "path": "work/2907-blocked-by-set-mutations/evidence.yml", + "kind": "evidence", + "digest": { + "algorithm": "sha256", + "value": "3fbbfb97ae508d3ecb66be3b6bcd5e52f9c4b15fb0f714b74139eff34343ddbe" + }, + "schemaVersion": 1, + "schemaStatus": "current" + }, + { + "path": "work/2907-blocked-by-set-mutations/plan.md", + "kind": "plan", + "digest": { + "algorithm": "sha256", + "value": "243f8da1ca1d80b697dcbd4c9359371b98f08f39961ec7bb1c363424b198288d" + }, + "schemaVersion": 1, + "schemaStatus": "current" + }, + { + "path": "work/2907-blocked-by-set-mutations/spec.md", + "kind": "specification", + "digest": { + "algorithm": "sha256", + "value": "bbfc8ac46a0af4e5487e6e08af4603eb9e97d26877c78774d4f96d892930802f" + }, + "schemaVersion": 1, + "schemaStatus": "current" + }, + { + "path": "work/2907-blocked-by-set-mutations/tasks.yml", + "kind": "tasks", + "digest": { + "algorithm": "sha256", + "value": "ae85b8835c2a835841d0d3ad0afbb741d36a51b524397d083b88b34203a8c540" + }, + "schemaVersion": 1, + "schemaStatus": "current" + } + ], + "lifecycleReadiness": { + "status": "implementationReady", + "stages": [ + { + "stage": "analyze", + "status": "implementationReady" + }, + { + "stage": "checklist", + "status": "current" + }, + { + "stage": "clarify", + "status": "current" + }, + { + "stage": "evidence", + "status": "evidenceReady" + }, + { + "stage": "plan", + "status": "current" + }, + { + "stage": "specify", + "status": "current" + }, + { + "stage": "tasks", + "status": "current" + } + ] + }, + "taskGraph": { + "taskCount": 14, + "dependencyCount": 8, + "dependenciesValid": true, + "statusesValid": true, + "findingIds": [] + }, + "evidenceDispositions": [ + { + "id": "ED-EV001", + "obligationId": "EV001", + "state": "supported", + "observed": true, + "classifiedRequirement": false, + "journeyRequirement": false, + "recordRequirement": false, + "evidenceIds": [ + "EV001" + ], + "affectedTaskIds": [ + "T001" + ], + "affectedSourceIds": [ + "AC-001", + "FR-001", + "PD-001" + ], + "severity": "ready", + "diagnosticIds": [], + "correction": "" + }, + { + "id": "ED-EV002", + "obligationId": "EV002", + "state": "supported", + "observed": true, + "classifiedRequirement": false, + "journeyRequirement": false, + "recordRequirement": false, + "evidenceIds": [ + "EV002" + ], + "affectedTaskIds": [ + "T002" + ], + "affectedSourceIds": [ + "AC-002", + "FR-002", + "PD-002" + ], + "severity": "ready", + "diagnosticIds": [], + "correction": "" + }, + { + "id": "ED-EV003", + "obligationId": "EV003", + "state": "supported", + "observed": true, + "classifiedRequirement": false, + "journeyRequirement": false, + "recordRequirement": false, + "evidenceIds": [ + "EV003" + ], + "affectedTaskIds": [ + "T003" + ], + "affectedSourceIds": [ + "AC-001", + "AC-002", + "AC-003", + "FR-003", + "PD-003" + ], + "severity": "ready", + "diagnosticIds": [], + "correction": "" + }, + { + "id": "ED-EV004", + "obligationId": "EV004", + "state": "supported", + "observed": true, + "classifiedRequirement": false, + "journeyRequirement": false, + "recordRequirement": false, + "evidenceIds": [ + "EV004" + ], + "affectedTaskIds": [ + "T004" + ], + "affectedSourceIds": [ + "AC-004", + "FR-004", + "PD-004" + ], + "severity": "ready", + "diagnosticIds": [], + "correction": "" + }, + { + "id": "ED-EV005", + "obligationId": "EV005", + "state": "supported", + "observed": true, + "classifiedRequirement": false, + "journeyRequirement": false, + "recordRequirement": false, + "evidenceIds": [ + "EV005" + ], + "affectedTaskIds": [ + "T005" + ], + "affectedSourceIds": [ + "AC-005", + "FR-005", + "PD-005" + ], + "severity": "ready", + "diagnosticIds": [], + "correction": "" + }, + { + "id": "ED-EV006", + "obligationId": "EV006", + "state": "supported", + "observed": true, + "classifiedRequirement": false, + "journeyRequirement": false, + "recordRequirement": false, + "evidenceIds": [ + "EV006" + ], + "affectedTaskIds": [ + "T006" + ], + "affectedSourceIds": [ + "AC-006", + "FR-006", + "PD-006" + ], + "severity": "ready", + "diagnosticIds": [], + "correction": "" + }, + { + "id": "ED-EV007", + "obligationId": "EV007", + "state": "supported", + "observed": true, + "classifiedRequirement": false, + "journeyRequirement": false, + "recordRequirement": false, + "evidenceIds": [ + "EV007" + ], + "affectedTaskIds": [ + "T007" + ], + "affectedSourceIds": [ + "DEC-001" + ], + "severity": "ready", + "diagnosticIds": [], + "correction": "" + }, + { + "id": "ED-EV008", + "obligationId": "EV008", + "state": "supported", + "observed": true, + "classifiedRequirement": false, + "journeyRequirement": false, + "recordRequirement": false, + "evidenceIds": [ + "EV008" + ], + "affectedTaskIds": [ + "T008" + ], + "affectedSourceIds": [ + "DEC-002" + ], + "severity": "ready", + "diagnosticIds": [], + "correction": "" + }, + { + "id": "ED-EV009", + "obligationId": "EV009", + "state": "supported", + "observed": true, + "classifiedRequirement": false, + "journeyRequirement": false, + "recordRequirement": false, + "evidenceIds": [ + "EV009" + ], + "affectedTaskIds": [ + "T009" + ], + "affectedSourceIds": [ + "DEC-003" + ], + "severity": "ready", + "diagnosticIds": [], + "correction": "" + }, + { + "id": "ED-EV010", + "obligationId": "EV010", + "state": "supported", + "observed": true, + "classifiedRequirement": false, + "journeyRequirement": false, + "recordRequirement": false, + "evidenceIds": [ + "EV010" + ], + "affectedTaskIds": [ + "T010" + ], + "affectedSourceIds": [ + "DEC-004" + ], + "severity": "ready", + "diagnosticIds": [], + "correction": "" + }, + { + "id": "ED-EV011", + "obligationId": "EV011", + "state": "supported", + "observed": true, + "classifiedRequirement": false, + "journeyRequirement": false, + "recordRequirement": false, + "evidenceIds": [ + "EV011" + ], + "affectedTaskIds": [ + "T011" + ], + "affectedSourceIds": [ + "PC-001", + "PD-001", + "PD-004" + ], + "severity": "ready", + "diagnosticIds": [], + "correction": "" + }, + { + "id": "ED-EV012", + "obligationId": "EV012", + "state": "supported", + "observed": true, + "classifiedRequirement": false, + "journeyRequirement": false, + "recordRequirement": false, + "evidenceIds": [ + "EV012" + ], + "affectedTaskIds": [ + "T012" + ], + "affectedSourceIds": [ + "PC-001", + "PD-001", + "PD-002", + "PD-003", + "PD-004", + "PD-005", + "PD-006", + "VO-001" + ], + "severity": "ready", + "diagnosticIds": [], + "correction": "" + }, + { + "id": "ED-EV013", + "obligationId": "EV013", + "state": "supported", + "observed": true, + "classifiedRequirement": false, + "journeyRequirement": false, + "recordRequirement": false, + "evidenceIds": [ + "EV013" + ], + "affectedTaskIds": [ + "T013" + ], + "affectedSourceIds": [ + "PC-001", + "PM-001" + ], + "severity": "ready", + "diagnosticIds": [], + "correction": "" + }, + { + "id": "ED-EV014", + "obligationId": "EV014", + "state": "supported", + "observed": true, + "classifiedRequirement": false, + "journeyRequirement": false, + "recordRequirement": false, + "evidenceIds": [ + "EV014" + ], + "affectedTaskIds": [ + "T014" + ], + "affectedSourceIds": [ + "GV-001", + "PD-001" + ], + "severity": "ready", + "diagnosticIds": [], + "correction": "" + } + ], + "testDispositions": [ + { + "id": "TD-EV001", + "obligationId": "EV001", + "state": "satisfied", + "observed": true, + "recordRequirement": false, + "evidenceIds": [ + "EV001" + ], + "affectedTaskIds": [ + "T001" + ], + "affectedRequirementIds": [ + "FR-001" + ], + "severity": "ready", + "diagnosticIds": [], + "correction": "" + }, + { + "id": "TD-EV002", + "obligationId": "EV002", + "state": "satisfied", + "observed": true, + "recordRequirement": false, + "evidenceIds": [ + "EV002" + ], + "affectedTaskIds": [ + "T002" + ], + "affectedRequirementIds": [ + "FR-002" + ], + "severity": "ready", + "diagnosticIds": [], + "correction": "" + }, + { + "id": "TD-EV003", + "obligationId": "EV003", + "state": "satisfied", + "observed": true, + "recordRequirement": false, + "evidenceIds": [ + "EV003" + ], + "affectedTaskIds": [ + "T003" + ], + "affectedRequirementIds": [ + "FR-003" + ], + "severity": "ready", + "diagnosticIds": [], + "correction": "" + }, + { + "id": "TD-EV004", + "obligationId": "EV004", + "state": "satisfied", + "observed": true, + "recordRequirement": false, + "evidenceIds": [ + "EV004" + ], + "affectedTaskIds": [ + "T004" + ], + "affectedRequirementIds": [ + "FR-004" + ], + "severity": "ready", + "diagnosticIds": [], + "correction": "" + }, + { + "id": "TD-EV005", + "obligationId": "EV005", + "state": "satisfied", + "observed": true, + "recordRequirement": false, + "evidenceIds": [ + "EV005" + ], + "affectedTaskIds": [ + "T005" + ], + "affectedRequirementIds": [ + "FR-005" + ], + "severity": "ready", + "diagnosticIds": [], + "correction": "" + }, + { + "id": "TD-EV006", + "obligationId": "EV006", + "state": "satisfied", + "observed": true, + "recordRequirement": false, + "evidenceIds": [ + "EV006" + ], + "affectedTaskIds": [ + "T006" + ], + "affectedRequirementIds": [ + "FR-006" + ], + "severity": "ready", + "diagnosticIds": [], + "correction": "" + }, + { + "id": "TD-EV007", + "obligationId": "EV007", + "state": "satisfied", + "observed": true, + "recordRequirement": false, + "evidenceIds": [ + "EV007" + ], + "affectedTaskIds": [ + "T007" + ], + "affectedRequirementIds": [], + "severity": "ready", + "diagnosticIds": [], + "correction": "" + }, + { + "id": "TD-EV008", + "obligationId": "EV008", + "state": "satisfied", + "observed": true, + "recordRequirement": false, + "evidenceIds": [ + "EV008" + ], + "affectedTaskIds": [ + "T008" + ], + "affectedRequirementIds": [], + "severity": "ready", + "diagnosticIds": [], + "correction": "" + }, + { + "id": "TD-EV009", + "obligationId": "EV009", + "state": "satisfied", + "observed": true, + "recordRequirement": false, + "evidenceIds": [ + "EV009" + ], + "affectedTaskIds": [ + "T009" + ], + "affectedRequirementIds": [], + "severity": "ready", + "diagnosticIds": [], + "correction": "" + }, + { + "id": "TD-EV010", + "obligationId": "EV010", + "state": "satisfied", + "observed": true, + "recordRequirement": false, + "evidenceIds": [ + "EV010" + ], + "affectedTaskIds": [ + "T010" + ], + "affectedRequirementIds": [], + "severity": "ready", + "diagnosticIds": [], + "correction": "" + }, + { + "id": "TD-EV011", + "obligationId": "EV011", + "state": "satisfied", + "observed": true, + "recordRequirement": false, + "evidenceIds": [ + "EV011" + ], + "affectedTaskIds": [ + "T011" + ], + "affectedRequirementIds": [], + "severity": "ready", + "diagnosticIds": [], + "correction": "" + }, + { + "id": "TD-EV012", + "obligationId": "EV012", + "state": "satisfied", + "observed": true, + "recordRequirement": false, + "evidenceIds": [ + "EV012" + ], + "affectedTaskIds": [ + "T012" + ], + "affectedRequirementIds": [], + "severity": "ready", + "diagnosticIds": [], + "correction": "" + }, + { + "id": "TD-EV013", + "obligationId": "EV013", + "state": "satisfied", + "observed": true, + "recordRequirement": false, + "evidenceIds": [ + "EV013" + ], + "affectedTaskIds": [ + "T013" + ], + "affectedRequirementIds": [], + "severity": "ready", + "diagnosticIds": [], + "correction": "" + }, + { + "id": "TD-EV014", + "obligationId": "EV014", + "state": "satisfied", + "observed": true, + "recordRequirement": false, + "evidenceIds": [ + "EV014" + ], + "affectedTaskIds": [ + "T014" + ], + "affectedRequirementIds": [], + "severity": "ready", + "diagnosticIds": [], + "correction": "" + } + ], + "skillVisibility": [ + { + "skill": "automated-tests", + "requiringTaskIds": [ + "T012" + ], + "visibility": "visible", + "sourceArtifactPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "severity": "ready", + "diagnosticIds": [], + "correction": "" + }, + { + "skill": "deterministic-json", + "requiringTaskIds": [ + "T014" + ], + "visibility": "visible", + "sourceArtifactPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "severity": "ready", + "diagnosticIds": [], + "correction": "" + }, + { + "skill": "fsharp", + "requiringTaskIds": [ + "T001", + "T002", + "T003", + "T004", + "T005", + "T006", + "T007", + "T008", + "T009", + "T010", + "T011" + ], + "visibility": "visible", + "sourceArtifactPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "severity": "ready", + "diagnosticIds": [], + "correction": "" + }, + { + "skill": "implementation", + "requiringTaskIds": [ + "T001", + "T002", + "T003", + "T004", + "T005", + "T006", + "T007", + "T008", + "T009", + "T010" + ], + "visibility": "visible", + "sourceArtifactPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "severity": "ready", + "diagnosticIds": [], + "correction": "" + }, + { + "skill": "readiness-evidence", + "requiringTaskIds": [ + "T012" + ], + "visibility": "visible", + "sourceArtifactPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "severity": "ready", + "diagnosticIds": [], + "correction": "" + }, + { + "skill": "schema-versioning", + "requiringTaskIds": [ + "T013" + ], + "visibility": "visible", + "sourceArtifactPath": "work/2907-blocked-by-set-mutations/tasks.yml", + "severity": "ready", + "diagnosticIds": [], + "correction": "" + } + ], + "generatedViews": [ + { + "path": "readiness/2907-blocked-by-set-mutations/analysis.json", + "kind": "verification", + "currency": "current", + "diagnosticIds": [] + }, + { + "path": "readiness/2907-blocked-by-set-mutations/work-model.json", + "kind": "workModel", + "currency": "current", + "diagnosticIds": [] + } + ], + "findings": [], + "governanceCompatibility": [ + { + "path": ".fsgg/policy.yml", + "relationship": "optionalGovernancePolicy", + "requiredBySdd": false, + "state": "notEvaluated", + "diagnosticIds": [] + }, + { + "path": ".fsgg/capabilities.yml", + "relationship": "optionalGovernanceCapabilities", + "requiredBySdd": false, + "state": "notEvaluated", + "diagnosticIds": [] + }, + { + "path": ".fsgg/tooling.yml", + "relationship": "optionalGovernanceTooling", + "requiredBySdd": false, + "state": "notEvaluated", + "diagnosticIds": [] + } + ], + "diagnostics": [], + "readiness": "verificationReady", + "nextAction": { + "actionId": "verify.next.ship", + "command": null, + "reason": "Verification readiness is current and ready for ship." + } +} \ No newline at end of file diff --git a/readiness/2907-blocked-by-set-mutations/work-model.json b/readiness/2907-blocked-by-set-mutations/work-model.json new file mode 100644 index 000000000..22c6344ff --- /dev/null +++ b/readiness/2907-blocked-by-set-mutations/work-model.json @@ -0,0 +1,1252 @@ +{ + "schemaVersion": 1, + "modelVersion": "1.2.0", + "workId": "2907-blocked-by-set-mutations", + "project": { + "id": ".github-2127", + "defaultWorkRoot": "work", + "profile": null + }, + "sources": [ + { + "path": ".fsgg/agents.yml", + "kind": "agentsConfig", + "owner": "sdd", + "schemaVersion": 1, + "rawSchemaVersion": "1", + "schemaStatus": "current", + "sourceDigest": { + "algorithm": "sha256", + "value": "c67035b1cf31b6fa802c10f761eeb1e5bf5d198c38d159b54fac299957b5aac3" + } + }, + { + "path": ".fsgg/project.yml", + "kind": "projectConfig", + "owner": "sdd", + "schemaVersion": 1, + "rawSchemaVersion": "1", + "schemaStatus": "current", + "sourceDigest": { + "algorithm": "sha256", + "value": "ef78f002b33ce22f738bac2c0dbf716db729a7d3ae3e4a68a4ce4b93810ced66" + } + }, + { + "path": ".fsgg/sdd.yml", + "kind": "sddConfig", + "owner": "sdd", + "schemaVersion": 1, + "rawSchemaVersion": "1", + "schemaStatus": "current", + "sourceDigest": { + "algorithm": "sha256", + "value": "fe5a7c270a975153e80ab0d08a610c9b302585dcb0b5f7c654841ceced9272cb" + } + }, + { + "path": "work/2907-blocked-by-set-mutations/checklist.md", + "kind": "checklist", + "owner": "sdd", + "schemaVersion": 1, + "rawSchemaVersion": "1", + "schemaStatus": "current", + "sourceDigest": { + "algorithm": "sha256", + "value": "2799d51aeaf8b672cd72d857c78bd907426e73a20a8b7c8cda8ea1ad2c71fe95" + } + }, + { + "path": "work/2907-blocked-by-set-mutations/clarifications.md", + "kind": "clarifications", + "owner": "sdd", + "schemaVersion": 1, + "rawSchemaVersion": "1", + "schemaStatus": "current", + "sourceDigest": { + "algorithm": "sha256", + "value": "29371de9aa66598f033214d6fd42665dac6d53189f32f572cdd1327bb6537bc5" + } + }, + { + "path": "work/2907-blocked-by-set-mutations/evidence.yml", + "kind": "evidence", + "owner": "sdd", + "schemaVersion": 1, + "rawSchemaVersion": "1", + "schemaStatus": "current", + "sourceDigest": { + "algorithm": "sha256", + "value": "dfb94cb7f1e646d2113733a263a31b67d8967f788ce6701f005e29e2aeffdf96" + } + }, + { + "path": "work/2907-blocked-by-set-mutations/plan.md", + "kind": "plan", + "owner": "sdd", + "schemaVersion": 1, + "rawSchemaVersion": "1", + "schemaStatus": "current", + "sourceDigest": { + "algorithm": "sha256", + "value": "243f8da1ca1d80b697dcbd4c9359371b98f08f39961ec7bb1c363424b198288d" + } + }, + { + "path": "work/2907-blocked-by-set-mutations/spec.md", + "kind": "spec", + "owner": "sdd", + "schemaVersion": 1, + "rawSchemaVersion": "1", + "schemaStatus": "current", + "sourceDigest": { + "algorithm": "sha256", + "value": "bbfc8ac46a0af4e5487e6e08af4603eb9e97d26877c78774d4f96d892930802f" + } + }, + { + "path": "work/2907-blocked-by-set-mutations/tasks.yml", + "kind": "tasks", + "owner": "sdd", + "schemaVersion": 1, + "rawSchemaVersion": "1", + "schemaStatus": "current", + "sourceDigest": { + "algorithm": "sha256", + "value": "ae85b8835c2a835841d0d3ad0afbb741d36a51b524397d083b88b34203a8c540" + } + } + ], + "workItem": { + "id": "2907-blocked-by-set-mutations", + "title": "Blocked-by Set Mutations", + "stage": "specify", + "changeTier": "tier1", + "status": "specified" + }, + "performanceIntent": null, + "requirements": [ + { + "id": "FR-001", + "title": "\u0060Blocked by\u0060 add canonicalizes and unions requested refs with the live canonical set, removes duplicates, and preserves every existing edge. (Stories: US-001; Acceptance: AC-001)", + "text": "\u0060Blocked by\u0060 add canonicalizes and unions requested refs with the live canonical set, removes duplicates, and preserves every existing edge. (Stories: US-001; Acceptance: AC-001)", + "acceptanceCriteria": [ + "AC-001" + ], + "priority": null, + "classification": [], + "source": "work/2907-blocked-by-set-mutations/spec.md", + "sourceLocation": { + "line": 37, + "column": 1 + }, + "linkedTaskIds": [ + "T001" + ], + "linkedEvidenceIds": [ + "EV001" + ] + }, + { + "id": "FR-002", + "title": "\u0060Blocked by\u0060 remove canonicalizes and subtracts requested refs from the live canonical set, preserves every non-requested edge, and uses the distinct clear mutation when the result is empty. (Stories: US-001; Acceptance: AC-002)", + "text": "\u0060Blocked by\u0060 remove canonicalizes and subtracts requested refs from the live canonical set, preserves every non-requested edge, and uses the distinct clear mutation when the result is empty. (Stories: US-001; Acceptance: AC-002)", + "acceptanceCriteria": [ + "AC-002" + ], + "priority": null, + "classification": [], + "source": "work/2907-blocked-by-set-mutations/spec.md", + "sourceLocation": { + "line": 38, + "column": 1 + }, + "linkedTaskIds": [ + "T002" + ], + "linkedEvidenceIds": [ + "EV002" + ] + }, + { + "id": "FR-003", + "title": "Add and remove bind both the live field value and Projects-v2 item revision; a changed value or revision at the guarded write boundary fails stale and emits no mutation. (Stories: US-001; Acceptance: AC-001, AC-002, AC-003)", + "text": "Add and remove bind both the live field value and Projects-v2 item revision; a changed value or revision at the guarded write boundary fails stale and emits no mutation. (Stories: US-001; Acceptance: AC-001, AC-002, AC-003)", + "acceptanceCriteria": [ + "AC-001", + "AC-002", + "AC-003" + ], + "priority": null, + "classification": [], + "source": "work/2907-blocked-by-set-mutations/spec.md", + "sourceLocation": { + "line": 39, + "column": 1 + }, + "linkedTaskIds": [ + "T003" + ], + "linkedEvidenceIds": [ + "EV003" + ] + }, + { + "id": "FR-004", + "title": "The command names add, remove, replace, and clear as distinct caller intents for \u0060Blocked by\u0060; an ambiguous bare replacement is refused while unrelated scalar-field syntax remains compatible. (Stories: US-001; Acceptance: AC-004)", + "text": "The command names add, remove, replace, and clear as distinct caller intents for \u0060Blocked by\u0060; an ambiguous bare replacement is refused while unrelated scalar-field syntax remains compatible. (Stories: US-001; Acceptance: AC-004)", + "acceptanceCriteria": [ + "AC-004" + ], + "priority": null, + "classification": [], + "source": "work/2907-blocked-by-set-mutations/spec.md", + "sourceLocation": { + "line": 40, + "column": 1 + }, + "linkedTaskIds": [ + "T004" + ], + "linkedEvidenceIds": [ + "EV004" + ] + }, + { + "id": "FR-005", + "title": "Lint reports a body-only \u0060Blocked by:\u0060 declaration when the authoritative field is empty and a divergent projection when their canonical sets differ, while an agreeing generated projection stays green. Invalid body syntax is reported rather than promoted to authority. (Stories: US-002; Acceptance: AC-005)", + "text": "Lint reports a body-only \u0060Blocked by:\u0060 declaration when the authoritative field is empty and a divergent projection when their canonical sets differ, while an agreeing generated projection stays green. Invalid body syntax is reported rather than promoted to authority. (Stories: US-002; Acceptance: AC-005)", + "acceptanceCriteria": [ + "AC-005" + ], + "priority": null, + "classification": [], + "source": "work/2907-blocked-by-set-mutations/spec.md", + "sourceLocation": { + "line": 41, + "column": 1 + }, + "linkedTaskIds": [ + "T005" + ], + "linkedEvidenceIds": [ + "EV005" + ] + }, + { + "id": "FR-006", + "title": "Focused tests and gate inversion prove add preserves \u0060#290\u0060 while adding \u0060#299\u0060, remove preserves \u0060#299\u0060 while removing \u0060#290\u0060, a changed observation is never overwritten, and lint distinguishes inert, divergent, invalid, absent, and agreeing body projections. (Stories: US-001, US-002; Acceptance: AC-006)", + "text": "Focused tests and gate inversion prove add preserves \u0060#290\u0060 while adding \u0060#299\u0060, remove preserves \u0060#299\u0060 while removing \u0060#290\u0060, a changed observation is never overwritten, and lint distinguishes inert, divergent, invalid, absent, and agreeing body projections. (Stories: US-001, US-002; Acceptance: AC-006)", + "acceptanceCriteria": [ + "AC-006" + ], + "priority": null, + "classification": [], + "source": "work/2907-blocked-by-set-mutations/spec.md", + "sourceLocation": { + "line": 42, + "column": 1 + }, + "linkedTaskIds": [ + "T006" + ], + "linkedEvidenceIds": [ + "EV006" + ] + } + ], + "decisions": [ + { + "id": "DEC-001", + "title": "Add four closed, mutually exclusive option fields and parser flags scoped only to \u0060set-field\u0060. \u0060--add\u0060 and \u0060--remove\u0060 derive from the live set, \u0060--replace\u0060 writes only the supplied canonical set, and \u0060--clear\u0060 uses \u0060Board.Clear\u0060. A bare \u0060Blocked by\u0060 positional value refuses and names the four valid forms. Scalar fields retain their existing positional contract; batch equality remains an explicitly named replacement/clear operation.", + "decision": "Add four closed, mutually exclusive option fields and parser flags scoped only to \u0060set-field\u0060. \u0060--add\u0060 and \u0060--remove\u0060 derive from the live set, \u0060--replace\u0060 writes only the supplied canonical set, and \u0060--clear\u0060 uses \u0060Board.Clear\u0060. A bare \u0060Blocked by\u0060 positional value refuses and names the four valid forms. Scalar fields retain their existing positional contract; batch equality remains an explicitly named replacement/clear operation.", + "requirementRefs": [ + "FR-001", + "FR-002", + "FR-004" + ], + "storyRefs": [], + "acceptanceRefs": [ + "AC-001", + "AC-002", + "AC-004" + ], + "source": "work/2907-blocked-by-set-mutations/clarifications.md", + "sourceLocation": { + "line": 26, + "column": 1 + }, + "linkedTaskIds": [ + "T007" + ] + }, + { + "id": "DEC-002", + "title": "Introduce a guarded single-field board write accepting \u0060BlockedByObservation\u0060. It resolves the item, re-reads the observation immediately before mutation, and emits no mutation on mismatch. The fixture controls the two reads independently and asserts a stale diagnostic plus zero update/clear documents when the second revision or value differs.", + "decision": "Introduce a guarded single-field board write accepting \u0060BlockedByObservation\u0060. It resolves the item, re-reads the observation immediately before mutation, and emits no mutation on mismatch. The fixture controls the two reads independently and asserts a stale diagnostic plus zero update/clear documents when the second revision or value differs.", + "requirementRefs": [ + "FR-003" + ], + "storyRefs": [], + "acceptanceRefs": [ + "AC-003" + ], + "source": "work/2907-blocked-by-set-mutations/clarifications.md", + "sourceLocation": { + "line": 27, + "column": 1 + }, + "linkedTaskIds": [ + "T008" + ] + }, + { + "id": "DEC-003", + "title": "Parse only an unfenced, line-leading \u0060Blocked by:\u0060 body projection using the same dependency canonicalizer as the field. No body line means no finding. A present line with empty authoritative field yields \u0060BLOCKED-BY-BODY-INERT\u0060; unequal canonical sets or invalid projection syntax yield the same stable rule family with a precise divergent/invalid detail; equal canonical sets stay green.", + "decision": "Parse only an unfenced, line-leading \u0060Blocked by:\u0060 body projection using the same dependency canonicalizer as the field. No body line means no finding. A present line with empty authoritative field yields \u0060BLOCKED-BY-BODY-INERT\u0060; unequal canonical sets or invalid projection syntax yield the same stable rule family with a precise divergent/invalid detail; equal canonical sets stay green.", + "requirementRefs": [ + "FR-005" + ], + "storyRefs": [], + "acceptanceRefs": [ + "AC-005" + ], + "source": "work/2907-blocked-by-set-mutations/clarifications.md", + "sourceLocation": { + "line": 28, + "column": 1 + }, + "linkedTaskIds": [ + "T009" + ] + }, + { + "id": "DEC-004", + "title": "Mutation controls independently replace union with requested-only, subtraction with empty, and stale comparison with unconditional success; lint controls suppress the body comparison. Each control must red a named focused test, then be restored before the full gates.", + "decision": "Mutation controls independently replace union with requested-only, subtraction with empty, and stale comparison with unconditional success; lint controls suppress the body comparison. Each control must red a named focused test, then be restored before the full gates.", + "requirementRefs": [ + "FR-006" + ], + "storyRefs": [], + "acceptanceRefs": [ + "AC-006" + ], + "source": "work/2907-blocked-by-set-mutations/clarifications.md", + "sourceLocation": { + "line": 29, + "column": 1 + }, + "linkedTaskIds": [ + "T010" + ] + } + ], + "tasks": [ + { + "id": "T001", + "title": "Implement requirement FR-001", + "status": "pending", + "owner": "sdd", + "dependencies": [], + "requirements": [ + "FR-001" + ], + "decisions": [], + "sourceIds": [ + "AC-001", + "FR-001", + "PD-001" + ], + "requiredSkills": [ + "fsharp", + "implementation" + ], + "requiredEvidence": [ + "EV001" + ], + "source": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceLocation": { + "line": 1, + "column": 1 + } + }, + { + "id": "T002", + "title": "Implement requirement FR-002", + "status": "pending", + "owner": "sdd", + "dependencies": [], + "requirements": [ + "FR-002" + ], + "decisions": [], + "sourceIds": [ + "AC-002", + "FR-002", + "PD-002" + ], + "requiredSkills": [ + "fsharp", + "implementation" + ], + "requiredEvidence": [ + "EV002" + ], + "source": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceLocation": { + "line": 2, + "column": 1 + } + }, + { + "id": "T003", + "title": "Implement requirement FR-003", + "status": "pending", + "owner": "sdd", + "dependencies": [], + "requirements": [ + "FR-003" + ], + "decisions": [], + "sourceIds": [ + "AC-001", + "AC-002", + "AC-003", + "FR-003", + "PD-003" + ], + "requiredSkills": [ + "fsharp", + "implementation" + ], + "requiredEvidence": [ + "EV003" + ], + "source": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceLocation": { + "line": 3, + "column": 1 + } + }, + { + "id": "T004", + "title": "Implement requirement FR-004", + "status": "pending", + "owner": "sdd", + "dependencies": [], + "requirements": [ + "FR-004" + ], + "decisions": [], + "sourceIds": [ + "AC-004", + "FR-004", + "PD-004" + ], + "requiredSkills": [ + "fsharp", + "implementation" + ], + "requiredEvidence": [ + "EV004" + ], + "source": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceLocation": { + "line": 4, + "column": 1 + } + }, + { + "id": "T005", + "title": "Implement requirement FR-005", + "status": "pending", + "owner": "sdd", + "dependencies": [], + "requirements": [ + "FR-005" + ], + "decisions": [], + "sourceIds": [ + "AC-005", + "FR-005", + "PD-005" + ], + "requiredSkills": [ + "fsharp", + "implementation" + ], + "requiredEvidence": [ + "EV005" + ], + "source": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceLocation": { + "line": 5, + "column": 1 + } + }, + { + "id": "T006", + "title": "Implement requirement FR-006", + "status": "pending", + "owner": "sdd", + "dependencies": [], + "requirements": [ + "FR-006" + ], + "decisions": [], + "sourceIds": [ + "AC-006", + "FR-006", + "PD-006" + ], + "requiredSkills": [ + "fsharp", + "implementation" + ], + "requiredEvidence": [ + "EV006" + ], + "source": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceLocation": { + "line": 6, + "column": 1 + } + }, + { + "id": "T007", + "title": "Implement clarification decision DEC-001", + "status": "pending", + "owner": "sdd", + "dependencies": [ + "T001" + ], + "requirements": [], + "decisions": [ + "DEC-001" + ], + "sourceIds": [ + "DEC-001" + ], + "requiredSkills": [ + "fsharp", + "implementation" + ], + "requiredEvidence": [ + "EV007" + ], + "source": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceLocation": { + "line": 7, + "column": 1 + } + }, + { + "id": "T008", + "title": "Implement clarification decision DEC-002", + "status": "pending", + "owner": "sdd", + "dependencies": [ + "T001" + ], + "requirements": [], + "decisions": [ + "DEC-002" + ], + "sourceIds": [ + "DEC-002" + ], + "requiredSkills": [ + "fsharp", + "implementation" + ], + "requiredEvidence": [ + "EV008" + ], + "source": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceLocation": { + "line": 8, + "column": 1 + } + }, + { + "id": "T009", + "title": "Implement clarification decision DEC-003", + "status": "pending", + "owner": "sdd", + "dependencies": [ + "T001" + ], + "requirements": [], + "decisions": [ + "DEC-003" + ], + "sourceIds": [ + "DEC-003" + ], + "requiredSkills": [ + "fsharp", + "implementation" + ], + "requiredEvidence": [ + "EV009" + ], + "source": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceLocation": { + "line": 9, + "column": 1 + } + }, + { + "id": "T010", + "title": "Implement clarification decision DEC-004", + "status": "pending", + "owner": "sdd", + "dependencies": [ + "T001" + ], + "requirements": [], + "decisions": [ + "DEC-004" + ], + "sourceIds": [ + "DEC-004" + ], + "requiredSkills": [ + "fsharp", + "implementation" + ], + "requiredEvidence": [ + "EV010" + ], + "source": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceLocation": { + "line": 10, + "column": 1 + } + }, + { + "id": "T011", + "title": "Update contract surface PC-001", + "status": "pending", + "owner": "sdd", + "dependencies": [ + "T001" + ], + "requirements": [], + "decisions": [], + "sourceIds": [ + "PC-001", + "PD-001", + "PD-004" + ], + "requiredSkills": [ + "fsharp" + ], + "requiredEvidence": [ + "EV011" + ], + "source": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceLocation": { + "line": 11, + "column": 1 + } + }, + { + "id": "T012", + "title": "Record verification evidence VO-001", + "status": "pending", + "owner": "sdd", + "dependencies": [ + "T001" + ], + "requirements": [], + "decisions": [], + "sourceIds": [ + "PC-001", + "PD-001", + "PD-002", + "PD-003", + "PD-004", + "PD-005", + "PD-006", + "VO-001" + ], + "requiredSkills": [ + "automated-tests", + "readiness-evidence" + ], + "requiredEvidence": [ + "EV012" + ], + "source": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceLocation": { + "line": 12, + "column": 1 + } + }, + { + "id": "T013", + "title": "Handle migration posture PM-001", + "status": "pending", + "owner": "sdd", + "dependencies": [ + "T001" + ], + "requirements": [], + "decisions": [], + "sourceIds": [ + "PC-001", + "PM-001" + ], + "requiredSkills": [ + "schema-versioning" + ], + "requiredEvidence": [ + "EV013" + ], + "source": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceLocation": { + "line": 13, + "column": 1 + } + }, + { + "id": "T014", + "title": "Refresh generated view impact GV-001", + "status": "pending", + "owner": "sdd", + "dependencies": [ + "T001" + ], + "requirements": [], + "decisions": [], + "sourceIds": [ + "GV-001", + "PD-001" + ], + "requiredSkills": [ + "deterministic-json" + ], + "requiredEvidence": [ + "EV014" + ], + "source": "work/2907-blocked-by-set-mutations/tasks.yml", + "sourceLocation": { + "line": 14, + "column": 1 + } + } + ], + "evidence": [ + { + "id": "EV001", + "kind": "verification", + "subjectType": "task", + "subjectId": "T001", + "taskRefs": [ + "T001" + ], + "requirementRefs": [ + "FR-001" + ], + "artifactRefs": [ + "src/FS.GG.Coord.Cli.BoardOps/Handlers.fs", + "src/FS.GG.Coord.Cli.Kernel/Options.fs", + "src/FS.GG.Coord.Cli/LintApplication.fs", + "src/FS.GG.Coord.GitHub/Board.fs", + "tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs", + "work/2907-blocked-by-set-mutations/verification/verification-evidence.md" + ], + "result": "pass", + "synthetic": false, + "performanceBudget": null, + "performanceEvidenceArtifact": null, + "performanceMeasurements": [], + "rationale": null, + "source": "work/2907-blocked-by-set-mutations/evidence.yml", + "sourceLocation": { + "line": 1, + "column": 1 + } + }, + { + "id": "EV002", + "kind": "verification", + "subjectType": "task", + "subjectId": "T002", + "taskRefs": [ + "T002" + ], + "requirementRefs": [ + "FR-002" + ], + "artifactRefs": [ + "src/FS.GG.Coord.Cli.BoardOps/Handlers.fs", + "src/FS.GG.Coord.Cli.Kernel/Options.fs", + "src/FS.GG.Coord.Cli/LintApplication.fs", + "src/FS.GG.Coord.GitHub/Board.fs", + "tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs", + "work/2907-blocked-by-set-mutations/verification/verification-evidence.md" + ], + "result": "pass", + "synthetic": false, + "performanceBudget": null, + "performanceEvidenceArtifact": null, + "performanceMeasurements": [], + "rationale": null, + "source": "work/2907-blocked-by-set-mutations/evidence.yml", + "sourceLocation": { + "line": 2, + "column": 1 + } + }, + { + "id": "EV003", + "kind": "verification", + "subjectType": "task", + "subjectId": "T003", + "taskRefs": [ + "T003" + ], + "requirementRefs": [ + "FR-003" + ], + "artifactRefs": [ + "src/FS.GG.Coord.Cli.BoardOps/Handlers.fs", + "src/FS.GG.Coord.Cli.Kernel/Options.fs", + "src/FS.GG.Coord.Cli/LintApplication.fs", + "src/FS.GG.Coord.GitHub/Board.fs", + "tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs", + "work/2907-blocked-by-set-mutations/verification/verification-evidence.md" + ], + "result": "pass", + "synthetic": false, + "performanceBudget": null, + "performanceEvidenceArtifact": null, + "performanceMeasurements": [], + "rationale": null, + "source": "work/2907-blocked-by-set-mutations/evidence.yml", + "sourceLocation": { + "line": 3, + "column": 1 + } + }, + { + "id": "EV004", + "kind": "verification", + "subjectType": "task", + "subjectId": "T004", + "taskRefs": [ + "T004" + ], + "requirementRefs": [ + "FR-004" + ], + "artifactRefs": [ + "src/FS.GG.Coord.Cli.BoardOps/Handlers.fs", + "src/FS.GG.Coord.Cli.Kernel/Options.fs", + "src/FS.GG.Coord.Cli/LintApplication.fs", + "src/FS.GG.Coord.GitHub/Board.fs", + "tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs", + "work/2907-blocked-by-set-mutations/verification/verification-evidence.md" + ], + "result": "pass", + "synthetic": false, + "performanceBudget": null, + "performanceEvidenceArtifact": null, + "performanceMeasurements": [], + "rationale": null, + "source": "work/2907-blocked-by-set-mutations/evidence.yml", + "sourceLocation": { + "line": 4, + "column": 1 + } + }, + { + "id": "EV005", + "kind": "verification", + "subjectType": "task", + "subjectId": "T005", + "taskRefs": [ + "T005" + ], + "requirementRefs": [ + "FR-005" + ], + "artifactRefs": [ + "src/FS.GG.Coord.Cli.BoardOps/Handlers.fs", + "src/FS.GG.Coord.Cli.Kernel/Options.fs", + "src/FS.GG.Coord.Cli/LintApplication.fs", + "src/FS.GG.Coord.GitHub/Board.fs", + "tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs", + "work/2907-blocked-by-set-mutations/verification/verification-evidence.md" + ], + "result": "pass", + "synthetic": false, + "performanceBudget": null, + "performanceEvidenceArtifact": null, + "performanceMeasurements": [], + "rationale": null, + "source": "work/2907-blocked-by-set-mutations/evidence.yml", + "sourceLocation": { + "line": 5, + "column": 1 + } + }, + { + "id": "EV006", + "kind": "verification", + "subjectType": "task", + "subjectId": "T006", + "taskRefs": [ + "T006" + ], + "requirementRefs": [ + "FR-006" + ], + "artifactRefs": [ + "src/FS.GG.Coord.Cli.BoardOps/Handlers.fs", + "src/FS.GG.Coord.Cli.Kernel/Options.fs", + "src/FS.GG.Coord.Cli/LintApplication.fs", + "src/FS.GG.Coord.GitHub/Board.fs", + "tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs", + "work/2907-blocked-by-set-mutations/verification/verification-evidence.md" + ], + "result": "pass", + "synthetic": false, + "performanceBudget": null, + "performanceEvidenceArtifact": null, + "performanceMeasurements": [], + "rationale": null, + "source": "work/2907-blocked-by-set-mutations/evidence.yml", + "sourceLocation": { + "line": 6, + "column": 1 + } + }, + { + "id": "EV007", + "kind": "verification", + "subjectType": "task", + "subjectId": "T007", + "taskRefs": [ + "T007" + ], + "requirementRefs": [], + "artifactRefs": [ + "src/FS.GG.Coord.Cli.BoardOps/Handlers.fs", + "src/FS.GG.Coord.Cli.Kernel/Options.fs", + "src/FS.GG.Coord.Cli/LintApplication.fs", + "src/FS.GG.Coord.GitHub/Board.fs", + "tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs", + "work/2907-blocked-by-set-mutations/verification/verification-evidence.md" + ], + "result": "pass", + "synthetic": false, + "performanceBudget": null, + "performanceEvidenceArtifact": null, + "performanceMeasurements": [], + "rationale": null, + "source": "work/2907-blocked-by-set-mutations/evidence.yml", + "sourceLocation": { + "line": 7, + "column": 1 + } + }, + { + "id": "EV008", + "kind": "verification", + "subjectType": "task", + "subjectId": "T008", + "taskRefs": [ + "T008" + ], + "requirementRefs": [], + "artifactRefs": [ + "src/FS.GG.Coord.Cli.BoardOps/Handlers.fs", + "src/FS.GG.Coord.Cli.Kernel/Options.fs", + "src/FS.GG.Coord.Cli/LintApplication.fs", + "src/FS.GG.Coord.GitHub/Board.fs", + "tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs", + "work/2907-blocked-by-set-mutations/verification/verification-evidence.md" + ], + "result": "pass", + "synthetic": false, + "performanceBudget": null, + "performanceEvidenceArtifact": null, + "performanceMeasurements": [], + "rationale": null, + "source": "work/2907-blocked-by-set-mutations/evidence.yml", + "sourceLocation": { + "line": 8, + "column": 1 + } + }, + { + "id": "EV009", + "kind": "verification", + "subjectType": "task", + "subjectId": "T009", + "taskRefs": [ + "T009" + ], + "requirementRefs": [], + "artifactRefs": [ + "src/FS.GG.Coord.Cli.BoardOps/Handlers.fs", + "src/FS.GG.Coord.Cli.Kernel/Options.fs", + "src/FS.GG.Coord.Cli/LintApplication.fs", + "src/FS.GG.Coord.GitHub/Board.fs", + "tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs", + "work/2907-blocked-by-set-mutations/verification/verification-evidence.md" + ], + "result": "pass", + "synthetic": false, + "performanceBudget": null, + "performanceEvidenceArtifact": null, + "performanceMeasurements": [], + "rationale": null, + "source": "work/2907-blocked-by-set-mutations/evidence.yml", + "sourceLocation": { + "line": 9, + "column": 1 + } + }, + { + "id": "EV010", + "kind": "verification", + "subjectType": "task", + "subjectId": "T010", + "taskRefs": [ + "T010" + ], + "requirementRefs": [], + "artifactRefs": [ + "src/FS.GG.Coord.Cli.BoardOps/Handlers.fs", + "src/FS.GG.Coord.Cli.Kernel/Options.fs", + "src/FS.GG.Coord.Cli/LintApplication.fs", + "src/FS.GG.Coord.GitHub/Board.fs", + "tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs", + "work/2907-blocked-by-set-mutations/verification/verification-evidence.md" + ], + "result": "pass", + "synthetic": false, + "performanceBudget": null, + "performanceEvidenceArtifact": null, + "performanceMeasurements": [], + "rationale": null, + "source": "work/2907-blocked-by-set-mutations/evidence.yml", + "sourceLocation": { + "line": 10, + "column": 1 + } + }, + { + "id": "EV011", + "kind": "verification", + "subjectType": "task", + "subjectId": "T011", + "taskRefs": [ + "T011" + ], + "requirementRefs": [], + "artifactRefs": [ + "src/FS.GG.Coord.Cli.BoardOps/Handlers.fs", + "src/FS.GG.Coord.Cli.Kernel/Options.fs", + "src/FS.GG.Coord.Cli/LintApplication.fs", + "src/FS.GG.Coord.GitHub/Board.fs", + "tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs", + "work/2907-blocked-by-set-mutations/verification/verification-evidence.md" + ], + "result": "pass", + "synthetic": false, + "performanceBudget": null, + "performanceEvidenceArtifact": null, + "performanceMeasurements": [], + "rationale": null, + "source": "work/2907-blocked-by-set-mutations/evidence.yml", + "sourceLocation": { + "line": 11, + "column": 1 + } + }, + { + "id": "EV012", + "kind": "verification", + "subjectType": "task", + "subjectId": "T012", + "taskRefs": [ + "T012" + ], + "requirementRefs": [], + "artifactRefs": [ + "src/FS.GG.Coord.Cli.BoardOps/Handlers.fs", + "src/FS.GG.Coord.Cli.Kernel/Options.fs", + "src/FS.GG.Coord.Cli/LintApplication.fs", + "src/FS.GG.Coord.GitHub/Board.fs", + "tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs", + "work/2907-blocked-by-set-mutations/verification/verification-evidence.md" + ], + "result": "pass", + "synthetic": false, + "performanceBudget": null, + "performanceEvidenceArtifact": null, + "performanceMeasurements": [], + "rationale": null, + "source": "work/2907-blocked-by-set-mutations/evidence.yml", + "sourceLocation": { + "line": 12, + "column": 1 + } + }, + { + "id": "EV013", + "kind": "verification", + "subjectType": "task", + "subjectId": "T013", + "taskRefs": [ + "T013" + ], + "requirementRefs": [], + "artifactRefs": [ + "src/FS.GG.Coord.Cli.BoardOps/Handlers.fs", + "src/FS.GG.Coord.Cli.Kernel/Options.fs", + "src/FS.GG.Coord.Cli/LintApplication.fs", + "src/FS.GG.Coord.GitHub/Board.fs", + "tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs", + "work/2907-blocked-by-set-mutations/verification/verification-evidence.md" + ], + "result": "pass", + "synthetic": false, + "performanceBudget": null, + "performanceEvidenceArtifact": null, + "performanceMeasurements": [], + "rationale": null, + "source": "work/2907-blocked-by-set-mutations/evidence.yml", + "sourceLocation": { + "line": 13, + "column": 1 + } + }, + { + "id": "EV014", + "kind": "verification", + "subjectType": "task", + "subjectId": "T014", + "taskRefs": [ + "T014" + ], + "requirementRefs": [], + "artifactRefs": [ + "src/FS.GG.Coord.Cli.BoardOps/Handlers.fs", + "src/FS.GG.Coord.Cli.Kernel/Options.fs", + "src/FS.GG.Coord.Cli/LintApplication.fs", + "src/FS.GG.Coord.GitHub/Board.fs", + "tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs", + "work/2907-blocked-by-set-mutations/verification/verification-evidence.md" + ], + "result": "pass", + "synthetic": false, + "performanceBudget": null, + "performanceEvidenceArtifact": null, + "performanceMeasurements": [], + "rationale": null, + "source": "work/2907-blocked-by-set-mutations/evidence.yml", + "sourceLocation": { + "line": 14, + "column": 1 + } + } + ], + "generatedViews": [ + { + "path": "readiness/2907-blocked-by-set-mutations/work-model.json", + "kind": "workModel", + "schemaVersion": 1, + "generator": { + "id": "FS.GG.SDD.Artifacts", + "version": "1.1.0" + }, + "sources": [ + { + "path": ".fsgg/agents.yml", + "digest": { + "algorithm": "sha256", + "value": "c67035b1cf31b6fa802c10f761eeb1e5bf5d198c38d159b54fac299957b5aac3" + }, + "schemaVersion": 1 + }, + { + "path": ".fsgg/project.yml", + "digest": { + "algorithm": "sha256", + "value": "ef78f002b33ce22f738bac2c0dbf716db729a7d3ae3e4a68a4ce4b93810ced66" + }, + "schemaVersion": 1 + }, + { + "path": ".fsgg/sdd.yml", + "digest": { + "algorithm": "sha256", + "value": "fe5a7c270a975153e80ab0d08a610c9b302585dcb0b5f7c654841ceced9272cb" + }, + "schemaVersion": 1 + }, + { + "path": "work/2907-blocked-by-set-mutations/checklist.md", + "digest": { + "algorithm": "sha256", + "value": "2799d51aeaf8b672cd72d857c78bd907426e73a20a8b7c8cda8ea1ad2c71fe95" + }, + "schemaVersion": 1 + }, + { + "path": "work/2907-blocked-by-set-mutations/clarifications.md", + "digest": { + "algorithm": "sha256", + "value": "29371de9aa66598f033214d6fd42665dac6d53189f32f572cdd1327bb6537bc5" + }, + "schemaVersion": 1 + }, + { + "path": "work/2907-blocked-by-set-mutations/evidence.yml", + "digest": { + "algorithm": "sha256", + "value": "dfb94cb7f1e646d2113733a263a31b67d8967f788ce6701f005e29e2aeffdf96" + }, + "schemaVersion": 1 + }, + { + "path": "work/2907-blocked-by-set-mutations/plan.md", + "digest": { + "algorithm": "sha256", + "value": "243f8da1ca1d80b697dcbd4c9359371b98f08f39961ec7bb1c363424b198288d" + }, + "schemaVersion": 1 + }, + { + "path": "work/2907-blocked-by-set-mutations/spec.md", + "digest": { + "algorithm": "sha256", + "value": "bbfc8ac46a0af4e5487e6e08af4603eb9e97d26877c78774d4f96d892930802f" + }, + "schemaVersion": 1 + }, + { + "path": "work/2907-blocked-by-set-mutations/tasks.yml", + "digest": { + "algorithm": "sha256", + "value": "ae85b8835c2a835841d0d3ad0afbb741d36a51b524397d083b88b34203a8c540" + }, + "schemaVersion": 1 + } + ], + "outputDigest": { + "algorithm": "sha256", + "value": "6e0cae114cc07a049c5e6a74dc5bf8eaa8f9fd942d9d9f0415092f4eae49d347" + }, + "currency": "current" + } + ], + "diagnostics": [], + "governanceBoundaries": [] +} \ No newline at end of file diff --git a/src/FS.GG.Coord.Cli.BoardOps/Handlers.fs b/src/FS.GG.Coord.Cli.BoardOps/Handlers.fs index 20809f77f..5521ff667 100644 --- a/src/FS.GG.Coord.Cli.BoardOps/Handlers.fs +++ b/src/FS.GG.Coord.Cli.BoardOps/Handlers.fs @@ -452,6 +452,128 @@ module Handlers = Error ExitError + let private canonicalBlockedByRefs (ref: Ref) (raw: string) : Result = + match Blockers.canonicalizeBlockedBy ref.Owner ref.Repo raw with + | Ok None -> Ok [] + | Ok(Some canonical) -> + canonical.Split(',') + |> Array.map (fun value -> value.Trim()) + |> Array.filter (fun value -> value <> "") + |> List.ofArray + |> Ok + | Error Blockers.Placeholder -> + eprint + $"fsgg-coord-engine: 'Blocked by' does not take a placeholder ('%s{raw.Trim()}'). Use --clear to clear the set." + + Error ExitError + | Error Blockers.NotIssueRefs -> + eprint + $"fsgg-coord-engine: 'Blocked by' takes issue refs (owner/repo#n), not prose: '%s{raw}'. If the item ITSELF is blocked, that is a Status: set-field Status Blocked" + + Error ExitError + + let private blockedByWrite (refs: string list) : Board.FieldWrite = + match refs with + | [] -> Board.Clear + | values -> Board.Set(String.concat ", " values) + + let private setBlockedByMutation (ctx: Context) (opts: Options) (mutation: Options.BlockedByMutation) : int = + match opts.Args with + | [ refArg; field ] when field = "Blocked by" -> + match parseRef ctx refArg, worker opts with + | Error msg, _ -> + eprint $"fsgg-coord-engine: %s{msg}" + ExitError + | _, Error c -> c + | Ok ref, Ok w -> + // Validate caller-supplied refs before any board read. Add/remove still need a live + // observation to derive their result, but malformed intent must spend zero GraphQL. + let boardResult = + match mutation with + | Options.ClearBlockedBy -> Board.bootstrapCached ctx.Transport ctx.Owner ctx.Title |> Result.mapError Choice2Of2 + | Options.AddBlockedBy raw + | Options.RemoveBlockedBy raw + | Options.ReplaceBlockedBy raw -> + match canonicalBlockedByRefs ref raw with + | Error rc -> Error(Choice1Of2 rc) + | Ok _ -> Board.bootstrapCached ctx.Transport ctx.Owner ctx.Title |> Result.mapError Choice2Of2 + + match boardResult with + | Error(Choice1Of2 rc) -> rc + | Error(Choice2Of2 e) -> fail e + | Ok board -> + let renderOutcome operation write outcome = + match outcome with + | Board.Written -> + printfn + "set %s Blocked by %s = %s" + ref.Canonical + operation + (match write with | Board.Set value -> value | Board.Clear -> "") + ExitGreen + | Board.Deferred -> + printfn "set-field %s Blocked by %s — QUEUED (budget exhausted; flush replays it)" ref.Canonical operation + Errors.ExRate + | Board.NotOnBoard -> + eprint $"fsgg-coord-engine: %s{ref.Canonical} is not an item on this board — nothing written." + ExitError + + let writeExplicit operation write = + match Board.boardWrite ctx.Transport board ref.Owner ref.Repo ref.Number "Blocked by" write w.Id with + | Error e -> fail e + | Ok outcome -> renderOutcome operation write outcome + + match mutation with + | Options.ReplaceBlockedBy raw -> + match canonicalBlockedByRefs ref raw with + | Error rc -> rc + | Ok [] -> + eprint "fsgg-coord-engine: --replace needs at least one issue ref; use --clear to clear the set." + ExitError + | Ok refs -> + let write = blockedByWrite refs + writeExplicit "replace" write + | Options.ClearBlockedBy -> + writeExplicit "clear" Board.Clear + | Options.AddBlockedBy raw + | Options.RemoveBlockedBy raw as edgeMutation -> + match Board.itemBlockedByObservation ctx.Transport board ref.Owner ref.Repo ref.Number with + | Error e -> fail e + | Ok observed -> + let liveRaw = observed.Value |> Option.defaultValue "" + match canonicalBlockedByRefs ref liveRaw, canonicalBlockedByRefs ref raw with + | Error rc, _ + | _, Error rc -> rc + | _, Ok [] -> + let operation = + match edgeMutation with + | Options.AddBlockedBy _ -> "add" + | _ -> "remove" + + eprint $"fsgg-coord-engine: --%s{operation} needs at least one issue ref." + ExitError + | Ok live, Ok requested -> + let result, operation = + match edgeMutation with + | Options.AddBlockedBy _ -> + let seen = Set.ofList live + live @ (requested |> List.filter (fun value -> not (Set.contains value seen))), "add" + | Options.RemoveBlockedBy _ -> + let removed = Set.ofList requested + live |> List.filter (fun value -> not (Set.contains value removed)), "remove" + | _ -> failwith "unreachable explicit edge mutation" + + let write = blockedByWrite result + match Board.boardWriteGuarded ctx.Transport board ref.Owner ref.Repo ref.Number observed write with + | Error e -> fail e + | Ok outcome -> renderOutcome operation write outcome + | [ _; field ] -> + eprint $"fsgg-coord-engine: --add/--remove/--replace/--clear apply only to the set-valued 'Blocked by' field (got '%s{field}')." + ExitError + | _ -> + eprint "fsgg-coord-engine: an explicit Blocked by mutation takes 'Blocked by' and exactly one of --add REFS, --remove REFS, --replace REFS, or --clear." + ExitError + // `set-field --batch Field=Value ...` — N fields in ONE aliased mutation (#448). // // The whole point is the call count: three separate writes are three GraphQL points; the same three @@ -620,12 +742,17 @@ module Handlers = eprint "fsgg-coord-engine: set-field --batch takes followed by one or more Field=Value pairs." ExitError - let setField (ctx: Context) (opts: Options) : int = + let private setFieldPositional (ctx: Context) (opts: Options) : int = if opts.Batch then setFieldBatchCmd ctx opts else match opts.Args with + | [ _; "Blocked by"; _ ] -> + eprint + "fsgg-coord-engine: bare replacement of the set-valued 'Blocked by' field is refused. Name the intent: --add REFS, --remove REFS, --replace REFS, or --clear." + + ExitError | [ refArg; field; value ] -> match parseRef ctx refArg, worker opts with | Error msg, _ -> @@ -718,8 +845,16 @@ module Handlers = eprint $"fsgg-coord-engine: %s{ref.Canonical} is not an item on this board — nothing written." ExitError | _ -> - eprint "fsgg-coord-engine: set-field takes (an empty value clears)." + eprint "fsgg-coord-engine: set-field takes , or 'Blocked by' with one explicit set mutation." + ExitError + + let setField (ctx: Context) (opts: Options) : int = + match opts.Batch, opts.BlockedByMutation with + | true, Some _ -> + eprint "fsgg-coord-engine: set-field --batch cannot be combined with --add, --remove, --replace, or --clear." ExitError + | _, Some mutation -> setBlockedByMutation ctx opts mutation + | _ -> setFieldPositional ctx opts let child (ctx: Context) (opts: Options) : int = match opts.Args with diff --git a/src/FS.GG.Coord.Cli.Kernel/Options.fs b/src/FS.GG.Coord.Cli.Kernel/Options.fs index 6ee69d1f0..fa1010e56 100644 --- a/src/FS.GG.Coord.Cli.Kernel/Options.fs +++ b/src/FS.GG.Coord.Cli.Kernel/Options.fs @@ -71,6 +71,15 @@ module Options = | Json | Text + // Explicit set-valued mutation intent for `set-field ... 'Blocked by'` (.github#2907). + // A union makes add/remove/replace/clear mutually exclusive by construction; the parser refuses + // a second spelling instead of silently choosing the last one. + type BlockedByMutation = + | AddBlockedBy of string + | RemoveBlockedBy of string + | ReplaceBlockedBy of string + | ClearBlockedBy + /// WHICH STDOUT PROJECTIONS A COMMAND ACTUALLY HAS (#1523). /// /// This is the ONE hand-written fact about the renderers, and everything else about `--json`/`--text` @@ -178,6 +187,8 @@ module Options = /// `repo#n`, or an issue URL, and prose or a placeholder is refused before anything is written. /// Read ONLY by `release`; every other command refuses it. BlockedBy: string option + // The explicit `Blocked by` set operation supplied to `set-field`. + BlockedByMutation: BlockedByMutation option /// `ready --all` — widen past the "not Done" default without naming a column (#520: `ready` is a /// TRUTH read, so `--all` shows the whole board, Done and closed items and all). All: bool @@ -473,7 +484,10 @@ IO (read and write the board — $FSGG_COORD_OWNER / $FSGG_COORD_PROJECT, $GITHU default only ever fills an EMPTY column: a row that already carries a Status keeps it, so re-running `add` cannot overwrite one somebody set. `--status S` names the column instead - set-field write one board field (empty value clears) + set-field write one scalar board field (empty value clears) + set-field 'Blocked by' mutate the dependency set explicitly: + --add REFS | --remove REFS preserve every other live edge and fail stale on change + --replace REFS | --clear explicitly replace the set or clear it set-field --batch Field=Value ... write N fields in ONE aliased mutation (#448) flush [--dry-run] REPLAY the board writes an exhausted budget queued — the verb every "QUEUED; flush replays it" message names (#862). Replays @@ -740,6 +754,10 @@ EXIT CODES — the engine's own (the shim translates them for a caller that stil | FIssue | FStatus | FBlockedBy + | FBlockedByAdd + | FBlockedByRemove + | FBlockedByReplace + | FBlockedByClear | FAll | FBatch | FStrict @@ -821,6 +839,10 @@ EXIT CODES — the engine's own (the shim translates them for a caller that stil // `release --blocked-by` (.github#2079) — the ONE call that pairs the `Blocked by` field write // with `--status Blocked`, so `release` is its only reader; every other command refuses it. | FBlockedBy -> Only [ Release ] + | FBlockedByAdd + | FBlockedByRemove + | FBlockedByReplace + | FBlockedByClear -> Only [ SetField ] | FMint -> Only [ WhoAmI ] | FLocal -> Only [ Who ] @@ -929,6 +951,10 @@ EXIT CODES — the engine's own (the shim translates them for a caller that stil | FIssue -> "--issue", [] | FStatus -> "--status", [] | FBlockedBy -> "--blocked-by", [] + | FBlockedByAdd -> "--add", [] + | FBlockedByRemove -> "--remove", [] + | FBlockedByReplace -> "--replace", [] + | FBlockedByClear -> "--clear", [] | FAll -> "--all", [] | FBatch -> "--batch", [] | FExplain -> "--explain", [] @@ -1105,6 +1131,12 @@ EXIT CODES — the engine's own (the shim translates them for a caller that stil if o.Issue.IsSome then FIssue if o.Status.IsSome then FStatus if o.BlockedBy.IsSome then FBlockedBy + match o.BlockedByMutation with + | Some(AddBlockedBy _) -> FBlockedByAdd + | Some(RemoveBlockedBy _) -> FBlockedByRemove + | Some(ReplaceBlockedBy _) -> FBlockedByReplace + | Some ClearBlockedBy -> FBlockedByClear + | None -> () if o.All then FAll if o.Batch then FBatch if o.Strict then FStrict @@ -1690,6 +1722,24 @@ EXIT CODES — the engine's own (the shim translates them for a caller that stil | "--blocked-by" :: value :: t -> flags { acc with BlockedBy = Some value } t | [ "--blocked-by" ] -> Error "--blocked-by needs a value" + | ("--add" | "--remove" | "--replace") as flag :: value :: _ when value.StartsWith "-" -> + Error $"%s{flag} needs a value (got flag '%s{value}')" + | ("--add" | "--remove" | "--replace") as flag :: value :: t -> + match acc.BlockedByMutation with + | Some _ -> Error "set-field accepts exactly one of --add, --remove, --replace, or --clear" + | None -> + let mutation = + match flag with + | "--add" -> AddBlockedBy value + | "--remove" -> RemoveBlockedBy value + | _ -> ReplaceBlockedBy value + flags { acc with BlockedByMutation = Some mutation } t + | [ ("--add" | "--remove" | "--replace") as flag ] -> Error $"%s{flag} needs a value" + | "--clear" :: t -> + match acc.BlockedByMutation with + | Some _ -> Error "set-field accepts exactly one of --add, --remove, --replace, or --clear" + | None -> flags { acc with BlockedByMutation = Some ClearBlockedBy } t + // `issues --label` / `--state` — a label may legitimately begin with a hyphen, but a bare // trailing `--label` with nothing after it is still an error, so the empty-tail guard stays. | "--label" :: value :: t -> flags { acc with Label = Some value } t @@ -1848,6 +1898,7 @@ EXIT CODES — the engine's own (the shim translates them for a caller that stil Issue = None Status = None BlockedBy = None + BlockedByMutation = None All = false Batch = false Explain = false diff --git a/src/FS.GG.Coord.Cli.Kernel/Options.fsi b/src/FS.GG.Coord.Cli.Kernel/Options.fsi index 6deac15ce..b1d75dbae 100644 --- a/src/FS.GG.Coord.Cli.Kernel/Options.fsi +++ b/src/FS.GG.Coord.Cli.Kernel/Options.fsi @@ -191,6 +191,13 @@ module Options = /// Every nullary command case, derived from the union rather than maintained as a second list. val allCommands: Command list + /// Explicit set-valued mutation intent for `set-field ... 'Blocked by'`. + type BlockedByMutation = + | AddBlockedBy of string + | RemoveBlockedBy of string + | ReplaceBlockedBy of string + | ClearBlockedBy + type Options = { Command: Command Render: Render @@ -269,6 +276,8 @@ module Options = /// FIELD in the SAME call (.github#2079), so a coherent park is one call. Canonicalized exactly /// as `set-field 'Blocked by' ` already canonicalizes it. BlockedBy: string option + /// Exactly one explicit set mutation for `set-field ... 'Blocked by'`, or none. + BlockedByMutation: BlockedByMutation option /// `--all` (`ready`) — widen past the "not Done" default without naming a column. `ready` is a /// TRUTH read (#520), so `--all` shows the whole board — Done, and closed-but-still-columned rows. All: bool diff --git a/src/FS.GG.Coord.Cli/Client.fs b/src/FS.GG.Coord.Cli/Client.fs index 896d9eabe..579e3b39e 100644 --- a/src/FS.GG.Coord.Cli/Client.fs +++ b/src/FS.GG.Coord.Cli/Client.fs @@ -51,6 +51,8 @@ module Client = let blockedNoReasonVerdict = LintApplication.blockedNoReasonVerdict + let blockedByBodyProjectionVerdict = LintApplication.blockedByBodyProjectionVerdict + let humanParkResolvedVerdict = LintApplication.humanParkResolvedVerdict let blockerCycleVerdicts = LintApplication.blockerCycleVerdicts @@ -8736,6 +8738,11 @@ scoped credential) and is tracked at .github#2332, not fixable from this repo's |> Option.map (mk "BLOCKED-NO-REASON" "error" r) |> Option.toList + let blockedByProjectionFindings (r: Scan.Row) (body: string) : LintFinding list = + blockedByBodyProjectionVerdict r.Ref.Owner r.Ref.Repo r.BlockedByRaw body + |> Option.map (mk "BLOCKED-BY-BODY-INERT" "error" r) + |> Option.toList + let humanParkFindings (r: Scan.Row) (body: string) : LintFinding list = Map.tryFind r.Ref blockersByRef |> Option.bind (fun blockers -> humanParkResolvedVerdict r.State r.Status blockers body) @@ -8860,7 +8867,15 @@ scoped credential) and is tracked at .github#2332, not fixable from this repo's // One body read serves the touch-set rules, the human-block rule, and the epic // body-child-refs. - let bodyNeeded = isTouchSetCandidate || isEpic || isHumanBlockCandidate + // Every open non-Done body may carry an inert `Blocked by:` projection. There is + // no authoritative pre-index for body text, so diagnosing it requires reading the + // same body operators would otherwise trust. Closed/Done rows are historical and + // omitted from this live dependency-safety census. + let isBlockedByProjectionCandidate = + r.State = IssueState.Open && r.Status <> BoardStatus.Done + + let bodyNeeded = + isTouchSetCandidate || isEpic || isHumanBlockCandidate || isBlockedByProjectionCandidate let bodyResult = if bodyNeeded then @@ -8874,6 +8889,7 @@ scoped credential) and is tracked at .github#2332, not fixable from this repo's let tsFindings = touchSetFindings r body let hbFindings = humanBlockFindings r body + let blockedByProjection = blockedByProjectionFindings r body let humanPark = humanParkFindings r body let clsFindings = classFindings r body @@ -8918,6 +8934,7 @@ scoped credential) and is tracked at .github#2332, not fixable from this repo's (acc @ tsFindings @ hbFindings + @ blockedByProjection @ humanPark @ clsFindings @ statusUnsetFindings diff --git a/src/FS.GG.Coord.Cli/Client.fsi b/src/FS.GG.Coord.Cli/Client.fsi index 008c9b59f..a51a029c3 100644 --- a/src/FS.GG.Coord.Cli/Client.fsi +++ b/src/FS.GG.Coord.Cli/Client.fsi @@ -75,6 +75,10 @@ module Client = (FS.GG.Coord.Types.IssueState -> FS.GG.Coord.Types.BoardStatus -> string -> string -> string option) + /// Compatibility seam for the body/field dependency-projection lint verdict. + val blockedByBodyProjectionVerdict: + (string -> string -> string -> string -> string option) + /// `lint`'s HUMAN-PARK-RESOLVED sentence for one row, or `None`. An ALIAS of /// `LintApplication.humanParkResolvedVerdict`. /// diff --git a/src/FS.GG.Coord.Cli/LintApplication.fs b/src/FS.GG.Coord.Cli/LintApplication.fs index be6363a03..a0d85bfd7 100644 --- a/src/FS.GG.Coord.Cli/LintApplication.fs +++ b/src/FS.GG.Coord.Cli/LintApplication.fs @@ -157,6 +157,64 @@ module LintApplication = else None + // Diagnose a `Blocked by:` BODY projection without ever treating it as dependency authority + // (.github#2907). Fenced examples are quotations and ignored. An agreeing canonical projection is + // useful human-readable text and stays green; empty, divergent, duplicated, or invalid projections + // are actionable because operators otherwise read an inert line as the live edge set. + let blockedByBodyProjectionVerdict + (owner: string) + (repo: string) + (blockedBy: string) + (body: string) + : string option = + + let mutable fence: string option = None + let projections = ResizeArray() + + for line in body.Replace("\r\n", "\n").Split('\n') do + let trimmed = line.TrimStart() + let marker = + if trimmed.StartsWith("```") then Some "```" + elif trimmed.StartsWith("~~~") then Some "~~~" + else None + + match fence, marker with + | None, Some opened -> fence <- Some opened + | Some opened, Some closed when opened = closed -> fence <- None + | None, None -> + let prefix = "Blocked by:" + if trimmed.StartsWith(prefix, System.StringComparison.OrdinalIgnoreCase) then + projections.Add(trimmed.Substring(prefix.Length).Trim()) + | _ -> () + + let render value = if System.String.IsNullOrWhiteSpace value then "" else value + let canonicalSet (value: string) = + value.Split(',') |> Array.map (fun part -> part.Trim()) |> Set.ofArray + + match List.ofSeq projections with + | [] -> None + | _ :: _ :: _ -> + Some + $"body declares %d{projections.Count} unfenced `Blocked by:` lines, but the Projects-v2 `Blocked by` field is the sole authority; keep exactly one generated human-readable projection." + | [ raw ] -> + match Blockers.canonicalizeBlockedBy owner repo raw with + | Error _ + | Ok None -> + Some + $"body declares an invalid or empty `Blocked by:` projection (`%s{render raw}`); it is inert because only the Projects-v2 field creates dependency edges." + | Ok(Some bodyCanonical) -> + match Blockers.canonicalizeBlockedBy owner repo blockedBy with + | Ok(Some fieldCanonical) when canonicalSet fieldCanonical = canonicalSet bodyCanonical -> None + | Ok None -> + Some + $"body says `Blocked by: %s{bodyCanonical}` while the authoritative Projects-v2 field is empty; the body line is inert and creates no dependency edge." + | Ok(Some fieldCanonical) -> + Some + $"body projects `Blocked by: %s{bodyCanonical}` but the authoritative Projects-v2 field is `%s{fieldCanonical}`; regenerate or remove the divergent body projection." + | Error _ -> + Some + $"body projects `Blocked by: %s{bodyCanonical}` but the authoritative Projects-v2 field is not a canonical issue-ref set (`%s{render blockedBy}`); repair the field authority before trusting the projection." + let humanParkResolvedVerdict state status (blockers: Blocker list) (body: string) : string option = match HumanBlock.parse body with | Some AwaitingHumanDecision when state = IssueState.Open && status = BoardStatus.Blocked && not (List.isEmpty blockers) && (blockers |> List.forall Blockers.isResolved) -> diff --git a/src/FS.GG.Coord.Cli/LintApplication.fsi b/src/FS.GG.Coord.Cli/LintApplication.fsi index 16ca3fcae..79493f81c 100644 --- a/src/FS.GG.Coord.Cli/LintApplication.fsi +++ b/src/FS.GG.Coord.Cli/LintApplication.fsi @@ -71,6 +71,11 @@ module LintApplication = val blockedNoReasonVerdict: state: IssueState -> status: BoardStatus -> blockedBy: string -> body: string -> string option + /// `Some detail` when an unfenced body `Blocked by:` projection is inert, divergent, duplicated, or + /// invalid relative to the authoritative Projects-v2 field; `None` when absent or canonically equal. + val blockedByBodyProjectionVerdict: + owner: string -> repo: string -> blockedBy: string -> body: string -> string option + val humanParkResolvedVerdict: state: IssueState -> status: BoardStatus -> blockers: Blocker list -> body: string -> string option diff --git a/src/FS.GG.Coord.GitHub/Board.fs b/src/FS.GG.Coord.GitHub/Board.fs index 59b1e52e0..d741fe057 100644 --- a/src/FS.GG.Coord.GitHub/Board.fs +++ b/src/FS.GG.Coord.GitHub/Board.fs @@ -1435,6 +1435,57 @@ module Board = // REPORTED, NEVER SWALLOWED. A refusal nobody can read is a refusal that did not happen. Error e + // A revision-guarded single-field write for a value derived from `Blocked by`'s live set + // (.github#2907). Unlike `boardWrite`, this path is never deferred: replaying a derived value after + // its observation has aged would turn an edge-local intent back into destructive replacement. + let boardWriteGuarded + (transport: IGitHubTransport) + (board: BoardMap) + (owner: string) + (repo: string) + (number: int) + (expected: BlockedByObservation) + (write: FieldWrite) + : IoResult = + + let subject = $"%s{owner}/%s{repo}#%d{number} guarded Blocked by write" + + let resolved = + if String.Equals(owner, board.Owner, StringComparison.OrdinalIgnoreCase) then + itemId transport board owner repo number + else + itemIdCached transport board owner repo number + + match resolved with + | Error e -> Error e + | Ok None -> Ok NotOnBoard + | Ok(Some item) -> + match itemBlockedByObservation transport board owner repo number with + | Error e -> Error e + | Ok observed when observed <> expected -> + Error( + Malformed( + subject, + "Stale dependency-edge observation: the Projects item revision or Blocked by edge changed at the board-write boundary; no mutation was sent. Re-derive and retry." + ) + ) + | Ok _ -> + match setField transport board item "Blocked by" write with + | Error e -> Error e + | Ok() -> + Cache.patchScan + board.Owner + board.Title + owner + repo + number + "Blocked by" + (match write with + | Set value -> value + | Clear -> "") + + Ok Written + // The batch sibling of `boardWrite` (#448): resolve the item, emit N fields in ONE aliased document, // and carry the SAME deferral policy the single write does. // diff --git a/src/FS.GG.Coord.GitHub/Board.fsi b/src/FS.GG.Coord.GitHub/Board.fsi index 0b71d2d94..68e617af6 100644 --- a/src/FS.GG.Coord.GitHub/Board.fsi +++ b/src/FS.GG.Coord.GitHub/Board.fsi @@ -327,6 +327,19 @@ module Board = worker: string -> IoResult + /// Write a `Blocked by` value derived from a live set only while the field value and Projects-v2 + /// item revision still equal `expected`. A mismatch fails stale before mutation. Guarded writes are + /// never placed on the unconditional deferred queue because replay would lose the observation bound. + val boardWriteGuarded: + transport: IGitHubTransport -> + board: BoardMap -> + owner: string -> + repo: string -> + number: int -> + expected: BlockedByObservation -> + write: FieldWrite -> + IoResult + /// **THE ONE BATCH BOARD WRITE (#448).** `boardWrite` for N fields in one aliased document. /// /// Carries the SAME deferral policy — an exhausted budget QUEUES every pair, so the whole batch replays diff --git a/tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs b/tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs index 0f7ed0f58..4b488ac23 100644 --- a/tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs +++ b/tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs @@ -1,5 +1,6 @@ namespace FS.GG.Coord.Cli.Tests +open System open System.IO open System.Text.RegularExpressions open Xunit @@ -14,6 +15,140 @@ module BlockerLintTests = let private ref' n : Ref = { Owner = "FS-GG"; Repo = ".github"; Number = n } + [] + let ``#2907 explicit Blocked by flags are mutually exclusive and scoped to set-field`` () = + let parsed = + Options.parse [ "set-field"; "FS.GG.SDD#42"; "Blocked by"; "--add"; "#299" ] + |> Result.defaultWith failwith + + Assert.Equal(Some(Options.AddBlockedBy "#299"), parsed.BlockedByMutation) + + Assert.True( + (Options.parse [ "set-field"; "FS.GG.SDD#42"; "Blocked by"; "--add"; "#299"; "--remove"; "#290" ]).IsError + ) + + Assert.True((Options.parse [ "heartbeat"; "FS.GG.SDD#42"; "--clear" ]).IsError) + + [] + [] + [] + [] + [] + let ``#2907 lint treats body dependency text as projection only`` (fieldValue: string) (body: string) (expected: bool) = + let actual = + Client.blockedByBodyProjectionVerdict "FS-GG" ".github" fieldValue body + |> Option.isSome + + Assert.Equal(expected, actual) + + module private BlockedBySetMutationFixture = + + let private ok body : Errors.IoResult = + Ok { Status = 200; Body = body; ETag = None; NextLink = None; Headers = Map.empty } + + type Outcome = + { Code: int + Out: string + Error: string + Mutations: string list } + + let run (initialValue: string) (secondValue: string) (initialRevision: string) (secondRevision: string) (args: string list) = + let mutable observations = 0 + let mutations = ResizeArray() + + let observation value revision = + $"""{{"data":{{"repository":{{"issue":{{"projectItems":{{"totalCount":1,"nodes":[{{"updatedAt":"%s{revision}","project":{{"number":12}},"fieldValueByName":{{"text":"%s{value}"}}}}]}}}}}}}},"rateLimit":{{"cost":1,"remaining":4977}}}}""" + + let transport = + Fake.Recorder(fun request -> + match request.Method, request.Path.Trim('/'), request.Body with + | "GET", "rate_limit", _ -> ok """{"resources":{"graphql":{"remaining":4980,"limit":5000}}}""" + | "POST", "graphql", Query(document, _) when document.Contains "projectsV2" -> + ok """{"data":{"organization":{"projectsV2":{"pageInfo":{"hasNextPage":false,"endCursor":null},"nodes":[{"number":12,"title":"Coordination","id":"PVT_coord"}]}}}}""" + | "POST", "graphql", Query(document, _) when document.Contains "fields(first" -> + ok """{"data":{"organization":{"projectV2":{"fields":{"totalCount":1,"nodes":[{"id":"PVTF_blocked","name":"Blocked by","dataType":"TEXT"}]}}}},"rateLimit":{"cost":1,"remaining":4977}}""" + | "POST", "graphql", Query(document, _) when document.Contains "updatedAt" && document.Contains "fieldValueByName" -> + observations <- observations + 1 + if observations = 1 then ok (observation initialValue initialRevision) + else ok (observation secondValue secondRevision) + | "POST", "graphql", Query(document, _) when document.Contains "projectItems" && document.Contains "id project" -> + ok """{"data":{"repository":{"issue":{"projectItems":{"nodes":[{"id":"PVTI_coord123","project":{"number":12}}]}}}}}""" + | "POST", "graphql", Query(document, variables) when document.Contains "updateProjectV2ItemFieldValue" -> + let text = + variables + |> List.tryPick (function | "text", VString value -> Some value | _ -> None) + |> Option.defaultValue "" + mutations.Add text + ok """{"data":{"updateProjectV2ItemFieldValue":{"clientMutationId":null}}}""" + | "POST", "graphql", Query(document, _) when document.Contains "clearProjectV2ItemFieldValue" -> + mutations.Add "" + ok """{"data":{"clearProjectV2ItemFieldValue":{"clientMutationId":null}}}""" + | method, path, _ -> Error(Errors.NotFound $"fixture serves no %s{method} %s{path}")) + + let dir = Path.Combine(Path.GetTempPath(), "fsgg-2907-" + Guid.NewGuid().ToString("N")) + let previousCache = Environment.GetEnvironmentVariable "FSGG_COORD_CACHE" + let previousWorker = Environment.GetEnvironmentVariable "FSGG_WORKER" + let stdout, stderr = Console.Out, Console.Error + use capturedOut = new StringWriter() + use capturedErr = new StringWriter() + + try + Directory.CreateDirectory dir |> ignore + Environment.SetEnvironmentVariable("FSGG_COORD_CACHE", dir) + Environment.SetEnvironmentVariable("FSGG_WORKER", "plover-2907") + Console.SetOut capturedOut + Console.SetError capturedErr + let opts = Options.parse args |> Result.defaultWith failwith + let context: Kernel.Context = + { Transport = transport; Owner = "FS-GG"; Title = "Coordination"; DefaultRepo = Some "FS.GG.SDD"; ChoreLocks = [] } + let code = Handlers.setField context opts + Console.Out.Flush() + Console.Error.Flush() + { Code = code; Out = capturedOut.ToString(); Error = capturedErr.ToString(); Mutations = List.ofSeq mutations } + finally + Console.SetOut stdout + Console.SetError stderr + Environment.SetEnvironmentVariable("FSGG_COORD_CACHE", previousCache) + Environment.SetEnvironmentVariable("FSGG_WORKER", previousWorker) + try Directory.Delete(dir, true) with _ -> () + + [] + let ``#2907 add preserves the existing edge while adding the requested edge`` () = + let result = + BlockedBySetMutationFixture.run + "FS-GG/FS.GG.SDD#290" + "FS-GG/FS.GG.SDD#290" + "r1" + "r1" + [ "set-field"; "FS.GG.SDD#42"; "Blocked by"; "--add"; "#299" ] + Assert.Equal(0, result.Code) + Assert.Equal([ "FS-GG/FS.GG.SDD#290, FS-GG/FS.GG.SDD#299" ], result.Mutations) + + [] + let ``#2907 remove preserves every edge not requested`` () = + let result = + BlockedBySetMutationFixture.run + "FS-GG/FS.GG.SDD#290, FS-GG/FS.GG.SDD#299" + "FS-GG/FS.GG.SDD#290, FS-GG/FS.GG.SDD#299" + "r1" + "r1" + [ "set-field"; "FS.GG.SDD#42"; "Blocked by"; "--remove"; "#290" ] + Assert.Equal(0, result.Code) + Assert.Equal([ "FS-GG/FS.GG.SDD#299" ], result.Mutations) + + [] + let ``#2907 concurrent revision change fails stale and sends no mutation`` () = + let result = + BlockedBySetMutationFixture.run + "FS-GG/FS.GG.SDD#290" + "FS-GG/FS.GG.SDD#290, FS-GG/FS.GG.SDD#777" + "r1" + "r2" + [ "set-field"; "FS.GG.SDD#42"; "Blocked by"; "--add"; "#299" ] + Assert.NotEqual(0, result.Code) + Assert.Contains("Stale dependency-edge observation", result.Error) + Assert.Empty(result.Mutations) + /// .github#2698 — a comment ledger holding one current delivery-route receipt for `subject`, as /// `Reads.commentBodies` reads it. Any fixture whose command RESOLVES a `Status=Ready` write needs /// one now; a `[]` ledger is the unschedulable-from-birth row the refusal exists to stop. @@ -73,7 +208,7 @@ module BlockerLintTests = let directStatusWrites = Regex.Matches(source, "Board\\.boardWrite[\\s\\S]{0,300}?\\\"Status\\\"").Count Assert.Equal(4, directStatusWrites) - Assert.Equal(12, Regex.Matches(source, "Board\\.boardWrite\\b").Count) + Assert.Equal(13, Regex.Matches(source, "Board\\.boardWrite\\b").Count) Assert.Equal(3, Regex.Matches(source, "Board\\.boardWriteBatch\\b").Count) Assert.Equal(3, Regex.Matches(source, "requireCoherentBlockedWrite ctx").Count) Assert.Equal(3, Regex.Matches(chore, "Some\\(\\\"Status\\\"").Count) diff --git a/tests/coord-engine-parity/run.sh b/tests/coord-engine-parity/run.sh index 39c0be41a..1fd313644 100755 --- a/tests/coord-engine-parity/run.sh +++ b/tests/coord-engine-parity/run.sh @@ -1401,7 +1401,7 @@ sfsrv -- set-field if [ -z "$SF_PORT" ]; then bad "set-field ref-first fixture bound a port"; else # a. WRONG IN BOTH WAYS: an unrecognised ref, AND prose in `Blocked by` (which gateField refuses on its # own — b proves it). Ref-first means the REF refusal is the one the caller is handed. - r1="$(sfr set-field --worker sf-1032 not-an-issue 'Blocked by' 'the audio team is busy')"; r1rc=$? + r1="$(sfr set-field --worker sf-1032 not-an-issue 'Blocked by' --replace 'the audio team is busy')"; r1rc=$? { [ "$r1rc" -eq 1 ] && printf '%s' "$r1" | grep -q "unrecognised issue ref 'not-an-issue'"; } \ && ok "#1032: a bad ref is refused AS A REF — 'unrecognised issue ref', exit 1" \ || bad "#1032: a bad ref must be refused as a ref" "rc=$r1rc out=$r1" @@ -1411,7 +1411,7 @@ if [ -z "$SF_PORT" ]; then bad "set-field ref-first fixture bound a port"; else # b. THE GATE IS ALIVE. The same prose value on a GOOD ref DOES reach the value refusal. This is what # makes (a) a statement about ORDERING rather than about a value check that never runs. - r2="$(sfr set-field --worker sf-1032 FS.GG.SDD#42 'Blocked by' 'the audio team is busy')"; r2rc=$? + r2="$(sfr set-field --worker sf-1032 FS.GG.SDD#42 'Blocked by' --replace 'the audio team is busy')"; r2rc=$? { [ "$r2rc" -eq 1 ] && printf '%s' "$r2" | grep -q "'Blocked by' takes issue refs"; } \ && ok "#1032: a GOOD ref with the same prose value DOES reach the value refusal — (a) is not vacuous" \ || bad "#1032: the 'Blocked by' gate must still refuse prose on a good ref" "rc=$r2rc out=$r2" @@ -1449,7 +1449,7 @@ fi # #611's fix. Each fixture below runs exactly the ONE command its assertion is about. sfsrv -- set-field if [ -z "$SF_PORT" ]; then bad "set-field ref-budget fixture bound a port"; else - sfr set-field --worker sf-1032 not-an-issue 'Blocked by' 'the audio team is busy' >/dev/null 2>&1 + sfr set-field --worker sf-1032 not-an-issue 'Blocked by' --replace 'the audio team is busy' >/dev/null 2>&1 [ "$(muts_on "$SF_PORT" | jq -r '.graphql')" = "0" ] \ && ok "#1032: a refused ref spends ZERO GraphQL — no read is paid for a ref that can never be used" \ || bad "#1032: a refused ref must not spend the budget the lock lives on" "graphql=$(muts_on "$SF_PORT" | jq -r '.graphql')" @@ -1460,7 +1460,7 @@ fi # claims as much. A claim with no leg behind it is the thing this whole section is about, so: pin it. sfsrv -- set-field if [ -z "$SF_PORT" ]; then bad "set-field value-gate budget fixture bound a port"; else - sfr set-field --worker sf-1032 FS.GG.SDD#42 'Blocked by' 'the audio team is busy' >/dev/null 2>&1 + sfr set-field --worker sf-1032 FS.GG.SDD#42 'Blocked by' --replace 'the audio team is busy' >/dev/null 2>&1 [ "$(muts_on "$SF_PORT" | jq -r '.graphql')" = "0" ] \ && ok "#1032: the 'Blocked by' value gate spends ZERO GraphQL too — it also precedes the board read" \ || bad "#1032: a refused value must not spend the budget either" "graphql=$(muts_on "$SF_PORT" | jq -r '.graphql')" @@ -1942,7 +1942,7 @@ rm -f "$SC_OUT"; rm -rf "$SC_CACHE" "$CO" # Projects v2 has no dependency field, so `Blocked by` is TEXT. In bash it drifted back into a free-form # LOG ("RESOLVED: #8 closed, shipped @d80a8ae"), and `.blocked` — which reads the field back as refs — # could not parse it, so an item the board displayed as blocked reached the scheduler UNBLOCKED. The gate -# is on the WRITE: `set-field 'Blocked by' ` canonicalizes every accepted form +# is on the WRITE: `set-field 'Blocked by' --replace ` canonicalizes every accepted form # (owner/repo#n, repo#n, a bare #n adopting the item's own repo, an issue URL) to one `owner/repo#n`, # de-dupes refs that canonicalize alike, and REFUSES prose — before any board read, so a refused value # spends no GraphQL (the budget that dies first). The corpus (case 13 lines 153-243) counts `gh`; this @@ -1959,35 +1959,35 @@ if [ -z "$BB_PORT" ]; then bad "#480: Blocked by fixture bound a port"; else BBCACHE="$(mktemp -d)" # The WRITE path shares one cache — the first write warms bootstrap, each records its mutation. bbw() { FSGG_GITHUB_API_BASE="http://127.0.0.1:$BB_PORT" FSGG_COORD_CACHE="$BBCACHE" \ - "$ENGINE" set-field --worker bb-13 FS.GG.SDD#42 'Blocked by' "$1" 2>&1; } + "$ENGINE" set-field --worker bb-13 FS.GG.SDD#42 'Blocked by' "$@" 2>&1; } bblast() { bbget "$BB_PORT" /_writes | jq -r "$1"; } # 1. A full ref passes through, canonical. - bbw 'FS-GG/FS.GG.SDD#8' >/dev/null + bbw --replace 'FS-GG/FS.GG.SDD#8' >/dev/null [ "$(bblast '.last | "\(.op) \(.field) \(.text)"')" = "set Blocked by FS-GG/FS.GG.SDD#8" ] \ && ok "Blocked by: a full owner/repo#n ref writes as-is (canonical --text, one transport over)" \ || bad "Blocked by: full ref passthrough" "$(bblast '.last')" # 2. A bare #n adopts the BLOCKED item's own repo (SDD#42 -> FS-GG/FS.GG.SDD#33). - bbw '#33' >/dev/null + bbw --replace '#33' >/dev/null [ "$(bblast '.last.text')" = "FS-GG/FS.GG.SDD#33" ] \ && ok "Blocked by: a bare #n adopts the blocked item's repo (#33 -> FS-GG/FS.GG.SDD#33)" \ || bad "Blocked by: bare #n adoption" "$(bblast '.last.text')" # 3. A LIST canonicalizes every form — a repo#n and an issue URL, in order. - bbw 'FS.GG.Rendering#33 , https://github.com/FS-GG/FS.GG.Templates/issues/8' >/dev/null + bbw --replace 'FS.GG.Rendering#33 , https://github.com/FS-GG/FS.GG.Templates/issues/8' >/dev/null [ "$(bblast '.last.text')" = "FS-GG/FS.GG.Rendering#33, FS-GG/FS.GG.Templates#8" ] \ && ok "Blocked by: a list canonicalizes EVERY form (repo#n + URL), in order" \ || bad "Blocked by: list canonicalization" "$(bblast '.last.text')" # 4. Refs that canonicalize alike are DE-DUPED — one edge, not two. - bbw '#8, FS-GG/FS.GG.SDD#8' >/dev/null + bbw --replace '#8, FS-GG/FS.GG.SDD#8' >/dev/null [ "$(bblast '.last.text')" = "FS-GG/FS.GG.SDD#8" ] \ && ok "Blocked by: refs that canonicalize alike are de-duped (#8 == FS-GG/FS.GG.SDD#8)" \ || bad "Blocked by: de-dupe" "$(bblast '.last.text')" # 5. An EMPTY value CLEARS — via the distinct clear mutation, never an empty --text (a no-op on the API). - bbw '' >/dev/null + bbw --clear >/dev/null [ "$(bblast '.last.op')" = "clear" ] \ && ok "Blocked by: an empty value CLEARS the field (clearProjectV2ItemFieldValue, not an empty update)" \ || bad "Blocked by: empty clears" "$(bblast '.last')" @@ -1996,7 +1996,7 @@ if [ -z "$BB_PORT" ]; then bad "#480: Blocked by fixture bound a port"; else # cache, so if the gate did NOT fire, bootstrap WOULD hit /graphql: the delta of 0 proves precedence. before="$(bbget "$BB_PORT" /_gqlcount | jq -r '.count')" pr_refuse="$(FSGG_GITHUB_API_BASE="http://127.0.0.1:$BB_PORT" FSGG_COORD_CACHE="$(mktemp -d)" \ - "$ENGINE" set-field --worker bb-13 FS.GG.SDD#42 'Blocked by' 'RESOLVED: #8 closed, shipped @d80a8ae' 2>&1)"; refrc=$? + "$ENGINE" set-field --worker bb-13 FS.GG.SDD#42 'Blocked by' --replace 'RESOLVED: #8 closed, shipped @d80a8ae' 2>&1)"; refrc=$? after="$(bbget "$BB_PORT" /_gqlcount | jq -r '.count')" { [ "$refrc" -ne 0 ] && [ "$before" = "$after" ]; } \ && ok "Blocked by: a refused write (a delivery log) is rejected AND spends ZERO GraphQL (validation precedes resolution)" \ @@ -2004,26 +2004,26 @@ if [ -z "$BB_PORT" ]; then bad "#480: Blocked by fixture bound a port"; else # 7. The delivery log, the inverted edge, and a ref TRAILED by prose are all prose — all refused. ( set +e - FSGG_GITHUB_API_BASE="http://127.0.0.1:$BB_PORT" FSGG_COORD_CACHE="$(mktemp -d)" "$ENGINE" set-field --worker bb-13 FS.GG.SDD#42 'Blocked by' 'blocks FS.GG.Governance#14' >/dev/null 2>&1 + FSGG_GITHUB_API_BASE="http://127.0.0.1:$BB_PORT" FSGG_COORD_CACHE="$(mktemp -d)" "$ENGINE" set-field --worker bb-13 FS.GG.SDD#42 'Blocked by' --replace 'blocks FS.GG.Governance#14' >/dev/null 2>&1 [ $? -ne 0 ] ) \ && ok "Blocked by: the inverted 'blocks X' edge is refused (wrong direction)" \ || bad "Blocked by: inverted edge must refuse" ( set +e - FSGG_GITHUB_API_BASE="http://127.0.0.1:$BB_PORT" FSGG_COORD_CACHE="$(mktemp -d)" "$ENGINE" set-field --worker bb-13 FS.GG.SDD#42 'Blocked by' 'FS-GG/FS.GG.SDD#8 (republish vehicle)' >/dev/null 2>&1 + FSGG_GITHUB_API_BASE="http://127.0.0.1:$BB_PORT" FSGG_COORD_CACHE="$(mktemp -d)" "$ENGINE" set-field --worker bb-13 FS.GG.SDD#42 'Blocked by' --replace 'FS-GG/FS.GG.SDD#8 (republish vehicle)' >/dev/null 2>&1 [ $? -ne 0 ] ) \ && ok "Blocked by: prose TRAILING a valid ref is refused — the anchored match will not swallow it" \ || bad "Blocked by: trailing prose must refuse" # 8. The prose refusal REDIRECTS: names Status as the home for 'the item IS blocked'. - prose_out="$(FSGG_GITHUB_API_BASE="http://127.0.0.1:$BB_PORT" FSGG_COORD_CACHE="$(mktemp -d)" "$ENGINE" set-field --worker bb-13 FS.GG.SDD#42 'Blocked by' 'not a ref' 2>&1)" + prose_out="$(FSGG_GITHUB_API_BASE="http://127.0.0.1:$BB_PORT" FSGG_COORD_CACHE="$(mktemp -d)" "$ENGINE" set-field --worker bb-13 FS.GG.SDD#42 'Blocked by' --replace 'not a ref' 2>&1)" printf '%s' "$prose_out" | grep -q 'set-field Status Blocked' \ && ok "Blocked by: the prose refusal names Status as the right home for 'is blocked'" \ || bad "Blocked by: prose refusal must name Status" "$prose_out" # 9. A '-'/'none' PLACEHOLDER is a distinct refusal — it points at CLEARING, not at Status. - ph_out="$(FSGG_GITHUB_API_BASE="http://127.0.0.1:$BB_PORT" FSGG_COORD_CACHE="$(mktemp -d)" "$ENGINE" set-field --worker bb-13 FS.GG.SDD#42 'Blocked by' 'none' 2>&1)"; phrc=$? - { [ "$phrc" -ne 0 ] && printf '%s' "$ph_out" | grep -q "'Blocked by' ''"; } \ - && ok "Blocked by: a '-'/'none' placeholder is refused TOWARD clearing (points at 'Blocked by' '')" \ + ph_out="$(FSGG_GITHUB_API_BASE="http://127.0.0.1:$BB_PORT" FSGG_COORD_CACHE="$(mktemp -d)" "$ENGINE" set-field --worker bb-13 FS.GG.SDD#42 'Blocked by' --replace 'none' 2>&1)"; phrc=$? + { [ "$phrc" -ne 0 ] && printf '%s' "$ph_out" | grep -q -- "--clear"; } \ + && ok "Blocked by: a '-'/'none' placeholder is refused TOWARD the explicit --clear intent" \ || bad "Blocked by: placeholder must point at clearing" "rc=$phrc out=$ph_out" # 10. THE GATE IS SCOPED to `Blocked by`. Every other TEXT field stays free-form — Contract takes prose. diff --git a/work/2907-blocked-by-set-mutations/charter.md b/work/2907-blocked-by-set-mutations/charter.md new file mode 100644 index 000000000..26ff3d213 --- /dev/null +++ b/work/2907-blocked-by-set-mutations/charter.md @@ -0,0 +1,39 @@ +--- +schemaVersion: 1 +workId: 2907-blocked-by-set-mutations +title: Blocked-by Set Mutations +stage: charter +changeTier: tier1 +status: chartered +policyPointers: + - .fsgg/sdd.yml + - .fsgg/agents.yml + - .fsgg/policy.yml + - .fsgg/capabilities.yml + - .fsgg/tooling.yml +--- + +# Blocked-by Set Mutations Charter + +## Identity +- Work id: `2907-blocked-by-set-mutations` +- Lifecycle stage: charter +- Status: chartered + +## Principles +- Treat `Blocked by` as a set whose individual edges are preserved unless the caller explicitly removes them. +- Bind every derived set mutation to the live Projects-v2 item revision and observed field value; stale observations fail closed. +- Keep the Projects-v2 `Blocked by` field authoritative. Body text is a human-readable projection and never mutation input. +- Ship every new write or lint gate with a discriminating control that demonstrates the gate can fail. + +## Scope Boundaries +- Change only the `set-field` command contract, its Projects-v2 write boundary, the inert-body lint rule, and focused tests. +- Preserve unrelated scalar field writes, explicit clearing, board authority, and existing dependency parsing/canonicalization. +- Do not infer dependency edges from issue bodies or silently repair a divergent body projection. + +## Policy Pointers +- SDD policy comes from `.fsgg/sdd.yml` and `.fsgg/agents.yml`. +- Governance files are optional compatibility pointers and are not evaluated by this command. + +## Lifecycle Notes +- Next lifecycle action: `fsgg-sdd specify --work 2907-blocked-by-set-mutations`. diff --git a/work/2907-blocked-by-set-mutations/checklist.md b/work/2907-blocked-by-set-mutations/checklist.md new file mode 100644 index 000000000..63ea9211d --- /dev/null +++ b/work/2907-blocked-by-set-mutations/checklist.md @@ -0,0 +1,55 @@ +--- +schemaVersion: 1 +workId: 2907-blocked-by-set-mutations +title: Blocked By Set Mutations +stage: checklist +changeTier: tier1 +status: checklistReady +sourceSpec: work/2907-blocked-by-set-mutations/spec.md +sourceClarifications: work/2907-blocked-by-set-mutations/clarifications.md +publicOrToolFacingImpact: true +--- + +# Blocked By Set Mutations Checklist + +Prose status: checklistReady + +## Source Specification +- work/2907-blocked-by-set-mutations/spec.md + +## Source Clarifications +- work/2907-blocked-by-set-mutations/clarifications.md + +## Source Snapshot +- spec: work/2907-blocked-by-set-mutations/spec.md sha256:bbfc8ac46a0af4e5487e6e08af4603eb9e97d26877c78774d4f96d892930802f schemaVersion:1 +- clarifications: work/2907-blocked-by-set-mutations/clarifications.md sha256:29371de9aa66598f033214d6fd42665dac6d53189f32f572cdd1327bb6537bc5 schemaVersion:1 + +## Checklist Items +- CHK-001 [FR-001] [AC-001] blocking: Requirement FR-001 is testable and linked to acceptance coverage. +- CHK-002 [FR-002] [AC-002] blocking: Requirement FR-002 is testable and linked to acceptance coverage. +- CHK-003 [FR-003] [AC-001] [AC-002] [AC-003] blocking: Requirement FR-003 is testable and linked to acceptance coverage. +- CHK-004 [FR-004] [AC-004] blocking: Requirement FR-004 is testable and linked to acceptance coverage. +- CHK-005 [FR-005] [AC-005] blocking: Requirement FR-005 is testable and linked to acceptance coverage. +- CHK-006 [FR-006] [AC-006] blocking: Requirement FR-006 is testable and linked to acceptance coverage. + +## Review Results +- CR-001 [CHK:CHK-001] [FR-001] [AC-001] pass: Requirement FR-001 is testable and linked to acceptance coverage. +- CR-002 [CHK:CHK-002] [FR-002] [AC-002] pass: Requirement FR-002 is testable and linked to acceptance coverage. +- CR-003 [CHK:CHK-003] [FR-003] [AC-001] [AC-002] [AC-003] pass: Requirement FR-003 is testable and linked to acceptance coverage. +- CR-004 [CHK:CHK-004] [FR-004] [AC-004] pass: Requirement FR-004 is testable and linked to acceptance coverage. +- CR-005 [CHK:CHK-005] [FR-005] [AC-005] pass: Requirement FR-005 is testable and linked to acceptance coverage. +- CR-006 [CHK:CHK-006] [FR-006] [AC-006] pass: Requirement FR-006 is testable and linked to acceptance coverage. + +## Accepted Deferrals +No accepted checklist deferrals recorded. + +## Blocking Findings +No blocking findings recorded. + +## Advisory Notes +No advisory notes recorded. + +## Lifecycle Notes +- Specification requirements reviewed: 6. +- Clarification decisions reviewed: 4. +- Next lifecycle action: `fsgg-sdd plan --work 2907-blocked-by-set-mutations`. diff --git a/work/2907-blocked-by-set-mutations/clarifications.md b/work/2907-blocked-by-set-mutations/clarifications.md new file mode 100644 index 000000000..0e066104d --- /dev/null +++ b/work/2907-blocked-by-set-mutations/clarifications.md @@ -0,0 +1,38 @@ +--- +schemaVersion: 1 +workId: 2907-blocked-by-set-mutations +title: Blocked-by Set Mutations +stage: clarify +changeTier: tier1 +status: clarified +sourceSpec: work/2907-blocked-by-set-mutations/spec.md +publicOrToolFacingImpact: true +--- + +# Blocked-by Set Mutations Clarifications + +## Source Specification +- work/2907-blocked-by-set-mutations/spec.md + +## Clarification Questions +- CQ-001 [AMB:AMB-001] blocking answered: What public spelling makes add, remove, replace, and clear explicit without weakening the parser's residue rule or changing scalar field writes? +- CQ-002 [AMB:AMB-002] blocking answered: Where is revision freshness checked when Projects-v2 exposes item `updatedAt` but no native compare-and-set input? + +## Answers +- CQ-001 [AMB:AMB-001] answer: Keep `set-field ` for scalar fields. For `Blocked by`, accept exactly one of `--add `, `--remove `, `--replace `, or `--clear`; refuse the legacy bare positional value with a corrective diagnostic. The existing `--batch` `Field=Value` grammar remains explicitly replacement-shaped by `=`, and `Field=` remains its explicit clear spelling. +- CQ-002 [AMB:AMB-002] answer: Add/remove first read `{ Value; Revision }`, derive the canonical result, then pass the same observation to the one board-write boundary. That boundary immediately re-reads both facts and refuses stale before emitting the mutation when either differs. GitHub supplies no server-side `If-Match`, so documentation must describe this as the strongest revision guard Projects-v2 exposes, not claim a nonexistent transport-level compare-and-set. Tests must inject a changed second observation and prove mutation count zero. + +## Decisions +- DEC-001 [CQ-001] [AMB:AMB-001] [FR-001] [FR-002] [FR-004] [AC-001] [AC-002] [AC-004]: Add four closed, mutually exclusive option fields and parser flags scoped only to `set-field`. `--add` and `--remove` derive from the live set, `--replace` writes only the supplied canonical set, and `--clear` uses `Board.Clear`. A bare `Blocked by` positional value refuses and names the four valid forms. Scalar fields retain their existing positional contract; batch equality remains an explicitly named replacement/clear operation. +- DEC-002 [CQ-002] [AMB:AMB-002] [FR-003] [AC-003]: Introduce a guarded single-field board write accepting `BlockedByObservation`. It resolves the item, re-reads the observation immediately before mutation, and emits no mutation on mismatch. The fixture controls the two reads independently and asserts a stale diagnostic plus zero update/clear documents when the second revision or value differs. +- DEC-003 [FR-005] [AC-005]: Parse only an unfenced, line-leading `Blocked by:` body projection using the same dependency canonicalizer as the field. No body line means no finding. A present line with empty authoritative field yields `BLOCKED-BY-BODY-INERT`; unequal canonical sets or invalid projection syntax yield the same stable rule family with a precise divergent/invalid detail; equal canonical sets stay green. +- DEC-004 [FR-006] [AC-006]: Mutation controls independently replace union with requested-only, subtraction with empty, and stale comparison with unconditional success; lint controls suppress the body comparison. Each control must red a named focused test, then be restored before the full gates. + +## Accepted Deferrals +No accepted deferrals recorded. + +## Remaining Ambiguity +No blocking ambiguity remains. + +## Lifecycle Notes +- Next lifecycle action: `fsgg-sdd checklist --work 2907-blocked-by-set-mutations`. diff --git a/work/2907-blocked-by-set-mutations/evidence.yml b/work/2907-blocked-by-set-mutations/evidence.yml new file mode 100644 index 000000000..fad265e91 --- /dev/null +++ b/work/2907-blocked-by-set-mutations/evidence.yml @@ -0,0 +1,416 @@ +schemaVersion: 1 +workId: 2907-blocked-by-set-mutations +stage: evidence +status: evidenceReady +sourceSpec: work/2907-blocked-by-set-mutations/spec.md +sourceClarifications: work/2907-blocked-by-set-mutations/clarifications.md +sourceChecklist: work/2907-blocked-by-set-mutations/checklist.md +sourcePlan: work/2907-blocked-by-set-mutations/plan.md +sourceTasks: work/2907-blocked-by-set-mutations/tasks.yml +sourceAnalysis: readiness/2907-blocked-by-set-mutations/analysis.json +sourceSnapshots: + - label: analysis + path: readiness/2907-blocked-by-set-mutations/analysis.json + digest: 3ae6df877929bd095ea483ed27cced27a3a43bcfe0acd2c4ada8c1b5411888ad + schemaVersion: 1 + - label: checklist + path: work/2907-blocked-by-set-mutations/checklist.md + digest: 2799d51aeaf8b672cd72d857c78bd907426e73a20a8b7c8cda8ea1ad2c71fe95 + schemaVersion: 1 + - label: clarifications + path: work/2907-blocked-by-set-mutations/clarifications.md + digest: 29371de9aa66598f033214d6fd42665dac6d53189f32f572cdd1327bb6537bc5 + schemaVersion: 1 + - label: plan + path: work/2907-blocked-by-set-mutations/plan.md + digest: 243f8da1ca1d80b697dcbd4c9359371b98f08f39961ec7bb1c363424b198288d + schemaVersion: 1 + - label: spec + path: work/2907-blocked-by-set-mutations/spec.md + digest: bbfc8ac46a0af4e5487e6e08af4603eb9e97d26877c78774d4f96d892930802f + schemaVersion: 1 + - label: tasks + path: work/2907-blocked-by-set-mutations/tasks.yml + digest: ae85b8835c2a835841d0d3ad0afbb741d36a51b524397d083b88b34203a8c540 + schemaVersion: 1 +evidence: + - id: EV001 + kind: verification + subject: + type: task + id: T001 + taskRefs: [T001] + requirementRefs: [FR-001] + acceptanceScenarioRefs: [] + clarificationDecisionRefs: [] + checklistResultRefs: [] + planDecisionRefs: [PD-001] + obligationRefs: [EV001] + artifacts: [src/FS.GG.Coord.Cli.BoardOps/Handlers.fs, src/FS.GG.Coord.Cli.Kernel/Options.fs, src/FS.GG.Coord.Cli/LintApplication.fs, src/FS.GG.Coord.GitHub/Board.fs, tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs, work/2907-blocked-by-set-mutations/verification/verification-evidence.md] + sourceRefs: + - kind: verification + path: tests/FS.GG.Coord.Cli.BoardOps.Tests/FS.GG.Coord.Cli.BoardOps.Tests.fsproj + result: pass + synthetic: false + observedRun: + source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx + digest: "sha256:21fa9267ea0052900650a3072ffa5c3cbfd991d64c126ed29f3bac462c7757ec" + digestContract: exact-bytes-v1 + outcome: passed + passed: 254 + failed: 0 + skipped: 0 + notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] + - id: EV002 + kind: verification + subject: + type: task + id: T002 + taskRefs: [T002] + requirementRefs: [FR-002] + acceptanceScenarioRefs: [] + clarificationDecisionRefs: [] + checklistResultRefs: [] + planDecisionRefs: [PD-002] + obligationRefs: [EV002] + artifacts: [src/FS.GG.Coord.Cli.BoardOps/Handlers.fs, src/FS.GG.Coord.Cli.Kernel/Options.fs, src/FS.GG.Coord.Cli/LintApplication.fs, src/FS.GG.Coord.GitHub/Board.fs, tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs, work/2907-blocked-by-set-mutations/verification/verification-evidence.md] + sourceRefs: + - kind: verification + path: tests/FS.GG.Coord.Cli.BoardOps.Tests/FS.GG.Coord.Cli.BoardOps.Tests.fsproj + result: pass + synthetic: false + observedRun: + source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx + digest: "sha256:21fa9267ea0052900650a3072ffa5c3cbfd991d64c126ed29f3bac462c7757ec" + digestContract: exact-bytes-v1 + outcome: passed + passed: 254 + failed: 0 + skipped: 0 + notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] + - id: EV003 + kind: verification + subject: + type: task + id: T003 + taskRefs: [T003] + requirementRefs: [FR-003] + acceptanceScenarioRefs: [] + clarificationDecisionRefs: [] + checklistResultRefs: [] + planDecisionRefs: [PD-003] + obligationRefs: [EV003] + artifacts: [src/FS.GG.Coord.Cli.BoardOps/Handlers.fs, src/FS.GG.Coord.Cli.Kernel/Options.fs, src/FS.GG.Coord.Cli/LintApplication.fs, src/FS.GG.Coord.GitHub/Board.fs, tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs, work/2907-blocked-by-set-mutations/verification/verification-evidence.md] + sourceRefs: + - kind: verification + path: tests/FS.GG.Coord.Cli.BoardOps.Tests/FS.GG.Coord.Cli.BoardOps.Tests.fsproj + result: pass + synthetic: false + observedRun: + source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx + digest: "sha256:21fa9267ea0052900650a3072ffa5c3cbfd991d64c126ed29f3bac462c7757ec" + digestContract: exact-bytes-v1 + outcome: passed + passed: 254 + failed: 0 + skipped: 0 + notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] + - id: EV004 + kind: verification + subject: + type: task + id: T004 + taskRefs: [T004] + requirementRefs: [FR-004] + acceptanceScenarioRefs: [] + clarificationDecisionRefs: [] + checklistResultRefs: [] + planDecisionRefs: [PD-004] + obligationRefs: [EV004] + artifacts: [src/FS.GG.Coord.Cli.BoardOps/Handlers.fs, src/FS.GG.Coord.Cli.Kernel/Options.fs, src/FS.GG.Coord.Cli/LintApplication.fs, src/FS.GG.Coord.GitHub/Board.fs, tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs, work/2907-blocked-by-set-mutations/verification/verification-evidence.md] + sourceRefs: + - kind: verification + path: tests/FS.GG.Coord.Cli.BoardOps.Tests/FS.GG.Coord.Cli.BoardOps.Tests.fsproj + result: pass + synthetic: false + observedRun: + source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx + digest: "sha256:21fa9267ea0052900650a3072ffa5c3cbfd991d64c126ed29f3bac462c7757ec" + digestContract: exact-bytes-v1 + outcome: passed + passed: 254 + failed: 0 + skipped: 0 + notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] + - id: EV005 + kind: verification + subject: + type: task + id: T005 + taskRefs: [T005] + requirementRefs: [FR-005] + acceptanceScenarioRefs: [] + clarificationDecisionRefs: [] + checklistResultRefs: [] + planDecisionRefs: [PD-005] + obligationRefs: [EV005] + artifacts: [src/FS.GG.Coord.Cli.BoardOps/Handlers.fs, src/FS.GG.Coord.Cli.Kernel/Options.fs, src/FS.GG.Coord.Cli/LintApplication.fs, src/FS.GG.Coord.GitHub/Board.fs, tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs, work/2907-blocked-by-set-mutations/verification/verification-evidence.md] + sourceRefs: + - kind: verification + path: tests/FS.GG.Coord.Cli.BoardOps.Tests/FS.GG.Coord.Cli.BoardOps.Tests.fsproj + result: pass + synthetic: false + observedRun: + source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx + digest: "sha256:21fa9267ea0052900650a3072ffa5c3cbfd991d64c126ed29f3bac462c7757ec" + digestContract: exact-bytes-v1 + outcome: passed + passed: 254 + failed: 0 + skipped: 0 + notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] + - id: EV006 + kind: verification + subject: + type: task + id: T006 + taskRefs: [T006] + requirementRefs: [FR-006] + acceptanceScenarioRefs: [] + clarificationDecisionRefs: [] + checklistResultRefs: [] + planDecisionRefs: [PD-006] + obligationRefs: [EV006] + artifacts: [src/FS.GG.Coord.Cli.BoardOps/Handlers.fs, src/FS.GG.Coord.Cli.Kernel/Options.fs, src/FS.GG.Coord.Cli/LintApplication.fs, src/FS.GG.Coord.GitHub/Board.fs, tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs, work/2907-blocked-by-set-mutations/verification/verification-evidence.md] + sourceRefs: + - kind: verification + path: tests/FS.GG.Coord.Cli.BoardOps.Tests/FS.GG.Coord.Cli.BoardOps.Tests.fsproj + result: pass + synthetic: false + observedRun: + source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx + digest: "sha256:21fa9267ea0052900650a3072ffa5c3cbfd991d64c126ed29f3bac462c7757ec" + digestContract: exact-bytes-v1 + outcome: passed + passed: 254 + failed: 0 + skipped: 0 + notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] + - id: EV007 + kind: verification + subject: + type: task + id: T007 + taskRefs: [T007] + requirementRefs: [] + acceptanceScenarioRefs: [] + clarificationDecisionRefs: [] + checklistResultRefs: [] + planDecisionRefs: [] + obligationRefs: [EV007] + artifacts: [src/FS.GG.Coord.Cli.BoardOps/Handlers.fs, src/FS.GG.Coord.Cli.Kernel/Options.fs, src/FS.GG.Coord.Cli/LintApplication.fs, src/FS.GG.Coord.GitHub/Board.fs, tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs, work/2907-blocked-by-set-mutations/verification/verification-evidence.md] + sourceRefs: + - kind: verification + path: tests/FS.GG.Coord.Cli.BoardOps.Tests/FS.GG.Coord.Cli.BoardOps.Tests.fsproj + result: pass + synthetic: false + observedRun: + source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx + digest: "sha256:21fa9267ea0052900650a3072ffa5c3cbfd991d64c126ed29f3bac462c7757ec" + digestContract: exact-bytes-v1 + outcome: passed + passed: 254 + failed: 0 + skipped: 0 + notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] + - id: EV008 + kind: verification + subject: + type: task + id: T008 + taskRefs: [T008] + requirementRefs: [] + acceptanceScenarioRefs: [] + clarificationDecisionRefs: [] + checklistResultRefs: [] + planDecisionRefs: [] + obligationRefs: [EV008] + artifacts: [src/FS.GG.Coord.Cli.BoardOps/Handlers.fs, src/FS.GG.Coord.Cli.Kernel/Options.fs, src/FS.GG.Coord.Cli/LintApplication.fs, src/FS.GG.Coord.GitHub/Board.fs, tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs, work/2907-blocked-by-set-mutations/verification/verification-evidence.md] + sourceRefs: + - kind: verification + path: tests/FS.GG.Coord.Cli.BoardOps.Tests/FS.GG.Coord.Cli.BoardOps.Tests.fsproj + result: pass + synthetic: false + observedRun: + source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx + digest: "sha256:21fa9267ea0052900650a3072ffa5c3cbfd991d64c126ed29f3bac462c7757ec" + digestContract: exact-bytes-v1 + outcome: passed + passed: 254 + failed: 0 + skipped: 0 + notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] + - id: EV009 + kind: verification + subject: + type: task + id: T009 + taskRefs: [T009] + requirementRefs: [] + acceptanceScenarioRefs: [] + clarificationDecisionRefs: [] + checklistResultRefs: [] + planDecisionRefs: [] + obligationRefs: [EV009] + artifacts: [src/FS.GG.Coord.Cli.BoardOps/Handlers.fs, src/FS.GG.Coord.Cli.Kernel/Options.fs, src/FS.GG.Coord.Cli/LintApplication.fs, src/FS.GG.Coord.GitHub/Board.fs, tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs, work/2907-blocked-by-set-mutations/verification/verification-evidence.md] + sourceRefs: + - kind: verification + path: tests/FS.GG.Coord.Cli.BoardOps.Tests/FS.GG.Coord.Cli.BoardOps.Tests.fsproj + result: pass + synthetic: false + observedRun: + source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx + digest: "sha256:21fa9267ea0052900650a3072ffa5c3cbfd991d64c126ed29f3bac462c7757ec" + digestContract: exact-bytes-v1 + outcome: passed + passed: 254 + failed: 0 + skipped: 0 + notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] + - id: EV010 + kind: verification + subject: + type: task + id: T010 + taskRefs: [T010] + requirementRefs: [] + acceptanceScenarioRefs: [] + clarificationDecisionRefs: [] + checklistResultRefs: [] + planDecisionRefs: [] + obligationRefs: [EV010] + artifacts: [src/FS.GG.Coord.Cli.BoardOps/Handlers.fs, src/FS.GG.Coord.Cli.Kernel/Options.fs, src/FS.GG.Coord.Cli/LintApplication.fs, src/FS.GG.Coord.GitHub/Board.fs, tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs, work/2907-blocked-by-set-mutations/verification/verification-evidence.md] + sourceRefs: + - kind: verification + path: tests/FS.GG.Coord.Cli.BoardOps.Tests/FS.GG.Coord.Cli.BoardOps.Tests.fsproj + result: pass + synthetic: false + observedRun: + source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx + digest: "sha256:21fa9267ea0052900650a3072ffa5c3cbfd991d64c126ed29f3bac462c7757ec" + digestContract: exact-bytes-v1 + outcome: passed + passed: 254 + failed: 0 + skipped: 0 + notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] + - id: EV011 + kind: verification + subject: + type: task + id: T011 + taskRefs: [T011] + requirementRefs: [] + acceptanceScenarioRefs: [] + clarificationDecisionRefs: [] + checklistResultRefs: [] + planDecisionRefs: [PD-001, PD-004] + obligationRefs: [EV011] + artifacts: [src/FS.GG.Coord.Cli.BoardOps/Handlers.fs, src/FS.GG.Coord.Cli.Kernel/Options.fs, src/FS.GG.Coord.Cli/LintApplication.fs, src/FS.GG.Coord.GitHub/Board.fs, tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs, work/2907-blocked-by-set-mutations/verification/verification-evidence.md] + sourceRefs: + - kind: verification + path: tests/FS.GG.Coord.Cli.BoardOps.Tests/FS.GG.Coord.Cli.BoardOps.Tests.fsproj + result: pass + synthetic: false + observedRun: + source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx + digest: "sha256:21fa9267ea0052900650a3072ffa5c3cbfd991d64c126ed29f3bac462c7757ec" + digestContract: exact-bytes-v1 + outcome: passed + passed: 254 + failed: 0 + skipped: 0 + notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] + - id: EV012 + kind: verification + subject: + type: task + id: T012 + taskRefs: [T012] + requirementRefs: [] + acceptanceScenarioRefs: [] + clarificationDecisionRefs: [] + checklistResultRefs: [] + planDecisionRefs: [PD-001, PD-002, PD-003, PD-004, PD-005, PD-006] + obligationRefs: [EV012] + artifacts: [src/FS.GG.Coord.Cli.BoardOps/Handlers.fs, src/FS.GG.Coord.Cli.Kernel/Options.fs, src/FS.GG.Coord.Cli/LintApplication.fs, src/FS.GG.Coord.GitHub/Board.fs, tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs, work/2907-blocked-by-set-mutations/verification/verification-evidence.md] + sourceRefs: + - kind: verification + path: tests/FS.GG.Coord.Cli.BoardOps.Tests/FS.GG.Coord.Cli.BoardOps.Tests.fsproj + result: pass + synthetic: false + observedRun: + source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx + digest: "sha256:21fa9267ea0052900650a3072ffa5c3cbfd991d64c126ed29f3bac462c7757ec" + digestContract: exact-bytes-v1 + outcome: passed + passed: 254 + failed: 0 + skipped: 0 + notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] + - id: EV013 + kind: verification + subject: + type: task + id: T013 + taskRefs: [T013] + requirementRefs: [] + acceptanceScenarioRefs: [] + clarificationDecisionRefs: [] + checklistResultRefs: [] + planDecisionRefs: [] + obligationRefs: [EV013] + artifacts: [src/FS.GG.Coord.Cli.BoardOps/Handlers.fs, src/FS.GG.Coord.Cli.Kernel/Options.fs, src/FS.GG.Coord.Cli/LintApplication.fs, src/FS.GG.Coord.GitHub/Board.fs, tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs, work/2907-blocked-by-set-mutations/verification/verification-evidence.md] + sourceRefs: + - kind: verification + path: tests/FS.GG.Coord.Cli.BoardOps.Tests/FS.GG.Coord.Cli.BoardOps.Tests.fsproj + result: pass + synthetic: false + observedRun: + source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx + digest: "sha256:21fa9267ea0052900650a3072ffa5c3cbfd991d64c126ed29f3bac462c7757ec" + digestContract: exact-bytes-v1 + outcome: passed + passed: 254 + failed: 0 + skipped: 0 + notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] + - id: EV014 + kind: verification + subject: + type: task + id: T014 + taskRefs: [T014] + requirementRefs: [] + acceptanceScenarioRefs: [] + clarificationDecisionRefs: [] + checklistResultRefs: [] + planDecisionRefs: [PD-001] + obligationRefs: [EV014] + artifacts: [src/FS.GG.Coord.Cli.BoardOps/Handlers.fs, src/FS.GG.Coord.Cli.Kernel/Options.fs, src/FS.GG.Coord.Cli/LintApplication.fs, src/FS.GG.Coord.GitHub/Board.fs, tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs, work/2907-blocked-by-set-mutations/verification/verification-evidence.md] + sourceRefs: + - kind: verification + path: tests/FS.GG.Coord.Cli.BoardOps.Tests/FS.GG.Coord.Cli.BoardOps.Tests.fsproj + result: pass + synthetic: false + observedRun: + source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx + digest: "sha256:21fa9267ea0052900650a3072ffa5c3cbfd991d64c126ed29f3bac462c7757ec" + digestContract: exact-bytes-v1 + outcome: passed + passed: 254 + failed: 0 + skipped: 0 + notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] +lifecycleNotes: + - "Next lifecycle action: verify." diff --git a/work/2907-blocked-by-set-mutations/plan.md b/work/2907-blocked-by-set-mutations/plan.md new file mode 100644 index 000000000..c2a890663 --- /dev/null +++ b/work/2907-blocked-by-set-mutations/plan.md @@ -0,0 +1,62 @@ +--- +schemaVersion: 1 +workId: 2907-blocked-by-set-mutations +title: Blocked By Set Mutations +stage: plan +changeTier: tier1 +status: planned +sourceSpec: work/2907-blocked-by-set-mutations/spec.md +sourceClarifications: work/2907-blocked-by-set-mutations/clarifications.md +sourceChecklist: work/2907-blocked-by-set-mutations/checklist.md +publicOrToolFacingImpact: true +--- + +# Blocked By Set Mutations Plan + +Prose status: planned + +## Source Snapshot +- spec: work/2907-blocked-by-set-mutations/spec.md sha256:bbfc8ac46a0af4e5487e6e08af4603eb9e97d26877c78774d4f96d892930802f schemaVersion:1 +- clarifications: work/2907-blocked-by-set-mutations/clarifications.md sha256:29371de9aa66598f033214d6fd42665dac6d53189f32f572cdd1327bb6537bc5 schemaVersion:1 +- checklist: work/2907-blocked-by-set-mutations/checklist.md sha256:2799d51aeaf8b672cd72d857c78bd907426e73a20a8b7c8cda8ea1ad2c71fe95 schemaVersion:1 + +## Plan Scope +- Work item 2907-blocked-by-set-mutations is planned from the current specification, clarification, and checklist facts. +- Requirement count: 6. +- Clarification decision count: 4. +- Checklist result count: 6. + +## Plan Decisions +- PD-001 [AC-001] [FR-001] complete: Extend `Options` with mutually exclusive `--add`, `--remove`, `--replace`, and `--clear` intents scoped to `set-field`; in `Handlers.setField`, read and canonicalize the live set, union requested additions in stable canonical order, and issue the derived write through the guarded boundary. +- PD-002 [AC-002] [FR-002] complete: Subtract canonical requested refs from the observed set while retaining every other edge; select `Board.Clear` only when subtraction produces an empty set. Removing an absent edge remains an idempotent guarded write outcome, not replacement of the whole set. +- PD-003 [AC-001] [AC-002] [AC-003] [FR-003] complete: Add `Board.boardWriteGuarded` beside the existing chokepoint. It resolves the item, re-reads `{Value; Revision}`, refuses any mismatch as stale, emits the derived single-field mutation only after a match, and never places guarded writes on the unconditional deferred queue. +- PD-004 [AC-004] [FR-004] complete: For `Blocked by`, refuse the legacy positional-value form and require one explicit intent. `--replace` uses canonical replacement and `--clear` maps directly to `Board.Clear`; scalar fields retain their positional value/empty-clear behavior and batch `Field=Value` remains explicitly replacement-shaped. +- PD-005 [AC-005] [FR-005] complete: Put the deterministic body/field comparison in `LintApplication`, expose it through the existing compatibility seam, and invoke it during the fresh lint census. The body is projection-only: the rule reports inert, divergent, or invalid text and never creates an edge or a reconcile chore. +- PD-006 [AC-006] [FR-006] complete: Add parser/residue and command-handler tests, Board transport tests with independently controlled observations, and lint verdict plus application-route tests. Capture four bounded inversions and then run BoardOps, GitHub, CLI, full solution, formatting, projections, and SDD analyze gates. + +## Contract Impact +- PC-001 [PD-001] [PD-004] command report: `set-field` advertises four explicit `Blocked by` mutation intents. Existing bare `Blocked by` replacement is intentionally refused with migration guidance; unrelated scalar writes and batch equality syntax remain compatible. `lint` adds stable `BLOCKED-BY-BODY-INERT` diagnostics without changing JSON schema. + +## Verification Obligations +- VO-001 [PD-001] [PD-002] [PD-003] [PD-004] [PD-005] [PD-006] [PC-001] semanticTest: Run focused parser, BoardOps, GitHub Board, and lint application tests; demonstrate red/green inversions for union preservation, subtraction preservation, stale refusal, and lint comparison; then run all affected projects, the solution, formatting, signature/projection generation checks, and `fsgg-sdd analyze`. + +## Performance Intent +No performance intent is declared for this work item. + +## Migration Posture +- PM-001 [PC-001] compatible: Scalar and batch callers need no migration. Single-field `Blocked by` callers replace the bare positional value with `--replace`, use `--add`/`--remove` for edge-local intent, and use `--clear` for clearing; the refusal prints these exact remedies. + +## Generated View Impact +- GV-001 [PD-001] workModel: Regenerate `readiness/2907-blocked-by-set-mutations/work-model.json` and `analysis.json` only through `fsgg-sdd tasks`/`analyze`; regenerate checked-in command/protocol projections through the repository generator if its check reports drift. + +## Accepted Deferrals +No accepted plan deferrals recorded. + +## Planning Findings +No blocking planning findings recorded. + +## Advisory Notes +- The lint application boundary lives in `src/FS.GG.Coord.Cli/LintApplication.{fs,fsi}` and its invocation/compatibility surface in `Client.{fs,fsi}`, which were absent from the filed touch-set. Widen those exact paths before editing and stop on overlap. + +## Lifecycle Notes +- Next lifecycle action: `fsgg-sdd tasks --work 2907-blocked-by-set-mutations`. diff --git a/work/2907-blocked-by-set-mutations/spec.md b/work/2907-blocked-by-set-mutations/spec.md new file mode 100644 index 000000000..3bc7515a3 --- /dev/null +++ b/work/2907-blocked-by-set-mutations/spec.md @@ -0,0 +1,54 @@ +--- +schemaVersion: 1 +workId: 2907-blocked-by-set-mutations +title: Blocked-by Set Mutations +stage: specify +changeTier: tier1 +status: specified +publicOrToolFacingImpact: true +--- + +# Blocked-by Set Mutations Specification + +Prose status: specified + +## User Value +Operators can add or remove one dependency edge without overwriting concurrent edges, and lint diagnoses inert body-only declarations. + +## Scope +- SB-001: Explicit set-valued Blocked by add/remove/replace/clear CLI semantics, revision-bound writes, lint projection diagnostics, and focused mutation-proven tests. + +## Non-Goals +- SB-002: Changing the Projects v2 field as dependency authority or changing unrelated board fields. + +## User Stories +- US-001 (P1): An operator safely mutates one blocker while preserving every other live blocker. +- US-002 (P1): A maintainer sees body-only or divergent Blocked by projections in lint. + +## Acceptance Scenarios +- AC-001 [US-001] [FR-001] [FR-003]: Given live `Blocked by` contains `FS-GG/.github#290`, when an operator explicitly adds `FS-GG/.github#299` against the observed item revision, then the resulting value contains both canonical edges. +- AC-002 [US-001] [FR-002] [FR-003]: Given live `Blocked by` contains `#290, #299`, when an operator explicitly removes `#290` against the observed item revision, then `#299` remains and only `#290` is removed. +- AC-003 [US-001] [FR-003]: Given the field value or Projects item revision changes after the mutation derives its set, when the write boundary validates the observation, then it reports stale and emits no field mutation. +- AC-004 [US-001] [FR-004]: Given a caller targets `Blocked by`, when it requests replacement or clearing, then replacement is explicitly named and clearing uses the distinct clear operation; an ambiguous bare replacement is refused before mutation. +- AC-005 [US-002] [FR-005]: Given a body contains a live `Blocked by:` line, when the authoritative board field is empty or differs, then lint reports the inert or divergent projection; when canonical sets agree, lint remains green for that rule. +- AC-006 [US-001] [US-002] [FR-006]: Given each new gate is inverted independently, when focused suites run against the bounded fixture, then the relevant add-preservation, remove-preservation, stale-write, or lint-projection test turns red and returns green after restoration. + +## Functional Requirements +- FR-001: `Blocked by` add canonicalizes and unions requested refs with the live canonical set, removes duplicates, and preserves every existing edge. (Stories: US-001; Acceptance: AC-001) +- FR-002: `Blocked by` remove canonicalizes and subtracts requested refs from the live canonical set, preserves every non-requested edge, and uses the distinct clear mutation when the result is empty. (Stories: US-001; Acceptance: AC-002) +- FR-003: Add and remove bind both the live field value and Projects-v2 item revision; a changed value or revision at the guarded write boundary fails stale and emits no mutation. (Stories: US-001; Acceptance: AC-001, AC-002, AC-003) +- FR-004: The command names add, remove, replace, and clear as distinct caller intents for `Blocked by`; an ambiguous bare replacement is refused while unrelated scalar-field syntax remains compatible. (Stories: US-001; Acceptance: AC-004) +- FR-005: Lint reports a body-only `Blocked by:` declaration when the authoritative field is empty and a divergent projection when their canonical sets differ, while an agreeing generated projection stays green. Invalid body syntax is reported rather than promoted to authority. (Stories: US-002; Acceptance: AC-005) +- FR-006: Focused tests and gate inversion prove add preserves `#290` while adding `#299`, remove preserves `#299` while removing `#290`, a changed observation is never overwritten, and lint distinguishes inert, divergent, invalid, absent, and agreeing body projections. (Stories: US-001, US-002; Acceptance: AC-006) + +## Ambiguities +- AMB-001: The public spelling for the four explicit `Blocked by` intents must preserve the existing parser's total flag-residue checks and avoid changing unrelated fields. +- AMB-002: GitHub Projects-v2 does not expose an `If-Match` argument on field mutation; the plan must state exactly where the revision is revalidated and must not describe a read/write window as stronger authority than it provides. + +## Public Or Tool-Facing Impact +- `set-field` gains explicit set-mutation syntax and updated help/command-contract documentation. +- `lint` gains a stable finding code for inert or divergent body projections. +- No serialized board field or SDD schema changes. + +## Lifecycle Notes +- Next lifecycle action: `fsgg-sdd clarify --work 2907-blocked-by-set-mutations`. diff --git a/work/2907-blocked-by-set-mutations/tasks.yml b/work/2907-blocked-by-set-mutations/tasks.yml new file mode 100644 index 000000000..bf9b61b72 --- /dev/null +++ b/work/2907-blocked-by-set-mutations/tasks.yml @@ -0,0 +1,176 @@ +schemaVersion: 1 +work: + id: 2907-blocked-by-set-mutations + title: "Blocked By Set Mutations" + stage: tasks + status: tasksReady + sourceSpec: work/2907-blocked-by-set-mutations/spec.md + sourceClarifications: work/2907-blocked-by-set-mutations/clarifications.md + sourceChecklist: work/2907-blocked-by-set-mutations/checklist.md + sourcePlan: work/2907-blocked-by-set-mutations/plan.md + publicOrToolFacingImpact: true + +sources: + - label: spec + path: work/2907-blocked-by-set-mutations/spec.md + digest: bbfc8ac46a0af4e5487e6e08af4603eb9e97d26877c78774d4f96d892930802f + schemaVersion: 1 + - label: clarifications + path: work/2907-blocked-by-set-mutations/clarifications.md + digest: 29371de9aa66598f033214d6fd42665dac6d53189f32f572cdd1327bb6537bc5 + schemaVersion: 1 + - label: checklist + path: work/2907-blocked-by-set-mutations/checklist.md + digest: 2799d51aeaf8b672cd72d857c78bd907426e73a20a8b7c8cda8ea1ad2c71fe95 + schemaVersion: 1 + - label: plan + path: work/2907-blocked-by-set-mutations/plan.md + digest: 243f8da1ca1d80b697dcbd4c9359371b98f08f39961ec7bb1c363424b198288d + schemaVersion: 1 +tasks: + - id: T001 + title: Implement requirement FR-001 + status: pending + owner: sdd + dependencies: [] + requirements: [FR-001] + decisions: [] + sourceIds: [AC-001, FR-001, PD-001] + requiredSkills: [fsharp, implementation] + requiredEvidence: [EV001] + - id: T002 + title: Implement requirement FR-002 + status: pending + owner: sdd + dependencies: [] + requirements: [FR-002] + decisions: [] + sourceIds: [AC-002, FR-002, PD-002] + requiredSkills: [fsharp, implementation] + requiredEvidence: [EV002] + - id: T003 + title: Implement requirement FR-003 + status: pending + owner: sdd + dependencies: [] + requirements: [FR-003] + decisions: [] + sourceIds: [AC-001, AC-002, AC-003, FR-003, PD-003] + requiredSkills: [fsharp, implementation] + requiredEvidence: [EV003] + - id: T004 + title: Implement requirement FR-004 + status: pending + owner: sdd + dependencies: [] + requirements: [FR-004] + decisions: [] + sourceIds: [AC-004, FR-004, PD-004] + requiredSkills: [fsharp, implementation] + requiredEvidence: [EV004] + - id: T005 + title: Implement requirement FR-005 + status: pending + owner: sdd + dependencies: [] + requirements: [FR-005] + decisions: [] + sourceIds: [AC-005, FR-005, PD-005] + requiredSkills: [fsharp, implementation] + requiredEvidence: [EV005] + - id: T006 + title: Implement requirement FR-006 + status: pending + owner: sdd + dependencies: [] + requirements: [FR-006] + decisions: [] + sourceIds: [AC-006, FR-006, PD-006] + requiredSkills: [fsharp, implementation] + requiredEvidence: [EV006] + - id: T007 + title: Implement clarification decision DEC-001 + status: pending + owner: sdd + dependencies: [T001] + requirements: [] + decisions: [DEC-001] + sourceIds: [DEC-001] + requiredSkills: [fsharp, implementation] + requiredEvidence: [EV007] + - id: T008 + title: Implement clarification decision DEC-002 + status: pending + owner: sdd + dependencies: [T001] + requirements: [] + decisions: [DEC-002] + sourceIds: [DEC-002] + requiredSkills: [fsharp, implementation] + requiredEvidence: [EV008] + - id: T009 + title: Implement clarification decision DEC-003 + status: pending + owner: sdd + dependencies: [T001] + requirements: [] + decisions: [DEC-003] + sourceIds: [DEC-003] + requiredSkills: [fsharp, implementation] + requiredEvidence: [EV009] + - id: T010 + title: Implement clarification decision DEC-004 + status: pending + owner: sdd + dependencies: [T001] + requirements: [] + decisions: [DEC-004] + sourceIds: [DEC-004] + requiredSkills: [fsharp, implementation] + requiredEvidence: [EV010] + - id: T011 + title: Update contract surface PC-001 + status: pending + owner: sdd + dependencies: [T001] + requirements: [] + decisions: [] + sourceIds: [PC-001, PD-001, PD-004] + requiredSkills: [fsharp] + requiredEvidence: [EV011] + - id: T012 + title: Record verification evidence VO-001 + status: pending + owner: sdd + dependencies: [T001] + requirements: [] + decisions: [] + sourceIds: [PC-001, PD-001, PD-002, PD-003, PD-004, PD-005, PD-006, VO-001] + requiredSkills: [automated-tests, readiness-evidence] + requiredEvidence: [EV012] + - id: T013 + title: Handle migration posture PM-001 + status: pending + owner: sdd + dependencies: [T001] + requirements: [] + decisions: [] + sourceIds: [PC-001, PM-001] + requiredSkills: [schema-versioning] + requiredEvidence: [EV013] + - id: T014 + title: Refresh generated view impact GV-001 + status: pending + owner: sdd + dependencies: [T001] + requirements: [] + decisions: [] + sourceIds: [GV-001, PD-001] + requiredSkills: [deterministic-json] + requiredEvidence: [EV014] +acceptedDeferrals: [] +findings: [] +advisoryNotes: + - "Optional Governance pointers remain compatibility facts only." +lifecycleNotes: + - "Next lifecycle action: fsgg-sdd analyze --work 2907-blocked-by-set-mutations." diff --git a/work/2907-blocked-by-set-mutations/verification/verification-evidence.md b/work/2907-blocked-by-set-mutations/verification/verification-evidence.md new file mode 100644 index 000000000..fe583d3c3 --- /dev/null +++ b/work/2907-blocked-by-set-mutations/verification/verification-evidence.md @@ -0,0 +1,31 @@ +# Verification evidence + +## Positive controls + +- `dotnet test tests/FS.GG.Coord.Cli.BoardOps.Tests/FS.GG.Coord.Cli.BoardOps.Tests.fsproj --no-restore`: 254 passed, 0 failed, 0 skipped. +- `dotnet test tests/FS.GG.Coord.GitHub.Tests/FS.GG.Coord.GitHub.Tests.fsproj --no-restore`: 671 passed, 0 failed, 0 skipped. +- `dotnet test tests/FS.GG.Coord.Cli.Kernel.Tests/FS.GG.Coord.Cli.Kernel.Tests.fsproj --no-restore`: 182 passed, 0 failed, 0 skipped. +- The Lifecycle, CLI, and Core test project commands each exited zero. +- The durable TRX at `readiness/2907-blocked-by-set-mutations/test-results/boardops.trx` records all 254 BoardOps tests passing. +- `tests/coord-engine-parity/run.sh` passed the explicit replace/clear, ref-first, zero-GraphQL refusal, canonicalization, de-duplication, and scoped-field controls after its legacy positional calls were migrated. +- `scripts/generate-projections --check` reported every projection current; the signature-doc mutation sweep killed 435/435 mutants. +- The Release engine build and the 12-entry deterministic package check exited zero. + +## Gate inversions + +Each bounded mutation was applied alone, the focused test was observed red, and the production implementation was restored before the positive controls: + +1. Add-set derivation was changed from union with the observed set to requested-only. The add-preservation control failed: expected `#290, #299`, actual `#299`. +2. Remove-set derivation was forced to clear. The remove-preservation control failed: expected `#299`, actual ``. +3. The guarded-write revision/value match was forced false. The stale-observation control failed because the command returned zero and the transport recorded a mutation. +4. The inert-body verdict was suppressed with `Ok None`. The lint theory failed because the divergent body case expected a finding and observed none. + +These inversions discriminate union, subtraction, stale-write refusal, and body-projection linting independently. + +## Runtime controls + +- Parser controls cover all four explicit intents, mutual exclusion, and rejection outside `set-field`. +- Legacy positional `Blocked by` replacement is refused before transport with the four explicit remedies; the parity fixture uses `--replace` and `--clear` and proves malformed explicit values spend zero GraphQL. +- Handler transport controls independently vary the first observation and guarded re-observation, assert the derived field mutation, and assert zero mutation on stale data. +- Lint controls distinguish absent/equal projection from empty, divergent, duplicate, and invalid body text; fenced examples remain ignored. +- The body lint is diagnostic-only and never feeds a board mutation route. From ca5f59a0feba2684570519a4120a072cc940437c Mon Sep 17 00:00:00 2001 From: osprey-d90d Date: Mon, 24 Aug 2026 08:16:14 +0200 Subject: [PATCH 2/5] Fix hosted lint body census fixture --- tests/coord-engine-parity/lint_server.py | 14 +++++++-- tests/coord-engine-parity/run.sh | 29 +++++++++++++++++++ .../verification/verification-evidence.md | 4 +++ 3 files changed, 45 insertions(+), 2 deletions(-) diff --git a/tests/coord-engine-parity/lint_server.py b/tests/coord-engine-parity/lint_server.py index 4d9880306..81f570c0d 100644 --- a/tests/coord-engine-parity/lint_server.py +++ b/tests/coord-engine-parity/lint_server.py @@ -43,11 +43,14 @@ """ import json +import os import re import sys from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer RATE = {"cost": 1, "remaining": 4988} +MISSING_BODY = int(os.environ.get("FSGG_LINT_MISSING_BODY", "-1")) +BODY_READS = [] SDD = "FS-GG/FS.GG.SDD" GAME = "FS-GG/FS.GG.Game" @@ -103,6 +106,10 @@ def node(n, status, repo, state="OPEN", title="", severity="Low"): 400: "An umbrella epic.\n\nPaths: none", 422: "Should we do X or Y? A decision.\n\nPaths: none", 407: "Paths: src/Real/**", + # The body-projection lint added by .github#2907 reads every open, non-Done row, including work in + # progress. Keep #423 ordinary and classed so it isolates that census expansion without adding a + # schedulability/class finding of its own. + 423: "Paths: src/Real/**\n\nClass: hardening", # CLASSED, and it has to be: this is the ONLY row in the `--repo game` scope, and case14 asserts that # scope is clean AND empty. An unclassed row here would make CLASS-UNSET fire and turn the corpus's one # "a real item, really scanned, and nothing wrong with it" leg into a finding — the assertion would then @@ -126,7 +133,7 @@ def node(n, status, repo, state="OPEN", title="", severity="Low"): # reads the board column back with, and refusing it would report a correctly-triaged row as untriaged. 436: "Paths: src/Real/**\n\nClass: Defect ", 437: "Paths: none\n\nClass: hardening", - # 423 (In progress) and 424 (closed) are NOT candidates, so the engine must never read their bodies. + # 424 is closed, so the engine must never read its body. } @@ -180,12 +187,15 @@ def do_POST(self): def do_GET(self): p = self.path.split("?", 1)[0] + if p.rstrip("/") == "/_body_reads": + return self._send(200, BODY_READS) if re.match(r"^/repos/[^/]+/[^/]+/issues/(\d+)/comments$", p): return self._send(200, []) m = re.match(r"^/repos/[^/]+/[^/]+/issues/(\d+)$", p) if m: n = int(m.group(1)) - if n in BODIES: + BODY_READS.append(n) + if n in BODIES and n != MISSING_BODY: return self._send(200, {"number": n, "body": BODIES[n]}) return self._send(404, {"message": "Not Found"}) if p.rstrip("/") == "/rate_limit": diff --git a/tests/coord-engine-parity/run.sh b/tests/coord-engine-parity/run.sh index 1fd313644..d1f3055e5 100755 --- a/tests/coord-engine-parity/run.sh +++ b/tests/coord-engine-parity/run.sh @@ -2809,6 +2809,35 @@ if [ -z "$LINT_PORT" ]; then bad "lint fixture bound a port"; else && ok "case14: ...and that clean scope produced zero findings (a real item, really scanned)" \ || bad "case14: --repo game must be clean+empty" "$(lt --repo game --json 2>/dev/null)" + # .github#2907 expands the body census to every open, non-Done row because an inert `Blocked by:` + # projection can mislead operators even while work is in progress. The normal fixture above proves + # #423 is readable. Now remove exactly that body: the server records that production requested it, + # and lint must abort rather than emit a confident findings array over a partial census. + LINT_MISSING_OUT="$(mktemp)" + FSGG_LINT_MISSING_BODY=423 python3 "$HERE/lint_server.py" >"$LINT_MISSING_OUT" 2>/dev/null & + LINT_MISSING_SRV=$!; LINT_MISSING_PORT="" + for _ in $(seq 1 50); do + LINT_MISSING_PORT="$(head -n1 "$LINT_MISSING_OUT" 2>/dev/null)" + [ -n "$LINT_MISSING_PORT" ] && break + sleep 0.1 + done + rm -f "$LINT_MISSING_OUT" + if [ -z "$LINT_MISSING_PORT" ]; then + unmeasured "#2907: unreadable open/In-progress body fails closed — fixture did not bind" + else + lint_missing="$(FSGG_GITHUB_API_BASE="http://127.0.0.1:$LINT_MISSING_PORT" GITHUB_TOKEN=t \ + FSGG_COORD_OWNER=FS-GG FSGG_COORD_PROJECT=Coordination FSGG_COORD_CACHE="$(mktemp -d)" \ + "$ENGINE" lint --json 2>&1)"; lint_missing_rc=$? + lint_missing_reads="$(curl -s "http://127.0.0.1:$LINT_MISSING_PORT/_body_reads" | jq -c '.')" + printf '%s' "$lint_missing_reads" | jq -e 'index(423) != null' >/dev/null \ + && ok "#2907: production lint requests the open/In-progress #423 body" \ + || bad "#2907: missing-body control must prove #423 was requested" "$lint_missing_reads" + { [ "$lint_missing_rc" -ne 0 ] && ! printf '%s' "$lint_missing" | jq -e 'type == "array"' >/dev/null 2>&1; } \ + && ok "#2907: an unreadable #423 body aborts lint instead of returning a partial findings array" \ + || bad "#2907: unreadable body must fail closed with no findings verdict" "rc=$lint_missing_rc out=$lint_missing" + kill "$LINT_MISSING_SRV" 2>/dev/null + fi + # ---- the CLASS axis: CLASS-UNSET (.github#1588) and CLASS-INVALID (.github#1651) ---------------- # # The SIXTH lint rule, certified HERE on the day it lands. .github#1609 was filed because two rules — diff --git a/work/2907-blocked-by-set-mutations/verification/verification-evidence.md b/work/2907-blocked-by-set-mutations/verification/verification-evidence.md index fe583d3c3..d5bb83566 100644 --- a/work/2907-blocked-by-set-mutations/verification/verification-evidence.md +++ b/work/2907-blocked-by-set-mutations/verification/verification-evidence.md @@ -8,6 +8,10 @@ - The Lifecycle, CLI, and Core test project commands each exited zero. - The durable TRX at `readiness/2907-blocked-by-set-mutations/test-results/boardops.trx` records all 254 BoardOps tests passing. - `tests/coord-engine-parity/run.sh` passed the explicit replace/clear, ref-first, zero-GraphQL refusal, canonicalization, de-duplication, and scoped-field controls after its legacy positional calls were migrated. +- After the initial critic identified a missing hosted body for open/In-progress item #423, the repaired + serialized parity run passed 616/616 assertions with zero failures and zero not-measured results. Its + negative control removes only #423's body, proves production requested that body, and proves lint + aborts rather than returning a partial JSON findings array. - `scripts/generate-projections --check` reported every projection current; the signature-doc mutation sweep killed 435/435 mutants. - The Release engine build and the 12-entry deterministic package check exited zero. From 125480d9ad4021fe52b21fac6dbf3147d5a13d2f Mon Sep 17 00:00:00 2001 From: osprey-d90d Date: Mon, 24 Aug 2026 09:12:37 +0200 Subject: [PATCH 3/5] Isolate blocker mutation fixture identity --- .../governance-handoff.json | 6 +- .../ship-verdict.json | 2 +- .../2907-blocked-by-set-mutations/ship.json | 6 +- .../test-results/boardops.trx | 2832 +++++++++-------- .../2907-blocked-by-set-mutations/verify.json | 4 +- .../work-model.json | 6 +- .../BlockerLintTests.fs | 70 +- .../evidence.yml | 56 +- .../verification/verification-evidence.md | 9 +- 9 files changed, 1532 insertions(+), 1459 deletions(-) diff --git a/readiness/2907-blocked-by-set-mutations/governance-handoff.json b/readiness/2907-blocked-by-set-mutations/governance-handoff.json index f57f340cd..c7fc120e3 100644 --- a/readiness/2907-blocked-by-set-mutations/governance-handoff.json +++ b/readiness/2907-blocked-by-set-mutations/governance-handoff.json @@ -6,17 +6,17 @@ "sources": [ { "path": "readiness/2907-blocked-by-set-mutations/ship.json", - "digest": "sha256:9ca471fb0157a040ce9d3a8eee5923e4b4a99f2995e5a0868767b088301cea3b", + "digest": "sha256:d5381bfd7c74fb4d39d4d3f85a0b792517dc8236c3f9fb39e11968091841975a", "schemaVersion": 1 }, { "path": "readiness/2907-blocked-by-set-mutations/verify.json", - "digest": "sha256:718bb70cc3793ed97fef51c7325d39af55ff36a87739738f00e0e45524768231", + "digest": "sha256:151b16b59d9fc2b2bb7875dedbe58995599f85bbbdebf7f98c218c6556cd780b", "schemaVersion": 1 }, { "path": "readiness/2907-blocked-by-set-mutations/work-model.json", - "digest": "sha256:08c104ba9cc7cb958d9736e2f935a5c41bf113156a9c9f8b6d6f60f73e64def8", + "digest": "sha256:10d22940c97c7432fb2b0649bf81bb219fadb293341101ae4e0e7742fe6c39c8", "schemaVersion": 1 } ], diff --git a/readiness/2907-blocked-by-set-mutations/ship-verdict.json b/readiness/2907-blocked-by-set-mutations/ship-verdict.json index 61d526cae..329e486d9 100644 --- a/readiness/2907-blocked-by-set-mutations/ship-verdict.json +++ b/readiness/2907-blocked-by-set-mutations/ship-verdict.json @@ -7,7 +7,7 @@ "generator": "FS.GG.SDD.Artifacts/1.1.0", "sourcesDigest": { "algorithm": "sha256", - "value": "dd4d76e7416695822555d10d065ea8a3c3de7bf12b72438a55fecb60a9e9d893" + "value": "a91879e791335c362b3a79c667cc621d172c3df5076592919e8d690be0760573" }, "verificationReadiness": { "status": "verificationReady", diff --git a/readiness/2907-blocked-by-set-mutations/ship.json b/readiness/2907-blocked-by-set-mutations/ship.json index 90729866a..565989573 100644 --- a/readiness/2907-blocked-by-set-mutations/ship.json +++ b/readiness/2907-blocked-by-set-mutations/ship.json @@ -51,7 +51,7 @@ "kind": "source", "digest": { "algorithm": "sha256", - "value": "718bb70cc3793ed97fef51c7325d39af55ff36a87739738f00e0e45524768231" + "value": "151b16b59d9fc2b2bb7875dedbe58995599f85bbbdebf7f98c218c6556cd780b" }, "schemaVersion": 1, "schemaStatus": "current" @@ -61,7 +61,7 @@ "kind": "workModel", "digest": { "algorithm": "sha256", - "value": "08c104ba9cc7cb958d9736e2f935a5c41bf113156a9c9f8b6d6f60f73e64def8" + "value": "10d22940c97c7432fb2b0649bf81bb219fadb293341101ae4e0e7742fe6c39c8" }, "schemaVersion": 1, "schemaStatus": "current" @@ -91,7 +91,7 @@ "kind": "evidence", "digest": { "algorithm": "sha256", - "value": "3fbbfb97ae508d3ecb66be3b6bcd5e52f9c4b15fb0f714b74139eff34343ddbe" + "value": "4484b0ae2cc24d6c9c1a659d4b0224fe1e8f32c2038fe5fc85a4aa58fb7b7f83" }, "schemaVersion": 1, "schemaStatus": "current" diff --git a/readiness/2907-blocked-by-set-mutations/test-results/boardops.trx b/readiness/2907-blocked-by-set-mutations/test-results/boardops.trx index 2741c70a1..9760bc241 100644 --- a/readiness/2907-blocked-by-set-mutations/test-results/boardops.trx +++ b/readiness/2907-blocked-by-set-mutations/test-results/boardops.trx @@ -1,1614 +1,1556 @@  - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + + + + + - + - - - - - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + + + + + + + + + - + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - - - - - - - + + + - - - + + + - - - + + + - - - + + + - + - - - + + + - - - + + + + + + + + + + + + + + + + + + + - + - - - - - + - - - - - - - - - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - - - - - - - - - - - - - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - - - - - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - - - - - - - - - - - - - - - - - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + [xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v3.1.5+1b188a7b0a (64-bit .NET 10.0.10) [xUnit.net 00:00:00.06] Discovering: FS.GG.Coord.Cli.BoardOps.Tests -[xUnit.net 00:00:00.09] Discovered: FS.GG.Coord.Cli.BoardOps.Tests +[xUnit.net 00:00:00.10] Discovered: FS.GG.Coord.Cli.BoardOps.Tests [xUnit.net 00:00:00.12] Starting: FS.GG.Coord.Cli.BoardOps.Tests -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-be8a179582154cb2a0a8fcffd3e1afee — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-be8a179582154cb2a0a8fcffd3e1afee — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) - src/Shared.fs - notified worker otter-9c21 on FS.GG.SDD#75 -fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-330f610e75cd48fdb49e0593362975de — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-330f610e75cd48fdb49e0593362975de — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) - src/Shared.fs - notified worker otter-9c21 on FS.GG.SDD#75 -fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-d4ee25ce4e144b6a9bdbb5dfb76b4224 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-d4ee25ce4e144b6a9bdbb5dfb76b4224 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-90977e1632f048908d403a6e174eb25e — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-90977e1632f048908d403a6e174eb25e — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-0b314e3bb3d946b381f02c654a64a6ba — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-0b314e3bb3d946b381f02c654a64a6ba — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) - src/Shared.fs - notified worker otter-9c21 on FS.GG.SDD#75 -fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-6a12f67098a94bae917f3f04d5558d71 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-6a12f67098a94bae917f3f04d5558d71 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) - src/Shared.fs - notified worker otter-9c21 on FS.GG.SDD#75 -fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-dd764a6143a246ce8da448b275fb4f63 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-dd764a6143a246ce8da448b275fb4f63 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) - src/Shared.fs - notified worker otter-9c21 on FS.GG.SDD#75 -fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-bc9f322c545347ecbee3723e958d7041 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-bc9f322c545347ecbee3723e958d7041 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) - src/Shared.fs - notified worker otter-9c21 on FS.GG.SDD#75 -fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-09376b7b1e384f999ae9ea8816a0d530 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-09376b7b1e384f999ae9ea8816a0d530 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) - src/Shared.fs - notified worker otter-9c21 on FS.GG.SDD#75 -fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-0d76bf02c98c4c0a8036f699fdc41f8c — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-0d76bf02c98c4c0a8036f699fdc41f8c — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) - src/Shared.fs - notified worker otter-9c21 on FS.GG.SDD#75 -fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-b7e906e61ce2440489cc64ea678cf443 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-b7e906e61ce2440489cc64ea678cf443 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) - src/Shared.fs - notified worker otter-9c21 on FS.GG.SDD#75 -fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: vole-418 does not hold FS.GG.SDD#42 — nothing to release. -fsgg-coord-engine: Status=Blocked refuses an incoherent park (.github#2079). -fsgg-coord-engine: set-field --batch refuses: this call clears 'Blocked by' in the SAME batch as 'Status=Blocked' — the row would land with an EMPTY field and no 'Blocked on: human/...' sentinel (.github#2079). Pair 'Status=Blocked' with a non-empty 'Blocked by=<refs>' instead, or record a human park first: add a body line 'Blocked on: human/decision' or 'Blocked on: human/action'. Nothing written. -fsgg-coord-engine: set-field --batch refuses: this call clears 'Blocked by' in the SAME batch as 'Status=Blocked' — the row would land with an EMPTY field and no 'Blocked on: human/...' sentinel (.github#2079). Pair 'Status=Blocked' with a non-empty 'Blocked by=<refs>' instead, or record a human park first: add a body line 'Blocked on: human/decision' or 'Blocked on: human/action'. Nothing written. -fsgg-coord-engine: Status=Blocked refuses an incoherent park (.github#2079). -fsgg-coord-engine: vole-418 does not hold FS.GG.SDD#42 — nothing to release. fsgg-coord-engine: intake apply partially completed draft 'tx-2134': issue FS-GG/.github#88 already exists; board projection is incomplete. Retry this corrected draft with the same id to resume without another issue-create POST. fsgg-coord-engine: not found: stop after reuse binding. The server said so — this is an absence, not a failed read. fsgg-coord-engine: intake apply partially completed draft 'tx-2134': issue FS-GG/.github#77 already exists; board projection is incomplete. Retry this corrected draft with the same id to resume without another issue-create POST. @@ -1630,12 +1572,12 @@ fsgg-coord-engine: malformed response reading blocked-2134: Blocked dependency F fsgg-coord-engine: malformed response reading tx-2134: a duplicate candidate matches the title; select reuse or revise the draft. That is a FAILED READ, not an empty answer — refusing to decide from it. fsgg-coord-engine: intake apply partially completed draft 'tx-2134': issue FS-GG/.github#77 already exists; board projection is incomplete. Retry this corrected draft with the same id to resume without another issue-create POST. fsgg-coord-engine: not found: stop after legacy intent recovery. The server said so — this is an absence, not a failed read. -fsgg-coord-engine: malformed response reading tx-2134: intake receipt '/tmp/fsgg-intake-aafa8b46863b45ef8de2b3148936e381/intake-tx-2134.json' is unreadable: 'not-json' is an invalid JSON literal. Expected the literal 'null'. LineNumber: 0 | BytePositionInLine: 1.. That is a FAILED READ, not an empty answer — refusing to decide from it. -fsgg-coord-engine: malformed response reading tx-2134: intake receipt '/tmp/fsgg-intake-aafa8b46863b45ef8de2b3148936e381/intake-tx-2134.json' is unreadable: The given key was not present in the dictionary.. That is a FAILED READ, not an empty answer — refusing to decide from it. +fsgg-coord-engine: malformed response reading tx-2134: intake receipt '/tmp/fsgg-intake-0395567c4d324e94b262e5183ae0d0a8/intake-tx-2134.json' is unreadable: 'not-json' is an invalid JSON literal. Expected the literal 'null'. LineNumber: 0 | BytePositionInLine: 1.. That is a FAILED READ, not an empty answer — refusing to decide from it. +fsgg-coord-engine: malformed response reading tx-2134: intake receipt '/tmp/fsgg-intake-0395567c4d324e94b262e5183ae0d0a8/intake-tx-2134.json' is unreadable: The given key was not present in the dictionary.. That is a FAILED READ, not an empty answer — refusing to decide from it. paths paths do not exist in target repository FS-GG/.github: definitely/not/a/live/path-2134 fsgg-coord-engine: intake apply partially completed draft 'tx-2134': issue FS-GG/.github#77 already exists; board projection is incomplete. Retry this corrected draft with the same id to resume without another issue-create POST. fsgg-coord-engine: not found: stop after receipt recovery. The server said so — this is an absence, not a failed read. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-0f04c5e22f21432ba2f432bf0cfd9a4e — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-286c8c1bead44b6c9617628e1f8cd64d — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. considered 3 candidate(s) — this is a measured count, not an assumption. FS.GG.SDD#74 — Status is In progress FS.GG.SDD#75 — Status is Blocked @@ -1645,115 +1587,115 @@ this queue is BUSY, not empty. soonest: lease EXPIRED — reapable 1 of those lease(s) have EXPIRED — collect them: scripts/fsgg-coord reap --repo FS.GG.SDD --apply wave occupancy: unavailable (no drive-board or work-board host-loop document exists) -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-ceb3cf170b2740baa7171d6b74ebadbd — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-ceb3cf170b2740baa7171d6b74ebadbd — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-beeb6e51c84349eb970b02794ac4c7d3 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-beeb6e51c84349eb970b02794ac4c7d3 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-dc49b74c343f476fa8717c5162c831ea — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-dc49b74c343f476fa8717c5162c831ea — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-684b52bd6400464f87e2c8ee2d56d2df — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-684b52bd6400464f87e2c8ee2d56d2df — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-1c3dab513da84de6be493ce25e118424 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-1c3dab513da84de6be493ce25e118424 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-5ebfe7e75c22456c925a623e8a1a4cfe — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-5ebfe7e75c22456c925a623e8a1a4cfe — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-a54086ee8b2c415a9ddf18805ea19cf9 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-a54086ee8b2c415a9ddf18805ea19cf9 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-b8aa4d24147245fdabed3cccc0c7199b — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-b8aa4d24147245fdabed3cccc0c7199b — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-efedc78994e34dde849601928599ba8d — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-3a29490a1610409a9f4b3f34c31d4e8a — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. considered 3 candidate(s) — this is a measured count, not an assumption. FS.GG.SDD#74 — Status is In progress FS.GG.SDD#75 — Status is In progress FS.GG.SDD#76 — overlaps FS.GG.SDD#75, which the board says is In progress with NO claim marker (someone is working outside the protocol — there is no lease to wait out; see: scripts/fsgg-coord who): src/Shared.fs ⇄ src/Shared.fs wave occupancy: unavailable (no drive-board or work-board host-loop document exists) -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-5a3685165e1449c39d8aba300f3c87f6 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-5a3685165e1449c39d8aba300f3c87f6 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-6f0894cfc6244aeea080591483b5849a — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-6f0894cfc6244aeea080591483b5849a — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-0f7647e27705486294cc4d9971226ae1 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-0f7647e27705486294cc4d9971226ae1 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-d98c42541b6f401cbe579e28ac69070f — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-d98c42541b6f401cbe579e28ac69070f — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-099c456fa89145808df8cd41085a30f4 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-099c456fa89145808df8cd41085a30f4 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-b5cb34da89664c07a93f5f05ddb7b3ba — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-b5cb34da89664c07a93f5f05ddb7b3ba — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-cba53d178fd3424da6e3ebf2e6f2f083 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-cba53d178fd3424da6e3ebf2e6f2f083 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-46f2bdb16fb54dbba3eb5498ff42e2a3 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-46f2bdb16fb54dbba3eb5498ff42e2a3 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-9deb853c368845538a38dbe8f340cb1d — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-9deb853c368845538a38dbe8f340cb1d — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-b58b14bdf40e40129da7be9d3c407160 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-b58b14bdf40e40129da7be9d3c407160 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-82497f9bf1f2490fb72e41bdb7dced92 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-82497f9bf1f2490fb72e41bdb7dced92 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-1e9396b9ecb94b08b7bc2b361dd1fc2e — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-1e9396b9ecb94b08b7bc2b361dd1fc2e — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-a065a1a7223f404a91a0ff51f8db4700 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-a065a1a7223f404a91a0ff51f8db4700 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-7a90208eb806416e86b8b4ea3cb6a193 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-7a90208eb806416e86b8b4ea3cb6a193 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-4e8832e1b7f44d8b8748c9f1f8aaee5f — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-4e8832e1b7f44d8b8748c9f1f8aaee5f — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-3b68cb791340476191700b291d287856 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-3b68cb791340476191700b291d287856 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-9d5e9f254b1c4c948bf9c26a7295c184 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-9d5e9f254b1c4c948bf9c26a7295c184 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-7c1a4db067254d3c938bf43d9c6d5a2b — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-7c1a4db067254d3c938bf43d9c6d5a2b — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-8cf4aa202a0d485e8b55b4036d549762 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-8cf4aa202a0d485e8b55b4036d549762 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-5b42822856c54b08abf25125a4877a4d — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-5b42822856c54b08abf25125a4877a4d — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-2ada873b7b9f43939cfed44e7235f34e — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-2ada873b7b9f43939cfed44e7235f34e — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-ddfb6dca18f842e6913ee02bd42370a2 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-ddfb6dca18f842e6913ee02bd42370a2 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-5a445cdb2b764d0bb228f7639f0be87f — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-5a445cdb2b764d0bb228f7639f0be87f — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-dff106ba513449178af1ef8ced6e73a9 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-dff106ba513449178af1ef8ced6e73a9 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-5048548bb7074eac9fc7297327103748 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-5048548bb7074eac9fc7297327103748 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-68a249f0d8d14c02bea67613c8f7ca66 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-68a249f0d8d14c02bea67613c8f7ca66 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-96162e631f624feeabdf07c6bc14e80a — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-96162e631f624feeabdf07c6bc14e80a — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-c0f0b1fbd9a3422d8708f3b1fa4df0e9 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-c0f0b1fbd9a3422d8708f3b1fa4df0e9 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-331323c9b0bb4159a84d959a2029dda7 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-331323c9b0bb4159a84d959a2029dda7 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-e07dc4a8a0024001a902ce42b0588f0e — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-e07dc4a8a0024001a902ce42b0588f0e — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-11cbd1110a8e46f88f640668ce7ff97d — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-11cbd1110a8e46f88f640668ce7ff97d — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-c95d1aad8e9e4c3bb0fd9c247e91b16f — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-c95d1aad8e9e4c3bb0fd9c247e91b16f — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-b6dcf331a9574fdfbd607e28d597771a — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-b6dcf331a9574fdfbd607e28d597771a — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-6833ebe73fa44084b4ed998493722c96 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-6833ebe73fa44084b4ed998493722c96 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. LIVE-CLAIM: worker ghost-777, FS.GG.SDD#42 is open and claimed by other-123; queue retained. UNKNOWN: could not record disposition for FS.GG.SDD#42: not found: the notice could not be posted. The server said so — this is an absence, not a failed read.. Queue retained. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-8ac4c01449fa4788a18b763f98d1ffcf — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-8ac4c01449fa4788a18b763f98d1ffcf — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-61401b26b37e4d1f90ae6532cbdbad55 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-61401b26b37e4d1f90ae6532cbdbad55 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-b0eadcb0f5ab4f7795b039d2068dd223 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-b0eadcb0f5ab4f7795b039d2068dd223 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-a6a182dfd46a4ebd9df2b150c320b992 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-158e99ec90734efb894327b1c219f8b6 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-158e99ec90734efb894327b1c219f8b6 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-27846aef8e184b0f9015edcfb649ada3 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-27846aef8e184b0f9015edcfb649ada3 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-e07d19f79c4e4fd592579588f6482194 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-e07d19f79c4e4fd592579588f6482194 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-4bc90412792b4809a905d9bce4160e51 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. considered 3 candidate(s) — this is a measured count, not an assumption. FS.GG.SDD#74 — Status is In progress FS.GG.SDD#75 — the issue is closed (the board column says In review; /check-board reconciles it) @@ -1762,79 +1704,143 @@ this queue is BUSY, not empty. 1 item(s) are QUEUED BEHIND LIVE CLAIMS held by: curlew-8afd soonest: lease frees in ~120m wave occupancy: unavailable (no drive-board or work-board host-loop document exists) -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-7b4268694fd44ee8b05a4150ca9a7a6d — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-7b4268694fd44ee8b05a4150ca9a7a6d — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-fb281dd9ffce491abb04c9703c982e71 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-fb281dd9ffce491abb04c9703c982e71 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker curlew-8afd) src/Shared.fs notified worker curlew-8afd on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-d22aa1cd14df410d8f3c741abbc5d8a9 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-d22aa1cd14df410d8f3c741abbc5d8a9 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-9fea11eae808463684b9c0d7a5079f4e — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-9fea11eae808463684b9c0d7a5079f4e — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-6f92a6d4b68a4fc996f402ab3c28faa5 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-6f92a6d4b68a4fc996f402ab3c28faa5 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-37f4f8bf13a3480bbbef9e6bb28d170a — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-37f4f8bf13a3480bbbef9e6bb28d170a — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-5b75a245a1744c05a61a336aed5f76dc — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-5b75a245a1744c05a61a336aed5f76dc — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-5dc85e4df1b04c8c86fdf2bac81a35ad — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-5dc85e4df1b04c8c86fdf2bac81a35ad — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-9c77a63c0a7a4d05a1e9821242c864ca — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-9c77a63c0a7a4d05a1e9821242c864ca — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-6747517a26314402bb8cba7303dc10ff — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-6747517a26314402bb8cba7303dc10ff — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs could NOT notify worker otter-9c21 on FS.GG.SDD#75: not found: the notice could not be posted. The server said so — this is an absence, not a failed read. fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-7b67c99f22bb47efb50a1c5cc159310a — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-7b67c99f22bb47efb50a1c5cc159310a — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-d6c08ce32561475e8cc2325edc1472b3 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-d6c08ce32561475e8cc2325edc1472b3 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs could NOT notify worker otter-9c21 on FS.GG.SDD#75: not found: the notice could not be posted. The server said so — this is an absence, not a failed read. fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-0be22cfa4d2d4126aa033ff76cce66c5 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-0be22cfa4d2d4126aa033ff76cce66c5 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-1ade53c3049047b08df18bd2abfeff3a — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-1ade53c3049047b08df18bd2abfeff3a — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-67693fd76c684f729893aa0f113b6fbe — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-67693fd76c684f729893aa0f113b6fbe — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-bcca1f2866bf4fc9abc69fbee243123f — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-bcca1f2866bf4fc9abc69fbee243123f — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-50b8086babda4cc7b0e6aac0a28ec8ce — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-09f907577b5d42b992d00307dacbf959 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. FS.GG.SDD#74 — Status is In progress FS.GG.SDD#75 — Status is Blocked wave occupancy: unavailable (no drive-board or work-board host-loop document exists) -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-ad2099cefce4494ca7ac9a6211613413 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-ad2099cefce4494ca7ac9a6211613413 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-470d4f27a9ba469b962540a60387e1bb — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-470d4f27a9ba469b962540a60387e1bb — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-765e0eaeddd1418ab52029a20a3e7e61 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-765e0eaeddd1418ab52029a20a3e7e61 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-cf52a7d169344a358fd289ba7af5eb75 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-cf52a7d169344a358fd289ba7af5eb75 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-5193a01ad15e4b6fb224cb75650e55b8 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-5193a01ad15e4b6fb224cb75650e55b8 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-f0660836ee754a93ab442f353e424849 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-f0660836ee754a93ab442f353e424849 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-5d3a4c38da994d4cbb55a990d6f5ef31 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-5d3a4c38da994d4cbb55a990d6f5ef31 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-094b653792a94e0db13d604d111d8568 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-094b653792a94e0db13d604d111d8568 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-094b653792a94e0db13d604d111d8568 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-094b653792a94e0db13d604d111d8568 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-4cb84f0abcf14bf1bbd9b3ba0bbe73c5 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-4cb84f0abcf14bf1bbd9b3ba0bbe73c5 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-e331b93fcdaf44e7b4a07d47a43e96ed — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-e331b93fcdaf44e7b4a07d47a43e96ed — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-3a0d815ec64b41f3882be3e979332c39 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-3a0d815ec64b41f3882be3e979332c39 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-b395048bc2154f3997faa69808830fbd — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-b395048bc2154f3997faa69808830fbd — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-f05e3ffbd11a47f7ba7a1f371ae6cd62 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-f05e3ffbd11a47f7ba7a1f371ae6cd62 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-2745341617334d4c8099d443ac7ddd6e — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-2745341617334d4c8099d443ac7ddd6e — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-3a70ded7c70843adb7937878e45557f0 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-3a70ded7c70843adb7937878e45557f0 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-df0eafc015e64acb80cbf8a473c6d200 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-df0eafc015e64acb80cbf8a473c6d200 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-b2943504006e416bb2e58e496f3bdba7 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-b2943504006e416bb2e58e496f3bdba7 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) + src/Shared.fs + notified worker otter-9c21 on FS.GG.SDD#75 +fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-32ae070a4da847febbeb4a30e7924ef0 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-32ae070a4da847febbeb4a30e7924ef0 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-c5caa75e06314daeb95ffe34a99e58c1 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-c5caa75e06314daeb95ffe34a99e58c1 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-43f4bbddaa6342f7a376290eb8d37ce0 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-43f4bbddaa6342f7a376290eb8d37ce0 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-43f4bbddaa6342f7a376290eb8d37ce0 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-43f4bbddaa6342f7a376290eb8d37ce0 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-aedd335b4ebb4152868642beb0ee7e57 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-aedd335b4ebb4152868642beb0ee7e57 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -[xUnit.net 00:00:01.33] Finished: FS.GG.Coord.Cli.BoardOps.Tests +fsgg-coord-engine: vole-418 does not hold FS.GG.SDD#42 — nothing to release. +fsgg-coord-engine: Status=Blocked refuses an incoherent park (.github#2079). +fsgg-coord-engine: set-field --batch refuses: this call clears 'Blocked by' in the SAME batch as 'Status=Blocked' — the row would land with an EMPTY field and no 'Blocked on: human/...' sentinel (.github#2079). Pair 'Status=Blocked' with a non-empty 'Blocked by=<refs>' instead, or record a human park first: add a body line 'Blocked on: human/decision' or 'Blocked on: human/action'. Nothing written. +fsgg-coord-engine: set-field --batch refuses: this call clears 'Blocked by' in the SAME batch as 'Status=Blocked' — the row would land with an EMPTY field and no 'Blocked on: human/...' sentinel (.github#2079). Pair 'Status=Blocked' with a non-empty 'Blocked by=<refs>' instead, or record a human park first: add a body line 'Blocked on: human/decision' or 'Blocked on: human/action'. Nothing written. +fsgg-coord-engine: Status=Blocked refuses an incoherent park (.github#2079). +fsgg-coord-engine: vole-418 does not hold FS.GG.SDD#42 — nothing to release. +[xUnit.net 00:00:01.43] Finished: FS.GG.Coord.Cli.BoardOps.Tests diff --git a/readiness/2907-blocked-by-set-mutations/verify.json b/readiness/2907-blocked-by-set-mutations/verify.json index 03424976f..c6c41e438 100644 --- a/readiness/2907-blocked-by-set-mutations/verify.json +++ b/readiness/2907-blocked-by-set-mutations/verify.json @@ -51,7 +51,7 @@ "kind": "workModel", "digest": { "algorithm": "sha256", - "value": "08c104ba9cc7cb958d9736e2f935a5c41bf113156a9c9f8b6d6f60f73e64def8" + "value": "10d22940c97c7432fb2b0649bf81bb219fadb293341101ae4e0e7742fe6c39c8" }, "schemaVersion": 1, "schemaStatus": "current" @@ -81,7 +81,7 @@ "kind": "evidence", "digest": { "algorithm": "sha256", - "value": "3fbbfb97ae508d3ecb66be3b6bcd5e52f9c4b15fb0f714b74139eff34343ddbe" + "value": "4484b0ae2cc24d6c9c1a659d4b0224fe1e8f32c2038fe5fc85a4aa58fb7b7f83" }, "schemaVersion": 1, "schemaStatus": "current" diff --git a/readiness/2907-blocked-by-set-mutations/work-model.json b/readiness/2907-blocked-by-set-mutations/work-model.json index 22c6344ff..96eafd893 100644 --- a/readiness/2907-blocked-by-set-mutations/work-model.json +++ b/readiness/2907-blocked-by-set-mutations/work-model.json @@ -77,7 +77,7 @@ "schemaStatus": "current", "sourceDigest": { "algorithm": "sha256", - "value": "dfb94cb7f1e646d2113733a263a31b67d8967f788ce6701f005e29e2aeffdf96" + "value": "9efdb0a398fb8d6b2e7e8df488dcc1a726584eb67f567892371700804d4166d2" } }, { @@ -1211,7 +1211,7 @@ "path": "work/2907-blocked-by-set-mutations/evidence.yml", "digest": { "algorithm": "sha256", - "value": "dfb94cb7f1e646d2113733a263a31b67d8967f788ce6701f005e29e2aeffdf96" + "value": "9efdb0a398fb8d6b2e7e8df488dcc1a726584eb67f567892371700804d4166d2" }, "schemaVersion": 1 }, @@ -1242,7 +1242,7 @@ ], "outputDigest": { "algorithm": "sha256", - "value": "6e0cae114cc07a049c5e6a74dc5bf8eaa8f9fd942d9d9f0415092f4eae49d347" + "value": "2e0fe7487b2019f4262ae9b0ee8aea4657c2686c60a79bb3fe18dee6b28d1353" }, "currency": "current" } diff --git a/tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs b/tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs index 4b488ac23..e444767fb 100644 --- a/tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs +++ b/tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs @@ -50,7 +50,14 @@ module BlockerLintTests = { Code: int Out: string Error: string - Mutations: string list } + Mutations: string list + IdentityLadderCleared: bool } + + let private identitySessionVars = + [ "CLAUDE_CODE_SESSION_ID" + "OPENCODE_SESSION_ID" + "FSGG_AGENT_SESSION_ID" + "FSGG_AGENT_HARNESS" ] let run (initialValue: string) (secondValue: string) (initialRevision: string) (secondRevision: string) (args: string list) = let mutable observations = 0 @@ -88,6 +95,9 @@ module BlockerLintTests = let dir = Path.Combine(Path.GetTempPath(), "fsgg-2907-" + Guid.NewGuid().ToString("N")) let previousCache = Environment.GetEnvironmentVariable "FSGG_COORD_CACHE" let previousWorker = Environment.GetEnvironmentVariable "FSGG_WORKER" + let previousSessions = + identitySessionVars + |> List.map (fun variable -> variable, Environment.GetEnvironmentVariable variable) let stdout, stderr = Console.Out, Console.Error use capturedOut = new StringWriter() use capturedErr = new StringWriter() @@ -95,21 +105,34 @@ module BlockerLintTests = try Directory.CreateDirectory dir |> ignore Environment.SetEnvironmentVariable("FSGG_COORD_CACHE", dir) - Environment.SetEnvironmentVariable("FSGG_WORKER", "plover-2907") + Environment.SetEnvironmentVariable("CLAUDE_CODE_SESSION_ID", null) + Environment.SetEnvironmentVariable("OPENCODE_SESSION_ID", null) + Environment.SetEnvironmentVariable("FSGG_AGENT_SESSION_ID", null) + Environment.SetEnvironmentVariable("FSGG_AGENT_HARNESS", null) + Environment.SetEnvironmentVariable("FSGG_WORKER", null) + let identityLadderCleared = + identitySessionVars + |> List.forall (fun variable -> String.IsNullOrEmpty(Environment.GetEnvironmentVariable variable)) Console.SetOut capturedOut Console.SetError capturedErr - let opts = Options.parse args |> Result.defaultWith failwith + let opts = Options.parse (args @ [ "--worker"; "plover-2907" ]) |> Result.defaultWith failwith let context: Kernel.Context = { Transport = transport; Owner = "FS-GG"; Title = "Coordination"; DefaultRepo = Some "FS.GG.SDD"; ChoreLocks = [] } let code = Handlers.setField context opts Console.Out.Flush() Console.Error.Flush() - { Code = code; Out = capturedOut.ToString(); Error = capturedErr.ToString(); Mutations = List.ofSeq mutations } + { Code = code + Out = capturedOut.ToString() + Error = capturedErr.ToString() + Mutations = List.ofSeq mutations + IdentityLadderCleared = identityLadderCleared } finally Console.SetOut stdout Console.SetError stderr Environment.SetEnvironmentVariable("FSGG_COORD_CACHE", previousCache) Environment.SetEnvironmentVariable("FSGG_WORKER", previousWorker) + for variable, value in previousSessions do + Environment.SetEnvironmentVariable(variable, value) try Directory.Delete(dir, true) with _ -> () [] @@ -149,6 +172,45 @@ module BlockerLintTests = Assert.Contains("Stale dependency-edge observation", result.Error) Assert.Empty(result.Mutations) + [] + let ``#2907 set mutation fixture clears every identity session source before using explicit worker`` () = + let sessionVariables = + [ "CLAUDE_CODE_SESSION_ID" + "OPENCODE_SESSION_ID" + "FSGG_AGENT_SESSION_ID" + "FSGG_AGENT_HARNESS" ] + let previous = + sessionVariables + |> List.map (fun variable -> variable, Environment.GetEnvironmentVariable variable) + + let cases = + [ [ "CLAUDE_CODE_SESSION_ID", "shared-claude-session" ] + [ "OPENCODE_SESSION_ID", "per-worker-opencode-session" ] + [ "FSGG_AGENT_SESSION_ID", "custom-session"; "FSGG_AGENT_HARNESS", "custom-harness" ] + [ "FSGG_AGENT_HARNESS", "orphaned-harness-name" ] ] + + try + for poisoned in cases do + for variable in sessionVariables do + Environment.SetEnvironmentVariable(variable, null) + for variable, value in poisoned do + Environment.SetEnvironmentVariable(variable, value) + + let result = + BlockedBySetMutationFixture.run + "FS-GG/FS.GG.SDD#290" + "FS-GG/FS.GG.SDD#290" + "r1" + "r1" + [ "set-field"; "FS.GG.SDD#42"; "Blocked by"; "--add"; "#299" ] + + Assert.True(result.IdentityLadderCleared, $"identity ladder was not cleared for %A{poisoned}") + Assert.Equal(0, result.Code) + Assert.Equal([ "FS-GG/FS.GG.SDD#290, FS-GG/FS.GG.SDD#299" ], result.Mutations) + finally + for variable, value in previous do + Environment.SetEnvironmentVariable(variable, value) + /// .github#2698 — a comment ledger holding one current delivery-route receipt for `subject`, as /// `Reads.commentBodies` reads it. Any fixture whose command RESOLVES a `Status=Ready` write needs /// one now; a `[]` ledger is the unschedulable-from-birth row the refusal exists to stop. diff --git a/work/2907-blocked-by-set-mutations/evidence.yml b/work/2907-blocked-by-set-mutations/evidence.yml index fad265e91..564447b28 100644 --- a/work/2907-blocked-by-set-mutations/evidence.yml +++ b/work/2907-blocked-by-set-mutations/evidence.yml @@ -54,10 +54,10 @@ evidence: synthetic: false observedRun: source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx - digest: "sha256:21fa9267ea0052900650a3072ffa5c3cbfd991d64c126ed29f3bac462c7757ec" + digest: "sha256:44901bd84eb72f1e414ec4ee66f4859548826edb4ce3c8b948e01ff5f3744b4f" digestContract: exact-bytes-v1 outcome: passed - passed: 254 + passed: 255 failed: 0 skipped: 0 notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] @@ -81,10 +81,10 @@ evidence: synthetic: false observedRun: source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx - digest: "sha256:21fa9267ea0052900650a3072ffa5c3cbfd991d64c126ed29f3bac462c7757ec" + digest: "sha256:44901bd84eb72f1e414ec4ee66f4859548826edb4ce3c8b948e01ff5f3744b4f" digestContract: exact-bytes-v1 outcome: passed - passed: 254 + passed: 255 failed: 0 skipped: 0 notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] @@ -108,10 +108,10 @@ evidence: synthetic: false observedRun: source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx - digest: "sha256:21fa9267ea0052900650a3072ffa5c3cbfd991d64c126ed29f3bac462c7757ec" + digest: "sha256:44901bd84eb72f1e414ec4ee66f4859548826edb4ce3c8b948e01ff5f3744b4f" digestContract: exact-bytes-v1 outcome: passed - passed: 254 + passed: 255 failed: 0 skipped: 0 notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] @@ -135,10 +135,10 @@ evidence: synthetic: false observedRun: source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx - digest: "sha256:21fa9267ea0052900650a3072ffa5c3cbfd991d64c126ed29f3bac462c7757ec" + digest: "sha256:44901bd84eb72f1e414ec4ee66f4859548826edb4ce3c8b948e01ff5f3744b4f" digestContract: exact-bytes-v1 outcome: passed - passed: 254 + passed: 255 failed: 0 skipped: 0 notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] @@ -162,10 +162,10 @@ evidence: synthetic: false observedRun: source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx - digest: "sha256:21fa9267ea0052900650a3072ffa5c3cbfd991d64c126ed29f3bac462c7757ec" + digest: "sha256:44901bd84eb72f1e414ec4ee66f4859548826edb4ce3c8b948e01ff5f3744b4f" digestContract: exact-bytes-v1 outcome: passed - passed: 254 + passed: 255 failed: 0 skipped: 0 notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] @@ -189,10 +189,10 @@ evidence: synthetic: false observedRun: source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx - digest: "sha256:21fa9267ea0052900650a3072ffa5c3cbfd991d64c126ed29f3bac462c7757ec" + digest: "sha256:44901bd84eb72f1e414ec4ee66f4859548826edb4ce3c8b948e01ff5f3744b4f" digestContract: exact-bytes-v1 outcome: passed - passed: 254 + passed: 255 failed: 0 skipped: 0 notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] @@ -216,10 +216,10 @@ evidence: synthetic: false observedRun: source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx - digest: "sha256:21fa9267ea0052900650a3072ffa5c3cbfd991d64c126ed29f3bac462c7757ec" + digest: "sha256:44901bd84eb72f1e414ec4ee66f4859548826edb4ce3c8b948e01ff5f3744b4f" digestContract: exact-bytes-v1 outcome: passed - passed: 254 + passed: 255 failed: 0 skipped: 0 notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] @@ -243,10 +243,10 @@ evidence: synthetic: false observedRun: source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx - digest: "sha256:21fa9267ea0052900650a3072ffa5c3cbfd991d64c126ed29f3bac462c7757ec" + digest: "sha256:44901bd84eb72f1e414ec4ee66f4859548826edb4ce3c8b948e01ff5f3744b4f" digestContract: exact-bytes-v1 outcome: passed - passed: 254 + passed: 255 failed: 0 skipped: 0 notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] @@ -270,10 +270,10 @@ evidence: synthetic: false observedRun: source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx - digest: "sha256:21fa9267ea0052900650a3072ffa5c3cbfd991d64c126ed29f3bac462c7757ec" + digest: "sha256:44901bd84eb72f1e414ec4ee66f4859548826edb4ce3c8b948e01ff5f3744b4f" digestContract: exact-bytes-v1 outcome: passed - passed: 254 + passed: 255 failed: 0 skipped: 0 notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] @@ -297,10 +297,10 @@ evidence: synthetic: false observedRun: source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx - digest: "sha256:21fa9267ea0052900650a3072ffa5c3cbfd991d64c126ed29f3bac462c7757ec" + digest: "sha256:44901bd84eb72f1e414ec4ee66f4859548826edb4ce3c8b948e01ff5f3744b4f" digestContract: exact-bytes-v1 outcome: passed - passed: 254 + passed: 255 failed: 0 skipped: 0 notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] @@ -324,10 +324,10 @@ evidence: synthetic: false observedRun: source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx - digest: "sha256:21fa9267ea0052900650a3072ffa5c3cbfd991d64c126ed29f3bac462c7757ec" + digest: "sha256:44901bd84eb72f1e414ec4ee66f4859548826edb4ce3c8b948e01ff5f3744b4f" digestContract: exact-bytes-v1 outcome: passed - passed: 254 + passed: 255 failed: 0 skipped: 0 notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] @@ -351,10 +351,10 @@ evidence: synthetic: false observedRun: source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx - digest: "sha256:21fa9267ea0052900650a3072ffa5c3cbfd991d64c126ed29f3bac462c7757ec" + digest: "sha256:44901bd84eb72f1e414ec4ee66f4859548826edb4ce3c8b948e01ff5f3744b4f" digestContract: exact-bytes-v1 outcome: passed - passed: 254 + passed: 255 failed: 0 skipped: 0 notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] @@ -378,10 +378,10 @@ evidence: synthetic: false observedRun: source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx - digest: "sha256:21fa9267ea0052900650a3072ffa5c3cbfd991d64c126ed29f3bac462c7757ec" + digest: "sha256:44901bd84eb72f1e414ec4ee66f4859548826edb4ce3c8b948e01ff5f3744b4f" digestContract: exact-bytes-v1 outcome: passed - passed: 254 + passed: 255 failed: 0 skipped: 0 notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] @@ -405,10 +405,10 @@ evidence: synthetic: false observedRun: source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx - digest: "sha256:21fa9267ea0052900650a3072ffa5c3cbfd991d64c126ed29f3bac462c7757ec" + digest: "sha256:44901bd84eb72f1e414ec4ee66f4859548826edb4ce3c8b948e01ff5f3744b4f" digestContract: exact-bytes-v1 outcome: passed - passed: 254 + passed: 255 failed: 0 skipped: 0 notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] diff --git a/work/2907-blocked-by-set-mutations/verification/verification-evidence.md b/work/2907-blocked-by-set-mutations/verification/verification-evidence.md index d5bb83566..c53fea905 100644 --- a/work/2907-blocked-by-set-mutations/verification/verification-evidence.md +++ b/work/2907-blocked-by-set-mutations/verification/verification-evidence.md @@ -2,16 +2,21 @@ ## Positive controls -- `dotnet test tests/FS.GG.Coord.Cli.BoardOps.Tests/FS.GG.Coord.Cli.BoardOps.Tests.fsproj --no-restore`: 254 passed, 0 failed, 0 skipped. +- `dotnet test tests/FS.GG.Coord.Cli.BoardOps.Tests/FS.GG.Coord.Cli.BoardOps.Tests.fsproj --no-restore`: 255 passed, 0 failed, 0 skipped. - `dotnet test tests/FS.GG.Coord.GitHub.Tests/FS.GG.Coord.GitHub.Tests.fsproj --no-restore`: 671 passed, 0 failed, 0 skipped. - `dotnet test tests/FS.GG.Coord.Cli.Kernel.Tests/FS.GG.Coord.Cli.Kernel.Tests.fsproj --no-restore`: 182 passed, 0 failed, 0 skipped. - The Lifecycle, CLI, and Core test project commands each exited zero. -- The durable TRX at `readiness/2907-blocked-by-set-mutations/test-results/boardops.trx` records all 254 BoardOps tests passing. +- The durable TRX at `readiness/2907-blocked-by-set-mutations/test-results/boardops.trx` records all 255 BoardOps tests passing. - `tests/coord-engine-parity/run.sh` passed the explicit replace/clear, ref-first, zero-GraphQL refusal, canonicalization, de-duplication, and scoped-field controls after its legacy positional calls were migrated. - After the initial critic identified a missing hosted body for open/In-progress item #423, the repaired serialized parity run passed 616/616 assertions with zero failures and zero not-measured results. Its negative control removes only #423's body, proves production requested that body, and proves lint aborts rather than returning a partial JSON findings array. +- After the successor pass, hosted `harness-identity / ladder-decided` exposed an ambient-session leak in + `BlockedBySetMutationFixture.run`. The round-2 repair clears all four variables currently read by + `Identity.resolve`, uses an explicit `--worker`, and exercises each poisoned source independently. + `python3 scripts/check-harness-identity.py --root .` passed its 111-shell/104-F# census, the focused + BlockerLint selection passed 36/36, and `tests/harness-identity/run.sh` passed 14/14 mutation controls. - `scripts/generate-projections --check` reported every projection current; the signature-doc mutation sweep killed 435/435 mutants. - The Release engine build and the 12-entry deterministic package check exited zero. From bedf6d1a90e8d36cda83adc880bed6b4795c3c70 Mon Sep 17 00:00:00 2001 From: osprey-d90d Date: Mon, 24 Aug 2026 10:04:45 +0200 Subject: [PATCH 4/5] fix(coord): fence concurrent Blocked-by mutations --- .../governance-handoff.json | 6 +- .../ship-verdict.json | 2 +- .../2907-blocked-by-set-mutations/ship.json | 6 +- .../test-results/boardops.trx | 2800 +++++++++-------- .../2907-blocked-by-set-mutations/verify.json | 4 +- .../work-model.json | 6 +- src/FS.GG.Coord.Cli.BoardOps/Handlers.fs | 102 +- src/FS.GG.Coord.GitHub/Writes.fs | 126 + src/FS.GG.Coord.GitHub/Writes.fsi | 10 + .../BlockerLintTests.fs | 159 +- tests/coord-engine-parity/blockedby_server.py | 35 + .../evidence.yml | 56 +- .../verification/verification-evidence.md | 17 +- 13 files changed, 1844 insertions(+), 1485 deletions(-) diff --git a/readiness/2907-blocked-by-set-mutations/governance-handoff.json b/readiness/2907-blocked-by-set-mutations/governance-handoff.json index c7fc120e3..daad1268c 100644 --- a/readiness/2907-blocked-by-set-mutations/governance-handoff.json +++ b/readiness/2907-blocked-by-set-mutations/governance-handoff.json @@ -6,17 +6,17 @@ "sources": [ { "path": "readiness/2907-blocked-by-set-mutations/ship.json", - "digest": "sha256:d5381bfd7c74fb4d39d4d3f85a0b792517dc8236c3f9fb39e11968091841975a", + "digest": "sha256:f76c8a5dfef234d49633c517b7f06dabd54cb054623742f844bf7abf7895e951", "schemaVersion": 1 }, { "path": "readiness/2907-blocked-by-set-mutations/verify.json", - "digest": "sha256:151b16b59d9fc2b2bb7875dedbe58995599f85bbbdebf7f98c218c6556cd780b", + "digest": "sha256:c6bbc59e78ab9bc3541b1eed807da98abb2eddb30cbd33c364b35c1c824ed02a", "schemaVersion": 1 }, { "path": "readiness/2907-blocked-by-set-mutations/work-model.json", - "digest": "sha256:10d22940c97c7432fb2b0649bf81bb219fadb293341101ae4e0e7742fe6c39c8", + "digest": "sha256:66f3025a15363dcf82dfc6a29bc360689c5f6c8123fbf5eeb31ecfbe94001550", "schemaVersion": 1 } ], diff --git a/readiness/2907-blocked-by-set-mutations/ship-verdict.json b/readiness/2907-blocked-by-set-mutations/ship-verdict.json index 329e486d9..9b22a98bc 100644 --- a/readiness/2907-blocked-by-set-mutations/ship-verdict.json +++ b/readiness/2907-blocked-by-set-mutations/ship-verdict.json @@ -7,7 +7,7 @@ "generator": "FS.GG.SDD.Artifacts/1.1.0", "sourcesDigest": { "algorithm": "sha256", - "value": "a91879e791335c362b3a79c667cc621d172c3df5076592919e8d690be0760573" + "value": "02e7c62e11699ec08c9e8a8ea29d2aff2470e7c7ee51071a590b1fcfecd494d0" }, "verificationReadiness": { "status": "verificationReady", diff --git a/readiness/2907-blocked-by-set-mutations/ship.json b/readiness/2907-blocked-by-set-mutations/ship.json index 565989573..0981db56a 100644 --- a/readiness/2907-blocked-by-set-mutations/ship.json +++ b/readiness/2907-blocked-by-set-mutations/ship.json @@ -51,7 +51,7 @@ "kind": "source", "digest": { "algorithm": "sha256", - "value": "151b16b59d9fc2b2bb7875dedbe58995599f85bbbdebf7f98c218c6556cd780b" + "value": "c6bbc59e78ab9bc3541b1eed807da98abb2eddb30cbd33c364b35c1c824ed02a" }, "schemaVersion": 1, "schemaStatus": "current" @@ -61,7 +61,7 @@ "kind": "workModel", "digest": { "algorithm": "sha256", - "value": "10d22940c97c7432fb2b0649bf81bb219fadb293341101ae4e0e7742fe6c39c8" + "value": "66f3025a15363dcf82dfc6a29bc360689c5f6c8123fbf5eeb31ecfbe94001550" }, "schemaVersion": 1, "schemaStatus": "current" @@ -91,7 +91,7 @@ "kind": "evidence", "digest": { "algorithm": "sha256", - "value": "4484b0ae2cc24d6c9c1a659d4b0224fe1e8f32c2038fe5fc85a4aa58fb7b7f83" + "value": "dd6696d33868cea46883b8391ce40853995f3c47aaa0db190ae172d716383f7f" }, "schemaVersion": 1, "schemaStatus": "current" diff --git a/readiness/2907-blocked-by-set-mutations/test-results/boardops.trx b/readiness/2907-blocked-by-set-mutations/test-results/boardops.trx index 9760bc241..35f196a3d 100644 --- a/readiness/2907-blocked-by-set-mutations/test-results/boardops.trx +++ b/readiness/2907-blocked-by-set-mutations/test-results/boardops.trx @@ -1,1556 +1,1574 @@  - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + [xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v3.1.5+1b188a7b0a (64-bit .NET 10.0.10) -[xUnit.net 00:00:00.06] Discovering: FS.GG.Coord.Cli.BoardOps.Tests -[xUnit.net 00:00:00.10] Discovered: FS.GG.Coord.Cli.BoardOps.Tests -[xUnit.net 00:00:00.12] Starting: FS.GG.Coord.Cli.BoardOps.Tests +[xUnit.net 00:00:00.08] Discovering: FS.GG.Coord.Cli.BoardOps.Tests +[xUnit.net 00:00:00.13] Discovered: FS.GG.Coord.Cli.BoardOps.Tests +[xUnit.net 00:00:00.17] Starting: FS.GG.Coord.Cli.BoardOps.Tests +fsgg-coord-engine: vole-418 does not hold FS.GG.SDD#42 — nothing to release. +fsgg-coord-engine: Status=Blocked refuses an incoherent park (.github#2079). +fsgg-coord-engine: set-field --batch refuses: this call clears 'Blocked by' in the SAME batch as 'Status=Blocked' — the row would land with an EMPTY field and no 'Blocked on: human/...' sentinel (.github#2079). Pair 'Status=Blocked' with a non-empty 'Blocked by=<refs>' instead, or record a human park first: add a body line 'Blocked on: human/decision' or 'Blocked on: human/action'. Nothing written. +fsgg-coord-engine: set-field --batch refuses: this call clears 'Blocked by' in the SAME batch as 'Status=Blocked' — the row would land with an EMPTY field and no 'Blocked on: human/...' sentinel (.github#2079). Pair 'Status=Blocked' with a non-empty 'Blocked by=<refs>' instead, or record a human park first: add a body line 'Blocked on: human/decision' or 'Blocked on: human/action'. Nothing written. +fsgg-coord-engine: Status=Blocked refuses an incoherent park (.github#2079). +fsgg-coord-engine: vole-418 does not hold FS.GG.SDD#42 — nothing to release. fsgg-coord-engine: intake apply partially completed draft 'tx-2134': issue FS-GG/.github#88 already exists; board projection is incomplete. Retry this corrected draft with the same id to resume without another issue-create POST. fsgg-coord-engine: not found: stop after reuse binding. The server said so — this is an absence, not a failed read. fsgg-coord-engine: intake apply partially completed draft 'tx-2134': issue FS-GG/.github#77 already exists; board projection is incomplete. Retry this corrected draft with the same id to resume without another issue-create POST. @@ -1572,12 +1590,12 @@ fsgg-coord-engine: malformed response reading blocked-2134: Blocked dependency F fsgg-coord-engine: malformed response reading tx-2134: a duplicate candidate matches the title; select reuse or revise the draft. That is a FAILED READ, not an empty answer — refusing to decide from it. fsgg-coord-engine: intake apply partially completed draft 'tx-2134': issue FS-GG/.github#77 already exists; board projection is incomplete. Retry this corrected draft with the same id to resume without another issue-create POST. fsgg-coord-engine: not found: stop after legacy intent recovery. The server said so — this is an absence, not a failed read. -fsgg-coord-engine: malformed response reading tx-2134: intake receipt '/tmp/fsgg-intake-0395567c4d324e94b262e5183ae0d0a8/intake-tx-2134.json' is unreadable: 'not-json' is an invalid JSON literal. Expected the literal 'null'. LineNumber: 0 | BytePositionInLine: 1.. That is a FAILED READ, not an empty answer — refusing to decide from it. -fsgg-coord-engine: malformed response reading tx-2134: intake receipt '/tmp/fsgg-intake-0395567c4d324e94b262e5183ae0d0a8/intake-tx-2134.json' is unreadable: The given key was not present in the dictionary.. That is a FAILED READ, not an empty answer — refusing to decide from it. +fsgg-coord-engine: malformed response reading tx-2134: intake receipt '/tmp/fsgg-intake-285ddde2eb4748cb858b211395eaa528/intake-tx-2134.json' is unreadable: 'not-json' is an invalid JSON literal. Expected the literal 'null'. LineNumber: 0 | BytePositionInLine: 1.. That is a FAILED READ, not an empty answer — refusing to decide from it. +fsgg-coord-engine: malformed response reading tx-2134: intake receipt '/tmp/fsgg-intake-285ddde2eb4748cb858b211395eaa528/intake-tx-2134.json' is unreadable: The given key was not present in the dictionary.. That is a FAILED READ, not an empty answer — refusing to decide from it. paths paths do not exist in target repository FS-GG/.github: definitely/not/a/live/path-2134 fsgg-coord-engine: intake apply partially completed draft 'tx-2134': issue FS-GG/.github#77 already exists; board projection is incomplete. Retry this corrected draft with the same id to resume without another issue-create POST. fsgg-coord-engine: not found: stop after receipt recovery. The server said so — this is an absence, not a failed read. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-286c8c1bead44b6c9617628e1f8cd64d — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-97d2f24072ab44e6be345b4e627a0aab — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. considered 3 candidate(s) — this is a measured count, not an assumption. FS.GG.SDD#74 — Status is In progress FS.GG.SDD#75 — Status is Blocked @@ -1587,115 +1605,115 @@ this queue is BUSY, not empty. soonest: lease EXPIRED — reapable 1 of those lease(s) have EXPIRED — collect them: scripts/fsgg-coord reap --repo FS.GG.SDD --apply wave occupancy: unavailable (no drive-board or work-board host-loop document exists) -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-beeb6e51c84349eb970b02794ac4c7d3 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-beeb6e51c84349eb970b02794ac4c7d3 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-588e848cf53e44489870e9d0e92783f0 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-588e848cf53e44489870e9d0e92783f0 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-5ebfe7e75c22456c925a623e8a1a4cfe — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-5ebfe7e75c22456c925a623e8a1a4cfe — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-a54086ee8b2c415a9ddf18805ea19cf9 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-a54086ee8b2c415a9ddf18805ea19cf9 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-b8aa4d24147245fdabed3cccc0c7199b — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-b8aa4d24147245fdabed3cccc0c7199b — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-bcd516e40bf245258fc36199187ce229 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-bcd516e40bf245258fc36199187ce229 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-bed4f528849049b9ab1d9cff7cf73ff1 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-bed4f528849049b9ab1d9cff7cf73ff1 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-6b4c5560dd7d490b88e9a00aae391137 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-6b4c5560dd7d490b88e9a00aae391137 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-3a29490a1610409a9f4b3f34c31d4e8a — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-8dd776ecdb814edd909386350d65c031 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. considered 3 candidate(s) — this is a measured count, not an assumption. FS.GG.SDD#74 — Status is In progress FS.GG.SDD#75 — Status is In progress FS.GG.SDD#76 — overlaps FS.GG.SDD#75, which the board says is In progress with NO claim marker (someone is working outside the protocol — there is no lease to wait out; see: scripts/fsgg-coord who): src/Shared.fs ⇄ src/Shared.fs wave occupancy: unavailable (no drive-board or work-board host-loop document exists) -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-0f7647e27705486294cc4d9971226ae1 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-0f7647e27705486294cc4d9971226ae1 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-d98c42541b6f401cbe579e28ac69070f — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-d98c42541b6f401cbe579e28ac69070f — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-1ba2de075c464ecd8ea505eca2051ab7 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-1ba2de075c464ecd8ea505eca2051ab7 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-93bcef12e66b455ea9353fa52e5db0b3 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-93bcef12e66b455ea9353fa52e5db0b3 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-b5cb34da89664c07a93f5f05ddb7b3ba — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-b5cb34da89664c07a93f5f05ddb7b3ba — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-d7fed6bb42524446976786aaf1b9829d — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-d7fed6bb42524446976786aaf1b9829d — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-46f2bdb16fb54dbba3eb5498ff42e2a3 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-46f2bdb16fb54dbba3eb5498ff42e2a3 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-a50daab4f4e24686ac638e3f2623bbd4 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-a50daab4f4e24686ac638e3f2623bbd4 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-b58b14bdf40e40129da7be9d3c407160 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-b58b14bdf40e40129da7be9d3c407160 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-5523f44437d441398823aecc8f5e1602 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-5523f44437d441398823aecc8f5e1602 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-1e9396b9ecb94b08b7bc2b361dd1fc2e — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-1e9396b9ecb94b08b7bc2b361dd1fc2e — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-c3d5106a9f154f42a52fb7592a5a4bde — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-c3d5106a9f154f42a52fb7592a5a4bde — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-7a90208eb806416e86b8b4ea3cb6a193 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-7a90208eb806416e86b8b4ea3cb6a193 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-340ba0aa9e424e79a1400ee0554be0df — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-340ba0aa9e424e79a1400ee0554be0df — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-7c1a4db067254d3c938bf43d9c6d5a2b — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-7c1a4db067254d3c938bf43d9c6d5a2b — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-8cf4aa202a0d485e8b55b4036d549762 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-8cf4aa202a0d485e8b55b4036d549762 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-5b42822856c54b08abf25125a4877a4d — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-5b42822856c54b08abf25125a4877a4d — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-1f6004f5530f4183bb2a69cacfc1ef21 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-1f6004f5530f4183bb2a69cacfc1ef21 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-2f5a7e791e864eddbf67db170d4ae153 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-2f5a7e791e864eddbf67db170d4ae153 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-0b1de6ea2a15463fa053b667db017da4 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-0b1de6ea2a15463fa053b667db017da4 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-ddfb6dca18f842e6913ee02bd42370a2 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-ddfb6dca18f842e6913ee02bd42370a2 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-683e3e41fabf47cc84c200626b6b0323 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-683e3e41fabf47cc84c200626b6b0323 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-68a249f0d8d14c02bea67613c8f7ca66 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-68a249f0d8d14c02bea67613c8f7ca66 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-96162e631f624feeabdf07c6bc14e80a — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-96162e631f624feeabdf07c6bc14e80a — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-c0f0b1fbd9a3422d8708f3b1fa4df0e9 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-c0f0b1fbd9a3422d8708f3b1fa4df0e9 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-fb536c08ed6a4d0392215996fe89ccf8 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-fb536c08ed6a4d0392215996fe89ccf8 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-2906eca6d8494a83a406bc8fb2184ab1 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-2906eca6d8494a83a406bc8fb2184ab1 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-aab773f1327e405288197354cd1292a1 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-aab773f1327e405288197354cd1292a1 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-11cbd1110a8e46f88f640668ce7ff97d — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-11cbd1110a8e46f88f640668ce7ff97d — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-c95d1aad8e9e4c3bb0fd9c247e91b16f — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-c95d1aad8e9e4c3bb0fd9c247e91b16f — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-1c7da5c6f87f480e8985a2407b423321 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-1c7da5c6f87f480e8985a2407b423321 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-a3e8d81463e04a09827862877aacc432 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-a3e8d81463e04a09827862877aacc432 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-6833ebe73fa44084b4ed998493722c96 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-6833ebe73fa44084b4ed998493722c96 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-d6e53c90917f45eeac7a1e164422122a — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-d6e53c90917f45eeac7a1e164422122a — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. LIVE-CLAIM: worker ghost-777, FS.GG.SDD#42 is open and claimed by other-123; queue retained. UNKNOWN: could not record disposition for FS.GG.SDD#42: not found: the notice could not be posted. The server said so — this is an absence, not a failed read.. Queue retained. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-158e99ec90734efb894327b1c219f8b6 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-158e99ec90734efb894327b1c219f8b6 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-27846aef8e184b0f9015edcfb649ada3 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-27846aef8e184b0f9015edcfb649ada3 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-e07d19f79c4e4fd592579588f6482194 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-e07d19f79c4e4fd592579588f6482194 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-4bc90412792b4809a905d9bce4160e51 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-74cb4f4eb4d245b79b517657fc17831e — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-74cb4f4eb4d245b79b517657fc17831e — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-8242a4e9d27c4878a2a3d201ff093164 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-8242a4e9d27c4878a2a3d201ff093164 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-ef6b0d75cffa4dd9ab29d80918d63e0b — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-ef6b0d75cffa4dd9ab29d80918d63e0b — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-8631ddce1f9b4781bcbb578cbc8d8570 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. considered 3 candidate(s) — this is a measured count, not an assumption. FS.GG.SDD#74 — Status is In progress FS.GG.SDD#75 — the issue is closed (the board column says In review; /check-board reconciles it) @@ -1704,143 +1722,137 @@ this queue is BUSY, not empty. 1 item(s) are QUEUED BEHIND LIVE CLAIMS held by: curlew-8afd soonest: lease frees in ~120m wave occupancy: unavailable (no drive-board or work-board host-loop document exists) -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-fb281dd9ffce491abb04c9703c982e71 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-fb281dd9ffce491abb04c9703c982e71 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-e26c099b18ba46239c9cf0f84c8a645c — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-e26c099b18ba46239c9cf0f84c8a645c — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker curlew-8afd) src/Shared.fs notified worker curlew-8afd on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-9fea11eae808463684b9c0d7a5079f4e — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-9fea11eae808463684b9c0d7a5079f4e — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-e12e3691c7c840b2a9eb6b39bf9e35c1 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-e12e3691c7c840b2a9eb6b39bf9e35c1 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-37f4f8bf13a3480bbbef9e6bb28d170a — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-37f4f8bf13a3480bbbef9e6bb28d170a — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-38a9a5b8baca40fc8a9e3c385ebf0db2 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-38a9a5b8baca40fc8a9e3c385ebf0db2 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-5dc85e4df1b04c8c86fdf2bac81a35ad — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-5dc85e4df1b04c8c86fdf2bac81a35ad — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-d1453c6de8734ad5a987f447406c0c32 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-d1453c6de8734ad5a987f447406c0c32 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-6747517a26314402bb8cba7303dc10ff — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-6747517a26314402bb8cba7303dc10ff — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-817d31329ace4457a62db63b4462d2a1 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-817d31329ace4457a62db63b4462d2a1 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs could NOT notify worker otter-9c21 on FS.GG.SDD#75: not found: the notice could not be posted. The server said so — this is an absence, not a failed read. fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-d6c08ce32561475e8cc2325edc1472b3 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-d6c08ce32561475e8cc2325edc1472b3 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-cc23f9fed92145349d83e9a05308970f — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-cc23f9fed92145349d83e9a05308970f — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs could NOT notify worker otter-9c21 on FS.GG.SDD#75: not found: the notice could not be posted. The server said so — this is an absence, not a failed read. fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-1ade53c3049047b08df18bd2abfeff3a — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-1ade53c3049047b08df18bd2abfeff3a — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-ccc1d376551c41c1adc2abe4317bafa7 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-ccc1d376551c41c1adc2abe4317bafa7 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-bcca1f2866bf4fc9abc69fbee243123f — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-bcca1f2866bf4fc9abc69fbee243123f — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-da8f41b45e1546d799352c7971487001 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-da8f41b45e1546d799352c7971487001 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-09f907577b5d42b992d00307dacbf959 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-1a62484ed0e742ca93ad4e51c2404ed6 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. FS.GG.SDD#74 — Status is In progress FS.GG.SDD#75 — Status is Blocked wave occupancy: unavailable (no drive-board or work-board host-loop document exists) -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-cf52a7d169344a358fd289ba7af5eb75 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-cf52a7d169344a358fd289ba7af5eb75 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-5193a01ad15e4b6fb224cb75650e55b8 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-5193a01ad15e4b6fb224cb75650e55b8 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-f0660836ee754a93ab442f353e424849 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-f0660836ee754a93ab442f353e424849 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-8e2ffeb7c8e74732972a11f0abbc19e8 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-8e2ffeb7c8e74732972a11f0abbc19e8 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-094d50a769ea4216819cacaabd0794e7 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-094d50a769ea4216819cacaabd0794e7 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-4a67a2879fbd46ca9452612b8fe9127e — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-4a67a2879fbd46ca9452612b8fe9127e — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-5d3a4c38da994d4cbb55a990d6f5ef31 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-5d3a4c38da994d4cbb55a990d6f5ef31 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-094b653792a94e0db13d604d111d8568 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-094b653792a94e0db13d604d111d8568 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-094b653792a94e0db13d604d111d8568 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-094b653792a94e0db13d604d111d8568 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-db746c44c28844719702a08afd8688be — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-db746c44c28844719702a08afd8688be — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-1686d102a60240f895790dfc50785ed0 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-1686d102a60240f895790dfc50785ed0 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-1686d102a60240f895790dfc50785ed0 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1740-1686d102a60240f895790dfc50785ed0 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-4cb84f0abcf14bf1bbd9b3ba0bbe73c5 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-4cb84f0abcf14bf1bbd9b3ba0bbe73c5 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-c0664ff0daf4499ab34ebc4fe4c776b1 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-c0664ff0daf4499ab34ebc4fe4c776b1 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-e331b93fcdaf44e7b4a07d47a43e96ed — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-e331b93fcdaf44e7b4a07d47a43e96ed — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-51e2a97cf0044b6c80fb89db2d23c04e — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-51e2a97cf0044b6c80fb89db2d23c04e — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-3a0d815ec64b41f3882be3e979332c39 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-3a0d815ec64b41f3882be3e979332c39 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-b395048bc2154f3997faa69808830fbd — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-b395048bc2154f3997faa69808830fbd — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-f05e3ffbd11a47f7ba7a1f371ae6cd62 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-f05e3ffbd11a47f7ba7a1f371ae6cd62 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-acc06728a6b9471693dd5e61acd9be56 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-acc06728a6b9471693dd5e61acd9be56 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-2084dc0672ad48f6bd20c0a854af3925 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-2084dc0672ad48f6bd20c0a854af3925 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-08f33850103f4ab8b2cbeedfd339dd6e — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-08f33850103f4ab8b2cbeedfd339dd6e — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-2745341617334d4c8099d443ac7ddd6e — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-2745341617334d4c8099d443ac7ddd6e — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-06a9bc02f86d447289d86dcdb6a67f3f — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-06a9bc02f86d447289d86dcdb6a67f3f — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-3a70ded7c70843adb7937878e45557f0 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-3a70ded7c70843adb7937878e45557f0 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-2a47765b344d4003a474e3b6dedd4f1d — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-2a47765b344d4003a474e3b6dedd4f1d — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-df0eafc015e64acb80cbf8a473c6d200 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-df0eafc015e64acb80cbf8a473c6d200 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-9cd807e017904d0caa119b72b1a1cc33 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-9cd807e017904d0caa119b72b1a1cc33 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-b2943504006e416bb2e58e496f3bdba7 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-b2943504006e416bb2e58e496f3bdba7 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-4bafb3577c554aaea96b9854c153ea33 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-4bafb3577c554aaea96b9854c153ea33 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-32ae070a4da847febbeb4a30e7924ef0 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-32ae070a4da847febbeb4a30e7924ef0 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-72194ac9c5294caab4552e9a795e4ac8 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-72194ac9c5294caab4552e9a795e4ac8 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-aedd335b4ebb4152868642beb0ee7e57 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. -fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-aedd335b4ebb4152868642beb0ee7e57 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-e1fe799371264676bc4046b59eaa5215 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. +fsgg-coord-engine: scripts/generated-paths does not exist under /tmp/fsgg-1517-e1fe799371264676bc4046b59eaa5215 — NOTHING is subtracted, so a regenerated artifact will be reported as drift below. OVERLAP — now collides with FS.GG.SDD#75 (worker otter-9c21) src/Shared.fs notified worker otter-9c21 on FS.GG.SDD#75 fsgg-coord-engine: the updated touch-set COLLIDES with a live claim (this command may or may not be what introduced it) — do NOT keep editing the shared paths until it is resolved. -fsgg-coord-engine: vole-418 does not hold FS.GG.SDD#42 — nothing to release. -fsgg-coord-engine: Status=Blocked refuses an incoherent park (.github#2079). -fsgg-coord-engine: set-field --batch refuses: this call clears 'Blocked by' in the SAME batch as 'Status=Blocked' — the row would land with an EMPTY field and no 'Blocked on: human/...' sentinel (.github#2079). Pair 'Status=Blocked' with a non-empty 'Blocked by=<refs>' instead, or record a human park first: add a body line 'Blocked on: human/decision' or 'Blocked on: human/action'. Nothing written. -fsgg-coord-engine: set-field --batch refuses: this call clears 'Blocked by' in the SAME batch as 'Status=Blocked' — the row would land with an EMPTY field and no 'Blocked on: human/...' sentinel (.github#2079). Pair 'Status=Blocked' with a non-empty 'Blocked by=<refs>' instead, or record a human park first: add a body line 'Blocked on: human/decision' or 'Blocked on: human/action'. Nothing written. -fsgg-coord-engine: Status=Blocked refuses an incoherent park (.github#2079). -fsgg-coord-engine: vole-418 does not hold FS.GG.SDD#42 — nothing to release. -[xUnit.net 00:00:01.43] Finished: FS.GG.Coord.Cli.BoardOps.Tests +[xUnit.net 00:00:01.78] Finished: FS.GG.Coord.Cli.BoardOps.Tests diff --git a/readiness/2907-blocked-by-set-mutations/verify.json b/readiness/2907-blocked-by-set-mutations/verify.json index c6c41e438..ecfacf741 100644 --- a/readiness/2907-blocked-by-set-mutations/verify.json +++ b/readiness/2907-blocked-by-set-mutations/verify.json @@ -51,7 +51,7 @@ "kind": "workModel", "digest": { "algorithm": "sha256", - "value": "10d22940c97c7432fb2b0649bf81bb219fadb293341101ae4e0e7742fe6c39c8" + "value": "66f3025a15363dcf82dfc6a29bc360689c5f6c8123fbf5eeb31ecfbe94001550" }, "schemaVersion": 1, "schemaStatus": "current" @@ -81,7 +81,7 @@ "kind": "evidence", "digest": { "algorithm": "sha256", - "value": "4484b0ae2cc24d6c9c1a659d4b0224fe1e8f32c2038fe5fc85a4aa58fb7b7f83" + "value": "dd6696d33868cea46883b8391ce40853995f3c47aaa0db190ae172d716383f7f" }, "schemaVersion": 1, "schemaStatus": "current" diff --git a/readiness/2907-blocked-by-set-mutations/work-model.json b/readiness/2907-blocked-by-set-mutations/work-model.json index 96eafd893..5073cb98e 100644 --- a/readiness/2907-blocked-by-set-mutations/work-model.json +++ b/readiness/2907-blocked-by-set-mutations/work-model.json @@ -77,7 +77,7 @@ "schemaStatus": "current", "sourceDigest": { "algorithm": "sha256", - "value": "9efdb0a398fb8d6b2e7e8df488dcc1a726584eb67f567892371700804d4166d2" + "value": "02b417f6fac4ec096e11ab6622d556948782cfd43b0d2bbfc5da284e3b29e7b0" } }, { @@ -1211,7 +1211,7 @@ "path": "work/2907-blocked-by-set-mutations/evidence.yml", "digest": { "algorithm": "sha256", - "value": "9efdb0a398fb8d6b2e7e8df488dcc1a726584eb67f567892371700804d4166d2" + "value": "02b417f6fac4ec096e11ab6622d556948782cfd43b0d2bbfc5da284e3b29e7b0" }, "schemaVersion": 1 }, @@ -1242,7 +1242,7 @@ ], "outputDigest": { "algorithm": "sha256", - "value": "2e0fe7487b2019f4262ae9b0ee8aea4657c2686c60a79bb3fe18dee6b28d1353" + "value": "2da86bdcdc9cdd64360602ff4fa428345c9f62462e001182ace50289943c640d" }, "currency": "current" } diff --git a/src/FS.GG.Coord.Cli.BoardOps/Handlers.fs b/src/FS.GG.Coord.Cli.BoardOps/Handlers.fs index 5521ff667..240c5a1c5 100644 --- a/src/FS.GG.Coord.Cli.BoardOps/Handlers.fs +++ b/src/FS.GG.Coord.Cli.BoardOps/Handlers.fs @@ -520,53 +520,61 @@ module Handlers = let writeExplicit operation write = match Board.boardWrite ctx.Transport board ref.Owner ref.Repo ref.Number "Blocked by" write w.Id with - | Error e -> fail e - | Ok outcome -> renderOutcome operation write outcome - - match mutation with - | Options.ReplaceBlockedBy raw -> - match canonicalBlockedByRefs ref raw with - | Error rc -> rc - | Ok [] -> - eprint "fsgg-coord-engine: --replace needs at least one issue ref; use --clear to clear the set." - ExitError - | Ok refs -> - let write = blockedByWrite refs - writeExplicit "replace" write - | Options.ClearBlockedBy -> - writeExplicit "clear" Board.Clear - | Options.AddBlockedBy raw - | Options.RemoveBlockedBy raw as edgeMutation -> - match Board.itemBlockedByObservation ctx.Transport board ref.Owner ref.Repo ref.Number with - | Error e -> fail e - | Ok observed -> - let liveRaw = observed.Value |> Option.defaultValue "" - match canonicalBlockedByRefs ref liveRaw, canonicalBlockedByRefs ref raw with - | Error rc, _ - | _, Error rc -> rc - | _, Ok [] -> - let operation = - match edgeMutation with - | Options.AddBlockedBy _ -> "add" - | _ -> "remove" - - eprint $"fsgg-coord-engine: --%s{operation} needs at least one issue ref." - ExitError - | Ok live, Ok requested -> - let result, operation = - match edgeMutation with - | Options.AddBlockedBy _ -> - let seen = Set.ofList live - live @ (requested |> List.filter (fun value -> not (Set.contains value seen))), "add" - | Options.RemoveBlockedBy _ -> - let removed = Set.ofList requested - live |> List.filter (fun value -> not (Set.contains value removed)), "remove" - | _ -> failwith "unreachable explicit edge mutation" - - let write = blockedByWrite result - match Board.boardWriteGuarded ctx.Transport board ref.Owner ref.Repo ref.Number observed write with - | Error e -> fail e - | Ok outcome -> renderOutcome operation write outcome + | Error e -> Error e + | Ok outcome -> Ok(renderOutcome operation write outcome) + + // The lease begins BEFORE the first live edge observation and remains held through + // the GraphQL mutation. Projects v2 has no expected-revision input, so moving only the + // second read closer to the write would preserve the overwrite race this boundary owns. + let transaction () : Errors.IoResult = + match mutation with + | Options.ReplaceBlockedBy raw -> + match canonicalBlockedByRefs ref raw with + | Error rc -> Ok rc + | Ok [] -> + eprint "fsgg-coord-engine: --replace needs at least one issue ref; use --clear to clear the set." + Ok ExitError + | Ok refs -> + let write = blockedByWrite refs + writeExplicit "replace" write + | Options.ClearBlockedBy -> + writeExplicit "clear" Board.Clear + | Options.AddBlockedBy raw + | Options.RemoveBlockedBy raw as edgeMutation -> + match Board.itemBlockedByObservation ctx.Transport board ref.Owner ref.Repo ref.Number with + | Error e -> Error e + | Ok observed -> + let liveRaw = observed.Value |> Option.defaultValue "" + match canonicalBlockedByRefs ref liveRaw, canonicalBlockedByRefs ref raw with + | Error rc, _ + | _, Error rc -> Ok rc + | _, Ok [] -> + let operation = + match edgeMutation with + | Options.AddBlockedBy _ -> "add" + | _ -> "remove" + + eprint $"fsgg-coord-engine: --%s{operation} needs at least one issue ref." + Ok ExitError + | Ok live, Ok requested -> + let result, operation = + match edgeMutation with + | Options.AddBlockedBy _ -> + let seen = Set.ofList live + live @ (requested |> List.filter (fun value -> not (Set.contains value seen))), "add" + | Options.RemoveBlockedBy _ -> + let removed = Set.ofList requested + live |> List.filter (fun value -> not (Set.contains value removed)), "remove" + | _ -> failwith "unreachable explicit edge mutation" + + let write = blockedByWrite result + match Board.boardWriteGuarded ctx.Transport board ref.Owner ref.Repo ref.Number observed write with + | Error e -> Error e + | Ok outcome -> Ok(renderOutcome operation write outcome) + + match Writes.withBlockedByMutationLease ctx.Transport ref transaction with + | Error e -> fail e + | Ok code -> code | [ _; field ] -> eprint $"fsgg-coord-engine: --add/--remove/--replace/--clear apply only to the set-valued 'Blocked by' field (got '%s{field}')." ExitError diff --git a/src/FS.GG.Coord.GitHub/Writes.fs b/src/FS.GG.Coord.GitHub/Writes.fs index 451418889..afa8cfb2c 100644 --- a/src/FS.GG.Coord.GitHub/Writes.fs +++ b/src/FS.GG.Coord.GitHub/Writes.fs @@ -368,6 +368,132 @@ module Writes = | Error(NotFound _) -> Ok() | Error e -> Error e + // GitHub Projects v2 field mutations expose no expected-revision input. A read immediately before + // `updateProjectV2ItemFieldValue` therefore cannot be a compare-and-set: another process can write + // after that read and before our mutation, and our derived set would erase its edge. Serialize the + // complete read/derive/write transaction on REST instead, where comment ids provide the same total + // order as the claim CAS. The marker is deliberately ephemeral; a bounded stale marker from a dead + // process is collected before a new contender enters. + [] + let private BlockedByLeaseMarker = "" + let now () = DateTimeOffset.UtcNow + let isStale candidate = now () - candidate.UpdatedAt > TimeSpan.FromMinutes(float BlockedByLeaseMinutes) + + let rec deleteAll candidates = + match candidates with + | [] -> Ok() + | candidate :: rest -> + deleteComment transport ref candidate.Id + |> Result.bind (fun () -> deleteAll rest) + + let finish myId actionResult = + match deleteComment transport ref myId, actionResult with + | Ok(), result -> result + | Error cleanup, Ok _ -> + Error(Malformed(subject, $"the guarded mutation succeeded but lease comment %d{myId} could not be removed (%s{Errors.explain cleanup}); do not retry until the lease expires")) + | Error cleanup, Error actionError -> + Error(Malformed(subject, $"the guarded mutation failed (%s{Errors.explain actionError}) and lease comment %d{myId} could not be removed (%s{Errors.explain cleanup})")) + + let runIfWinner myId = + blockedByLeaseCandidates transport ref + |> Result.bind (fun candidates -> + let live = candidates |> List.filter (isStale >> not) + match live |> List.tryHead with + | Some winner when winner.Id = myId -> finish myId (action ()) + | Some winner -> + deleteComment transport ref myId + |> Result.bind (fun () -> Error(Malformed(subject, $"Blocked by mutation lease is held by comment %d{winner.Id}; no board mutation was sent"))) + | None -> + deleteComment transport ref myId + |> Result.bind (fun () -> Error(Malformed(subject, "our mutation lease candidate disappeared before the authoritative election")))) + + blockedByLeaseCandidates transport ref + |> Result.bind (fun initial -> + initial + |> List.filter isStale + |> deleteAll + |> Result.bind (fun () -> blockedByLeaseCandidates transport ref) + |> Result.bind (fun current -> + match current |> List.filter (isStale >> not) |> List.tryHead with + | Some winner -> + Error(Malformed(subject, $"Blocked by mutation lease is held by comment %d{winner.Id}; no board mutation was sent")) + | None -> + match postComment transport ref body with + | Ok myId -> runIfWinner myId + | Error writeError -> + blockedByLeaseCandidates transport ref + |> Result.bind (fun recovered -> + match recovered |> List.tryFind (fun candidate -> candidate.Body = body) with + | Some ours -> runIfWinner ours.Id + | None -> Error writeError))) + let private patchComment (transport: IGitHubTransport) (ref: Ref) diff --git a/src/FS.GG.Coord.GitHub/Writes.fsi b/src/FS.GG.Coord.GitHub/Writes.fsi index 69b00cfef..602d5655a 100644 --- a/src/FS.GG.Coord.GitHub/Writes.fsi +++ b/src/FS.GG.Coord.GitHub/Writes.fsi @@ -100,6 +100,16 @@ module Writes = body: string -> Errors.IoResult + /// Serialize one complete explicit `Blocked by` read/derive/write transaction using an ephemeral, + /// REST-backed comment CAS. Projects v2 field mutations have no expected-revision input, so another + /// pre-read is not mutation authority. The lowest live GitHub comment id wins; stale candidates from + /// a dead process expire after ten minutes, and every completed contender removes only its own marker. + val withBlockedByMutationLease: + transport: Transport.IGitHubTransport -> + ref: FS.GG.Coord.Types.Ref -> + action: (unit -> Errors.IoResult<'value>) -> + Errors.IoResult<'value> + /// Validate an intake draft before issuing its REST issue-create request. Invalid drafts spend no IO. val createIntake: transport: Transport.IGitHubTransport -> draft: FS.GG.Coord.Intake.Draft -> Errors.IoResult diff --git a/tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs b/tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs index e444767fb..78bb6bdab 100644 --- a/tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs +++ b/tests/FS.GG.Coord.Cli.BoardOps.Tests/BlockerLintTests.fs @@ -3,6 +3,7 @@ namespace FS.GG.Coord.Cli.Tests open System open System.IO open System.Text.RegularExpressions +open System.Text.Json open Xunit open FS.GG.Coord open FS.GG.Coord.Types @@ -59,8 +60,16 @@ module BlockerLintTests = "FSGG_AGENT_SESSION_ID" "FSGG_AGENT_HARNESS" ] - let run (initialValue: string) (secondValue: string) (initialRevision: string) (secondRevision: string) (args: string list) = + let private runCore + (leaseRaceWinner: bool) + (initialValue: string) + (secondValue: string) + (initialRevision: string) + (secondRevision: string) + (args: string list) = let mutable observations = 0 + let mutable leaseReads = 0 + let mutable leaseBody = "" let mutations = ResizeArray() let observation value revision = @@ -69,6 +78,26 @@ module BlockerLintTests = let transport = Fake.Recorder(fun request -> match request.Method, request.Path.Trim('/'), request.Body with + | "GET", "repos/FS-GG/FS.GG.SDD/issues/42/comments", _ -> + leaseReads <- leaseReads + 1 + if leaseReads < 3 then ok "[]" + else + let now = DateTimeOffset.UtcNow.ToString("o") + let ours = {| id = 200L; body = leaseBody; updated_at = now; html_url = "https://fixture/200" |} + if leaseRaceWinner then + let winner = + {| id = 100L + body = "" + updated_at = now + html_url = "https://fixture/100" |} + ok (JsonSerializer.Serialize [| winner; ours |]) + else + ok (JsonSerializer.Serialize [| ours |]) + | "POST", "repos/FS-GG/FS.GG.SDD/issues/42/comments", Json payload -> + use document = JsonDocument.Parse payload + leaseBody <- document.RootElement.GetProperty("body").GetString() + ok """{"id":200}""" + | "DELETE", "repos/FS-GG/FS.GG.SDD/issues/comments/200", _ -> ok "{}" | "GET", "rate_limit", _ -> ok """{"resources":{"graphql":{"remaining":4980,"limit":5000}}}""" | "POST", "graphql", Query(document, _) when document.Contains "projectsV2" -> ok """{"data":{"organization":{"projectsV2":{"pageInfo":{"hasNextPage":false,"endCursor":null},"nodes":[{"number":12,"title":"Coordination","id":"PVT_coord"}]}}}}""" @@ -135,6 +164,12 @@ module BlockerLintTests = Environment.SetEnvironmentVariable(variable, value) try Directory.Delete(dir, true) with _ -> () + let run initialValue secondValue initialRevision secondRevision args = + runCore false initialValue secondValue initialRevision secondRevision args + + let runContended initialValue secondValue initialRevision secondRevision args = + runCore true initialValue secondValue initialRevision secondRevision args + [] let ``#2907 add preserves the existing edge while adding the requested edge`` () = let result = @@ -172,6 +207,128 @@ module BlockerLintTests = Assert.Contains("Stale dependency-edge observation", result.Error) Assert.Empty(result.Mutations) + [] + let ``#2907 lower comment-id contender fences the mutation before any edge read or write`` () = + let result = + BlockedBySetMutationFixture.runContended + "FS-GG/FS.GG.SDD#290" + "FS-GG/FS.GG.SDD#290" + "r1" + "r1" + [ "set-field"; "FS.GG.SDD#42"; "Blocked by"; "--add"; "#299" ] + + Assert.NotEqual(0, result.Code) + Assert.Contains("lease is held by comment 100", result.Error) + Assert.Empty(result.Mutations) + + [] + let ``#2907 two concurrent writers serialize without losing either edge`` () = + let sync = obj () + let bothReadyToPost = new Threading.ManualResetEventSlim(false) + let bothPosted = new Threading.ManualResetEventSlim(false) + let bothElected = new Threading.ManualResetEventSlim(false) + let comments = Collections.Generic.Dictionary() + let emptyReadsByThread = Collections.Generic.Dictionary() + let mutable nextComment = 100L + let mutable readyToPost = 0 + let mutable postCount = 0 + let mutable electionReads = 0 + let mutable edges = Set.empty + let mutable actionsInProgress = 0 + let mutable maximumConcurrentActions = 0 + + let response body : Errors.IoResult = + Ok { Status = 200; Body = body; ETag = None; NextLink = None; Headers = Map.empty } + + let commentJson () = + lock sync (fun () -> + let now = DateTimeOffset.UtcNow.ToString("o") + comments + |> Seq.sortBy (fun entry -> entry.Key) + |> Seq.map (fun entry -> + {| id = entry.Key + body = entry.Value + updated_at = now + html_url = $"https://fixture/%d{entry.Key}" |}) + |> Seq.toArray + |> JsonSerializer.Serialize) + + let transport = + { new IGitHubTransport with + member _.Send(request: Request) = + match request.Method, request.Path.Trim('/'), request.Body with + | "GET", "repos/FS-GG/.github/issues/42/comments", _ -> + let mustWaitToPost, json = + lock sync (fun () -> + let threadId = Threading.Thread.CurrentThread.ManagedThreadId + let priorReads = + match emptyReadsByThread.TryGetValue threadId with + | true, count -> count + | _ -> 0 + let currentReads = priorReads + 1 + emptyReadsByThread.[threadId] <- currentReads + let mustWaitToPost = postCount = 0 && currentReads = 2 + if mustWaitToPost then + readyToPost <- readyToPost + 1 + if readyToPost = 2 then bothReadyToPost.Set() + if postCount >= 2 then + electionReads <- electionReads + 1 + if electionReads >= 2 then bothElected.Set() + mustWaitToPost, commentJson ()) + if mustWaitToPost then Assert.True(bothReadyToPost.Wait(TimeSpan.FromSeconds 10.0), "both contenders did not reach the post boundary") + response json + | "POST", "repos/FS-GG/.github/issues/42/comments", Json payload -> + let id, body, mustWait = + use document = JsonDocument.Parse payload + let body = document.RootElement.GetProperty("body").GetString() + lock sync (fun () -> + let id = nextComment + nextComment <- nextComment + 1L + comments.[id] <- body + postCount <- postCount + 1 + if postCount = 2 then bothPosted.Set() + id, body, postCount <= 2) + if mustWait then Assert.True(bothPosted.Wait(TimeSpan.FromSeconds 10.0), "both contenders did not post") + response (JsonSerializer.Serialize {| id = id; body = body |}) + | "DELETE", path, _ when path.StartsWith "repos/FS-GG/.github/issues/comments/" -> + let id = int64 (path.Substring(path.LastIndexOf('/') + 1)) + lock sync (fun () -> comments.Remove id |> ignore) + response "{}" + | method, path, _ -> Error(Errors.NotFound $"race fixture serves no %s{method} %s{path}") } + + let run edge : Errors.IoResult = + Writes.withBlockedByMutationLease transport (ref' 42) (fun () -> + lock sync (fun () -> + actionsInProgress <- actionsInProgress + 1 + maximumConcurrentActions <- max maximumConcurrentActions actionsInProgress) + Assert.True(bothElected.Wait(TimeSpan.FromSeconds 10.0), "both contenders did not complete election reads") + lock sync (fun () -> + let observed = edges + edges <- Set.add edge observed + actionsInProgress <- actionsInProgress - 1) + Ok()) + + let first = Threading.Tasks.Task.Run(fun () -> run "FS-GG/.github#290") + let second = Threading.Tasks.Task.Run(fun () -> run "FS-GG/.github#299") + Threading.Tasks.Task.WaitAll [| first :> Threading.Tasks.Task; second :> Threading.Tasks.Task |] + + let firstResults = [ first.Result; second.Result ] + let firstErrors = + firstResults + |> List.choose (function | Error error -> Some(Errors.explain error) | Ok() -> None) + |> String.concat " | " + Assert.True(firstResults |> List.filter Result.isOk |> List.length = 1, firstErrors) + Assert.Equal(1, firstResults |> List.filter Result.isError |> List.length) + Assert.Equal(1, lock sync (fun () -> edges.Count)) + Assert.Equal(1, maximumConcurrentActions) + + let losingEdge = + if first.Result.IsError then "FS-GG/.github#290" else "FS-GG/.github#299" + + Assert.True((run losingEdge).IsOk) + Assert.Equal(Set.ofList [ "FS-GG/.github#290"; "FS-GG/.github#299" ], lock sync (fun () -> edges)) + Assert.Equal(1, maximumConcurrentActions) + [] let ``#2907 set mutation fixture clears every identity session source before using explicit worker`` () = let sessionVariables = diff --git a/tests/coord-engine-parity/blockedby_server.py b/tests/coord-engine-parity/blockedby_server.py index 8e52cc406..ff74fd1f0 100644 --- a/tests/coord-engine-parity/blockedby_server.py +++ b/tests/coord-engine-parity/blockedby_server.py @@ -29,6 +29,7 @@ import re import sys import threading +from datetime import datetime, timezone from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer RATE = {"cost": 1, "remaining": 4960} @@ -47,6 +48,8 @@ LOCK = threading.Lock() GQL_COUNT = 0 # every POST to /graphql — the `gcount` the corpus reads, one transport over. WRITES = [] # every field mutation, in order: {field, op: set|clear, text} +COMMENTS = [] # ephemeral REST-backed Blocked-by mutation leases +NEXT_COMMENT_ID = 1000 def _is_field_mutation(doc): @@ -108,6 +111,24 @@ def do_POST(self): q = body.get("query", "") a = graphql(q, body.get("variables", {}) or {}) return self._send(200, a if a is not None else {"errors": [{"message": f"unhandled {q[:60]}"}]}) + if re.match(r"^/repos/[^/]+/[^/]+/issues/(\d+)/comments$", p): + global NEXT_COMMENT_ID + try: + body = json.loads(raw).get("body") + except json.JSONDecodeError: + body = None + if not isinstance(body, str): + return self._send(422, {"message": "body required"}) + with LOCK: + comment = { + "id": NEXT_COMMENT_ID, + "body": body, + "updated_at": datetime.now(timezone.utc).isoformat(), + "html_url": f"https://fixture/comments/{NEXT_COMMENT_ID}", + } + NEXT_COMMENT_ID += 1 + COMMENTS.append(comment) + return self._send(201, comment) self._send(500, {"message": f"unhandled POST {p}"}) def do_GET(self): @@ -120,6 +141,9 @@ def do_GET(self): if p.rstrip("/") == "/_writes": with LOCK: return self._send(200, {"writes": WRITES, "last": WRITES[-1] if WRITES else None}) + if re.match(r"^/repos/[^/]+/[^/]+/issues/(\d+)/comments$", p): + with LOCK: + return self._send(200, list(COMMENTS)) m = re.match(r"^/repos/[^/]+/[^/]+/issues/(\d+)$", p) if m: n = int(m.group(1)) @@ -128,6 +152,17 @@ def do_GET(self): return self._send(200, {"resources": {"graphql": {"remaining": 4960, "limit": 5000}}}) self._send(500, {"message": f"unhandled GET {p}"}) + def do_DELETE(self): + p = self.path.split("?", 1)[0] + match = re.match(r"^/repos/[^/]+/[^/]+/issues/comments/(\d+)$", p) + if match: + comment_id = int(match.group(1)) + with LOCK: + before = len(COMMENTS) + COMMENTS[:] = [comment for comment in COMMENTS if comment["id"] != comment_id] + return self._send(204, {}) if len(COMMENTS) < before else self._send(404, {"message": "Not Found"}) + self._send(500, {"message": f"unhandled DELETE {p}"}) + def main(): s = ThreadingHTTPServer(("127.0.0.1", 0), H) diff --git a/work/2907-blocked-by-set-mutations/evidence.yml b/work/2907-blocked-by-set-mutations/evidence.yml index 564447b28..c5204394d 100644 --- a/work/2907-blocked-by-set-mutations/evidence.yml +++ b/work/2907-blocked-by-set-mutations/evidence.yml @@ -54,10 +54,10 @@ evidence: synthetic: false observedRun: source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx - digest: "sha256:44901bd84eb72f1e414ec4ee66f4859548826edb4ce3c8b948e01ff5f3744b4f" + digest: "sha256:52d675d5191ed3ecc2eca8f68c16ac5cdecf53b48fe4be444878366dc7a49c1c" digestContract: exact-bytes-v1 outcome: passed - passed: 255 + passed: 257 failed: 0 skipped: 0 notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] @@ -81,10 +81,10 @@ evidence: synthetic: false observedRun: source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx - digest: "sha256:44901bd84eb72f1e414ec4ee66f4859548826edb4ce3c8b948e01ff5f3744b4f" + digest: "sha256:52d675d5191ed3ecc2eca8f68c16ac5cdecf53b48fe4be444878366dc7a49c1c" digestContract: exact-bytes-v1 outcome: passed - passed: 255 + passed: 257 failed: 0 skipped: 0 notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] @@ -108,10 +108,10 @@ evidence: synthetic: false observedRun: source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx - digest: "sha256:44901bd84eb72f1e414ec4ee66f4859548826edb4ce3c8b948e01ff5f3744b4f" + digest: "sha256:52d675d5191ed3ecc2eca8f68c16ac5cdecf53b48fe4be444878366dc7a49c1c" digestContract: exact-bytes-v1 outcome: passed - passed: 255 + passed: 257 failed: 0 skipped: 0 notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] @@ -135,10 +135,10 @@ evidence: synthetic: false observedRun: source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx - digest: "sha256:44901bd84eb72f1e414ec4ee66f4859548826edb4ce3c8b948e01ff5f3744b4f" + digest: "sha256:52d675d5191ed3ecc2eca8f68c16ac5cdecf53b48fe4be444878366dc7a49c1c" digestContract: exact-bytes-v1 outcome: passed - passed: 255 + passed: 257 failed: 0 skipped: 0 notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] @@ -162,10 +162,10 @@ evidence: synthetic: false observedRun: source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx - digest: "sha256:44901bd84eb72f1e414ec4ee66f4859548826edb4ce3c8b948e01ff5f3744b4f" + digest: "sha256:52d675d5191ed3ecc2eca8f68c16ac5cdecf53b48fe4be444878366dc7a49c1c" digestContract: exact-bytes-v1 outcome: passed - passed: 255 + passed: 257 failed: 0 skipped: 0 notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] @@ -189,10 +189,10 @@ evidence: synthetic: false observedRun: source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx - digest: "sha256:44901bd84eb72f1e414ec4ee66f4859548826edb4ce3c8b948e01ff5f3744b4f" + digest: "sha256:52d675d5191ed3ecc2eca8f68c16ac5cdecf53b48fe4be444878366dc7a49c1c" digestContract: exact-bytes-v1 outcome: passed - passed: 255 + passed: 257 failed: 0 skipped: 0 notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] @@ -216,10 +216,10 @@ evidence: synthetic: false observedRun: source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx - digest: "sha256:44901bd84eb72f1e414ec4ee66f4859548826edb4ce3c8b948e01ff5f3744b4f" + digest: "sha256:52d675d5191ed3ecc2eca8f68c16ac5cdecf53b48fe4be444878366dc7a49c1c" digestContract: exact-bytes-v1 outcome: passed - passed: 255 + passed: 257 failed: 0 skipped: 0 notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] @@ -243,10 +243,10 @@ evidence: synthetic: false observedRun: source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx - digest: "sha256:44901bd84eb72f1e414ec4ee66f4859548826edb4ce3c8b948e01ff5f3744b4f" + digest: "sha256:52d675d5191ed3ecc2eca8f68c16ac5cdecf53b48fe4be444878366dc7a49c1c" digestContract: exact-bytes-v1 outcome: passed - passed: 255 + passed: 257 failed: 0 skipped: 0 notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] @@ -270,10 +270,10 @@ evidence: synthetic: false observedRun: source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx - digest: "sha256:44901bd84eb72f1e414ec4ee66f4859548826edb4ce3c8b948e01ff5f3744b4f" + digest: "sha256:52d675d5191ed3ecc2eca8f68c16ac5cdecf53b48fe4be444878366dc7a49c1c" digestContract: exact-bytes-v1 outcome: passed - passed: 255 + passed: 257 failed: 0 skipped: 0 notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] @@ -297,10 +297,10 @@ evidence: synthetic: false observedRun: source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx - digest: "sha256:44901bd84eb72f1e414ec4ee66f4859548826edb4ce3c8b948e01ff5f3744b4f" + digest: "sha256:52d675d5191ed3ecc2eca8f68c16ac5cdecf53b48fe4be444878366dc7a49c1c" digestContract: exact-bytes-v1 outcome: passed - passed: 255 + passed: 257 failed: 0 skipped: 0 notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] @@ -324,10 +324,10 @@ evidence: synthetic: false observedRun: source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx - digest: "sha256:44901bd84eb72f1e414ec4ee66f4859548826edb4ce3c8b948e01ff5f3744b4f" + digest: "sha256:52d675d5191ed3ecc2eca8f68c16ac5cdecf53b48fe4be444878366dc7a49c1c" digestContract: exact-bytes-v1 outcome: passed - passed: 255 + passed: 257 failed: 0 skipped: 0 notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] @@ -351,10 +351,10 @@ evidence: synthetic: false observedRun: source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx - digest: "sha256:44901bd84eb72f1e414ec4ee66f4859548826edb4ce3c8b948e01ff5f3744b4f" + digest: "sha256:52d675d5191ed3ecc2eca8f68c16ac5cdecf53b48fe4be444878366dc7a49c1c" digestContract: exact-bytes-v1 outcome: passed - passed: 255 + passed: 257 failed: 0 skipped: 0 notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] @@ -378,10 +378,10 @@ evidence: synthetic: false observedRun: source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx - digest: "sha256:44901bd84eb72f1e414ec4ee66f4859548826edb4ce3c8b948e01ff5f3744b4f" + digest: "sha256:52d675d5191ed3ecc2eca8f68c16ac5cdecf53b48fe4be444878366dc7a49c1c" digestContract: exact-bytes-v1 outcome: passed - passed: 255 + passed: 257 failed: 0 skipped: 0 notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] @@ -405,10 +405,10 @@ evidence: synthetic: false observedRun: source: readiness/2907-blocked-by-set-mutations/test-results/boardops.trx - digest: "sha256:44901bd84eb72f1e414ec4ee66f4859548826edb4ce3c8b948e01ff5f3744b4f" + digest: "sha256:52d675d5191ed3ecc2eca8f68c16ac5cdecf53b48fe4be444878366dc7a49c1c" digestContract: exact-bytes-v1 outcome: passed - passed: 255 + passed: 257 failed: 0 skipped: 0 notes: [The observed BoardOps receipt covers parser, "and inert-body lint controls; verification-evidence.md records four independently observed red inversions and the complete affected-project gate set.", set-mutation, stale-write] diff --git a/work/2907-blocked-by-set-mutations/verification/verification-evidence.md b/work/2907-blocked-by-set-mutations/verification/verification-evidence.md index c53fea905..b59b7b7dd 100644 --- a/work/2907-blocked-by-set-mutations/verification/verification-evidence.md +++ b/work/2907-blocked-by-set-mutations/verification/verification-evidence.md @@ -2,11 +2,11 @@ ## Positive controls -- `dotnet test tests/FS.GG.Coord.Cli.BoardOps.Tests/FS.GG.Coord.Cli.BoardOps.Tests.fsproj --no-restore`: 255 passed, 0 failed, 0 skipped. +- `dotnet test tests/FS.GG.Coord.Cli.BoardOps.Tests/FS.GG.Coord.Cli.BoardOps.Tests.fsproj --no-restore`: 257 passed, 0 failed, 0 skipped. - `dotnet test tests/FS.GG.Coord.GitHub.Tests/FS.GG.Coord.GitHub.Tests.fsproj --no-restore`: 671 passed, 0 failed, 0 skipped. - `dotnet test tests/FS.GG.Coord.Cli.Kernel.Tests/FS.GG.Coord.Cli.Kernel.Tests.fsproj --no-restore`: 182 passed, 0 failed, 0 skipped. - The Lifecycle, CLI, and Core test project commands each exited zero. -- The durable TRX at `readiness/2907-blocked-by-set-mutations/test-results/boardops.trx` records all 255 BoardOps tests passing. +- The durable TRX at `readiness/2907-blocked-by-set-mutations/test-results/boardops.trx` records all 257 BoardOps tests passing. - `tests/coord-engine-parity/run.sh` passed the explicit replace/clear, ref-first, zero-GraphQL refusal, canonicalization, de-duplication, and scoped-field controls after its legacy positional calls were migrated. - After the initial critic identified a missing hosted body for open/In-progress item #423, the repaired serialized parity run passed 616/616 assertions with zero failures and zero not-measured results. Its @@ -17,6 +17,14 @@ `Identity.resolve`, uses an explicit `--worker`, and exercises each poisoned source independently. `python3 scripts/check-harness-identity.py --root .` passed its 111-shell/104-F# census, the focused BlockerLint selection passed 36/36, and `tests/harness-identity/run.sh` passed 14/14 mutation controls. +- The round-3 repair serializes the complete Blocked-by observation/derive/guarded-write transaction + behind GitHub's issue-comment ticket order. A two-task control forces both contenders through their + empty pre-censuses, posts both tickets, and holds the winner until both election reads complete. One + first attempt executes, the loser executes no action, and retry leaves both requested edges present; + maximum concurrent actions remains one. The focused `#2907` selection passed 11/11. +- A clean serialized parity run passed 616/616 with zero not-measured, and the production write harness + passed 180/186. Its six failures are the pre-existing #2133 validator-version mismatch: installed + `fsgg-sdd` reports 1.1.0 while those controls accept only 1.0.0; all other write assertions passed. - `scripts/generate-projections --check` reported every projection current; the signature-doc mutation sweep killed 435/435 mutants. - The Release engine build and the 12-entry deterministic package check exited zero. @@ -28,8 +36,11 @@ Each bounded mutation was applied alone, the focused test was observed red, and 2. Remove-set derivation was forced to clear. The remove-preservation control failed: expected `#299`, actual ``. 3. The guarded-write revision/value match was forced false. The stale-observation control failed because the command returned zero and the transport recorded a mutation. 4. The inert-body verdict was suppressed with `Ok None`. The lint theory failed because the divergent body case expected a finding and observed none. +5. The production mutation-lease election was reversed from lowest to highest comment id. The lower-id + contender control failed because the command returned zero instead of fencing our higher-id writer. -These inversions discriminate union, subtraction, stale-write refusal, and body-projection linting independently. +These inversions discriminate union, subtraction, stale-write refusal, body-projection linting, and +server-ordered mutation fencing independently. ## Runtime controls From ded5b50850568537153813fac65c175535ddd3d4 Mon Sep 17 00:00:00 2001 From: EHotwagner Date: Tue, 25 Aug 2026 08:13:18 +0200 Subject: [PATCH 5/5] Refresh #2907 SDD recovery evidence --- .../analysis.json | 14 +++++- .../governance-handoff.json | 8 ++-- .../ship-verdict.json | 4 +- .../2907-blocked-by-set-mutations/ship.json | 8 ++-- .../2907-blocked-by-set-mutations/verify.json | 43 ++++++++++++++++--- .../work-model.json | 4 +- .../verification/verification-evidence.md | 6 +++ 7 files changed, 68 insertions(+), 19 deletions(-) diff --git a/readiness/2907-blocked-by-set-mutations/analysis.json b/readiness/2907-blocked-by-set-mutations/analysis.json index 12d61c3f0..3a599cdeb 100644 --- a/readiness/2907-blocked-by-set-mutations/analysis.json +++ b/readiness/2907-blocked-by-set-mutations/analysis.json @@ -4,7 +4,7 @@ "workId": "2907-blocked-by-set-mutations", "stage": "analyze", "status": "implementationReady", - "generator": "FS.GG.SDD.Artifacts/1.1.0", + "generator": "FS.GG.SDD.Artifacts/1.2.5", "sources": [ { "path": ".fsgg/agents.yml", @@ -36,6 +36,16 @@ "schemaVersion": 1, "schemaStatus": "current" }, + { + "path": "readiness/2907-blocked-by-set-mutations/work-model.json", + "kind": "workModel", + "digest": { + "algorithm": "sha256", + "value": "db56994d8c948ccf24af6a447846e8059252e8a02782bd3d3fa4b669d676d176" + }, + "schemaVersion": 1, + "schemaStatus": "current" + }, { "path": "work/2907-blocked-by-set-mutations/checklist.md", "kind": "checklist", @@ -546,7 +556,7 @@ { "path": "readiness/2907-blocked-by-set-mutations/work-model.json", "kind": "workModel", - "currency": "missing", + "currency": "current", "diagnosticIds": [] } ], diff --git a/readiness/2907-blocked-by-set-mutations/governance-handoff.json b/readiness/2907-blocked-by-set-mutations/governance-handoff.json index daad1268c..8082f117e 100644 --- a/readiness/2907-blocked-by-set-mutations/governance-handoff.json +++ b/readiness/2907-blocked-by-set-mutations/governance-handoff.json @@ -1,22 +1,22 @@ { "schemaVersion": 1, "contractVersion": "2.0.0", - "generatorVersion": "FS.GG.SDD.Artifacts/1.1.0", + "generatorVersion": "FS.GG.SDD.Artifacts/1.2.5", "workId": "2907-blocked-by-set-mutations", "sources": [ { "path": "readiness/2907-blocked-by-set-mutations/ship.json", - "digest": "sha256:f76c8a5dfef234d49633c517b7f06dabd54cb054623742f844bf7abf7895e951", + "digest": "sha256:15ccda01a5e111e480f6f043942874794f5c2d481f8e8b197862f2c0c23fac98", "schemaVersion": 1 }, { "path": "readiness/2907-blocked-by-set-mutations/verify.json", - "digest": "sha256:c6bbc59e78ab9bc3541b1eed807da98abb2eddb30cbd33c364b35c1c824ed02a", + "digest": "sha256:3c01ddc13ad6bff9bbecf40db062b2122ca967a695b8496fffe3f706fc4ac886", "schemaVersion": 1 }, { "path": "readiness/2907-blocked-by-set-mutations/work-model.json", - "digest": "sha256:66f3025a15363dcf82dfc6a29bc360689c5f6c8123fbf5eeb31ecfbe94001550", + "digest": "sha256:db56994d8c948ccf24af6a447846e8059252e8a02782bd3d3fa4b669d676d176", "schemaVersion": 1 } ], diff --git a/readiness/2907-blocked-by-set-mutations/ship-verdict.json b/readiness/2907-blocked-by-set-mutations/ship-verdict.json index 9b22a98bc..c81449636 100644 --- a/readiness/2907-blocked-by-set-mutations/ship-verdict.json +++ b/readiness/2907-blocked-by-set-mutations/ship-verdict.json @@ -4,10 +4,10 @@ "workId": "2907-blocked-by-set-mutations", "stage": "ship", "status": "shipReady", - "generator": "FS.GG.SDD.Artifacts/1.1.0", + "generator": "FS.GG.SDD.Artifacts/1.2.5", "sourcesDigest": { "algorithm": "sha256", - "value": "02e7c62e11699ec08c9e8a8ea29d2aff2470e7c7ee51071a590b1fcfecd494d0" + "value": "00f1473b9a7b16b75f2b89e5acb81a50061e65d74344e37497e3416a8adabe1c" }, "verificationReadiness": { "status": "verificationReady", diff --git a/readiness/2907-blocked-by-set-mutations/ship.json b/readiness/2907-blocked-by-set-mutations/ship.json index 0981db56a..583ed827c 100644 --- a/readiness/2907-blocked-by-set-mutations/ship.json +++ b/readiness/2907-blocked-by-set-mutations/ship.json @@ -4,7 +4,7 @@ "workId": "2907-blocked-by-set-mutations", "stage": "ship", "status": "shipReady", - "generator": "FS.GG.SDD.Artifacts/1.1.0", + "generator": "FS.GG.SDD.Artifacts/1.2.5", "sources": [ { "path": ".fsgg/agents.yml", @@ -41,7 +41,7 @@ "kind": "analysis", "digest": { "algorithm": "sha256", - "value": "3ae6df877929bd095ea483ed27cced27a3a43bcfe0acd2c4ada8c1b5411888ad" + "value": "38a2c866a5b712987a139f889e06969751a270028812b7fa4e61bf9b6a9c805e" }, "schemaVersion": 1, "schemaStatus": "current" @@ -51,7 +51,7 @@ "kind": "source", "digest": { "algorithm": "sha256", - "value": "c6bbc59e78ab9bc3541b1eed807da98abb2eddb30cbd33c364b35c1c824ed02a" + "value": "3c01ddc13ad6bff9bbecf40db062b2122ca967a695b8496fffe3f706fc4ac886" }, "schemaVersion": 1, "schemaStatus": "current" @@ -61,7 +61,7 @@ "kind": "workModel", "digest": { "algorithm": "sha256", - "value": "66f3025a15363dcf82dfc6a29bc360689c5f6c8123fbf5eeb31ecfbe94001550" + "value": "db56994d8c948ccf24af6a447846e8059252e8a02782bd3d3fa4b669d676d176" }, "schemaVersion": 1, "schemaStatus": "current" diff --git a/readiness/2907-blocked-by-set-mutations/verify.json b/readiness/2907-blocked-by-set-mutations/verify.json index ecfacf741..4fccc6604 100644 --- a/readiness/2907-blocked-by-set-mutations/verify.json +++ b/readiness/2907-blocked-by-set-mutations/verify.json @@ -4,7 +4,7 @@ "workId": "2907-blocked-by-set-mutations", "stage": "verify", "status": "verificationReady", - "generator": "FS.GG.SDD.Artifacts/1.1.0", + "generator": "FS.GG.SDD.Artifacts/1.2.5", "sources": [ { "path": ".fsgg/agents.yml", @@ -41,7 +41,7 @@ "kind": "analysis", "digest": { "algorithm": "sha256", - "value": "3ae6df877929bd095ea483ed27cced27a3a43bcfe0acd2c4ada8c1b5411888ad" + "value": "38a2c866a5b712987a139f889e06969751a270028812b7fa4e61bf9b6a9c805e" }, "schemaVersion": 1, "schemaStatus": "current" @@ -51,7 +51,7 @@ "kind": "workModel", "digest": { "algorithm": "sha256", - "value": "66f3025a15363dcf82dfc6a29bc360689c5f6c8123fbf5eeb31ecfbe94001550" + "value": "db56994d8c948ccf24af6a447846e8059252e8a02782bd3d3fa4b669d676d176" }, "schemaVersion": 1, "schemaStatus": "current" @@ -831,7 +831,24 @@ "diagnosticIds": [] } ], - "findings": [], + "findings": [ + { + "id": "VF001", + "severity": "warning", + "category": "warning", + "path": "work/2907-blocked-by-set-mutations/evidence.yml", + "relatedIds": [ + "analysis", + "checklist", + "clarifications", + "plan", + "spec", + "tasks" + ], + "message": "One or more evidence source snapshots no longer match current source digests.", + "correction": "Rerun the evidence command after reviewing the changed source artifacts." + } + ], "governanceCompatibility": [ { "path": ".fsgg/policy.yml", @@ -855,7 +872,23 @@ "diagnosticIds": [] } ], - "diagnostics": [], + "diagnostics": [ + { + "id": "evidence.staleEvidenceSource", + "severity": "warning", + "artifact": "work/2907-blocked-by-set-mutations/evidence.yml", + "message": "One or more evidence source snapshots no longer match current source digests.", + "correction": "Rerun the evidence command after reviewing the changed source artifacts.", + "relatedIds": [ + "analysis", + "checklist", + "clarifications", + "plan", + "spec", + "tasks" + ] + } + ], "readiness": "verificationReady", "nextAction": { "actionId": "verify.next.ship", diff --git a/readiness/2907-blocked-by-set-mutations/work-model.json b/readiness/2907-blocked-by-set-mutations/work-model.json index 5073cb98e..77ad75073 100644 --- a/readiness/2907-blocked-by-set-mutations/work-model.json +++ b/readiness/2907-blocked-by-set-mutations/work-model.json @@ -1164,7 +1164,7 @@ "schemaVersion": 1, "generator": { "id": "FS.GG.SDD.Artifacts", - "version": "1.1.0" + "version": "1.2.5" }, "sources": [ { @@ -1242,7 +1242,7 @@ ], "outputDigest": { "algorithm": "sha256", - "value": "2da86bdcdc9cdd64360602ff4fa428345c9f62462e001182ace50289943c640d" + "value": "041086d508d87646cfdf5f884ca356216b1262d60ceb06999d65b2fbc6c06586" }, "currency": "current" } diff --git a/work/2907-blocked-by-set-mutations/verification/verification-evidence.md b/work/2907-blocked-by-set-mutations/verification/verification-evidence.md index b59b7b7dd..e3935adb1 100644 --- a/work/2907-blocked-by-set-mutations/verification/verification-evidence.md +++ b/work/2907-blocked-by-set-mutations/verification/verification-evidence.md @@ -27,6 +27,12 @@ `fsgg-sdd` reports 1.1.0 while those controls accept only 1.0.0; all other write assertions passed. - `scripts/generate-projections --check` reported every projection current; the signature-doc mutation sweep killed 435/435 mutants. - The Release engine build and the 12-entry deterministic package check exited zero. +- Recovery validation after rebasing onto `origin/main` at `712f0257c15b8027432bbf7d4c1ea3df9b643105` + rebuilt the Release CLI with zero warnings/errors, passed BoardOps 257/257 and GitHub 671/671, + and confirmed `scripts/generate-projections --check` current. Regenerating the lifecycle views with + `fsgg-sdd` 1.2.5 required a second `analyze` pass after the first refreshed `work-model.json`; the + second pass returned `implementationReady`, `verify` returned `verificationReady` with all 14 + obligations backed by observed evidence, and `ship` returned `shipReady`. ## Gate inversions