diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 743c2c0..3bd2449 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,7 +2,7 @@ # Contributing -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). +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). 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. diff --git a/UPSTREAM.json b/UPSTREAM.json index fbee5d6..5375dd3 100644 --- a/UPSTREAM.json +++ b/UPSTREAM.json @@ -12,7 +12,7 @@ }, "files": { ".gitignore": "a7079e923a776f14f1bb3a6aa0a11a133a8e1dfb35af020f327623357b7e3957", - "CONTRIBUTING.md": "e1a3cad13687fd1f9469b7cd9cd1e869143c417c3a97a4d895b9971720873dd0", + "CONTRIBUTING.md": "9b54670bd54b1bc7e5375667af4b6c17f420d81789a5f7e8cb7533ed8ff73f9a", "README.md": "534091974042589c31978080b0268761164f2279850f02c30e07f48945ef2321", "assets/boatstack-journey.svg": "e465befc50c8ce30f3e07e8fd97012931beeb053392c8fbf38ad645023b3cc63", "assets/boatstack-mark.svg": "be1f984da1bfa69fa5d1f986d8343d21f7e20921b71db888c928b4d2e54b09b5", @@ -82,8 +82,8 @@ "boatstack/detached_test.go": "2cd744335a80b9fbc2db8fa7955658dd31691c43150d67bf15029d06ce84277a", "boatstack/docs/control-law-scoping.md": "0ae984821248eabda8c0eeaf201b367991e6742984e7c718df20ecc24caee475", "boatstack/evidence.go": "497a31e6ff632cb1d7c3adfc9f269af3f6aa84e948dd5d417c162767542a27df", - "boatstack/export.go": "b7f1008b977932291bb16cf363598fa2f060af0c888d27ef186bbdf51e3c701d", - "boatstack/export_test.go": "6ea4997a6a9f29b1d16fe4fdc3b9fa1057cb1a1a220c631e1ee7638480b0c82e", + "boatstack/export.go": "96534cf341b8ae43f569fd1c3d25d4bf88cb7afc7418689457b461d4d2895082", + "boatstack/export_test.go": "9157acf1993aa75b825cdf771798cc1c056054c4ddc725ad735f4fa9eac73193", "boatstack/flow_coding.go": "9fa53a0204f98a25f97775c3acf37392a591c14ce850b44aa587b5806e770bb9", "boatstack/flow_coding_test.go": "dddcd7a85892d4fa10af42739d4c1ff265721b0313e27b6e7a1bbb019d5c3b51", "boatstack/flow_control.go": "c6a4b3db41570ab92efc7f90115414e9a86dcd26cd2b7f7999d8d171e005e82a", @@ -215,7 +215,7 @@ "boatstack/safety_test.go": "7f40f09ce5cb2b815882a529ee7d8516e82b6686fe7e600085a3c04ece58b35a", "boatstack/safety_update_publisher_test.go": "ed3f8187036623694dfe7c395cdae00fdae14609bab6124d1fdfc6fe73fa2196", "boatstack/skill_frontmatter.go": "73364df463ce828c2d005aab55f72bb92f7a34d99cf3f53d4e0cd5a4da9dbd0e", - "boatstack/skill_frontmatter_test.go": "a3ec52e7df357a72265c95dd66db15d9c0effc7e5f90f14ce69c27792ce394eb", + "boatstack/skill_frontmatter_test.go": "5ebf971d2fb0d02b2144a47883067bca7c89863e4285933dfac6f2c5816d560a", "boatstack/solution_closure_conformance_test.go": "f73e6748dac373e2a10bc9269c2f2e060bd220bb4113bd0d5ff66ca4c8e91a54", "boatstack/statemap.go": "0db3a980f2fd00538498f6599b488a6719a5ee0f0764172834165e7d9d8f8057", "boatstack/statemap_conformance_test.go": "504debd406c1b5ad6cc9cb38715dea08954ef9c258cb5f91c59fb04d1398e53e", @@ -243,10 +243,10 @@ "docs/benchmark-corpus-audit.md": "f2d206fe8579a514f9da82b2c96c19b343ac004be67617e1bd34f0f8e0e5e6c6", "docs/benchmark-submission-audit.md": "9518abdd17690729c6423f87cab20418ed47b0915b5faa44b9ef975e9e9c3b79", "docs/configuration.md": "2ceb050bb67737c725b66d7e191949c2f3b652ecbafc5e44002e99bc785114ab", - "docs/evidence-engineered-coding.md": "3e12871b4561507e4dbebca80649b22f9dc23acf8bb527d55d61f03a0b53691e", + "docs/evidence-engineered-coding.md": "e8284c01dea52bb09df673f23588944757b08c831d3d61a106c5989744525e86", "docs/generated-files.md": "8679b960bacbdf2ca7b898aa44eb3a486ebb325eca8ce9cc4e316191e7ef5087", "docs/getting-started.md": "834e6d1c33d5198743a3f896c4e205801713762dcd2fa339e47c99b532df2cf5", - "docs/public-claims.json": "d12663da575041a87cd174a1e9db780078ca9633634315922425db03d2854954", + "docs/public-claims.json": "cc6879c53a2598b02e474436d92acd7f5ea7d4f6edf88c231d9ae190f0b84c5f", "docs/public-surface.md": "713f7a050b5f339cf948299103ef3800417dccfecf2cc1a4166397ea6f978907", "docs/research-and-design.md": "8d78678108f0a6c924e1ff9b32c0f81aae9d1f779e0082843b6f99ad993ae2b6", "docs/safety.md": "1a2b84e0a4b9aa6322d35d6677ff52662c306089031295692b569233cdd94d8f", @@ -260,7 +260,7 @@ "labs/diagram-json/compiled/evidence.md": "1ba1c989ade070a8ef9a508fbd788d100d7292f2dbacbb2bce895468019f619d", "labs/diagram-json/compiled/tasks.json": "88f60851abf79d851e9fccc754ff3040034ae595306bc87d64784c19eb403e71", "labs/diagram-json/compiled/test-matrix.json": "424657ff505768e50fa113801fd8363364a18269d5297480907a993d44063a39", - "labs/diagram-json/plan.lock.json": "83e623384d3ba7a497dc22efa6cc770e281624d0c784059fc388677c19c184e9", + "labs/diagram-json/plan.lock.json": "ac9dd9b50170095d2a1c172695c0ed7e682d910eb834b106640ed2c93a436da8", "labs/diagram-json/plan.md": "3cc4f533b8d69386deff16b3a594a3ba09d4c0c3db636cccd8c4380084ce6a51", "labs/diagram-json/questions.md": "74733b015002c8a6777c558e7e997fa48c94850b9bd39054fe9366c97ecf728d", "labs/diagram-json/request.md": "0808fc41c36779c404f4a3a121167da6e76cac56df526e70f9ed6d3e0d4c02ed", @@ -415,12 +415,13 @@ "release-notes/2026-08-02-goal-driven-autonomous-run.md": "a5b66250c98ca6c23c3761bc09c81cebd02a1243de12fc6110bd1119fd8faf4a", "release-notes/2026-08-02-strengthen-screenshot-delivery.md": "2e56eeb08702f4dd58dce75e26a52fbcb7e48af0cd5dd062d4e2a204704705df", "release-notes/2026-08-04-external-authority-boundary.md": "0bc788db940f7fbc3624a01fff554d7002137e9915b10c47fd287dc1b24cdd66", + "release-notes/2026-08-05-codex-operation-skills.md": "2402adbe3ef21762418648f6ac19ba282b8c9524546369e3f8aa76ad33d2c53d", "release-notes/2026-08-05-detached-external-config.md": "b8b5ab914eae695f67c4e25deba3957894439e054b42ab93751bccb614235fda" }, "generator": "operatorstack/intelligence-flow:boatstack-distribution", "schema_version": 1, "source": { - "commit": "2b61577db37944e1b1c3aad534eeeb3b32f5eb4d", + "commit": "3c9ed10dcf0c6781023a547effb4469879b8a375", "path": "labs/12-product-engineering-loop", "repository": "operatorstack/intelligence-flow" } diff --git a/boatstack/export.go b/boatstack/export.go index f96700b..62e6942 100644 --- a/boatstack/export.go +++ b/boatstack/export.go @@ -288,6 +288,16 @@ description: %s `, spec.Name, spec.Description, argumentHint, strings.TrimSpace(operationBody), arguments) } +func codexOperationSkill(spec claudeSkillSpec, operationBody string) string { + return fmt.Sprintf(`--- +name: %s +description: %s +--- + +%s +`, spec.Name, spec.Description, strings.TrimSpace(operationBody)) +} + func BuildExportBundle(configPath string, config ProjectConfig, rawConfig []byte, adapterName string) (ExportBundle, error) { if !adapterNamePattern.MatchString(adapterName) { 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 if err != nil { return ExportBundle{}, err } + for _, spec := range claudeVisibleSkills { + extra, ok := operations[spec.Name] + if !ok { + return ExportBundle{}, fmt.Errorf("missing operation instructions for Codex skill %s", spec.Name) + } + path := fmt.Sprintf(".agents/skills/%s/SKILL.md", spec.Name) + files[path], err = GeneratedFrontmatter( + codexOperationSkill(spec, commandBody(spec.Name, extra)), + ) + if err != nil { + return ExportBundle{}, err + } + } } if contains(adapters, "github") { files[fmt.Sprintf(".github/PULL_REQUEST_TEMPLATE/%s.md", adapterName)] = GeneratedMarkdown(`# Reviewer-ready change diff --git a/boatstack/export_test.go b/boatstack/export_test.go index f7babc2..4fb5302 100644 --- a/boatstack/export_test.go +++ b/boatstack/export_test.go @@ -110,6 +110,8 @@ func TestExportAndDriftCheck(t *testing.T) { ".gemini/skills/auto-plan/SKILL.md", ".gemini/skills/boatstack-update/SKILL.md", ".agents/skills/boatstack/SKILL.md", + ".agents/skills/boatstack-run/SKILL.md", + ".agents/skills/auto-plan/SKILL.md", ".product-loop/.gitignore", ".product-loop/templates/plan.md", ".product-loop/templates/approval.md", @@ -163,6 +165,40 @@ func TestExportAndDriftCheck(t *testing.T) { } } + codexSkillPaths := map[string]bool{} + for path := range bundle.Files { + if strings.HasPrefix(path, ".agents/skills/") && strings.HasSuffix(path, "/SKILL.md") { + codexSkillPaths[path] = true + } + } + if len(codexSkillPaths) != len(claudeVisibleSkills)+1 { + t.Fatalf("generated %d Codex skills, want %d: %#v", len(codexSkillPaths), len(claudeVisibleSkills)+1, codexSkillPaths) + } + for _, spec := range claudeVisibleSkills { + path := ".agents/skills/" + spec.Name + "/SKILL.md" + skill := string(bundle.Files[path]) + for _, expected := range []string{ + "name: " + spec.Name, + "description: " + spec.Description, + "Run the " + spec.Name + " operation", + ".product-loop/workflow.md", + "User-facing response contract", + } { + if !strings.Contains(skill, expected) { + t.Fatalf("%s is missing %q", path, expected) + } + } + } + codexRun := string(bundle.Files[".agents/skills/boatstack-run/SKILL.md"]) + for _, expected := range []string{ + "If status is NOT_STARTED, route to auto-plan", + "planning and plan-gate do not require delivery preflight", + } { + if !strings.Contains(codexRun, expected) { + t.Fatalf("Codex boatstack-run skill is missing operation boundary %q", expected) + } + } + geminiSkillPaths := map[string]bool{} for path := range bundle.Files { if strings.HasPrefix(path, ".gemini/skills/") && strings.HasSuffix(path, "/SKILL.md") { @@ -495,6 +531,9 @@ func TestPortableHostAdaptersShareWorkflowAndArtifactContract(t *testing.T) { if _, exists := bundle.Files[".gemini/skills/"+spec.Name+"/SKILL.md"]; !exists { t.Fatalf("Gemini does not expose user operation %q", spec.Name) } + if _, exists := bundle.Files[".agents/skills/"+spec.Name+"/SKILL.md"]; !exists { + t.Fatalf("Codex does not expose user operation %q", spec.Name) + } } for _, expected := range []string{"source plan", "plan.md", "approval.md", "evidence", "gaps", "review", "pr.md"} { if !strings.Contains(strings.ToLower(artifacts), strings.ToLower(expected)) { diff --git a/boatstack/skill_frontmatter_test.go b/boatstack/skill_frontmatter_test.go index 7d3d988..5c4dd0d 100644 --- a/boatstack/skill_frontmatter_test.go +++ b/boatstack/skill_frontmatter_test.go @@ -34,7 +34,7 @@ func TestGeneratedSkillFrontmatterIsValidYAML(t *testing.T) { expected += len(claudeVisibleSkills) + 1 } if contains(config.Adapters, "codex") { - expected += 1 + expected += len(claudeVisibleSkills) + 1 } if skillCount != expected { t.Fatalf("validated %d generated skills, want %d", skillCount, expected) diff --git a/docs/evidence-engineered-coding.md b/docs/evidence-engineered-coding.md index c754837..9640a1f 100644 --- a/docs/evidence-engineered-coding.md +++ b/docs/evidence-engineered-coding.md @@ -146,6 +146,6 @@ Delivery and system improvement also remain separate. A failed task may suggest ## What is evidence-backed -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). +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). 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. diff --git a/docs/public-claims.json b/docs/public-claims.json index 2b3e00e..b393f0f 100644 --- a/docs/public-claims.json +++ b/docs/public-claims.json @@ -1,6 +1,6 @@ { "schema_version": 1, - "source_commit": "2b61577db37944e1b1c3aad534eeeb3b32f5eb4d", + "source_commit": "3c9ed10dcf0c6781023a547effb4469879b8a375", "statuses": ["verified", "observed", "still_being_evaluated"], "claims": [ { @@ -12,7 +12,7 @@ "readable_evidence": "why-these-steps.md#portable-workflow-and-state", "implementation": ["../boatstack/export.go", "../boatstack/references/artifacts.md", "../boatstack/references/workflow.md"], "verification": ["../boatstack/export_test.go"], - "last_verified_version": "source:2b61577db37944e1b1c3aad534eeeb3b32f5eb4d" + "last_verified_version": "source:3c9ed10dcf0c6781023a547effb4469879b8a375" }, { "id": "human-decisions", @@ -23,7 +23,7 @@ "readable_evidence": "why-these-steps.md#human-decisions", "implementation": ["../boatstack/references/workflow.md", "../boatstack/plan.go"], "verification": ["../boatstack/plan_test.go", "../boatstack/planning_test.go"], - "last_verified_version": "source:2b61577db37944e1b1c3aad534eeeb3b32f5eb4d" + "last_verified_version": "source:3c9ed10dcf0c6781023a547effb4469879b8a375" }, { "id": "validation-provenance", @@ -34,7 +34,7 @@ "readable_evidence": "why-these-steps.md#validation-provenance", "implementation": ["validation-and-evidence.md", "../boatstack/plan.go"], "verification": ["../boatstack/plan_test.go"], - "last_verified_version": "source:2b61577db37944e1b1c3aad534eeeb3b32f5eb4d" + "last_verified_version": "source:3c9ed10dcf0c6781023a547effb4469879b8a375" }, { "id": "irreversible-operations", @@ -46,7 +46,7 @@ "readable_evidence": "why-these-steps.md#irreversible-operations", "implementation": ["safety.md", "../boatstack/safety.go", "../boatstack/hooks.go"], "verification": ["../boatstack/safety_test.go", "../boatstack/hooks_test.go"], - "last_verified_version": "source:2b61577db37944e1b1c3aad534eeeb3b32f5eb4d" + "last_verified_version": "source:3c9ed10dcf0c6781023a547effb4469879b8a375" }, { "id": "reviewer-ready-pr", @@ -57,7 +57,7 @@ "readable_evidence": "why-these-steps.md#reviewer-ready-pr", "implementation": ["../boatstack/pr.go", "getting-started.md"], "verification": ["../boatstack/pr_test.go"], - "last_verified_version": "source:2b61577db37944e1b1c3aad534eeeb3b32f5eb4d" + "last_verified_version": "source:3c9ed10dcf0c6781023a547effb4469879b8a375" }, { "id": "phase-scoped-delivery", @@ -68,7 +68,7 @@ "readable_evidence": "why-these-steps.md#phase-scoped-delivery", "implementation": ["../boatstack/delivery.go", "../boatstack/safety.go", "../boatstack/hooks.go", "../boatstack/references/workflow.md"], "verification": ["../boatstack/delivery_test.go", "../boatstack/pr_test.go"], - "last_verified_version": "source:2b61577db37944e1b1c3aad534eeeb3b32f5eb4d" + "last_verified_version": "source:3c9ed10dcf0c6781023a547effb4469879b8a375" }, { "id": "model-neutral-contract", @@ -79,7 +79,7 @@ "readable_evidence": "why-these-steps.md#model-choice-and-budget", "implementation": ["research-and-design.md", "../boatstack/references/workflow.md"], "verification": ["../boatstack/export_test.go", "../boatstack/planning_test.go"], - "last_verified_version": "source:2b61577db37944e1b1c3aad534eeeb3b32f5eb4d" + "last_verified_version": "source:3c9ed10dcf0c6781023a547effb4469879b8a375" }, { "id": "cross-model-failures", @@ -90,7 +90,7 @@ "readable_evidence": "why-these-steps.md#model-choice-and-budget", "implementation": ["research-and-design.md"], "verification": ["benchmark-corpus-audit.md", "benchmark-submission-audit.md"], - "last_verified_version": "source:2b61577db37944e1b1c3aad534eeeb3b32f5eb4d" + "last_verified_version": "source:3c9ed10dcf0c6781023a547effb4469879b8a375" }, { "id": "lower-cost-outcomes", @@ -101,7 +101,7 @@ "readable_evidence": "why-these-steps.md#model-choice-and-budget", "implementation": ["research-and-design.md"], "verification": ["benchmark-corpus-audit.md", "benchmark-submission-audit.md"], - "last_verified_version": "source:2b61577db37944e1b1c3aad534eeeb3b32f5eb4d" + "last_verified_version": "source:3c9ed10dcf0c6781023a547effb4469879b8a375" }, { "id": "git-worktree-activation", @@ -112,7 +112,7 @@ "readable_evidence": "why-these-steps.md#git-worktree-activation", "implementation": ["../boatstack/runtime_cache.go", "../boatstack/hooks.go"], "verification": ["../boatstack/runtime_cache_test.go", "../boatstack/hooks_test.go"], - "last_verified_version": "source:2b61577db37944e1b1c3aad534eeeb3b32f5eb4d" + "last_verified_version": "source:3c9ed10dcf0c6781023a547effb4469879b8a375" }, { "id": "visible-updates", @@ -123,7 +123,7 @@ "readable_evidence": "why-these-steps.md#visible-updates", "implementation": ["../boatstack/update.go", "../boatstack/init.go"], "verification": ["../boatstack/update_test.go", "../boatstack/init_test.go", "../boatstack/export_test.go"], - "last_verified_version": "source:2b61577db37944e1b1c3aad534eeeb3b32f5eb4d" + "last_verified_version": "source:3c9ed10dcf0c6781023a547effb4469879b8a375" } ] } diff --git a/labs/diagram-json/plan.lock.json b/labs/diagram-json/plan.lock.json index 991e020..51da0e3 100644 --- a/labs/diagram-json/plan.lock.json +++ b/labs/diagram-json/plan.lock.json @@ -6,7 +6,7 @@ "plan_path": "labs/diagram-json/plan.md", "plan_sha256": "3cc4f533b8d69386deff16b3a594a3ba09d4c0c3db636cccd8c4380084ce6a51", "schema_version": 1, - "source_commit": "2b61577db37944e1b1c3aad534eeeb3b32f5eb4d", + "source_commit": "3c9ed10dcf0c6781023a547effb4469879b8a375", "source_plan_path": "labs/diagram-json/source-plan.md", "source_plan_sha256": "e10593ddaa7522ab80cc991d0a09399257139799e37f737794cd49d68a39985b", "spec_path": "labs/diagram-json/spec.md", diff --git a/release-notes/2026-08-05-codex-operation-skills.md b/release-notes/2026-08-05-codex-operation-skills.md new file mode 100644 index 0000000..a9c0b43 --- /dev/null +++ b/release-notes/2026-08-05-codex-operation-skills.md @@ -0,0 +1,3 @@ +### Codex receives Boatstack operation drivers + +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.