Skip to content

Commit f034cf6

Browse files
Sync Boatstack from Intelligence Flow Labs @ 004b6c128866
1 parent eb2820e commit f034cf6

13 files changed

Lines changed: 137 additions & 32 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/b5f5cd69a44fdba533c0b821c55eca08c7fd6b4f/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/004b6c1288661bbbfdcfe96c068f35e48f4c8bb3/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: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,13 @@
1212
},
1313
"files": {
1414
".gitignore": "a7079e923a776f14f1bb3a6aa0a11a133a8e1dfb35af020f327623357b7e3957",
15-
"CONTRIBUTING.md": "4fcfafdf6afd69be63a6b04c847e37dcd5ce225d40269519b06d54c44c09eb98",
15+
"CONTRIBUTING.md": "c26f3f4606810e5db041f21dc48ebcc3020ba5959103cddd7a001af266a9f470",
1616
"README.md": "a840004db57a129ecd361bb0421adfe02065d86751736dd91953c8a8b178e5ef",
1717
"assets/boatstack-journey.svg": "c1f7fe2741f5e9ca66bb3fe9b103e6364ba5acbca8b7a8054768ffd85cf325ea",
1818
"assets/boatstack-mark.svg": "ec96165583b15cfd446c27049d49217973f3e9b1defa5771cc08eec0c9542ce4",
1919
"assets/boatstack-portability.svg": "ce648f5581d16586d25824d3a8132ef1b3d88b73329179173120129d4f74fd24",
2020
"boatstack/SKILL.md": "a63f88eb039c06f34ba018444871b7a0b17c43bdb3ab62f0122732f50345bd6d",
21+
"boatstack/agents/gemini.yaml": "cbf43b387399e456fa6178f86d83e6e35567e6142ff800f8de6ffca306fa963e",
2122
"boatstack/agents/openai.yaml": "68a30a60859556c5a26e16d184594ca243a6043d99c8cf7d66b5dd6d50a93cd1",
2223
"boatstack/assets/templates/adr.md": "c577a3c1c1319061f61deb053597e6e853657022185fe28b8f733327e2a78565",
2324
"boatstack/assets/templates/approval.md": "74b0b816703a6dce3c96c8f95f981af910b020b6908e7f76cf5630778637e9f5",
@@ -37,8 +38,8 @@
3738
"boatstack/cmd/boatstack-helper/main_test.go": "ff73003b6a5157202fa09ddf1129fb13c3d79702b2e05a8721ce5a11bf5ab779",
3839
"boatstack/delivery.go": "565bc8465252a798124a29874e1aeffff16e9027d1a86715e11b3e4bc0743bd2",
3940
"boatstack/delivery_test.go": "2545c26389d330a92c11e7b09fb2342101db5d09a825a2a9e81b4ea9eea9407b",
40-
"boatstack/export.go": "176c8e734ebc9e01d4bbe25b48ede049d9a627452260bc7fc77b6e236987a862",
41-
"boatstack/export_test.go": "f5db74fbf344f9286fa5fe19cf591c62343f7754dc55d10129320d00af3e4a9c",
41+
"boatstack/export.go": "44498da493987a6a5bc3a7055d06afe04e72bc99dfc70a7b32dfec6d1e5bd4fc",
42+
"boatstack/export_test.go": "b38875e004c1a0003f8e377b25ac14e9f4898cf949e91f3d9bfd9531a2867d76",
4243
"boatstack/go.mod": "6086ef1b2a83f5696190dca692c653925f27b61f652f659fd3fca43ed54a1641",
4344
"boatstack/go.sum": "26c315c867b11b886f3c9402fce7f341f6a9115a5d61f54afbb5e1b1fb5f6017",
4445
"boatstack/hooks.go": "2b7d899f92efef8a68a160c423a46bcd6fd37daa0eba2ac8ad44ffa3dc5f88c9",
@@ -70,8 +71,8 @@
7071
"boatstack/runtime_cache_test.go": "b981467ddc9f0f562da6bff5de7a80a9fe5a433a0317541d1e48df268546ac85",
7172
"boatstack/safety.go": "7574820a1b3802b59153defb9bf11e2a0ecd3b1f86af13fe4630a99adb740e19",
7273
"boatstack/safety_test.go": "efe5990631134cf469d09e8ff1138007132006b50b8e757ff55749f0d968dec7",
73-
"boatstack/skill_frontmatter.go": "85ba7389e5d41f52a716b912ffb6b03c81e575b0b049b2cc11f7cd45c3da93c4",
74-
"boatstack/skill_frontmatter_test.go": "ad92021f44f09d99949bda6670a8e350af85254dee087eeb86f3815dbdf7f500",
74+
"boatstack/skill_frontmatter.go": "73364df463ce828c2d005aab55f72bb92f7a34d99cf3f53d4e0cd5a4da9dbd0e",
75+
"boatstack/skill_frontmatter_test.go": "a3ec52e7df357a72265c95dd66db15d9c0effc7e5f90f14ce69c27792ce394eb",
7576
"boatstack/testdata/reviewer-pr-body.md": "4c64e3788e5d61a377aeb0f797f7fc8d2316ab6e49572d15636eea7ba9e34ac4",
7677
"boatstack/testdata/safety/safe_apply.py.txt": "c9ec7fb932cf21b6aa8df597c4d4c54d6ec65e796240e49118d699f583383975",
7778
"boatstack/testdata/safety/unsafe_apply.py.txt": "42db1751865cc15c4dd69a03146b5deca8f21f916d258e433b27bbef5f884ab1",
@@ -80,10 +81,10 @@
8081
"docs/account-recovery-walkthrough.md": "676034974594a7d1a559b24dbed31d7ccc429eb81404b203ca07bbdaa19ec3d3",
8182
"docs/benchmark-corpus-audit.md": "f2d206fe8579a514f9da82b2c96c19b343ac004be67617e1bd34f0f8e0e5e6c6",
8283
"docs/benchmark-submission-audit.md": "9518abdd17690729c6423f87cab20418ed47b0915b5faa44b9ef975e9e9c3b79",
83-
"docs/evidence-engineered-coding.md": "4d8bf35cb94a92f9b3e01872da738201aa8718b49604257300af30f75740a551",
84+
"docs/evidence-engineered-coding.md": "3f63fc8c92a8f2069368cfbf8f7ac69a0202b05300b2c9ffaa56b70b8154a214",
8485
"docs/generated-files.md": "136422baf0c7fc2bd5100cfe0ebdb3d9d0705dfd7e7d54bf745dd1037e63492c",
8586
"docs/getting-started.md": "eacc814fdffdfa3c7d8052b7cd99a79c04da5c75d88d8b44f3fb68d9afec0316",
86-
"docs/public-claims.json": "39aadbc4775609b8a1b95fdec54df618d1d5e9c104a0b3985478bc26c9d26afa",
87+
"docs/public-claims.json": "44c60c3460165176cfe866d5a695ee7172c92e3192e46e69824d693d549f5d1d",
8788
"docs/public-surface.md": "713f7a050b5f339cf948299103ef3800417dccfecf2cc1a4166397ea6f978907",
8889
"docs/research-and-design.md": "d65c66e323037bda5d45aacef5d48afa6bf93da55901378891d235aca3a5684f",
8990
"docs/safety.md": "7b9b5c515d36e683767ec8d3d9d6d119ac93650b2f629d351deadd4c600ed6a6",
@@ -97,13 +98,13 @@
9798
"labs/diagram-json/compiled/evidence.md": "1ba1c989ade070a8ef9a508fbd788d100d7292f2dbacbb2bce895468019f619d",
9899
"labs/diagram-json/compiled/tasks.json": "88f60851abf79d851e9fccc754ff3040034ae595306bc87d64784c19eb403e71",
99100
"labs/diagram-json/compiled/test-matrix.json": "424657ff505768e50fa113801fd8363364a18269d5297480907a993d44063a39",
100-
"labs/diagram-json/plan.lock.json": "2403efe2031f8c384d177c108837758838bfe27d5b5a4ec33ea7c30112365718",
101+
"labs/diagram-json/plan.lock.json": "a3d49021f016d3bee5c8410f954bf328af2f53ee7288462404d03d2d00f2af10",
101102
"labs/diagram-json/plan.md": "3cc4f533b8d69386deff16b3a594a3ba09d4c0c3db636cccd8c4380084ce6a51",
102103
"labs/diagram-json/questions.md": "74733b015002c8a6777c558e7e997fa48c94850b9bd39054fe9366c97ecf728d",
103104
"labs/diagram-json/request.md": "0808fc41c36779c404f4a3a121167da6e76cac56df526e70f9ed6d3e0d4c02ed",
104105
"labs/diagram-json/source-plan.md": "e10593ddaa7522ab80cc991d0a09399257139799e37f737794cd49d68a39985b",
105106
"labs/diagram-json/spec.md": "506b12b57bef99183d8b9a87b9f1aa5e68c39b910de88d7637b2207b7b1d6bb4",
106-
"project.example.json": "f90fa25280c75e37a7073d384f61330b0889248fd2ca263babcc57a0bb8afd09",
107+
"project.example.json": "9952b222f5c95d1c4f4811b24284d2e1667ea197b78d34c1458a174666a2d109",
107108
"release-notes/2026-07-17-delivery-harness-framing.md": "6fccbe7efdb288f5eca7e824ee5e44ad6b30a34f312eb997dca6aa44c55b26cb",
108109
"release-notes/2026-07-17-phase-scoped-delivery.md": "bfc8edd30a67daf5940ad4ceceebf81d01d62914ebeabb7073985c53f13df2ff",
109110
"release-notes/2026-07-17-visible-release-messages.md": "c93e8c812528a983502263e35d66c86a265d6ccba8203f393788c069b3fa6606",
@@ -128,12 +129,14 @@
128129
"release-notes/2026-07-19-minimal-dated-changelogs.md": "6f525e5c5cf26cc72969a161bbdaeb4a5c1f14759c5985335e97e3d3f45b1daf",
129130
"release-notes/2026-07-19-new-worktree-intent.md": "969beaf8ef7c0635fb45a816cf762a7f66e5ea20b45847a564ee53153863b120",
130131
"release-notes/2026-07-19-optional-repository-changelog.md": "7ae6bed436c269335ac5055e04438489451bef00836fecb3e5fcb06a18501853",
131-
"release-notes/2026-07-19-valid-skill-frontmatter.md": "a0a002f7891474d7d1eea49e3234cae5ddbd941158726b83555dc48474181a92"
132+
"release-notes/2026-07-19-valid-skill-frontmatter.md": "a0a002f7891474d7d1eea49e3234cae5ddbd941158726b83555dc48474181a92",
133+
"release-notes/2026-07-20-gemini-cli-integration.md": "d829b4fafb3a02dd766e018558b20bf1bc948dd5e337911d6a7c8b54c83c9942",
134+
"release-notes/2026-07-20-speak-software-standards.md": "a8890ed7eb38868bdf3035572d71785ca89abd3ffc3a314a5dc5315150afe397"
132135
},
133136
"generator": "operatorstack/intelligence-flow:boatstack-distribution",
134137
"schema_version": 1,
135138
"source": {
136-
"commit": "b5f5cd69a44fdba533c0b821c55eca08c7fd6b4f",
139+
"commit": "004b6c1288661bbbfdcfe96c068f35e48f4c8bb3",
137140
"path": "labs/12-product-engineering-loop",
138141
"repository": "operatorstack/intelligence-flow"
139142
}

