Skip to content

Commit 30beb75

Browse files
Sync Boatstack from Intelligence Flow Labs @ 3c9ed10dcf0c (#168)
Co-authored-by: operator-stack-publisher[bot] <operator-stack-publisher[bot]@users.noreply.github.com>
1 parent 4fed607 commit 30beb75

9 files changed

Lines changed: 90 additions & 24 deletions

File tree

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/2b61577db37944e1b1c3aad534eeeb3b32f5eb4d/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/3c9ed10dcf0c6781023a547effb4469879b8a375/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: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
},
1313
"files": {
1414
".gitignore": "a7079e923a776f14f1bb3a6aa0a11a133a8e1dfb35af020f327623357b7e3957",
15-
"CONTRIBUTING.md": "e1a3cad13687fd1f9469b7cd9cd1e869143c417c3a97a4d895b9971720873dd0",
15+
"CONTRIBUTING.md": "9b54670bd54b1bc7e5375667af4b6c17f420d81789a5f7e8cb7533ed8ff73f9a",
1616
"README.md": "534091974042589c31978080b0268761164f2279850f02c30e07f48945ef2321",
1717
"assets/boatstack-journey.svg": "e465befc50c8ce30f3e07e8fd97012931beeb053392c8fbf38ad645023b3cc63",
1818
"assets/boatstack-mark.svg": "be1f984da1bfa69fa5d1f986d8343d21f7e20921b71db888c928b4d2e54b09b5",
@@ -82,8 +82,8 @@
8282
"boatstack/detached_test.go": "2cd744335a80b9fbc2db8fa7955658dd31691c43150d67bf15029d06ce84277a",
8383
"boatstack/docs/control-law-scoping.md": "0ae984821248eabda8c0eeaf201b367991e6742984e7c718df20ecc24caee475",
8484
"boatstack/evidence.go": "497a31e6ff632cb1d7c3adfc9f269af3f6aa84e948dd5d417c162767542a27df",
85-
"boatstack/export.go": "b7f1008b977932291bb16cf363598fa2f060af0c888d27ef186bbdf51e3c701d",
86-
"boatstack/export_test.go": "6ea4997a6a9f29b1d16fe4fdc3b9fa1057cb1a1a220c631e1ee7638480b0c82e",
85+
"boatstack/export.go": "96534cf341b8ae43f569fd1c3d25d4bf88cb7afc7418689457b461d4d2895082",
86+
"boatstack/export_test.go": "9157acf1993aa75b825cdf771798cc1c056054c4ddc725ad735f4fa9eac73193",
8787
"boatstack/flow_coding.go": "9fa53a0204f98a25f97775c3acf37392a591c14ce850b44aa587b5806e770bb9",
8888
"boatstack/flow_coding_test.go": "dddcd7a85892d4fa10af42739d4c1ff265721b0313e27b6e7a1bbb019d5c3b51",
8989
"boatstack/flow_control.go": "c6a4b3db41570ab92efc7f90115414e9a86dcd26cd2b7f7999d8d171e005e82a",
@@ -215,7 +215,7 @@
215215
"boatstack/safety_test.go": "7f40f09ce5cb2b815882a529ee7d8516e82b6686fe7e600085a3c04ece58b35a",
216216
"boatstack/safety_update_publisher_test.go": "ed3f8187036623694dfe7c395cdae00fdae14609bab6124d1fdfc6fe73fa2196",
217217
"boatstack/skill_frontmatter.go": "73364df463ce828c2d005aab55f72bb92f7a34d99cf3f53d4e0cd5a4da9dbd0e",
218-
"boatstack/skill_frontmatter_test.go": "a3ec52e7df357a72265c95dd66db15d9c0effc7e5f90f14ce69c27792ce394eb",
218+
"boatstack/skill_frontmatter_test.go": "5ebf971d2fb0d02b2144a47883067bca7c89863e4285933dfac6f2c5816d560a",
219219
"boatstack/solution_closure_conformance_test.go": "f73e6748dac373e2a10bc9269c2f2e060bd220bb4113bd0d5ff66ca4c8e91a54",
220220
"boatstack/statemap.go": "0db3a980f2fd00538498f6599b488a6719a5ee0f0764172834165e7d9d8f8057",
221221
"boatstack/statemap_conformance_test.go": "504debd406c1b5ad6cc9cb38715dea08954ef9c258cb5f91c59fb04d1398e53e",
@@ -243,10 +243,10 @@
243243
"docs/benchmark-corpus-audit.md": "f2d206fe8579a514f9da82b2c96c19b343ac004be67617e1bd34f0f8e0e5e6c6",
244244
"docs/benchmark-submission-audit.md": "9518abdd17690729c6423f87cab20418ed47b0915b5faa44b9ef975e9e9c3b79",
245245
"docs/configuration.md": "2ceb050bb67737c725b66d7e191949c2f3b652ecbafc5e44002e99bc785114ab",
246-
"docs/evidence-engineered-coding.md": "3e12871b4561507e4dbebca80649b22f9dc23acf8bb527d55d61f03a0b53691e",
246+
"docs/evidence-engineered-coding.md": "e8284c01dea52bb09df673f23588944757b08c831d3d61a106c5989744525e86",
247247
"docs/generated-files.md": "8679b960bacbdf2ca7b898aa44eb3a486ebb325eca8ce9cc4e316191e7ef5087",
248248
"docs/getting-started.md": "834e6d1c33d5198743a3f896c4e205801713762dcd2fa339e47c99b532df2cf5",
249-
"docs/public-claims.json": "d12663da575041a87cd174a1e9db780078ca9633634315922425db03d2854954",
249+
"docs/public-claims.json": "cc6879c53a2598b02e474436d92acd7f5ea7d4f6edf88c231d9ae190f0b84c5f",
250250
"docs/public-surface.md": "713f7a050b5f339cf948299103ef3800417dccfecf2cc1a4166397ea6f978907",
251251
"docs/research-and-design.md": "8d78678108f0a6c924e1ff9b32c0f81aae9d1f779e0082843b6f99ad993ae2b6",
252252
"docs/safety.md": "1a2b84e0a4b9aa6322d35d6677ff52662c306089031295692b569233cdd94d8f",
@@ -260,7 +260,7 @@
260260
"labs/diagram-json/compiled/evidence.md": "1ba1c989ade070a8ef9a508fbd788d100d7292f2dbacbb2bce895468019f619d",
261261
"labs/diagram-json/compiled/tasks.json": "88f60851abf79d851e9fccc754ff3040034ae595306bc87d64784c19eb403e71",
262262
"labs/diagram-json/compiled/test-matrix.json": "424657ff505768e50fa113801fd8363364a18269d5297480907a993d44063a39",
263-
"labs/diagram-json/plan.lock.json": "83e623384d3ba7a497dc22efa6cc770e281624d0c784059fc388677c19c184e9",
263+
"labs/diagram-json/plan.lock.json": "ac9dd9b50170095d2a1c172695c0ed7e682d910eb834b106640ed2c93a436da8",
264264
"labs/diagram-json/plan.md": "3cc4f533b8d69386deff16b3a594a3ba09d4c0c3db636cccd8c4380084ce6a51",
265265
"labs/diagram-json/questions.md": "74733b015002c8a6777c558e7e997fa48c94850b9bd39054fe9366c97ecf728d",
266266
"labs/diagram-json/request.md": "0808fc41c36779c404f4a3a121167da6e76cac56df526e70f9ed6d3e0d4c02ed",
@@ -415,12 +415,13 @@
415415
"release-notes/2026-08-02-goal-driven-autonomous-run.md": "a5b66250c98ca6c23c3761bc09c81cebd02a1243de12fc6110bd1119fd8faf4a",
416416
"release-notes/2026-08-02-strengthen-screenshot-delivery.md": "2e56eeb08702f4dd58dce75e26a52fbcb7e48af0cd5dd062d4e2a204704705df",
417417
"release-notes/2026-08-04-external-authority-boundary.md": "0bc788db940f7fbc3624a01fff554d7002137e9915b10c47fd287dc1b24cdd66",
418+
"release-notes/2026-08-05-codex-operation-skills.md": "2402adbe3ef21762418648f6ac19ba282b8c9524546369e3f8aa76ad33d2c53d",
418419
"release-notes/2026-08-05-detached-external-config.md": "b8b5ab914eae695f67c4e25deba3957894439e054b42ab93751bccb614235fda"
419420
},
420421
"generator": "operatorstack/intelligence-flow:boatstack-distribution",
421422
"schema_version": 1,
422423
"source": {
423-
"commit": "2b61577db37944e1b1c3aad534eeeb3b32f5eb4d",
424+
"commit": "3c9ed10dcf0c6781023a547effb4469879b8a375",
424425
"path": "labs/12-product-engineering-loop",
425426
"repository": "operatorstack/intelligence-flow"
426427
}

