From f034cf6be5dd650e9811d5a0386250df665beb48 Mon Sep 17 00:00:00 2001 From: "operator-stack-publisher[bot]" Date: Mon, 20 Jul 2026 01:27:34 +0000 Subject: [PATCH] Sync Boatstack from Intelligence Flow Labs @ 004b6c128866 --- CONTRIBUTING.md | 2 +- UPSTREAM.json | 25 ++++---- boatstack/agents/gemini.yaml | 4 ++ boatstack/export.go | 28 ++++++++- boatstack/export_test.go | 59 ++++++++++++++++++- boatstack/skill_frontmatter.go | 2 + boatstack/skill_frontmatter_test.go | 13 +++- docs/evidence-engineered-coding.md | 2 +- docs/public-claims.json | 24 ++++---- labs/diagram-json/plan.lock.json | 2 +- project.example.json | 2 +- .../2026-07-20-gemini-cli-integration.md | 3 + .../2026-07-20-speak-software-standards.md | 3 + 13 files changed, 137 insertions(+), 32 deletions(-) create mode 100644 boatstack/agents/gemini.yaml create mode 100644 release-notes/2026-07-20-gemini-cli-integration.md create mode 100644 release-notes/2026-07-20-speak-software-standards.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 82549ed..ce3adfd 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/b5f5cd69a44fdba533c0b821c55eca08c7fd6b4f/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/004b6c1288661bbbfdcfe96c068f35e48f4c8bb3/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 44bdce0..22baec7 100644 --- a/UPSTREAM.json +++ b/UPSTREAM.json @@ -12,12 +12,13 @@ }, "files": { ".gitignore": "a7079e923a776f14f1bb3a6aa0a11a133a8e1dfb35af020f327623357b7e3957", - "CONTRIBUTING.md": "4fcfafdf6afd69be63a6b04c847e37dcd5ce225d40269519b06d54c44c09eb98", + "CONTRIBUTING.md": "c26f3f4606810e5db041f21dc48ebcc3020ba5959103cddd7a001af266a9f470", "README.md": "a840004db57a129ecd361bb0421adfe02065d86751736dd91953c8a8b178e5ef", "assets/boatstack-journey.svg": "c1f7fe2741f5e9ca66bb3fe9b103e6364ba5acbca8b7a8054768ffd85cf325ea", "assets/boatstack-mark.svg": "ec96165583b15cfd446c27049d49217973f3e9b1defa5771cc08eec0c9542ce4", "assets/boatstack-portability.svg": "ce648f5581d16586d25824d3a8132ef1b3d88b73329179173120129d4f74fd24", "boatstack/SKILL.md": "a63f88eb039c06f34ba018444871b7a0b17c43bdb3ab62f0122732f50345bd6d", + "boatstack/agents/gemini.yaml": "cbf43b387399e456fa6178f86d83e6e35567e6142ff800f8de6ffca306fa963e", "boatstack/agents/openai.yaml": "68a30a60859556c5a26e16d184594ca243a6043d99c8cf7d66b5dd6d50a93cd1", "boatstack/assets/templates/adr.md": "c577a3c1c1319061f61deb053597e6e853657022185fe28b8f733327e2a78565", "boatstack/assets/templates/approval.md": "74b0b816703a6dce3c96c8f95f981af910b020b6908e7f76cf5630778637e9f5", @@ -37,8 +38,8 @@ "boatstack/cmd/boatstack-helper/main_test.go": "ff73003b6a5157202fa09ddf1129fb13c3d79702b2e05a8721ce5a11bf5ab779", "boatstack/delivery.go": "565bc8465252a798124a29874e1aeffff16e9027d1a86715e11b3e4bc0743bd2", "boatstack/delivery_test.go": "2545c26389d330a92c11e7b09fb2342101db5d09a825a2a9e81b4ea9eea9407b", - "boatstack/export.go": "176c8e734ebc9e01d4bbe25b48ede049d9a627452260bc7fc77b6e236987a862", - "boatstack/export_test.go": "f5db74fbf344f9286fa5fe19cf591c62343f7754dc55d10129320d00af3e4a9c", + "boatstack/export.go": "44498da493987a6a5bc3a7055d06afe04e72bc99dfc70a7b32dfec6d1e5bd4fc", + "boatstack/export_test.go": "b38875e004c1a0003f8e377b25ac14e9f4898cf949e91f3d9bfd9531a2867d76", "boatstack/go.mod": "6086ef1b2a83f5696190dca692c653925f27b61f652f659fd3fca43ed54a1641", "boatstack/go.sum": "26c315c867b11b886f3c9402fce7f341f6a9115a5d61f54afbb5e1b1fb5f6017", "boatstack/hooks.go": "2b7d899f92efef8a68a160c423a46bcd6fd37daa0eba2ac8ad44ffa3dc5f88c9", @@ -70,8 +71,8 @@ "boatstack/runtime_cache_test.go": "b981467ddc9f0f562da6bff5de7a80a9fe5a433a0317541d1e48df268546ac85", "boatstack/safety.go": "7574820a1b3802b59153defb9bf11e2a0ecd3b1f86af13fe4630a99adb740e19", "boatstack/safety_test.go": "efe5990631134cf469d09e8ff1138007132006b50b8e757ff55749f0d968dec7", - "boatstack/skill_frontmatter.go": "85ba7389e5d41f52a716b912ffb6b03c81e575b0b049b2cc11f7cd45c3da93c4", - "boatstack/skill_frontmatter_test.go": "ad92021f44f09d99949bda6670a8e350af85254dee087eeb86f3815dbdf7f500", + "boatstack/skill_frontmatter.go": "73364df463ce828c2d005aab55f72bb92f7a34d99cf3f53d4e0cd5a4da9dbd0e", + "boatstack/skill_frontmatter_test.go": "a3ec52e7df357a72265c95dd66db15d9c0effc7e5f90f14ce69c27792ce394eb", "boatstack/testdata/reviewer-pr-body.md": "4c64e3788e5d61a377aeb0f797f7fc8d2316ab6e49572d15636eea7ba9e34ac4", "boatstack/testdata/safety/safe_apply.py.txt": "c9ec7fb932cf21b6aa8df597c4d4c54d6ec65e796240e49118d699f583383975", "boatstack/testdata/safety/unsafe_apply.py.txt": "42db1751865cc15c4dd69a03146b5deca8f21f916d258e433b27bbef5f884ab1", @@ -80,10 +81,10 @@ "docs/account-recovery-walkthrough.md": "676034974594a7d1a559b24dbed31d7ccc429eb81404b203ca07bbdaa19ec3d3", "docs/benchmark-corpus-audit.md": "f2d206fe8579a514f9da82b2c96c19b343ac004be67617e1bd34f0f8e0e5e6c6", "docs/benchmark-submission-audit.md": "9518abdd17690729c6423f87cab20418ed47b0915b5faa44b9ef975e9e9c3b79", - "docs/evidence-engineered-coding.md": "4d8bf35cb94a92f9b3e01872da738201aa8718b49604257300af30f75740a551", + "docs/evidence-engineered-coding.md": "3f63fc8c92a8f2069368cfbf8f7ac69a0202b05300b2c9ffaa56b70b8154a214", "docs/generated-files.md": "136422baf0c7fc2bd5100cfe0ebdb3d9d0705dfd7e7d54bf745dd1037e63492c", "docs/getting-started.md": "eacc814fdffdfa3c7d8052b7cd99a79c04da5c75d88d8b44f3fb68d9afec0316", - "docs/public-claims.json": "39aadbc4775609b8a1b95fdec54df618d1d5e9c104a0b3985478bc26c9d26afa", + "docs/public-claims.json": "44c60c3460165176cfe866d5a695ee7172c92e3192e46e69824d693d549f5d1d", "docs/public-surface.md": "713f7a050b5f339cf948299103ef3800417dccfecf2cc1a4166397ea6f978907", "docs/research-and-design.md": "d65c66e323037bda5d45aacef5d48afa6bf93da55901378891d235aca3a5684f", "docs/safety.md": "7b9b5c515d36e683767ec8d3d9d6d119ac93650b2f629d351deadd4c600ed6a6", @@ -97,13 +98,13 @@ "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": "2403efe2031f8c384d177c108837758838bfe27d5b5a4ec33ea7c30112365718", + "labs/diagram-json/plan.lock.json": "a3d49021f016d3bee5c8410f954bf328af2f53ee7288462404d03d2d00f2af10", "labs/diagram-json/plan.md": "3cc4f533b8d69386deff16b3a594a3ba09d4c0c3db636cccd8c4380084ce6a51", "labs/diagram-json/questions.md": "74733b015002c8a6777c558e7e997fa48c94850b9bd39054fe9366c97ecf728d", "labs/diagram-json/request.md": "0808fc41c36779c404f4a3a121167da6e76cac56df526e70f9ed6d3e0d4c02ed", "labs/diagram-json/source-plan.md": "e10593ddaa7522ab80cc991d0a09399257139799e37f737794cd49d68a39985b", "labs/diagram-json/spec.md": "506b12b57bef99183d8b9a87b9f1aa5e68c39b910de88d7637b2207b7b1d6bb4", - "project.example.json": "f90fa25280c75e37a7073d384f61330b0889248fd2ca263babcc57a0bb8afd09", + "project.example.json": "9952b222f5c95d1c4f4811b24284d2e1667ea197b78d34c1458a174666a2d109", "release-notes/2026-07-17-delivery-harness-framing.md": "6fccbe7efdb288f5eca7e824ee5e44ad6b30a34f312eb997dca6aa44c55b26cb", "release-notes/2026-07-17-phase-scoped-delivery.md": "bfc8edd30a67daf5940ad4ceceebf81d01d62914ebeabb7073985c53f13df2ff", "release-notes/2026-07-17-visible-release-messages.md": "c93e8c812528a983502263e35d66c86a265d6ccba8203f393788c069b3fa6606", @@ -128,12 +129,14 @@ "release-notes/2026-07-19-minimal-dated-changelogs.md": "6f525e5c5cf26cc72969a161bbdaeb4a5c1f14759c5985335e97e3d3f45b1daf", "release-notes/2026-07-19-new-worktree-intent.md": "969beaf8ef7c0635fb45a816cf762a7f66e5ea20b45847a564ee53153863b120", "release-notes/2026-07-19-optional-repository-changelog.md": "7ae6bed436c269335ac5055e04438489451bef00836fecb3e5fcb06a18501853", - "release-notes/2026-07-19-valid-skill-frontmatter.md": "a0a002f7891474d7d1eea49e3234cae5ddbd941158726b83555dc48474181a92" + "release-notes/2026-07-19-valid-skill-frontmatter.md": "a0a002f7891474d7d1eea49e3234cae5ddbd941158726b83555dc48474181a92", + "release-notes/2026-07-20-gemini-cli-integration.md": "d829b4fafb3a02dd766e018558b20bf1bc948dd5e337911d6a7c8b54c83c9942", + "release-notes/2026-07-20-speak-software-standards.md": "a8890ed7eb38868bdf3035572d71785ca89abd3ffc3a314a5dc5315150afe397" }, "generator": "operatorstack/intelligence-flow:boatstack-distribution", "schema_version": 1, "source": { - "commit": "b5f5cd69a44fdba533c0b821c55eca08c7fd6b4f", + "commit": "004b6c1288661bbbfdcfe96c068f35e48f4c8bb3", "path": "labs/12-product-engineering-loop", "repository": "operatorstack/intelligence-flow" } diff --git a/boatstack/agents/gemini.yaml b/boatstack/agents/gemini.yaml new file mode 100644 index 0000000..66c81f4 --- /dev/null +++ b/boatstack/agents/gemini.yaml @@ -0,0 +1,4 @@ +interface: + display_name: "Boatstack (Gemini)" + short_description: "Build freely; approve, verify, review, and ship with evidence using Gemini CLI." + default_prompt: "Use $boatstack as an evidence-engineered coding node: keep implementation tactics open and require evidence for approval, completion, review, and shipping." diff --git a/boatstack/export.go b/boatstack/export.go index 368dfbc..a37179b 100644 --- a/boatstack/export.go +++ b/boatstack/export.go @@ -16,6 +16,7 @@ var allowedAdapters = map[string]bool{ "cursor": true, "claude": true, "codex": true, + "gemini": true, "github": true, } @@ -114,7 +115,7 @@ func ValidateConfig(config ProjectConfig) error { func normalizedAdapters(adapters []string) []string { if len(adapters) == 0 { - return []string{"claude", "codex", "cursor", "github"} + return []string{"claude", "codex", "cursor", "gemini", "github"} } seen := map[string]bool{} for _, adapter := range adapters { @@ -335,6 +336,31 @@ If gstack is enabled, use only its namespaced /gstack-* specialist lenses inside } } } + if contains(adapters, "gemini") { + geminiAdapterSkill := strings.Replace( + adapterSkill, + "\n---\n\n# Boatstack adapter", + "\nuser-invocable: false\n---\n\n# Boatstack adapter", + 1, + ) + files[fmt.Sprintf(".gemini/skills/%s/SKILL.md", adapterName)], err = GeneratedFrontmatter(geminiAdapterSkill) + 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 Gemini skill %s", spec.Name) + } + path := fmt.Sprintf(".gemini/skills/%s/SKILL.md", spec.Name) + files[path], err = GeneratedFrontmatter( + claudeOperationSkill(spec, commandBody(spec.Name, extra)), + ) + if err != nil { + return ExportBundle{}, err + } + } + } if contains(adapters, "codex") { codexAdapterSkill := strings.Replace( adapterSkill, diff --git a/boatstack/export_test.go b/boatstack/export_test.go index 1b958db..81045af 100644 --- a/boatstack/export_test.go +++ b/boatstack/export_test.go @@ -66,7 +66,7 @@ func testConfig() ProjectConfig { Name: "fixture", Commands: map[string]string{"test": "go test ./..."}, }, Workflow: Workflow{HumanPlanApproval: true, IndependentReviewForHighRisk: true, AllowPassWithGaps: true}, - Adapters: []string{"cursor", "claude", "codex", "github"}, + Adapters: []string{"cursor", "claude", "codex", "gemini", "github"}, Integrations: map[string]IntegrationState{ "gstack": {Requested: false, Version: GStackRef}, "spec-kit": {Requested: false, Version: SpecKitVersion}, @@ -106,6 +106,9 @@ func TestExportAndDriftCheck(t *testing.T) { ".claude/skills/boatstack/SKILL.md", ".claude/skills/auto-plan/SKILL.md", ".claude/skills/boatstack-update/SKILL.md", + ".gemini/skills/boatstack/SKILL.md", + ".gemini/skills/auto-plan/SKILL.md", + ".gemini/skills/boatstack-update/SKILL.md", ".agents/skills/boatstack/SKILL.md", ".product-loop/.gitignore", ".product-loop/templates/plan.md", @@ -159,6 +162,48 @@ func TestExportAndDriftCheck(t *testing.T) { t.Fatalf("internal or alias operation must not be a visible Claude skill: %s", path) } } + + geminiSkillPaths := map[string]bool{} + for path := range bundle.Files { + if strings.HasPrefix(path, ".gemini/skills/") && strings.HasSuffix(path, "/SKILL.md") { + geminiSkillPaths[path] = true + } + } + if len(geminiSkillPaths) != len(claudeVisibleSkills)+1 { + t.Fatalf("generated %d Gemini skills, want %d: %#v", len(geminiSkillPaths), len(claudeVisibleSkills)+1, geminiSkillPaths) + } + for _, spec := range claudeVisibleSkills { + path := ".gemini/skills/" + spec.Name + "/SKILL.md" + skill := string(bundle.Files[path]) + for _, expected := range []string{ + "name: " + spec.Name, + "description: " + spec.Description, + "disable-model-invocation: true", + "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) + } + } + } + geminiAutoPlan := string(bundle.Files[".gemini/skills/auto-plan/SKILL.md"]) + for _, expected := range []string{`argument-hint: "[plan-file]"`, "$ARGUMENTS", "/auto-plan "} { + if !strings.Contains(geminiAutoPlan, expected) { + t.Fatalf("Gemini auto-plan skill is missing argument behavior %q", expected) + } + } + geminiRouter := string(bundle.Files[".gemini/skills/boatstack/SKILL.md"]) + if !strings.Contains(geminiRouter, "user-invocable: false") || strings.Contains(geminiRouter, "disable-model-invocation: true") { + t.Fatal("Gemini Boatstack router must be hidden from users but available to the model") + } + for _, operation := range []string{"retro", "review", "ship"} { + path := ".gemini/skills/" + operation + "/SKILL.md" + if geminiSkillPaths[path] { + t.Fatalf("internal or alias operation must not be a visible Gemini skill: %s", path) + } + } if _, exists := bundle.Files[".product-loop/tools/approve_plan.py"]; exists { t.Fatal("public export must not contain Python runtime tools") } @@ -296,7 +341,7 @@ func TestExportAndDriftCheck(t *testing.T) { t.Fatalf("run adapter is missing startup recovery rule %q", expected) } } - for _, path := range []string{".claude/skills/boatstack/SKILL.md", ".agents/skills/boatstack/SKILL.md"} { + for _, path := range []string{".claude/skills/boatstack/SKILL.md", ".gemini/skills/boatstack/SKILL.md", ".agents/skills/boatstack/SKILL.md"} { router := string(bundle.Files[path]) if !strings.Contains(router, "automatically use repair") || !strings.Contains(router, "active managed delivery") { t.Fatalf("%s does not auto-route free-form delivery changes", path) @@ -369,7 +414,7 @@ func TestExportAndDriftCheck(t *testing.T) { t.Fatalf("canonical workflow is missing safety boundary %q", expected) } } - for _, path := range []string{".agents/skills/boatstack/SKILL.md", ".claude/skills/boatstack/SKILL.md"} { + for _, path := range []string{".agents/skills/boatstack/SKILL.md", ".claude/skills/boatstack/SKILL.md", ".gemini/skills/boatstack/SKILL.md"} { adapter := string(bundle.Files[path]) for _, expected := range []string{"User-facing response contract", "exactly one Next step", "a approves the pending plan", "o opens the currently previewed feature/ad-hoc/update PR", "u updates the currently previewed existing PR", "r accepts every recommendation", "Bracketed forms such as [o]", "Continue accepting approve, open PR, update PR, and open update PR for compatibility", "do not advertise them in user-facing responses", "Never interpret r as plan approval, PR publication, identity, secret input, permission escalation, policy bypass, destructive recovery authorization", "1a/1b/1c and 2a/2b/2c", "exactly one recommendation", "Echo the selected question-to-answer mapping", "filesystem username", "Never create or advertise a /pr-brief command", "state-scoped o to open or u to update", "boatstack-update"} { if !strings.Contains(adapter, expected) { @@ -427,6 +472,9 @@ func TestPortableHostAdaptersShareWorkflowAndArtifactContract(t *testing.T) { if _, exists := bundle.Files[".claude/skills/"+spec.Name+"/SKILL.md"]; !exists { t.Fatalf("Claude does not expose user operation %q", spec.Name) } + if _, exists := bundle.Files[".gemini/skills/"+spec.Name+"/SKILL.md"]; !exists { + t.Fatalf("Gemini 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)) { @@ -437,6 +485,7 @@ func TestPortableHostAdaptersShareWorkflowAndArtifactContract(t *testing.T) { hostSurfaces := map[string]string{ "cursor": string(bundle.Files[".cursor/rules/boatstack.mdc"]), "claude": string(bundle.Files[".claude/skills/boatstack/SKILL.md"]), + "gemini": string(bundle.Files[".gemini/skills/boatstack/SKILL.md"]), "codex": string(bundle.Files[".agents/skills/boatstack/SKILL.md"]), } for host, surface := range hostSurfaces { @@ -453,6 +502,9 @@ func TestPortableHostAdaptersShareWorkflowAndArtifactContract(t *testing.T) { if !strings.Contains(hostSurfaces["claude"], operation) { t.Fatalf("Claude natural-language router does not declare portable operation %q", operation) } + if !strings.Contains(hostSurfaces["gemini"], operation) { + t.Fatalf("Gemini natural-language router does not declare portable operation %q", operation) + } } } @@ -460,6 +512,7 @@ func TestExportRefusesUserOwnedCollision(t *testing.T) { for _, relative := range []string{ ".cursor/rules/boatstack.mdc", ".claude/skills/auto-plan/SKILL.md", + ".gemini/skills/auto-plan/SKILL.md", } { t.Run(relative, func(t *testing.T) { repo := t.TempDir() diff --git a/boatstack/skill_frontmatter.go b/boatstack/skill_frontmatter.go index 4558a4d..afbc819 100644 --- a/boatstack/skill_frontmatter.go +++ b/boatstack/skill_frontmatter.go @@ -111,6 +111,8 @@ func skillFieldsForPath(path string) (map[string]string, error) { return codexSkillFields, nil case strings.HasPrefix(path, ".claude/skills/"): return claudeSkillFields, nil + case strings.HasPrefix(path, ".gemini/skills/"): + return claudeSkillFields, nil default: return nil, fmt.Errorf("unsupported generated skill path") } diff --git a/boatstack/skill_frontmatter_test.go b/boatstack/skill_frontmatter_test.go index 644d4eb..7d3d988 100644 --- a/boatstack/skill_frontmatter_test.go +++ b/boatstack/skill_frontmatter_test.go @@ -26,7 +26,17 @@ func TestGeneratedSkillFrontmatterIsValidYAML(t *testing.T) { t.Errorf("%s has invalid frontmatter: %v", path, err) } } - if expected := len(claudeVisibleSkills) + 2; skillCount != expected { + expected := 0 + if contains(config.Adapters, "claude") { + expected += len(claudeVisibleSkills) + 1 + } + if contains(config.Adapters, "gemini") { + expected += len(claudeVisibleSkills) + 1 + } + if contains(config.Adapters, "codex") { + expected += 1 + } + if skillCount != expected { t.Fatalf("validated %d generated skills, want %d", skillCount, expected) } } @@ -45,6 +55,7 @@ func TestBoatstackRoutersHaveUnindentedTopLevelKeys(t *testing.T) { for _, path := range []string{ ".agents/skills/boatstack/SKILL.md", ".claude/skills/boatstack/SKILL.md", + ".gemini/skills/boatstack/SKILL.md", } { frontmatter := skillFrontmatterForTest(t, bundle.Files[path]) if !strings.Contains(frontmatter, "\ndescription: Use when") { diff --git a/docs/evidence-engineered-coding.md b/docs/evidence-engineered-coding.md index af2fb77..cfc596f 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 [`b5f5cd69a44fdba533c0b821c55eca08c7fd6b4f`](https://github.com/operatorstack/intelligence-flow/tree/b5f5cd69a44fdba533c0b821c55eca08c7fd6b4f/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 [`004b6c1288661bbbfdcfe96c068f35e48f4c8bb3`](https://github.com/operatorstack/intelligence-flow/tree/004b6c1288661bbbfdcfe96c068f35e48f4c8bb3/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 c719a80..cd08cc8 100644 --- a/docs/public-claims.json +++ b/docs/public-claims.json @@ -1,6 +1,6 @@ { "schema_version": 1, - "source_commit": "b5f5cd69a44fdba533c0b821c55eca08c7fd6b4f", + "source_commit": "004b6c1288661bbbfdcfe96c068f35e48f4c8bb3", "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:b5f5cd69a44fdba533c0b821c55eca08c7fd6b4f" + "last_verified_version": "source:004b6c1288661bbbfdcfe96c068f35e48f4c8bb3" }, { "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:b5f5cd69a44fdba533c0b821c55eca08c7fd6b4f" + "last_verified_version": "source:004b6c1288661bbbfdcfe96c068f35e48f4c8bb3" }, { "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:b5f5cd69a44fdba533c0b821c55eca08c7fd6b4f" + "last_verified_version": "source:004b6c1288661bbbfdcfe96c068f35e48f4c8bb3" }, { "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:b5f5cd69a44fdba533c0b821c55eca08c7fd6b4f" + "last_verified_version": "source:004b6c1288661bbbfdcfe96c068f35e48f4c8bb3" }, { "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:b5f5cd69a44fdba533c0b821c55eca08c7fd6b4f" + "last_verified_version": "source:004b6c1288661bbbfdcfe96c068f35e48f4c8bb3" }, { "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:b5f5cd69a44fdba533c0b821c55eca08c7fd6b4f" + "last_verified_version": "source:004b6c1288661bbbfdcfe96c068f35e48f4c8bb3" }, { "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:b5f5cd69a44fdba533c0b821c55eca08c7fd6b4f" + "last_verified_version": "source:004b6c1288661bbbfdcfe96c068f35e48f4c8bb3" }, { "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:b5f5cd69a44fdba533c0b821c55eca08c7fd6b4f" + "last_verified_version": "source:004b6c1288661bbbfdcfe96c068f35e48f4c8bb3" }, { "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:b5f5cd69a44fdba533c0b821c55eca08c7fd6b4f" + "last_verified_version": "source:004b6c1288661bbbfdcfe96c068f35e48f4c8bb3" }, { "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:b5f5cd69a44fdba533c0b821c55eca08c7fd6b4f" + "last_verified_version": "source:004b6c1288661bbbfdcfe96c068f35e48f4c8bb3" }, { "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:b5f5cd69a44fdba533c0b821c55eca08c7fd6b4f" + "last_verified_version": "source:004b6c1288661bbbfdcfe96c068f35e48f4c8bb3" } ] } diff --git a/labs/diagram-json/plan.lock.json b/labs/diagram-json/plan.lock.json index 8d15109..1b6cddc 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": "b5f5cd69a44fdba533c0b821c55eca08c7fd6b4f", + "source_commit": "004b6c1288661bbbfdcfe96c068f35e48f4c8bb3", "source_plan_path": "labs/diagram-json/source-plan.md", "source_plan_sha256": "e10593ddaa7522ab80cc991d0a09399257139799e37f737794cd49d68a39985b", "spec_path": "labs/diagram-json/spec.md", diff --git a/project.example.json b/project.example.json index b65c709..b8c0781 100644 --- a/project.example.json +++ b/project.example.json @@ -37,5 +37,5 @@ "version": "v0.12.16" } }, - "adapters": ["cursor", "claude", "codex", "github"] + "adapters": ["cursor", "claude", "codex", "gemini", "github"] } diff --git a/release-notes/2026-07-20-gemini-cli-integration.md b/release-notes/2026-07-20-gemini-cli-integration.md new file mode 100644 index 0000000..a767fc7 --- /dev/null +++ b/release-notes/2026-07-20-gemini-cli-integration.md @@ -0,0 +1,3 @@ +### Integrate Gemini CLI into Boatstack as a first-class supported adapter + +Gemini CLI is now fully supported as a first-class adapter for Boatstack. The local projector automatically packages and brands the `gemini.yaml` agent configuration, and exports the full suite of interactive, visible `boatstack-` skills under `.gemini/skills/` to provide a seamless, native conversational delivery and repair experience within the Gemini CLI environment. diff --git a/release-notes/2026-07-20-speak-software-standards.md b/release-notes/2026-07-20-speak-software-standards.md new file mode 100644 index 0000000..554225c --- /dev/null +++ b/release-notes/2026-07-20-speak-software-standards.md @@ -0,0 +1,3 @@ +### Document 'speak software' standards for published artifacts + +The developer documentation has been updated to codify the "speak software" standard for all published and projected distribution artifacts. Developers are instructed that any changes affecting Boatstack or Pitot must be accompanied by precise, append-only release note fragments under their respective `release-notes/` directories to maintain a faithful and programmatically verifiable record of changes.