boatstack/agents/gemini.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
interface:
2+
display_name: "Boatstack (Gemini)"
3+
short_description: "Build freely; approve, verify, review, and ship with evidence using Gemini CLI."
4+
default_prompt: "Use $boatstack as an evidence-engineered coding node: keep implementation tactics open and require evidence for approval, completion, review, and shipping."

boatstack/export.go

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ var allowedAdapters = map[string]bool{
1616
"cursor": true,
1717
"claude": true,
1818
"codex": true,
19+
"gemini": true,
1920
"github": true,
2021
}
2122

@@ -114,7 +115,7 @@ func ValidateConfig(config ProjectConfig) error {
114115

115116
func normalizedAdapters(adapters []string) []string {
116117
if len(adapters) == 0 {
117-
return []string{"claude", "codex", "cursor", "github"}
118+
return []string{"claude", "codex", "cursor", "gemini", "github"}
118119
}
119120
seen := map[string]bool{}
120121
for _, adapter := range adapters {
@@ -335,6 +336,31 @@ If gstack is enabled, use only its namespaced /gstack-* specialist lenses inside
335336
}
336337
}
337338
}
339+
if contains(adapters, "gemini") {
340+
geminiAdapterSkill := strings.Replace(
341+
adapterSkill,
342+
"\n---\n\n# Boatstack adapter",
343+
"\nuser-invocable: false\n---\n\n# Boatstack adapter",
344+
1,
345+
)
346+
files[fmt.Sprintf(".gemini/skills/%s/SKILL.md", adapterName)], err = GeneratedFrontmatter(geminiAdapterSkill)
347+
if err != nil {
348+
return ExportBundle{}, err
349+
}
350+
for _, spec := range claudeVisibleSkills {
351+
extra, ok := operations[spec.Name]
352+
if !ok {
353+
return ExportBundle{}, fmt.Errorf("missing operation instructions for Gemini skill %s", spec.Name)
354+
}
355+
path := fmt.Sprintf(".gemini/skills/%s/SKILL.md", spec.Name)
356+
files[path], err = GeneratedFrontmatter(
357+
claudeOperationSkill(spec, commandBody(spec.Name, extra)),
358+
)
359+
if err != nil {
360+
return ExportBundle{}, err
361+
}
362+
}
363+
}
338364
if contains(adapters, "codex") {
339365
codexAdapterSkill := strings.Replace(
340366
adapterSkill,

boatstack/export_test.go

Lines changed: 56 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ func testConfig() ProjectConfig {
6666
Name: "fixture", Commands: map[string]string{"test": "go test ./..."},
6767
},
6868
Workflow: Workflow{HumanPlanApproval: true, IndependentReviewForHighRisk: true, AllowPassWithGaps: true},
69-
Adapters: []string{"cursor", "claude", "codex", "github"},
69+
Adapters: []string{"cursor", "claude", "codex", "gemini", "github"},
7070
Integrations: map[string]IntegrationState{
7171
"gstack": {Requested: false, Version: GStackRef},
7272
"spec-kit": {Requested: false, Version: SpecKitVersion},
@@ -106,6 +106,9 @@ func TestExportAndDriftCheck(t *testing.T) {
106106
".claude/skills/boatstack/SKILL.md",
107107
".claude/skills/auto-plan/SKILL.md",
108108
".claude/skills/boatstack-update/SKILL.md",
109+
".gemini/skills/boatstack/SKILL.md",
110+
".gemini/skills/auto-plan/SKILL.md",
111+
".gemini/skills/boatstack-update/SKILL.md",
109112
".agents/skills/boatstack/SKILL.md",
110113
".product-loop/.gitignore",
111114
".product-loop/templates/plan.md",
@@ -159,6 +162,48 @@ func TestExportAndDriftCheck(t *testing.T) {
159162
t.Fatalf("internal or alias operation must not be a visible Claude skill: %s", path)
160163
}
161164
}
165+
166+
geminiSkillPaths := map[string]bool{}
167+
for path := range bundle.Files {
168+
if strings.HasPrefix(path, ".gemini/skills/") && strings.HasSuffix(path, "/SKILL.md") {
169+
geminiSkillPaths[path] = true
170+
}
171+
}
172+
if len(geminiSkillPaths) != len(claudeVisibleSkills)+1 {
173+
t.Fatalf("generated %d Gemini skills, want %d: %#v", len(geminiSkillPaths), len(claudeVisibleSkills)+1, geminiSkillPaths)
174+
}
175+
for _, spec := range claudeVisibleSkills {
176+
path := ".gemini/skills/" + spec.Name + "/SKILL.md"
177+
skill := string(bundle.Files[path])
178+
for _, expected := range []string{
179+
"name: " + spec.Name,
180+
"description: " + spec.Description,
181+
"disable-model-invocation: true",
182+
"Run the " + spec.Name + " operation",
183+
".product-loop/workflow.md",
184+
"User-facing response contract",
185+
} {
186+
if !strings.Contains(skill, expected) {
187+
t.Fatalf("%s is missing %q", path, expected)
188+
}
189+
}
190+
}
191+
geminiAutoPlan := string(bundle.Files[".gemini/skills/auto-plan/SKILL.md"])
192+
for _, expected := range []string{`argument-hint: "[plan-file]"`, "$ARGUMENTS", "/auto-plan <plan-file>"} {
193+
if !strings.Contains(geminiAutoPlan, expected) {
194+
t.Fatalf("Gemini auto-plan skill is missing argument behavior %q", expected)
195+
}
196+
}
197+
geminiRouter := string(bundle.Files[".gemini/skills/boatstack/SKILL.md"])
198+
if !strings.Contains(geminiRouter, "user-invocable: false") || strings.Contains(geminiRouter, "disable-model-invocation: true") {
199+
t.Fatal("Gemini Boatstack router must be hidden from users but available to the model")
200+
}
201+
for _, operation := range []string{"retro", "review", "ship"} {
202+
path := ".gemini/skills/" + operation + "/SKILL.md"
203+
if geminiSkillPaths[path] {
204+
t.Fatalf("internal or alias operation must not be a visible Gemini skill: %s", path)
205+
}
206+
}
162207
if _, exists := bundle.Files[".product-loop/tools/approve_plan.py"]; exists {
163208
t.Fatal("public export must not contain Python runtime tools")
164209
}
@@ -296,7 +341,7 @@ func TestExportAndDriftCheck(t *testing.T) {
296341
t.Fatalf("run adapter is missing startup recovery rule %q", expected)
297342
}
298343
}
299-
for _, path := range []string{".claude/skills/boatstack/SKILL.md", ".agents/skills/boatstack/SKILL.md"} {
344+
for _, path := range []string{".claude/skills/boatstack/SKILL.md", ".gemini/skills/boatstack/SKILL.md", ".agents/skills/boatstack/SKILL.md"} {
300345
router := string(bundle.Files[path])
301346
if !strings.Contains(router, "automatically use repair") || !strings.Contains(router, "active managed delivery") {
302347
t.Fatalf("%s does not auto-route free-form delivery changes", path)
@@ -369,7 +414,7 @@ func TestExportAndDriftCheck(t *testing.T) {
369414
t.Fatalf("canonical workflow is missing safety boundary %q", expected)
370415
}
371416
}
372-
for _, path := range []string{".agents/skills/boatstack/SKILL.md", ".claude/skills/boatstack/SKILL.md"} {
417+
for _, path := range []string{".agents/skills/boatstack/SKILL.md", ".claude/skills/boatstack/SKILL.md", ".gemini/skills/boatstack/SKILL.md"} {
373418
adapter := string(bundle.Files[path])
374419
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"} {
375420
if !strings.Contains(adapter, expected) {
@@ -427,6 +472,9 @@ func TestPortableHostAdaptersShareWorkflowAndArtifactContract(t *testing.T) {
427472
if _, exists := bundle.Files[".claude/skills/"+spec.Name+"/SKILL.md"]; !exists {
428473
t.Fatalf("Claude does not expose user operation %q", spec.Name)
429474
}
475+
if _, exists := bundle.Files[".gemini/skills/"+spec.Name+"/SKILL.md"]; !exists {
476+
t.Fatalf("Gemini does not expose user operation %q", spec.Name)
477+
}
430478
}
431479
for _, expected := range []string{"source plan", "plan.md", "approval.md", "evidence", "gaps", "review", "pr.md"} {
432480
if !strings.Contains(strings.ToLower(artifacts), strings.ToLower(expected)) {
@@ -437,6 +485,7 @@ func TestPortableHostAdaptersShareWorkflowAndArtifactContract(t *testing.T) {
437485
hostSurfaces := map[string]string{
438486
"cursor": string(bundle.Files[".cursor/rules/boatstack.mdc"]),
439487
"claude": string(bundle.Files[".claude/skills/boatstack/SKILL.md"]),
488+
"gemini": string(bundle.Files[".gemini/skills/boatstack/SKILL.md"]),
440489
"codex": string(bundle.Files[".agents/skills/boatstack/SKILL.md"]),
441490
}
442491
for host, surface := range hostSurfaces {
@@ -453,13 +502,17 @@ func TestPortableHostAdaptersShareWorkflowAndArtifactContract(t *testing.T) {
453502
if !strings.Contains(hostSurfaces["claude"], operation) {
454503
t.Fatalf("Claude natural-language router does not declare portable operation %q", operation)
455504
}
505+
if !strings.Contains(hostSurfaces["gemini"], operation) {
506+
t.Fatalf("Gemini natural-language router does not declare portable operation %q", operation)
507+
}
456508
}
457509
}
458510

459511
func TestExportRefusesUserOwnedCollision(t *testing.T) {
460512
for _, relative := range []string{
461513
".cursor/rules/boatstack.mdc",
462514
".claude/skills/auto-plan/SKILL.md",
515+
".gemini/skills/auto-plan/SKILL.md",
463516
} {
464517
t.Run(relative, func(t *testing.T) {
465518
repo := t.TempDir()

boatstack/skill_frontmatter.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,8 @@ func skillFieldsForPath(path string) (map[string]string, error) {
111111
return codexSkillFields, nil
112112
case strings.HasPrefix(path, ".claude/skills/"):
113113
return claudeSkillFields, nil
114+
case strings.HasPrefix(path, ".gemini/skills/"):
115+
return claudeSkillFields, nil
114116
default:
115117
return nil, fmt.Errorf("unsupported generated skill path")
116118
}

boatstack/skill_frontmatter_test.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,17 @@ func TestGeneratedSkillFrontmatterIsValidYAML(t *testing.T) {
2626
t.Errorf("%s has invalid frontmatter: %v", path, err)
2727
}
2828
}
29-
if expected := len(claudeVisibleSkills) + 2; skillCount != expected {
29+
expected := 0
30+
if contains(config.Adapters, "claude") {
31+
expected += len(claudeVisibleSkills) + 1
32+
}
33+
if contains(config.Adapters, "gemini") {
34+
expected += len(claudeVisibleSkills) + 1
35+
}
36+
if contains(config.Adapters, "codex") {
37+
expected += 1
38+
}
39+
if skillCount != expected {
3040
t.Fatalf("validated %d generated skills, want %d", skillCount, expected)
3141
}
3242
}
@@ -45,6 +55,7 @@ func TestBoatstackRoutersHaveUnindentedTopLevelKeys(t *testing.T) {
4555
for _, path := range []string{
4656
".agents/skills/boatstack/SKILL.md",
4757
".claude/skills/boatstack/SKILL.md",
58+
".gemini/skills/boatstack/SKILL.md",
4859
} {
4960
frontmatter := skillFrontmatterForTest(t, bundle.Files[path])
5061
if !strings.Contains(frontmatter, "\ndescription: Use when") {

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 [`b5f5cd69a44fdba533c0b821c55eca08c7fd6b4f`](https://github.com/operatorstack/intelligence-flow/tree/b5f5cd69a44fdba533c0b821c55eca08c7fd6b4f/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 [`004b6c1288661bbbfdcfe96c068f35e48f4c8bb3`](https://github.com/operatorstack/intelligence-flow/tree/004b6c1288661bbbfdcfe96c068f35e48f4c8bb3/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.

0 commit comments

Comments
 (0)