Skip to content

Commit fcd0f47

Browse files
Sync Boatstack from Intelligence Flow Labs @ f42f1a845ecc (#155)
Co-authored-by: operator-stack-publisher[bot] <operator-stack-publisher[bot]@users.noreply.github.com>
1 parent 30dc223 commit fcd0f47

13 files changed

Lines changed: 292 additions & 32 deletions

CONTRIBUTING.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
# Contributing
44

5-
Boatstack is a generated content distribution. Propose changes to workflow semantics, templates, evidence rules, or generated presentation in [Intelligence Flow](https://github.com/operatorstack/intelligence-flow/tree/d604f832578355bd5bc34eb66e8d54b062645629/labs/12-product-engineering-loop).
5+
Boatstack is a generated content distribution. Propose changes to workflow semantics, templates, evidence rules, or generated presentation in [Intelligence Flow](https://github.com/operatorstack/intelligence-flow/tree/f42f1a845ecc6e5905d6e38dca863749cc19f0c0/labs/12-product-engineering-loop).
66

77
The Boatstack repository receives product/runtime changes through a generated pull request. Review the PR's `UPSTREAM.json`, tests, adapter diff, and context-size change; do not hand-edit generated output on `main`. `.github/workflows` is the exception: it is Boatstack's executable control plane, excluded from scheduled projection and changed only through a separate manually reviewed Boatstack PR.
88

UPSTREAM.json

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
},
1313
"files": {
1414
".gitignore": "a7079e923a776f14f1bb3a6aa0a11a133a8e1dfb35af020f327623357b7e3957",
15-
"CONTRIBUTING.md": "5060717c0e6f5337197d3c2b1acb6a047264ffab0ed6cf8af411ee498cd57051",
15+
"CONTRIBUTING.md": "970762fd2bd13341d06dcef8929099dc3b71b246f3bc52e1e53e9df6957c5c68",
1616
"README.md": "3ce3e95e511089b44e946a44b8d5f4f81d019ece5336db65b2cab1f9dc4d4dad",
1717
"assets/boatstack-journey.svg": "e465befc50c8ce30f3e07e8fd97012931beeb053392c8fbf38ad645023b3cc63",
1818
"assets/boatstack-mark.svg": "be1f984da1bfa69fa5d1f986d8343d21f7e20921b71db888c928b4d2e54b09b5",
@@ -36,7 +36,7 @@
3636
"boatstack/atomic_unix.go": "89f2723361591de2bb8bd22ce7e34ec529d3278509f0df78fd5c4a7d4140fbe9",
3737
"boatstack/atomic_windows.go": "cefd775cbe7e7c3bd8a3f5673b11cdd784c6d3ebd6de7dcb8f39406b0bee511f",
3838
"boatstack/attach.go": "6a855440fac9acc63be857efef9d76210a4619774728684832dfbb08caf42a30",
39-
"boatstack/capability.go": "9d9a75086e88bb1d9d4170821436c686002fe3a125e6ee7d23eea5779aac5cfe",
39+
"boatstack/capability.go": "fc6bccb0ce4df579b81252ecffeb23c68d62f02ff041bfec980d844baf0885a3",
4040
"boatstack/capability_test.go": "e8322903a843970d7f0317d2629466532cb05c3ffcb44b9423adf4219faa8021",
4141
"boatstack/capture.go": "0e137d8251a658118bd56812040575d01f02fd2f862c80ef761b253db6b35bbe",
4242
"boatstack/capture_test.go": "31a8afa40a54ae716fea1ea44be3b41705ed171789a181d1ef26432855c05c9e",
@@ -64,17 +64,17 @@
6464
"boatstack/delivery_terminal_conformance_test.go": "50b88bdfb9bdfc9dc50c11f46276e1eb13eed61618e75b4c951dfa2ac6075df0",
6565
"boatstack/delivery_test.go": "45c48ff7581c911bcaf821c3e4241d4ae2a9bb4aa682485cc58b6ad8fe1c85bf",
6666
"boatstack/deliverycontrol_parity_test.go": "706be08bdc89192cf200f0b2cf889c8f4bb0e666a5d8a557996d7215101ce2ca",
67-
"boatstack/denial.go": "ce77240edafb2589565ff3821b4e2cf8be3cf5884b1467d606265ca877188d3e",
67+
"boatstack/denial.go": "507593c091c7ee80a3a4f0299d247d616a85331bc1c0aaf2d69f8a2e7aaf6f1c",
6868
"boatstack/denial_escalation_conformance_test.go": "d50f0e1c803c8f5731a46dbe6f82c7935c0ccbd582f513cbe07211f5e902157e",
6969
"boatstack/denial_ledger.go": "a35bf8fd8c1f6b9302109cf0087e1b9158e43e07b92b18df5e589a637d58491d",
70-
"boatstack/denial_solutions.go": "5e5f110ee62bb08f65e8240b85d34a16cea5cb19c1993e4b39f2e83addfaf95d",
71-
"boatstack/denial_solutions_conformance_test.go": "1055048d1d7935dded699abdb7015b30a966e8e1ae54b1253c106dde54aff10e",
70+
"boatstack/denial_solutions.go": "ae6cb218c01a89c14367242b21e2b96d85e1fda357076b7bffedb56066ef961b",
71+
"boatstack/denial_solutions_conformance_test.go": "5371654664318b9fbef65a9999cedf04f893517107edd033c77511753830f9e2",
7272
"boatstack/denial_test.go": "9dc9f0f79328c4947073efaa785479b34e70eb214da57cd72348f39fd672e4fd",
7373
"boatstack/detached.go": "b0ea2a1f31bf2a2a83f6089a3065a9b47221194b64de48af9120046e6d70dee8",
7474
"boatstack/detached_test.go": "6cc70d15baa9a69afacf66ea29ce112efeb166836acb0a52bf9c4bb4c898cee5",
7575
"boatstack/docs/control-law-scoping.md": "0ae984821248eabda8c0eeaf201b367991e6742984e7c718df20ecc24caee475",
7676
"boatstack/evidence.go": "497a31e6ff632cb1d7c3adfc9f269af3f6aa84e948dd5d417c162767542a27df",
77-
"boatstack/export.go": "d12002b03cc73fa7a7390ec091f636874d81acbb8202bf668cb8abd82c9f2742",
77+
"boatstack/export.go": "62c421867f2dde0e7d78116e3eee28054d824e70699c981cacb8415adb08d74b",
7878
"boatstack/export_test.go": "dce5aa3ab5499c82d05859cf86b46dfcee308482491366d83e10ca3fb8605bb6",
7979
"boatstack/flow_coding.go": "9fa53a0204f98a25f97775c3acf37392a591c14ce850b44aa587b5806e770bb9",
8080
"boatstack/flow_coding_test.go": "dddcd7a85892d4fa10af42739d4c1ff265721b0313e27b6e7a1bbb019d5c3b51",
@@ -165,10 +165,10 @@
165165
"boatstack/planning_first_write_conformance_test.go": "873097aa9384b75bf01e74a475f3ec2ac7cca4a28f733e82f2c82959032c6a30",
166166
"boatstack/planning_test.go": "06ec7022222d926040c3ae28b84ab50c3d2f804ae6473e61b303804dd992d884",
167167
"boatstack/post_publish_prescribe_conformance_test.go": "3c20d359ff84648db7dedb227b4d64e6574d9f41d3cdca0adefec1c60bfbf4ae",
168-
"boatstack/pr.go": "511ae0025aae3d99a5fbb942bb078d68a04feb62190387b331d562f934902c41",
168+
"boatstack/pr.go": "3c7088e47c997a0b6c25e40dad56a1662be0451c025f39460b4b62961cb2a634",
169169
"boatstack/pr_phase.go": "59f8cbb75b6b538a5345474acd6a725450979579bf8ecf9591956cbbe1cc4737",
170170
"boatstack/pr_phase_conformance_test.go": "bc9c834e9c4ed43b35d81abafd7b1bf2a264ea2a8c4a4ec9758ee18d1d438968",
171-
"boatstack/pr_test.go": "dd223d9ddc50af2f34b20fd30246b9aaef7e4d9fd479bcaa3e87bb4de58bd4b3",
171+
"boatstack/pr_test.go": "89f6f88b1e3eb51efbe6faaff8586bd930d4c868fae5eafd48e1746b919c27a7",
172172
"boatstack/provenance.go": "d44dcd5421306269326f1202ba1d52df8c252490550270ef9d022e8ec2b65210",
173173
"boatstack/provision.go": "eb7333a73331b011adc93f59a2d97415d850c2e588f0e2bbb5116984e2ef927d",
174174
"boatstack/provision_test.go": "214e9edb991a66d5bbb696a7c1b63876d2f799f2cab4e3f40785f4e8f1eac57b",
@@ -231,10 +231,10 @@
231231
"docs/benchmark-corpus-audit.md": "f2d206fe8579a514f9da82b2c96c19b343ac004be67617e1bd34f0f8e0e5e6c6",
232232
"docs/benchmark-submission-audit.md": "9518abdd17690729c6423f87cab20418ed47b0915b5faa44b9ef975e9e9c3b79",
233233
"docs/configuration.md": "caa95f1dd484a71a9051951652d6457294c213999fe00fb764d05e8a509cc786",
234-
"docs/evidence-engineered-coding.md": "bb8bd613b350be866929105ab96a3225f30f8e306b0b650a9b6655fb7c26af07",
234+
"docs/evidence-engineered-coding.md": "d6d7babc0c4e61030a1e76754dc45f2bc40cdb7df88a9cf312e24aa9c06ce7c7",
235235
"docs/generated-files.md": "437791765b0a4015032ae21d1a6618563cad92b7402819e4f963bf5ae16284a3",
236236
"docs/getting-started.md": "51c2823f21e35140d31e6d5083dc4b89fddd24721ac6acc474154a4da53ee9f8",
237-
"docs/public-claims.json": "ef823c6a3d27eee37856712bbb0bb4b9b0d266c97dcd2fd4568aa0c98416041a",
237+
"docs/public-claims.json": "962bde13802724ae3ad87955bec0e48e0d4274385703be509308c43a7e91674f",
238238
"docs/public-surface.md": "713f7a050b5f339cf948299103ef3800417dccfecf2cc1a4166397ea6f978907",
239239
"docs/research-and-design.md": "8d78678108f0a6c924e1ff9b32c0f81aae9d1f779e0082843b6f99ad993ae2b6",
240240
"docs/safety.md": "7b9b5c515d36e683767ec8d3d9d6d119ac93650b2f629d351deadd4c600ed6a6",
@@ -248,7 +248,7 @@
248248
"labs/diagram-json/compiled/evidence.md": "1ba1c989ade070a8ef9a508fbd788d100d7292f2dbacbb2bce895468019f619d",
249249
"labs/diagram-json/compiled/tasks.json": "88f60851abf79d851e9fccc754ff3040034ae595306bc87d64784c19eb403e71",
250250
"labs/diagram-json/compiled/test-matrix.json": "424657ff505768e50fa113801fd8363364a18269d5297480907a993d44063a39",
251-
"labs/diagram-json/plan.lock.json": "72e44c5239a3ec0bb1f609d25083d152d43b81d8206aeafdef7ce8db04a37512",
251+
"labs/diagram-json/plan.lock.json": "963e46963033dc5911e2cdd4a034f0aff909fb6c7e966a224d854b6fa9d7c447",
252252
"labs/diagram-json/plan.md": "3cc4f533b8d69386deff16b3a594a3ba09d4c0c3db636cccd8c4380084ce6a51",
253253
"labs/diagram-json/questions.md": "74733b015002c8a6777c558e7e997fa48c94850b9bd39054fe9366c97ecf728d",
254254
"labs/diagram-json/request.md": "0808fc41c36779c404f4a3a121167da6e76cac56df526e70f9ed6d3e0d4c02ed",
@@ -390,12 +390,13 @@
390390
"release-notes/2026-07-28-retro-derive-proposals.md": "c90797d76fb00816340475620b584ad150fa32d7d10bc14997a614529ef9b558",
391391
"release-notes/2026-07-28-retromine-recurrence-detector.md": "27790993a02e73f3a2700dce7340d044aeb0e52f785ded68271ff6673add9e25",
392392
"release-notes/2026-07-29-readiness-and-journey-control.md": "2411db76974990ad0128fcd90e795c4c1c5c70d6d6f15fccd452f7e1a242310b",
393+
"release-notes/2026-07-30-auto-capture-on-ship.md": "49aa077ac52005d380ba2cae9e406c7d0a9941157c40aa4ed44b9e59195b3837",
393394
"release-notes/2026-07-30-visual-evidence-survives-preview-commit.md": "71d19e9fabb40e8cb1e939f26bf288911d227979926f43f337046c6cf6b66551"
394395
},
395396
"generator": "operatorstack/intelligence-flow:boatstack-distribution",
396397
"schema_version": 1,
397398
"source": {
398-
"commit": "d604f832578355bd5bc34eb66e8d54b062645629",
399+
"commit": "f42f1a845ecc6e5905d6e38dca863749cc19f0c0",
399400
"path": "labs/12-product-engineering-loop",
400401
"repository": "operatorstack/intelligence-flow"
401402
}

boatstack/capability.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ var capabilityRegistry = map[string]Capability{
4141
"visual": {
4242
Name: "visual",
4343
CommandAliases: []string{"visual", "screenshot", "e2e"},
44-
AdmittedStages: []string{"BUILD", "TEST_PASSED"},
44+
AdmittedStages: []string{"BUILD", "TEST_PASSED", "REVIEW_PASSED", "PR_PREVIEW"},
4545
RetryClass: "IDEMPOTENT_EXTERNAL",
4646
},
4747
}

boatstack/denial.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,20 @@ func denialFor(host string, finding SafetyFinding) Denial {
534534
d.Reassurance = "No push or pull request was made."
535535
return d
536536

537+
case "workflow-visual-evidence-missing":
538+
target := "this delivery"
539+
if finding.BlockingFeature != "" {
540+
target = fmt.Sprintf("feature %q", finding.BlockingFeature)
541+
}
542+
d.Qualifier = "visual evidence is owed"
543+
d.Detail = "PR publication is blocked until required visual evidence is current for " + target + "."
544+
if reason := strings.TrimSpace(finding.Reason); reason != "" {
545+
d.Detail += " Automatic capture reported: " + reason + "."
546+
}
547+
d.Detail += " Boatstack captures the plan's approved scenarios itself once a repository command is registered; declare pr_visual_evidence not_relevant (with a reason) only for a genuinely nonvisual change."
548+
d.Reassurance = "No pull request was created or updated."
549+
return d
550+
537551
case "operation-in-flight":
538552
d.Severity = SeverityAdvisory
539553
d.Qualifier = "already supervised"

boatstack/denial_solutions.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,47 @@ func enumerateDenialSolutions(repo, host string, finding SafetyFinding) Solution
8181
appendObserveOption(&set, repo, "", "delivery.next")
8282
return set
8383

84+
case finding.Category == "workflow-visual-evidence-missing":
85+
// Every rung of the recovery ladder, in preference order: run the
86+
// registered harness, register or provision a harness, record
87+
// externally captured evidence, or amend the plan's relevance —
88+
// the only escape for a genuinely nonvisual change.
89+
captureArgs := repoFlagArgs(repo)
90+
captureOwed := []string{"--feature"}
91+
if feature := strings.TrimSpace(finding.BlockingFeature); feature != "" {
92+
captureArgs = append(captureArgs, "--feature", feature)
93+
captureOwed = nil
94+
}
95+
appendSolution(&set, PrescribedCommand{
96+
Verb: "capture-evidence", Args: captureArgs,
97+
RequiresHumanInput: captureOwed, AutoDerivable: len(captureOwed) == 0,
98+
Transition: denialMarker("capture-evidence"),
99+
})
100+
appendSolution(&set, PrescribedCommand{
101+
Verb: "capability-register", Args: append(repoFlagArgs(repo), "--capability", "visual"),
102+
RequiresHumanInput: []string{"--command"},
103+
Transition: denialMarker("capability-register"),
104+
})
105+
appendSolution(&set, PrescribedCommand{
106+
Verb: "provision-capability", Args: append(repoFlagArgs(repo), "--capability", "visual"),
107+
AutoDerivable: true,
108+
Transition: denialMarker("provision-capability"),
109+
})
110+
appendSolution(&set, PrescribedCommand{
111+
Verb: "record-pr-visual-evidence", Args: repoFlagArgs(repo),
112+
RequiresHumanInput: []string{"--manifest"},
113+
Transition: denialMarker("record-pr-visual-evidence"),
114+
})
115+
if feature := strings.TrimSpace(finding.BlockingFeature); feature != "" {
116+
// The artifact name and its Markdown (stdin) are authored content — owed.
117+
appendSolution(&set, PrescribedCommand{
118+
Verb: "planning-write", Args: append(repoFlagArgs(repo), "--feature", feature),
119+
RequiresHumanInput: []string{"--artifact"},
120+
Transition: denialMarker("planning-write"),
121+
})
122+
}
123+
return set
124+
84125
case strings.HasPrefix(finding.Category, "operation-"):
85126
// Observation-only by design: inspect the durable operation state before
86127
// any retry (the observed-effect discipline).

boatstack/denial_solutions_conformance_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ var denialCategoryInventory = []SafetyFinding{
2727
{Category: "workflow-phase-bypass", Source: "planning-state", WorkflowStage: "DRAFT_PLAN", NextOperation: "plan-gate", BlockingFeature: "demo"},
2828
{Category: "workflow-phase-bypass", Source: "planning-state", WorkflowStage: "NOT_STARTED", NextOperation: "planning-write", AttemptedPath: ".product-loop/features/demo/plan.md"},
2929
{Category: "workflow-publication-bypass", BlockingFeature: "demo", BlockingSlice: "s1", Source: "tool-input"},
30+
{Category: "workflow-visual-evidence-missing", BlockingFeature: "demo", Source: "publication"},
3031
{Category: "operation-in-flight", OperationID: "op_1", OperationState: "RUNNING", Source: "operation-state"},
3132
{Category: "operation-already-succeeded", OperationID: "op_2", OperationState: "SUCCEEDED", Source: "operation-state"},
3233
{Category: "operation-reconciliation-required", OperationID: "op_3", Source: "operation-state"},

0 commit comments

Comments
 (0)