boatstack/export.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,16 @@ description: %s
288288
`, spec.Name, spec.Description, argumentHint, strings.TrimSpace(operationBody), arguments)
289289
}
290290

291+
func codexOperationSkill(spec claudeSkillSpec, operationBody string) string {
292+
return fmt.Sprintf(`---
293+
name: %s
294+
description: %s
295+
---
296+
297+
%s
298+
`, spec.Name, spec.Description, strings.TrimSpace(operationBody))
299+
}
300+
291301
func BuildExportBundle(configPath string, config ProjectConfig, rawConfig []byte, adapterName string) (ExportBundle, error) {
292302
if !adapterNamePattern.MatchString(adapterName) {
293303
return ExportBundle{}, fmt.Errorf("adapter name must be a lowercase kebab-case slug")
@@ -518,6 +528,19 @@ If gstack is enabled, use only its namespaced /gstack-* specialist lenses inside
518528
if err != nil {
519529
return ExportBundle{}, err
520530
}
531+
for _, spec := range claudeVisibleSkills {
532+
extra, ok := operations[spec.Name]
533+
if !ok {
534+
return ExportBundle{}, fmt.Errorf("missing operation instructions for Codex skill %s", spec.Name)
535+
}
536+
path := fmt.Sprintf(".agents/skills/%s/SKILL.md", spec.Name)
537+
files[path], err = GeneratedFrontmatter(
538+
codexOperationSkill(spec, commandBody(spec.Name, extra)),
539+
)
540+
if err != nil {
541+
return ExportBundle{}, err
542+
}
543+
}
521544
}
522545
if contains(adapters, "github") {
523546
files[fmt.Sprintf(".github/PULL_REQUEST_TEMPLATE/%s.md", adapterName)] = GeneratedMarkdown(`# Reviewer-ready change

