Skip to content

Commit 4c61bcf

Browse files
Sync Boatstack from Intelligence Flow Labs @ e5dbf426e441
1 parent 8c69b06 commit 4c61bcf

17 files changed

Lines changed: 354 additions & 42 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/146f50c0f3309e592ed45374b8cddb3d8ed64d85/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/e5dbf426e4417f4f2f73c9f855d34808f7fa8f9a/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: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
},
1313
"files": {
1414
".gitignore": "a7079e923a776f14f1bb3a6aa0a11a133a8e1dfb35af020f327623357b7e3957",
15-
"CONTRIBUTING.md": "c3334d810923b2cf4a745dae0aecc859d5de7cdafc94c0d193fb7d7b08892c53",
15+
"CONTRIBUTING.md": "c6a8df3d94c8dd4228cbd6e1d85223ebd3f64613b31a534ee34f9d12c4ccee1f",
1616
"README.md": "3ce3e95e511089b44e946a44b8d5f4f81d019ece5336db65b2cab1f9dc4d4dad",
1717
"assets/boatstack-journey.svg": "e465befc50c8ce30f3e07e8fd97012931beeb053392c8fbf38ad645023b3cc63",
1818
"assets/boatstack-mark.svg": "be1f984da1bfa69fa5d1f986d8343d21f7e20921b71db888c928b4d2e54b09b5",
@@ -42,9 +42,9 @@
4242
"boatstack/capture_test.go": "7072d0c5f9ab0ea9ef493f9e6dcb01cf0de544514c8201e30b8e4e6a4065505a",
4343
"boatstack/changelog.go": "6b06be7cd9738de29ba6e87aa2569f3b027a2e618b04524f5abd7abaa17945bf",
4444
"boatstack/changelog_test.go": "ce792f23a7fe1e09fb3096cd1314130a6ab69321d4877b12a8e994027541baf7",
45-
"boatstack/cmd/boatstack-helper/coverage_conformance_test.go": "f5a931d2b5cdb0d32af85acbbd499fa0f509ed36d62e772e6b6072e348200aca",
45+
"boatstack/cmd/boatstack-helper/coverage_conformance_test.go": "5c10219591d5b9998361ed83eac88debb4d4c338c835c7502b709ed81cf151b6",
4646
"boatstack/cmd/boatstack-helper/flow.go": "0d41c7a86b49004e897f59551780220841d5941396202c81de97a4d52f593520",
47-
"boatstack/cmd/boatstack-helper/main.go": "e69f021955d13160e19c53e4fd2c11cde871821b2d25932ebbe299b778ed77b4",
47+
"boatstack/cmd/boatstack-helper/main.go": "903a233fdbe706e9281b9840abda458e78035b8379a99c9c97dd922832430a64",
4848
"boatstack/cmd/boatstack-helper/main_test.go": "b36c52d6d5c9dd2428730de10ff18194b7e32a98722e41341c301c6f7a04cad5",
4949
"boatstack/cmd/boatstack-helper/retro.go": "68b83e33ade5b5fec126c70ec798fdcbed22fda755dc1cad2758143fead8e187",
5050
"boatstack/command.go": "4726ac515dedab4947be7eb48f88c6cb8b53d674124504b69f03e6396b080ee8",
@@ -68,7 +68,7 @@
6868
"boatstack/denial_escalation_conformance_test.go": "d50f0e1c803c8f5731a46dbe6f82c7935c0ccbd582f513cbe07211f5e902157e",
6969
"boatstack/denial_ledger.go": "a35bf8fd8c1f6b9302109cf0087e1b9158e43e07b92b18df5e589a637d58491d",
7070
"boatstack/denial_solutions.go": "ae6cb218c01a89c14367242b21e2b96d85e1fda357076b7bffedb56066ef961b",
71-
"boatstack/denial_solutions_conformance_test.go": "5371654664318b9fbef65a9999cedf04f893517107edd033c77511753830f9e2",
71+
"boatstack/denial_solutions_conformance_test.go": "3adf1c4e5d4ef1a8775c99648a9597e01f5a2e3b4af73d3587b9d6764e18127b",
7272
"boatstack/denial_test.go": "9dc9f0f79328c4947073efaa785479b34e70eb214da57cd72348f39fd672e4fd",
7373
"boatstack/detached.go": "b0ea2a1f31bf2a2a83f6089a3065a9b47221194b64de48af9120046e6d70dee8",
7474
"boatstack/detached_test.go": "6cc70d15baa9a69afacf66ea29ce112efeb166836acb0a52bf9c4bb4c898cee5",
@@ -78,11 +78,11 @@
7878
"boatstack/export_test.go": "dce5aa3ab5499c82d05859cf86b46dfcee308482491366d83e10ca3fb8605bb6",
7979
"boatstack/flow_coding.go": "9fa53a0204f98a25f97775c3acf37392a591c14ce850b44aa587b5806e770bb9",
8080
"boatstack/flow_coding_test.go": "dddcd7a85892d4fa10af42739d4c1ff265721b0313e27b6e7a1bbb019d5c3b51",
81-
"boatstack/flow_control.go": "363a89b24171f023e71aaeac875765d7c98a050f56f4b86afa8a9d96ea31f983",
81+
"boatstack/flow_control.go": "c9845ef3d87f41257a444f033b93eed72a0f4766b8e539825626ef01ff3b7685",
8282
"boatstack/flow_control_test.go": "02d788c83be55ebd79ffc73875bfd019de45325151eb1f70f506980eb8e77f29",
8383
"boatstack/flow_drive.go": "90f57e178884aff017195a126954ac0aeb85f27707b9d42844323341dc1fefd9",
8484
"boatstack/flow_drive_conformance_test.go": "23edea926c271a1f5718fb9dae1da11e4bf03cceb1357290cd61cd8ffb73beda",
85-
"boatstack/flow_frontier.go": "57e860c1613f3d5cca2fde56fb6e7dad527a71ac148ee3617ceb4bccd9cf805a",
85+
"boatstack/flow_frontier.go": "c69a225abd32306ce3da94e7566cc99ef28b098230a9c965294d7bc5f0f7507c",
8686
"boatstack/flow_frontier_conformance_test.go": "771838f06d6157547c1277eca1f7c1df609bb9f3ae630b2fa509f641b49aba86",
8787
"boatstack/flow_guard.go": "dd18524d95f4a220cfd3d11b11003dacc52120785ee0ccdbeceb2307fab55872",
8888
"boatstack/flow_guard_test.go": "8ba75f11ddd080427c15bd7e25f7d03c1b746a2f587c212cea0e710337d1c0e1",
@@ -148,8 +148,8 @@
148148
"boatstack/mutation_test.go": "68d5049c7f96c1ac558e4c781151f67e8deee2f8d6b9bf293b90d44e769ef7c6",
149149
"boatstack/mutation_undo.go": "697d11b600a276ddbcabe6a9f8040d4f7283e017a0e8fd689ef53a274638946c",
150150
"boatstack/mutation_undo_test.go": "39540e717e3f2136bf975594043a3db9072b28ebe61c6cb0b982cea5e8b1e14e",
151-
"boatstack/next.go": "d66e9303c52cac43a1ecc928b64eeedb5a596de271f0f214084b92a270b53dcc",
152-
"boatstack/next_actor_conformance_test.go": "c881e26fc68a84b2a2e6648cc9a3921abcdce76229013bbe13ad69ed6c47a383",
151+
"boatstack/next.go": "6a8936df6ddf5444d5fe61d9af15cf52948b405689f833e659b5d8de92d4fd01",
152+
"boatstack/next_actor_conformance_test.go": "8759285ed6133c99a3282bc597ca3f774fc051f414fb55e6fc59bfa5a30e22c9",
153153
"boatstack/next_banner_test.go": "c431a6987ed1e479442fc9f5db4371632880b92aa790fa9dd0f5285293352c41",
154154
"boatstack/next_response.go": "11decf2e3b236cbaa183980946ec17ffbbbb1af9c08bd11a466a8487bf229d5f",
155155
"boatstack/next_response_conformance_test.go": "be4f3bc7507abfb0ae9f86310eb29e34b166dcc40b6fa103e05babb81f2bd928",
@@ -165,7 +165,7 @@
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": "c389bd5fddf788290069eb858e1062433d1ff4dff928855a5211ac470c67ccd7",
168+
"boatstack/pr.go": "57a9f63fc622dc76bd2382cf2ccb9099b447d37eafadc457e3743217eba7a714",
169169
"boatstack/pr_phase.go": "59f8cbb75b6b538a5345474acd6a725450979579bf8ecf9591956cbbe1cc4737",
170170
"boatstack/pr_phase_conformance_test.go": "bc9c834e9c4ed43b35d81abafd7b1bf2a264ea2a8c4a4ec9758ee18d1d438968",
171171
"boatstack/pr_test.go": "5c0ff03eb21e383026a4e9fbc5671b2e316040e4e4c55ab6583b930e7e117dda",
@@ -207,7 +207,7 @@
207207
"boatstack/skill_frontmatter.go": "73364df463ce828c2d005aab55f72bb92f7a34d99cf3f53d4e0cd5a4da9dbd0e",
208208
"boatstack/skill_frontmatter_test.go": "a3ec52e7df357a72265c95dd66db15d9c0effc7e5f90f14ce69c27792ce394eb",
209209
"boatstack/solution_closure_conformance_test.go": "f73e6748dac373e2a10bc9269c2f2e060bd220bb4113bd0d5ff66ca4c8e91a54",
210-
"boatstack/statemap.go": "27aabde21c5dbfa9526f1533578c1e512ddd3174606457b67da344c8a6c36733",
210+
"boatstack/statemap.go": "0c36ea26e5858a90bd81330a352c08b917c04e385151f4ae62cd0ec4ee2af8a6",
211211
"boatstack/statemap_conformance_test.go": "e418f88bd91ab466bc64d0965ff5c404d7810479de509b01ec345826dfef978a",
212212
"boatstack/supervisory_control_test.go": "c7ea4bcd678e8ec211dac772c834981c4e21762914be2770a5e181bc24605e06",
213213
"boatstack/testdata/reviewer-pr-body.md": "4c64e3788e5d61a377aeb0f797f7fc8d2316ab6e49572d15636eea7ba9e34ac4",
@@ -217,8 +217,9 @@
217217
"boatstack/update_publication.go": "5c1ac8445345c6546d165b9321a736453b313ced96a0059465b8ad637498bac6",
218218
"boatstack/update_publication_test.go": "c5f32578db53be65e35452d5e8b4520884354e4e80a370dcec19860ea644d091",
219219
"boatstack/update_test.go": "bf5f19f8499db6dd7356917d867b113b790548ab89bfdea59e2adf4999a82a6a",
220+
"boatstack/visual_attach_conformance_test.go": "a376f032cfc59615fe4d403bdb8d7c7d3972dc7de334c3f6763edf1531ff1f03",
220221
"boatstack/visual_evidence.go": "f9fbde0e89f0ce8d9503939197d9b92cc8da377053007371d28360e29715a84a",
221-
"boatstack/visual_evidence_test.go": "0fe8f5154ef4398dfeba5e7f7b387b2d279ed75635ea35d93ff392269f2cc6d0",
222+
"boatstack/visual_evidence_test.go": "b2e50093080d4c2381c8f441a4e1cfeca714fa3d034e7536835b7077fad0556a",
222223
"boatstack/visual_publisher.go": "ec5e95228b48e4ec20731975606048f5e732c4e09a7fd175770d4b15e447cc88",
223224
"boatstack/visual_publisher_test.go": "979f600edae00c77569ae753b80530e8cbf2e3b342995efcd992d351ff382eaf",
224225
"boatstack/workspace.go": "79f472d0d10794bf5193518d0c2798d2f5e7e530226e02fb33f99840110f995f",
@@ -231,10 +232,10 @@
231232
"docs/benchmark-corpus-audit.md": "f2d206fe8579a514f9da82b2c96c19b343ac004be67617e1bd34f0f8e0e5e6c6",
232233
"docs/benchmark-submission-audit.md": "9518abdd17690729c6423f87cab20418ed47b0915b5faa44b9ef975e9e9c3b79",
233234
"docs/configuration.md": "8c5b0a6a8394333165dd0b2b1a70ca74e9d53f784b478e2ef7f1b12d93bc03b0",
234-
"docs/evidence-engineered-coding.md": "27da8a87d58783dc2ac2ad72cb2265cbdbab456f41fb4e09f261dbc44d90cd12",
235+
"docs/evidence-engineered-coding.md": "a0bc4ce88390774ea8ad188173264024505dc84e554820b3b219944e11cfe870",
235236
"docs/generated-files.md": "437791765b0a4015032ae21d1a6618563cad92b7402819e4f963bf5ae16284a3",
236237
"docs/getting-started.md": "51c2823f21e35140d31e6d5083dc4b89fddd24721ac6acc474154a4da53ee9f8",
237-
"docs/public-claims.json": "3bf81d5a1ca4371fc34a6b25eddd156da6c3e1cda728785cf3a0559a0d367596",
238+
"docs/public-claims.json": "dd049cd3c8e23362bdd0bfcf2090015432f309e6298ab8b45b67741b780d170a",
238239
"docs/public-surface.md": "713f7a050b5f339cf948299103ef3800417dccfecf2cc1a4166397ea6f978907",
239240
"docs/research-and-design.md": "8d78678108f0a6c924e1ff9b32c0f81aae9d1f779e0082843b6f99ad993ae2b6",
240241
"docs/safety.md": "7b9b5c515d36e683767ec8d3d9d6d119ac93650b2f629d351deadd4c600ed6a6",
@@ -248,7 +249,7 @@
248249
"labs/diagram-json/compiled/evidence.md": "1ba1c989ade070a8ef9a508fbd788d100d7292f2dbacbb2bce895468019f619d",
249250
"labs/diagram-json/compiled/tasks.json": "88f60851abf79d851e9fccc754ff3040034ae595306bc87d64784c19eb403e71",
250251
"labs/diagram-json/compiled/test-matrix.json": "424657ff505768e50fa113801fd8363364a18269d5297480907a993d44063a39",
251-
"labs/diagram-json/plan.lock.json": "2c861b4174ba2e09d859ff9463f62e0e5ffb4198db121cb426246b206cc697a4",
252+
"labs/diagram-json/plan.lock.json": "eebacf19b2b399d8cb6bbd3aad96e9e1705e369b69561f8841aeeb06f5d68e03",
252253
"labs/diagram-json/plan.md": "3cc4f533b8d69386deff16b3a594a3ba09d4c0c3db636cccd8c4380084ce6a51",
253254
"labs/diagram-json/questions.md": "74733b015002c8a6777c558e7e997fa48c94850b9bd39054fe9366c97ecf728d",
254255
"labs/diagram-json/request.md": "0808fc41c36779c404f4a3a121167da6e76cac56df526e70f9ed6d3e0d4c02ed",
@@ -392,12 +393,13 @@
392393
"release-notes/2026-07-29-readiness-and-journey-control.md": "2411db76974990ad0128fcd90e795c4c1c5c70d6d6f15fccd452f7e1a242310b",
393394
"release-notes/2026-07-30-auto-capture-on-ship.md": "49aa077ac52005d380ba2cae9e406c7d0a9941157c40aa4ed44b9e59195b3837",
394395
"release-notes/2026-07-30-plan-approved-scenarios-escalate-to-require.md": "21c3f2be51b834fc2eb7662236db2549e80b1a1a0665a0721e773b7736e2c079",
396+
"release-notes/2026-07-30-visual-attach-retry-prescription.md": "38b610685a7a62c0341ba21b273b42c24d82ca803de6d8f694754156eaa606a9",
395397
"release-notes/2026-07-30-visual-evidence-survives-preview-commit.md": "71d19e9fabb40e8cb1e939f26bf288911d227979926f43f337046c6cf6b66551"
396398
},
397399
"generator": "operatorstack/intelligence-flow:boatstack-distribution",
398400
"schema_version": 1,
399401
"source": {
400-
"commit": "146f50c0f3309e592ed45374b8cddb3d8ed64d85",
402+
"commit": "e5dbf426e4417f4f2f73c9f855d34808f7fa8f9a",
401403
"path": "labs/12-product-engineering-loop",
402404
"repository": "operatorstack/intelligence-flow"
403405
}

