Skip to content

Commit 2950e89

Browse files
Sync Boatstack from Intelligence Flow Labs @ bfaa855fddf3 (#73)
Co-authored-by: operator-stack-publisher[bot] <operator-stack-publisher[bot]@users.noreply.github.com>
1 parent bf8e3c4 commit 2950e89

29 files changed

Lines changed: 1608 additions & 120 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/3fc5f6eb68c22007a46434b4af9dacc31dcc04ed/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/bfaa855fddf392520adb0e2324d38aff0421a7fb/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: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"canonical_context": {
3-
"characters": 56257,
4-
"estimated_tokens": 14065,
3+
"characters": 57829,
4+
"estimated_tokens": 14458,
55
"estimator": "ceil(total characters / 4); compactness signal, not provider billing",
66
"files": [
77
"product-engineering-loop/references/workflow.md",
@@ -12,7 +12,7 @@
1212
},
1313
"files": {
1414
".gitignore": "a7079e923a776f14f1bb3a6aa0a11a133a8e1dfb35af020f327623357b7e3957",
15-
"CONTRIBUTING.md": "1971ef51d571471a54b88c648cf7d8027057155efb75125647042997a31ae078",
15+
"CONTRIBUTING.md": "2352ef6339506b5d3b6abaa1c81e35f33410add957cb10a05df8c3aa5f71f1a1",
1616
"README.md": "125b47671a68556df382f19756fb61fa18925606cbbaf54d6bc9df8872b36870",
1717
"assets/boatstack-journey.svg": "e465befc50c8ce30f3e07e8fd97012931beeb053392c8fbf38ad645023b3cc63",
1818
"assets/boatstack-mark.svg": "be1f984da1bfa69fa5d1f986d8343d21f7e20921b71db888c928b4d2e54b09b5",
@@ -34,7 +34,7 @@
3434
"boatstack/atomic_windows.go": "cefd775cbe7e7c3bd8a3f5673b11cdd784c6d3ebd6de7dcb8f39406b0bee511f",
3535
"boatstack/changelog.go": "c5e1f31440b44d61e6037ad27af0333540af3545d655e35819a0241cbbebd8ec",
3636
"boatstack/changelog_test.go": "ce792f23a7fe1e09fb3096cd1314130a6ab69321d4877b12a8e994027541baf7",
37-
"boatstack/cmd/boatstack-helper/main.go": "093e9b0e28931febf1dfb150dc83a46e4b8a8411693ea56409e25cbe6a50ee9e",
37+
"boatstack/cmd/boatstack-helper/main.go": "f4ba748c29f96896d0cb496cf59a259e1b2993c8ee9391d4e49d5f768695f559",
3838
"boatstack/cmd/boatstack-helper/main_test.go": "ff73003b6a5157202fa09ddf1129fb13c3d79702b2e05a8721ce5a11bf5ab779",
3939
"boatstack/command.go": "94d2117c6e390d5a644afc5cd90f7e712e3f8b1032f8c9e3b253cc134524c28a",
4040
"boatstack/command_test.go": "9f707abba3640add81c3e97ba7e72fedbf98f3394b1c060a9ca4b4a28e919968",
@@ -44,15 +44,17 @@
4444
"boatstack/delivery.go": "96b55c27d320c0a218b1db4ea9c61a8687dfcff8c6f9d3f1126f5b7ae7ed35bd",
4545
"boatstack/delivery_test.go": "5ce806257307af5d2e4c74c07c77c3db119398f60953890d9b72f95cb168cae2",
4646
"boatstack/evidence.go": "497a31e6ff632cb1d7c3adfc9f269af3f6aa84e948dd5d417c162767542a27df",
47-
"boatstack/export.go": "4deaef656e181533230b63bfbddac0c5169048a68f150ee1f32282b4a381ce1c",
48-
"boatstack/export_test.go": "d2f57fd5af57ac0992ad198c1982c848b8fa39699c0af9a206b72960efb3e460",
47+
"boatstack/export.go": "5f6e09c683974bacd1415cd0c9b75f7fe0cef2d22f865e5aa6798c0890b46dd4",
48+
"boatstack/export_test.go": "762ce1425a721af1d3b1b3de91570a7ea1d99846301e8c42c9e201ae13fbf297",
4949
"boatstack/go.mod": "6086ef1b2a83f5696190dca692c653925f27b61f652f659fd3fca43ed54a1641",
5050
"boatstack/go.sum": "26c315c867b11b886f3c9402fce7f341f6a9115a5d61f54afbb5e1b1fb5f6017",
51-
"boatstack/hooks.go": "ac67d7d0beea65a3eb719679d80213f911bfad7da7f16397d9831062a03839ce",
51+
"boatstack/hooks.go": "b88cedcd045e5217fedfac625ced2e4f691adb42e62155fcbc392a8f6d88366e",
5252
"boatstack/hooks_test.go": "c5786bc6463cf6932a6612b26cbe65d035008ecbca5c0063bea253d857c2f622",
53-
"boatstack/init.go": "816d2a59ea8a48e078f72158c134304393804f7530c38d4e117419cb5ba24391",
54-
"boatstack/init_test.go": "fa48be69d07691fa7842224ec831e5f290504d8b6565263c9735d2dabd9b43b8",
53+
"boatstack/init.go": "a32ffdbc148a19aa556e36897d80e7d41ac04a976fef6b27d527b81246bcf32d",
54+
"boatstack/init_test.go": "5fdf687205e7a5984a98a87336b7127e4ae9b651d57e21ec2dc8ca7e653ee602",
5555
"boatstack/init_transaction.go": "112456c4e1c4db54c4137bcf4f7a9a9e63399a6f5971e9b3dc952d0c4b2aa4b6",
56+
"boatstack/installation_repair.go": "0c896e7a5033211350eca2b2225bca638b3b0ac4adff550bc514090f7b789f23",
57+
"boatstack/installation_repair_test.go": "ae5a5ea1110836bd78cf20ade863a4d32cfd63d282559f92786f57b31869bd14",
5658
"boatstack/integrations.go": "75b39ce2e662fccd66bf4b9bff0e097a4db558f23b3aa1d9bc83a5fc6373444c",
5759
"boatstack/migrate.go": "eaf589e2b266238068e42c6d78e01dc040266d28e342cb24f09e33e8541749b3",
5860
"boatstack/migrate_test.go": "9f4bda2fb158c5e54bcc0242dace1da3c1965f9846a213c573956a35b7d1724e",
@@ -70,31 +72,31 @@
7072
"boatstack/pr_test.go": "838e6c244aed84317d00e6f49de6b65bb08f6fe1e1a11fb37aad8428ae2f6ea1",
7173
"boatstack/recovery.go": "dd816b18b54a0085b8d8276a93ee98d2b1e90099059a0d85cf6e24edf6f37d5b",
7274
"boatstack/recovery_test.go": "29490e7477ba602491330036a491289dd9117b99ff862f66dae421ba17e04c9f",
73-
"boatstack/references/artifacts.md": "3f88ef39233b8e4b3554651c0d3ff6c8fade0512f69a912404976d90bf9ff304",
75+
"boatstack/references/artifacts.md": "5fa888ac519085d65cee1d04df5902761651bcf2d7af81711fa0f8ecd1fc0f59",
7476
"boatstack/references/config-schema.md": "c07c2d532ef95ea6ae538a1fffefb92ded1f8dc6a06eb3b8d463e371d1ed8416",
75-
"boatstack/references/failure-moves.md": "9daee2131050e9e0fd3d5f18385b7363e552da28fdf0dc35146f651e62071233",
76-
"boatstack/references/host-hook-contracts.md": "7414a633dee8e8bd5d4516562f2030561f994366e6a02d0e18e0af152e80faa6",
77+
"boatstack/references/failure-moves.md": "36e4f1487a790d981055ee5554fb1ee829b183dc8ca8c2b93f24e678b7d8a680",
78+
"boatstack/references/host-hook-contracts.md": "d68ae1556e7b1e29e9ac7cb4db767809d510aabf0be52e60e44665ea7abb980e",
7779
"boatstack/references/irreversible-operation-boundary.md": "631743991ace65977586e4537f8dd50f8ae88f8e16f27cf7baad93b2791a73df",
7880
"boatstack/references/portability.md": "fb683095991bb0cb06ec56fb8884c49038b283172a7d2f8b203483b7cacb4bae",
79-
"boatstack/references/workflow.md": "75c9b433a0c42275e47046ad5a3d5a1be4fdec1004dcdf91369fb6f839b8c582",
81+
"boatstack/references/workflow.md": "86cc04ff440098ddf9f1a793da9e5dca7208fd24dcc3be4a7742c1d323e4866c",
8082
"boatstack/release.go": "82dcb4ca59e8c79a68d5333d650f90e64abd448d04e0c6f504fdf07f42b5ed76",
8183
"boatstack/release_test.go": "5cf2d76fe9b836a91ca68eba53d5585e2c4be5b9421aaf939ea0723063a24690",
8284
"boatstack/run.go": "fbdbf583c862c41f23d1a200f53d042842db72f19c29fe94e4288a69b0ac4a6b",
8385
"boatstack/run_test.go": "34484285fd2457b84faf6d5353117b74af73d4601cd60a96e270b7fd0a7a6a8e",
8486
"boatstack/runtime.go": "687b3543c22acbbed91c94e798c2a813bd828e087ac180ab29a21e3a429f9971",
8587
"boatstack/runtime_cache.go": "60c4eb0c7dde91d40d6ef3f05adc1a1282d17ff1ca12470d0a008454f7ca7489",
8688
"boatstack/runtime_cache_test.go": "b981467ddc9f0f562da6bff5de7a80a9fe5a433a0317541d1e48df268546ac85",
87-
"boatstack/safety.go": "56dd3760f16aa083d95d740f160770c21429f2ef2b7b2f6a940956a8ad50f774",
89+
"boatstack/safety.go": "5997a2fe1de6d563c219ca73bcc3f5bd00b88b9439831d335ee37eaeb6ad5dcc",
8890
"boatstack/safety_test.go": "dc21b6ee72221d3913fbac11e13af56c5a38c9e7b31dba6113fb5dde02036741",
8991
"boatstack/skill_frontmatter.go": "73364df463ce828c2d005aab55f72bb92f7a34d99cf3f53d4e0cd5a4da9dbd0e",
9092
"boatstack/skill_frontmatter_test.go": "a3ec52e7df357a72265c95dd66db15d9c0effc7e5f90f14ce69c27792ce394eb",
9193
"boatstack/testdata/reviewer-pr-body.md": "4c64e3788e5d61a377aeb0f797f7fc8d2316ab6e49572d15636eea7ba9e34ac4",
9294
"boatstack/testdata/safety/safe_apply.py.txt": "c9ec7fb932cf21b6aa8df597c4d4c54d6ec65e796240e49118d699f583383975",
9395
"boatstack/testdata/safety/unsafe_apply.py.txt": "42db1751865cc15c4dd69a03146b5deca8f21f916d258e433b27bbef5f884ab1",
94-
"boatstack/update.go": "792ba4481503590e1412c0d2ddbfdd912899218a8e3ebcf323e385698b498ab0",
95-
"boatstack/update_publication.go": "b1c967a4f6e43d7be2d8d71734bcb0563bc062a0ed152f56506c62a046ed54cd",
96-
"boatstack/update_publication_test.go": "df07663ceec8a8055eaac6a8b1583bc9ef38c033fac191ec74c821d19238305a",
97-
"boatstack/update_test.go": "b7d989c3c74a9e4d80ad14f9f74d94b617798dbcc36359327a4233524677db22",
96+
"boatstack/update.go": "edcf524ec103c62e07266aa70c3b7abba665ce1ed04dfa8eb3b26e330100172e",
97+
"boatstack/update_publication.go": "c8b7bd38019b1cbf8c523652e9e20e8c971c7e48b2f3972a0ac638648326fe63",
98+
"boatstack/update_publication_test.go": "c5f32578db53be65e35452d5e8b4520884354e4e80a370dcec19860ea644d091",
99+
"boatstack/update_test.go": "4cdd612356978edf718191f794be11590796bd5af1d524381b1a09243636cd51",
98100
"boatstack/visual_evidence.go": "90a68d554e10ff4fb7afa45000912cdedd4cdf93b3d279055b50844401924f01",
99101
"boatstack/visual_evidence_test.go": "0fe8f5154ef4398dfeba5e7f7b387b2d279ed75635ea35d93ff392269f2cc6d0",
100102
"boatstack/workspace.go": "91b343400b3506a6f516c28fabc3f1575f22024a5b19f934a020be660a20482e",
@@ -103,24 +105,24 @@
103105
"docs/benchmark-corpus-audit.md": "f2d206fe8579a514f9da82b2c96c19b343ac004be67617e1bd34f0f8e0e5e6c6",
104106
"docs/benchmark-submission-audit.md": "9518abdd17690729c6423f87cab20418ed47b0915b5faa44b9ef975e9e9c3b79",
105107
"docs/configuration.md": "f530c5dcbacf32dcb6fdab590901d8f658a4f29bd93f6264cec5d4f449c2cbd1",
106-
"docs/evidence-engineered-coding.md": "8eba4e45b1969d0418306a8b6156c56e93263ab2d2b9f6cd790f67998ffc3ef7",
107-
"docs/generated-files.md": "bb9b9efe69d97471820c225a9dcf5fda75e4896c20c9be6afb0db22a6bc9049e",
108-
"docs/getting-started.md": "f741cfc69ac7123709b6120a1cbcc57a6e5559a6b7783bdb9f495a3cb845bd33",
109-
"docs/public-claims.json": "49dbe4592a124ccccd4fe0ce907bb1b403521ec57905e2760372dcf274360ea8",
108+
"docs/evidence-engineered-coding.md": "f722b9e3db8c3f8f9e8e34f8f9ee916ed22966dacc67965fc2acec17bd7fbc99",
109+
"docs/generated-files.md": "437791765b0a4015032ae21d1a6618563cad92b7402819e4f963bf5ae16284a3",
110+
"docs/getting-started.md": "d5f0b170209e61518810a23b851bf9eb50b6755906703ca313e6e9faab20e1cd",
111+
"docs/public-claims.json": "7e844ed4a89ebdcf1834def12db0bb8cda83fe2fab511bfa54353304b4127193",
110112
"docs/public-surface.md": "713f7a050b5f339cf948299103ef3800417dccfecf2cc1a4166397ea6f978907",
111113
"docs/research-and-design.md": "d65c66e323037bda5d45aacef5d48afa6bf93da55901378891d235aca3a5684f",
112114
"docs/safety.md": "7b9b5c515d36e683767ec8d3d9d6d119ac93650b2f629d351deadd4c600ed6a6",
113-
"docs/troubleshooting.md": "065fe8580215b4964d676fd6f6fa69f12720ddf0f55a951c167360637f4dfede",
115+
"docs/troubleshooting.md": "7e0106ab2b7642f0c7cf641a61c18287bbe8a6b61a89222ce745dabe804240c9",
114116
"docs/validation-and-evidence.md": "e7d91ad49c6adb44784ebe7d94feceb6abd445857f9a0716f0758bf6b55296c5",
115-
"docs/why-these-steps.md": "80957af13979070e8b2f2a8db78ce06d20d152bbc8ec41c3a8003f28393f6369",
116-
"install.ps1": "960b2b20b406bb2878a560e9ace53fe7226bc510be6ee8466ce4e608beb5625a",
117-
"install.sh": "939e604aa153b454e7fa1cbbe50a88be17782ea9df35d1bbb5615c737ed6f86e",
117+
"docs/why-these-steps.md": "cbe0d769db11ef15bb1dff888009378d6783776ad020e6f5139847a1dd62fa09",
118+
"install.ps1": "6f5857ec0feb502683c5781b9bfbbe31ed39556cd13384ddc66da622a8423cb7",
119+
"install.sh": "c76a3ac6c7a45e6eb8e0178e1c3458f72c4899426c6a801d058ee38938e4b477",
118120
"labs/diagram-json/README.md": "f56a120877c8a3b10daa49c6d951481c02e98b8b8bb3f28672e9e092d97a37bb",
119121
"labs/diagram-json/approval.md": "ec9f353dc2a923c8df2c7fe6e90f5b054bed1129a6a21e86351596ef2a5d4215",
120122
"labs/diagram-json/compiled/evidence.md": "1ba1c989ade070a8ef9a508fbd788d100d7292f2dbacbb2bce895468019f619d",
121123
"labs/diagram-json/compiled/tasks.json": "88f60851abf79d851e9fccc754ff3040034ae595306bc87d64784c19eb403e71",
122124
"labs/diagram-json/compiled/test-matrix.json": "424657ff505768e50fa113801fd8363364a18269d5297480907a993d44063a39",
123-
"labs/diagram-json/plan.lock.json": "57689bcf7c38c94f7bd59f3acd901b9446c1d4cc6545f0ef1a11a39dc618f92e",
125+
"labs/diagram-json/plan.lock.json": "b2cb5cdf6ed31f55d748ad5d62cba8d894d48a98857201818e553d9c0928358f",
124126
"labs/diagram-json/plan.md": "3cc4f533b8d69386deff16b3a594a3ba09d4c0c3db636cccd8c4380084ce6a51",
125127
"labs/diagram-json/questions.md": "74733b015002c8a6777c558e7e997fa48c94850b9bd39054fe9366c97ecf728d",
126128
"labs/diagram-json/request.md": "0808fc41c36779c404f4a3a121167da6e76cac56df526e70f9ed6d3e0d4c02ed",
@@ -177,12 +179,13 @@
177179
"release-notes/2026-07-22-pre-activation-mutation-interlock.md": "bebc6104159acc7c91e45c3d80d6e714b79486ab204c619fc715971303adedd1",
178180
"release-notes/2026-07-22-product-configuration-guide.md": "45e96862336bd53a2628ce3fe718c829ea20315555f53187eb7f04ba749f3a97",
179181
"release-notes/2026-07-22-projection-layout-validation.md": "fd0d2935f3f0c4caa41bda678e3bd9a9b496eb2652ab38d80c1c1434cbba3159",
180-
"release-notes/2026-07-22-value-translation-boundary.md": "9cf168ff7caaf3906b78533935bdfb2c86e753984ed1e5ec8204cb373d083390"
182+
"release-notes/2026-07-22-value-translation-boundary.md": "9cf168ff7caaf3906b78533935bdfb2c86e753984ed1e5ec8204cb373d083390",
183+
"release-notes/2026-07-23-bootstrap-safe-update-repair.md": "d8e66c46ae05e3d228dfea45879f4d1166d5e3a253ac24bababd4c3e396c214b"
181184
},
182185
"generator": "operatorstack/intelligence-flow:boatstack-distribution",
183186
"schema_version": 1,
184187
"source": {
185-
"commit": "3fc5f6eb68c22007a46434b4af9dacc31dcc04ed",
188+
"commit": "bfaa855fddf392520adb0e2324d38aff0421a7fb",
186189
"path": "labs/12-product-engineering-loop",
187190
"repository": "operatorstack/intelligence-flow"
188191
}

boatstack/cmd/boatstack-helper/main.go

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,16 +66,49 @@ func updateCommand(arguments []string) int {
6666
repo := flags.String("repo", ".", "repository to update")
6767
binary := flags.String("binary", "", "verified replacement helper binary")
6868
yes := flags.Bool("yes", false, "accept the generated-file preview")
69+
repair := flags.Bool("repair", false, "repair only fingerprinted Boatstack-owned control state")
70+
allowDowngrade := flags.Bool("allow-downgrade", false, "permit an explicitly repaired downgrade")
6971
if err := flags.Parse(arguments); err != nil {
7072
return 2
7173
}
72-
err := boatstack.RunUpdate(boatstack.InitOptions{Repo: *repo, BinaryPath: *binary, Yes: *yes})
74+
err := boatstack.RunUpdate(boatstack.InitOptions{Repo: *repo, BinaryPath: *binary, Yes: *yes, Repair: *repair, AllowDowngrade: *allowDowngrade})
7375
if err != nil {
7476
return fail(err)
7577
}
7678
return 0
7779
}
7880

81+
func repairStatusCommand(arguments []string) int {
82+
flags := flag.NewFlagSet("repair-status", flag.ContinueOnError)
83+
repo := flags.String("repo", ".", "repository installation to inspect")
84+
allowDowngrade := flags.Bool("allow-downgrade", false, "include explicit downgrade authority in the projection")
85+
jsonOutput := flags.Bool("json", false, "emit the versioned JSON projection")
86+
if err := flags.Parse(arguments); err != nil {
87+
return 2
88+
}
89+
config, _, err := boatstack.LoadConfig(filepath.Join(*repo, ".boatstack-project.json"))
90+
if err != nil {
91+
return fail(err)
92+
}
93+
result, err := boatstack.ClassifyInstallationRepair(*repo, config.Adapters, *allowDowngrade)
94+
if err != nil {
95+
return fail(err)
96+
}
97+
value, err := boatstack.MarshalJSON(result)
98+
if err != nil {
99+
return fail(err)
100+
}
101+
if *jsonOutput {
102+
fmt.Print(string(value))
103+
} else {
104+
fmt.Printf("REPAIR_STATUS=%s\nDIRECTION=%s\nPACKAGE_FINGERPRINT=%s\nNEXT_OPERATION=%s\n", result.VerificationStatus, result.Direction, result.PackageFingerprint, result.NextOperation)
105+
}
106+
if result.VerificationStatus == "BLOCKED" {
107+
return 1
108+
}
109+
return 0
110+
}
111+
79112
func checkUpdateCommand(arguments []string) int {
80113
flags := flag.NewFlagSet("check-update", flag.ContinueOnError)
81114
repo := flags.String("repo", ".", "repository whose Boatstack release should be checked")
@@ -896,7 +929,7 @@ func workspaceStatusCommand(arguments []string) int {
896929

897930
func run() int {
898931
if len(os.Args) < 2 {
899-
fmt.Fprintln(os.Stderr, "usage: boatstack-helper <init|update|check-update|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|run-preflight|record-change|record-delivery-gate|record-pr-visual-evidence|record-pr-visual-publication|check-safety|migrate-config|safety-hook|diagnose-hook|pr-context|check-pr|publish-pr|workspace-cut|workspace-cleanup|workspace-status|doctor|version>")
932+
fmt.Fprintln(os.Stderr, "usage: boatstack-helper <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|run-preflight|record-change|record-delivery-gate|record-pr-visual-evidence|record-pr-visual-publication|check-safety|migrate-config|safety-hook|diagnose-hook|pr-context|check-pr|publish-pr|workspace-cut|workspace-cleanup|workspace-status|doctor|version>")
900933
return 2
901934
}
902935
switch os.Args[1] {
@@ -906,6 +939,8 @@ func run() int {
906939
return updateCommand(os.Args[2:])
907940
case "check-update":
908941
return checkUpdateCommand(os.Args[2:])
942+
case "repair-status":
943+
return repairStatusCommand(os.Args[2:])
909944
case "operation-status":
910945
return operationStatusCommand(os.Args[2:])
911946
case "prepare-update-pr":

0 commit comments

Comments
 (0)