boatstack/export_test.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,8 @@ func TestExportAndDriftCheck(t *testing.T) {
110110
".gemini/skills/auto-plan/SKILL.md",
111111
".gemini/skills/boatstack-update/SKILL.md",
112112
".agents/skills/boatstack/SKILL.md",
113+
".agents/skills/boatstack-run/SKILL.md",
114+
".agents/skills/auto-plan/SKILL.md",
113115
".product-loop/.gitignore",
114116
".product-loop/templates/plan.md",
115117
".product-loop/templates/approval.md",
@@ -163,6 +165,40 @@ func TestExportAndDriftCheck(t *testing.T) {
163165
}
164166
}
165167

168+
codexSkillPaths := map[string]bool{}
169+
for path := range bundle.Files {
170+
if strings.HasPrefix(path, ".agents/skills/") && strings.HasSuffix(path, "/SKILL.md") {
171+
codexSkillPaths[path] = true
172+
}
173+
}
174+
if len(codexSkillPaths) != len(claudeVisibleSkills)+1 {
175+
t.Fatalf("generated %d Codex skills, want %d: %#v", len(codexSkillPaths), len(claudeVisibleSkills)+1, codexSkillPaths)
176+
}
177+
for _, spec := range claudeVisibleSkills {
178+
path := ".agents/skills/" + spec.Name + "/SKILL.md"
179+
skill := string(bundle.Files[path])
180+
for _, expected := range []string{
181+
"name: " + spec.Name,
182+
"description: " + spec.Description,
183+
"Run the " + spec.Name + " operation",
184+
".product-loop/workflow.md",
185+
"User-facing response contract",
186+
} {
187+
if !strings.Contains(skill, expected) {
188+
t.Fatalf("%s is missing %q", path, expected)
189+
}
190+
}
191+
}
192+
codexRun := string(bundle.Files[".agents/skills/boatstack-run/SKILL.md"])
193+
for _, expected := range []string{
194+
"If status is NOT_STARTED, route to auto-plan",
195+
"planning and plan-gate do not require delivery preflight",
196+
} {
197+
if !strings.Contains(codexRun, expected) {
198+
t.Fatalf("Codex boatstack-run skill is missing operation boundary %q", expected)
199+
}
200+
}
201+
166202
geminiSkillPaths := map[string]bool{}
167203
for path := range bundle.Files {
168204
if strings.HasPrefix(path, ".gemini/skills/") && strings.HasSuffix(path, "/SKILL.md") {
@@ -495,6 +531,9 @@ func TestPortableHostAdaptersShareWorkflowAndArtifactContract(t *testing.T) {
495531
if _, exists := bundle.Files[".gemini/skills/"+spec.Name+"/SKILL.md"]; !exists {
496532
t.Fatalf("Gemini does not expose user operation %q", spec.Name)
497533
}
534+
if _, exists := bundle.Files[".agents/skills/"+spec.Name+"/SKILL.md"]; !exists {
535+
t.Fatalf("Codex does not expose user operation %q", spec.Name)
536+
}
498537
}
499538
for _, expected := range []string{"source plan", "plan.md", "approval.md", "evidence", "gaps", "review", "pr.md"} {
500539
if !strings.Contains(strings.ToLower(artifacts), strings.ToLower(expected)) {

boatstack/skill_frontmatter_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ func TestGeneratedSkillFrontmatterIsValidYAML(t *testing.T) {
3434
expected += len(claudeVisibleSkills) + 1
3535
}
3636
if contains(config.Adapters, "codex") {
37-
expected += 1
37+
expected += len(claudeVisibleSkills) + 1
3838
}
3939
if skillCount != expected {
4040
t.Fatalf("validated %d generated skills, want %d", skillCount, expected)

docs/evidence-engineered-coding.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,6 @@ Delivery and system improvement also remain separate. A failed task may suggest
146146

147147
## What is evidence-backed
148148

149-
The current moves were derived from the Intelligence Flow benchmark corpus and product-repository studies. The generated source commit is [`2b61577db37944e1b1c3aad534eeeb3b32f5eb4d`](https://github.com/operatorstack/intelligence-flow/tree/2b61577db37944e1b1c3aad534eeeb3b32f5eb4d/labs/12-product-engineering-loop).
149+
The current moves were derived from the Intelligence Flow benchmark corpus and product-repository studies. The generated source commit is [`3c9ed10dcf0c6781023a547effb4469879b8a375`](https://github.com/operatorstack/intelligence-flow/tree/3c9ed10dcf0c6781023a547effb4469879b8a375/labs/12-product-engineering-loop).
150150

151151
The evidence supports specific failure mechanisms and guardrails. It does not establish that Boatstack is optimal, that control-theory notation proves software quality, or that one workflow dominates every team. Those are evaluation questions, so the distribution preserves measurements, provenance, gaps, and negative results.

docs/public-claims.json

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"schema_version": 1,
3-
"source_commit": "2b61577db37944e1b1c3aad534eeeb3b32f5eb4d",
3+
"source_commit": "3c9ed10dcf0c6781023a547effb4469879b8a375",
44
"statuses": ["verified", "observed", "still_being_evaluated"],
55
"claims": [
66
{
@@ -12,7 +12,7 @@
1212
"readable_evidence": "why-these-steps.md#portable-workflow-and-state",
1313
"implementation": ["../boatstack/export.go", "../boatstack/references/artifacts.md", "../boatstack/references/workflow.md"],
1414
"verification": ["../boatstack/export_test.go"],
15-
"last_verified_version": "source:2b61577db37944e1b1c3aad534eeeb3b32f5eb4d"
15+
"last_verified_version": "source:3c9ed10dcf0c6781023a547effb4469879b8a375"
1616
},
1717
{
1818
"id": "human-decisions",
@@ -23,7 +23,7 @@
2323
"readable_evidence": "why-these-steps.md#human-decisions",
2424
"implementation": ["../boatstack/references/workflow.md", "../boatstack/plan.go"],
2525
"verification": ["../boatstack/plan_test.go", "../boatstack/planning_test.go"],
26-
"last_verified_version": "source:2b61577db37944e1b1c3aad534eeeb3b32f5eb4d"
26+
"last_verified_version": "source:3c9ed10dcf0c6781023a547effb4469879b8a375"
2727
},
2828
{
2929
"id": "validation-provenance",
@@ -34,7 +34,7 @@
3434
"readable_evidence": "why-these-steps.md#validation-provenance",
3535
"implementation": ["validation-and-evidence.md", "../boatstack/plan.go"],
3636
"verification": ["../boatstack/plan_test.go"],
37-
"last_verified_version": "source:2b61577db37944e1b1c3aad534eeeb3b32f5eb4d"
37+
"last_verified_version": "source:3c9ed10dcf0c6781023a547effb4469879b8a375"
3838
},
3939
{
4040
"id": "irreversible-operations",
@@ -46,7 +46,7 @@
4646
"readable_evidence": "why-these-steps.md#irreversible-operations",
4747
"implementation": ["safety.md", "../boatstack/safety.go", "../boatstack/hooks.go"],
4848
"verification": ["../boatstack/safety_test.go", "../boatstack/hooks_test.go"],
49-
"last_verified_version": "source:2b61577db37944e1b1c3aad534eeeb3b32f5eb4d"
49+
"last_verified_version": "source:3c9ed10dcf0c6781023a547effb4469879b8a375"
5050
},
5151
{
5252
"id": "reviewer-ready-pr",
@@ -57,7 +57,7 @@
5757
"readable_evidence": "why-these-steps.md#reviewer-ready-pr",
5858
"implementation": ["../boatstack/pr.go", "getting-started.md"],
5959
"verification": ["../boatstack/pr_test.go"],
60-
"last_verified_version": "source:2b61577db37944e1b1c3aad534eeeb3b32f5eb4d"
60+
"last_verified_version": "source:3c9ed10dcf0c6781023a547effb4469879b8a375"
6161
},
6262
{
6363
"id": "phase-scoped-delivery",
@@ -68,7 +68,7 @@
6868
"readable_evidence": "why-these-steps.md#phase-scoped-delivery",
6969
"implementation": ["../boatstack/delivery.go", "../boatstack/safety.go", "../boatstack/hooks.go", "../boatstack/references/workflow.md"],
7070
"verification": ["../boatstack/delivery_test.go", "../boatstack/pr_test.go"],
71-
"last_verified_version": "source:2b61577db37944e1b1c3aad534eeeb3b32f5eb4d"
71+
"last_verified_version": "source:3c9ed10dcf0c6781023a547effb4469879b8a375"
7272
},
7373
{
7474
"id": "model-neutral-contract",
@@ -79,7 +79,7 @@
7979
"readable_evidence": "why-these-steps.md#model-choice-and-budget",
8080
"implementation": ["research-and-design.md", "../boatstack/references/workflow.md"],
8181
"verification": ["../boatstack/export_test.go", "../boatstack/planning_test.go"],
82-
"last_verified_version": "source:2b61577db37944e1b1c3aad534eeeb3b32f5eb4d"
82+
"last_verified_version": "source:3c9ed10dcf0c6781023a547effb4469879b8a375"
8383
},
8484
{
8585
"id": "cross-model-failures",
@@ -90,7 +90,7 @@
9090
"readable_evidence": "why-these-steps.md#model-choice-and-budget",
9191
"implementation": ["research-and-design.md"],
9292
"verification": ["benchmark-corpus-audit.md", "benchmark-submission-audit.md"],
93-
"last_verified_version": "source:2b61577db37944e1b1c3aad534eeeb3b32f5eb4d"
93+
"last_verified_version": "source:3c9ed10dcf0c6781023a547effb4469879b8a375"
9494
},
9595
{
9696
"id": "lower-cost-outcomes",
@@ -101,7 +101,7 @@
101101
"readable_evidence": "why-these-steps.md#model-choice-and-budget",
102102
"implementation": ["research-and-design.md"],
103103
"verification": ["benchmark-corpus-audit.md", "benchmark-submission-audit.md"],
104-
"last_verified_version": "source:2b61577db37944e1b1c3aad534eeeb3b32f5eb4d"
104+
"last_verified_version": "source:3c9ed10dcf0c6781023a547effb4469879b8a375"
105105
},
106106
{
107107
"id": "git-worktree-activation",
@@ -112,7 +112,7 @@
112112
"readable_evidence": "why-these-steps.md#git-worktree-activation",
113113
"implementation": ["../boatstack/runtime_cache.go", "../boatstack/hooks.go"],
114114
"verification": ["../boatstack/runtime_cache_test.go", "../boatstack/hooks_test.go"],
115-
"last_verified_version": "source:2b61577db37944e1b1c3aad534eeeb3b32f5eb4d"
115+
"last_verified_version": "source:3c9ed10dcf0c6781023a547effb4469879b8a375"
116116
},
117117
{
118118
"id": "visible-updates",
@@ -123,7 +123,7 @@
123123
"readable_evidence": "why-these-steps.md#visible-updates",
124124
"implementation": ["../boatstack/update.go", "../boatstack/init.go"],
125125
"verification": ["../boatstack/update_test.go", "../boatstack/init_test.go", "../boatstack/export_test.go"],
126-
"last_verified_version": "source:2b61577db37944e1b1c3aad534eeeb3b32f5eb4d"
126+
"last_verified_version": "source:3c9ed10dcf0c6781023a547effb4469879b8a375"
127127
}
128128
]
129129
}

labs/diagram-json/plan.lock.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"plan_path": "labs/diagram-json/plan.md",
77
"plan_sha256": "3cc4f533b8d69386deff16b3a594a3ba09d4c0c3db636cccd8c4380084ce6a51",
88
"schema_version": 1,
9-
"source_commit": "2b61577db37944e1b1c3aad534eeeb3b32f5eb4d",
9+
"source_commit": "3c9ed10dcf0c6781023a547effb4469879b8a375",
1010
"source_plan_path": "labs/diagram-json/source-plan.md",
1111
"source_plan_sha256": "e10593ddaa7522ab80cc991d0a09399257139799e37f737794cd49d68a39985b",
1212
"spec_path": "labs/diagram-json/spec.md",
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
### Codex receives Boatstack operation drivers
2+
3+
Codex installations and detached controllers now include the same operation-specific Boatstack skills as other supported coding hosts. A `boatstack-run` session can follow the released planning, preflight, build, evidence, review, and PR boundaries instead of inferring those transitions from the generic adapter.

0 commit comments

Comments
 (0)