boatstack/cmd/boatstack-helper/coverage_conformance_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ var nonDeliveryVerbs = map[string]bool{
6363
"provision-capability": true,
6464
"capability-register": true,
6565
"record-pr-visual-publication": true,
66+
"attach-evidence": true,
6667
// PR construction / verification helpers reached around the ship gate.
6768
"check-pr": true,
6869
// Detached Supervision lifecycle (control-plane ownership, not delivery moves).

boatstack/cmd/boatstack-helper/main.go

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -705,6 +705,28 @@ func recordPRVisualPublicationCommand(arguments []string) int {
705705
return 0
706706
}
707707

708+
func attachEvidenceCommand(arguments []string) int {
709+
flags := flag.NewFlagSet("attach-evidence", flag.ContinueOnError)
710+
repo := flags.String("repo", ".", "repository whose Git-common state owns the evidence")
711+
feature := flags.String("feature", "", "managed Boatstack feature slug")
712+
if err := flags.Parse(arguments); err != nil {
713+
return 2
714+
}
715+
if *feature == "" {
716+
return fail(fmt.Errorf("attach-evidence requires --feature"))
717+
}
718+
manifest, err := boatstack.RetryVisualAttachment(*repo, *feature, boatstack.SelectVisualPublisher(*repo))
719+
if err != nil {
720+
return fail(err)
721+
}
722+
value, err := boatstack.MarshalJSON(manifest)
723+
if err != nil {
724+
return fail(err)
725+
}
726+
fmt.Print(string(value))
727+
return 0
728+
}
729+
708730
func deliveryStatusCommand(arguments []string) int {
709731
flags := flag.NewFlagSet("delivery-status", flag.ContinueOnError)
710732
repo := flags.String("repo", ".", "repository containing the managed delivery")
@@ -1487,7 +1509,7 @@ func workspaceSyncCommand(arguments []string) int {
14871509

14881510
func run() int {
14891511
if len(os.Args) < 2 {
1490-
fmt.Fprintln(os.Stderr, "usage: boatstack-helper <attach|detach|detached-status|context|activate|deactivate|init|update|check-update|repair-status|operation-status|prepare-update-pr|publish-update-pr|release-classify|next-patch|export|check-source-plan|planning-write|check-plan|record-approval|activate-plan|delivery-status|next-status|recovery-status|repair-state|mutation-status|undo|run-preflight|record-change|record-journey-results|ignore-delivery|record-delivery-gate|record-pr-visual-evidence|capture-evidence|provision-capability|capability-register|record-pr-visual-publication|check-safety|migrate-config|safety-hook|ambient-safety-hook|diagnose-hook|render-denial|pr-context|check-pr|publish-pr|workspace-cut|workspace-cleanup|workspace-reap|workspace-status|workspace-sync|flow|retro|doctor|version>")
1512+
fmt.Fprintln(os.Stderr, "usage: boatstack-helper <attach|detach|detached-status|context|activate|deactivate|init|update|check-update|repair-status|operation-status|prepare-update-pr|publish-update-pr|release-classify|next-patch|export|check-source-plan|planning-write|check-plan|record-approval|activate-plan|delivery-status|next-status|recovery-status|repair-state|mutation-status|undo|run-preflight|record-change|record-journey-results|ignore-delivery|record-delivery-gate|record-pr-visual-evidence|capture-evidence|provision-capability|capability-register|record-pr-visual-publication|attach-evidence|check-safety|migrate-config|safety-hook|ambient-safety-hook|diagnose-hook|render-denial|pr-context|check-pr|publish-pr|workspace-cut|workspace-cleanup|workspace-reap|workspace-status|workspace-sync|flow|retro|doctor|version>")
14911513
return 2
14921514
}
14931515
switch os.Args[1] {
@@ -1567,6 +1589,8 @@ func run() int {
15671589
return capabilityRegisterCommand(os.Args[2:])
15681590
case "record-pr-visual-publication":
15691591
return recordPRVisualPublicationCommand(os.Args[2:])
1592+
case "attach-evidence":
1593+
return attachEvidenceCommand(os.Args[2:])
15701594
case "pr-context":
15711595
return prContextCommand(os.Args[2:])
15721596
case "check-pr":

boatstack/denial_solutions_conformance_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ func TestTamperDenialNamesDeclaredOwnerVerbs(t *testing.T) {
123123
".git/boatstack/mutations/v1/abc.json": {"activate-plan", "undo"},
124124
".git/boatstack/quarantine/demo/receipt.json": {"repair-state"},
125125
"state-root/boatstack/registry.json": {"attach", "detach"},
126-
".git/boatstack/visual-evidence/x/manifest.json": {"record-pr-visual-evidence", "capture-evidence", "record-pr-visual-publication"},
126+
".git/boatstack/visual-evidence/x/manifest.json": {"record-pr-visual-evidence", "capture-evidence", "record-pr-visual-publication", "attach-evidence"},
127127
"boatstack/repositories/sample/binding.json": {"attach", "detach", "activate"},
128128
}
129129
for attempted, want := range cases {

0 commit comments

Comments
 (0)