Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -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/3c9ed10dcf0c6781023a547effb4469879b8a375/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/53f0f064a116c6d0edbacd2b07dba935481bba96/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.

Expand Down
53 changes: 28 additions & 25 deletions UPSTREAM.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"canonical_context": {
"characters": 96335,
"estimated_tokens": 24084,
"characters": 97918,
"estimated_tokens": 24480,
"estimator": "ceil(total characters / 4); compactness signal, not provider billing",
"files": [
"product-engineering-loop/references/workflow.md",
Expand All @@ -12,14 +12,14 @@
},
"files": {
".gitignore": "a7079e923a776f14f1bb3a6aa0a11a133a8e1dfb35af020f327623357b7e3957",
"CONTRIBUTING.md": "9b54670bd54b1bc7e5375667af4b6c17f420d81789a5f7e8cb7533ed8ff73f9a",
"CONTRIBUTING.md": "3fd277a4f4bc4ea63b33094aa52671235609e363a0073ac949371b67172b4c38",
"README.md": "534091974042589c31978080b0268761164f2279850f02c30e07f48945ef2321",
"assets/boatstack-journey.svg": "e465befc50c8ce30f3e07e8fd97012931beeb053392c8fbf38ad645023b3cc63",
"assets/boatstack-mark.svg": "be1f984da1bfa69fa5d1f986d8343d21f7e20921b71db888c928b4d2e54b09b5",
"assets/boatstack-portability.svg": "66dfdfa85db857b3bd18b32047a6975f1fbbfc4dc091158e8277193f9969a346",
"boatstack/AGENTS.md": "bc76221e1fe90a91afbacd7c6bc9b41a70e6c10fc128c275a6a0b9bc094d9506",
"boatstack/BUG-worktree-delivery-state.md": "02469cf51c3849dad5743783e248e5c04583e4240507fbef0e3f890cd6a95724",
"boatstack/SKILL.md": "055f2be8a3cfa63a9f6110b8e31561b8dda3b193c31e4c7527a0e4bd3eeec7ac",
"boatstack/SKILL.md": "c0f8ace95892e5caac1fa98e68e15150afacbef8e48a228c503f7140ce8d0463",
"boatstack/activation.go": "deb7712d20aed37371254596613bfaccfc05fcb59634408b03378d1a0bf693ea",
"boatstack/agents/gemini.yaml": "cbf43b387399e456fa6178f86d83e6e35567e6142ff800f8de6ffca306fa963e",
"boatstack/agents/openai.yaml": "68a30a60859556c5a26e16d184594ca243a6043d99c8cf7d66b5dd6d50a93cd1",
Expand Down Expand Up @@ -69,11 +69,11 @@
"boatstack/delivery_terminal_conformance_test.go": "50b88bdfb9bdfc9dc50c11f46276e1eb13eed61618e75b4c951dfa2ac6075df0",
"boatstack/delivery_test.go": "45c48ff7581c911bcaf821c3e4241d4ae2a9bb4aa682485cc58b6ad8fe1c85bf",
"boatstack/deliverycontrol_parity_test.go": "706be08bdc89192cf200f0b2cf889c8f4bb0e666a5d8a557996d7215101ce2ca",
"boatstack/denial.go": "3b6419412c7672ca2dd9cf80140675b8326d6b54460bbcb650cf3dde48dddd56",
"boatstack/denial.go": "e3eb8007e7a98f3aad48304e85fd88cfebe40e9a7ff3f23263c43864b0ee5933",
"boatstack/denial_escalation_conformance_test.go": "d50f0e1c803c8f5731a46dbe6f82c7935c0ccbd582f513cbe07211f5e902157e",
"boatstack/denial_ledger.go": "a35bf8fd8c1f6b9302109cf0087e1b9158e43e07b92b18df5e589a637d58491d",
"boatstack/denial_solutions.go": "7d1cae6b8a5fd373795f8a83f62861c79a931e630972ea04490378e0400ab0fc",
"boatstack/denial_solutions_conformance_test.go": "0b329dabffbc2666dffd2ff9e2b7d9d27816472d6fbee91a47a79c67527dce8d",
"boatstack/denial_solutions.go": "097141290cc684ea688887ae37dfdbbf3cffecf43fe12f64f22e09496d71cee6",
"boatstack/denial_solutions_conformance_test.go": "aace80640a4e0d331263bb3f82172ad8ff2e4a27e0544000fca3d475a8afb9aa",
"boatstack/denial_test.go": "9dc9f0f79328c4947073efaa785479b34e70eb214da57cd72348f39fd672e4fd",
"boatstack/detached.go": "3e3f2b81e2d79107ede2adc55fa296d0f487aa90d8d847d3cac2aa82120c3b12",
"boatstack/detached_external_config_conformance_test.go": "6554739e80d32672f472fa55b1599e9594f4ba8790eb9939c3aef9e883316f1c",
Expand All @@ -82,11 +82,11 @@
"boatstack/detached_test.go": "2cd744335a80b9fbc2db8fa7955658dd31691c43150d67bf15029d06ce84277a",
"boatstack/docs/control-law-scoping.md": "0ae984821248eabda8c0eeaf201b367991e6742984e7c718df20ecc24caee475",
"boatstack/evidence.go": "497a31e6ff632cb1d7c3adfc9f269af3f6aa84e948dd5d417c162767542a27df",
"boatstack/export.go": "96534cf341b8ae43f569fd1c3d25d4bf88cb7afc7418689457b461d4d2895082",
"boatstack/export_test.go": "9157acf1993aa75b825cdf771798cc1c056054c4ddc725ad735f4fa9eac73193",
"boatstack/export.go": "86eeea828a0bb354114a6606aeb2a1bb1f374c10f7af0363797e5406ab69a290",
"boatstack/export_test.go": "076cc6c31ceadbc8c4ba0ebdff047490a84a2cd8d7638ddfbb2835800fdc65d0",
"boatstack/flow_coding.go": "9fa53a0204f98a25f97775c3acf37392a591c14ce850b44aa587b5806e770bb9",
"boatstack/flow_coding_test.go": "dddcd7a85892d4fa10af42739d4c1ff265721b0313e27b6e7a1bbb019d5c3b51",
"boatstack/flow_control.go": "c6a4b3db41570ab92efc7f90115414e9a86dcd26cd2b7f7999d8d171e005e82a",
"boatstack/flow_control.go": "75de1b2fcb2468c6a36de3c31c4da95d31f8ccf14d211583386e57b2d2a9041c",
"boatstack/flow_control_test.go": "02d788c83be55ebd79ffc73875bfd019de45325151eb1f70f506980eb8e77f29",
"boatstack/flow_drive.go": "90f57e178884aff017195a126954ac0aeb85f27707b9d42844323341dc1fefd9",
"boatstack/flow_drive_conformance_test.go": "23edea926c271a1f5718fb9dae1da11e4bf03cceb1357290cd61cd8ffb73beda",
Expand All @@ -98,7 +98,7 @@
"boatstack/flow_prescribe_conformance_test.go": "42dc20b26472531deedcaace94cf0ca5d086f0d76d1d91b37e38fc0138283ddf",
"boatstack/flow_report.go": "a31d0764725eb38f717bab1e5509da82860d3bed23dd2b65ff388bb39573f418",
"boatstack/flow_report_test.go": "ec989f2f14c7ae52840f61822a11dd0ac91055390f775d6a4b04da4993166b50",
"boatstack/flow_solutions.go": "78d639ebd1012326f3e7e67cb5a4068de24898148a29db9176a1237af932f6aa",
"boatstack/flow_solutions.go": "f9674a970ca018b33865b49809c7e3aee138d06420860a98e5e3feaeba3c2299",
"boatstack/flow_tasks.go": "a3a8699ac0fd6cda3a3420acf83cc5881c5a821b17a3f9cf0d20da460c6e5252",
"boatstack/flow_tasks_conformance_test.go": "fbc4d672536051f8e20a2e6c07c5b10f78cd84fc04765eee11cbed7a459b8e4b",
"boatstack/flow_trace.go": "5097d90f02f69ed49f25a04098fd0f2b9c62f4406fce8314c79ccc4a6dbf2763",
Expand Down Expand Up @@ -166,14 +166,16 @@
"boatstack/next_test.go": "6b5ec46ecf1a197d7644846cecbb6d99873a06b7c4e5562772b5016fa0a4cb11",
"boatstack/operation.go": "63a58c3e1247624b4dcd71d0c8d6f19818b1d17ff128e019564841949e3df659",
"boatstack/operation_test.go": "9580b71ed4fa70cf73f02975737c824484341fa6751e670e7d183e898e1ffdde",
"boatstack/paths.go": "17f50de1eeefc4e023383eadae3f41bc2813a666baa5eb967650505237236bba",
"boatstack/paths.go": "621b7bcad09ba9372140a4bae1a4cf7c24f14e3b4875193d82c367609a5bf6f7",
"boatstack/plan.go": "04ad740d2aab9802baefc963534965c3ea1a1bd19238569c3a3e54bea435cde6",
"boatstack/plan_test.go": "1b01e7d9d7794eb11c998e19a2f3532d3b8509d984eca934cf5f1662a0a7e573",
"boatstack/plan_validation.go": "06ff8fa8c22525bd371848a7776682a2b041ea5e1aacc913170856d0dda83edd",
"boatstack/plan_validation_test.go": "ce17eb7449c1d9ec2e829943082bb9680414e02b8f0d5049418bace5488bbedb",
"boatstack/planning.go": "3263587dea8d055bdfb8bf791d98a0a0a1abcb11433e739f2bfa8a8a882cf58b",
"boatstack/planning_first_write_conformance_test.go": "873097aa9384b75bf01e74a475f3ec2ac7cca4a28f733e82f2c82959032c6a30",
"boatstack/planning_test.go": "06ec7022222d926040c3ae28b84ab50c3d2f804ae6473e61b303804dd992d884",
"boatstack/planning.go": "2f1f28930740d5139d5838ff250ed329676c02f1b41500ab1494bc150d8cbfd4",
"boatstack/planning_first_write_conformance_test.go": "eb8725417ea5704dff89d09d03602918e1d5f8eeac7e7002cbb4518aaa80104f",
"boatstack/planning_test.go": "c5966d293a0e71b0c8b4391368b837e807737b9fa7c5c2604758240ac6c03017",
"boatstack/planning_transport.go": "8beaa1cc139e55f1899dc7ae4280ac18183b1a87c1ef22122d63e2ba55bc7434",
"boatstack/planning_transport_conformance_test.go": "e1ac2c9d410f07037dec0d065aed2117957a88ca99aa0b0403772bf14ead0a77",
"boatstack/post_publish_prescribe_conformance_test.go": "3c20d359ff84648db7dedb227b4d64e6574d9f41d3cdca0adefec1c60bfbf4ae",
"boatstack/pr.go": "843f83e4a5d9ad0e997c6d8bd5795b6e8324f34f0f4264d2500933f1bcf36917",
"boatstack/pr_phase.go": "59f8cbb75b6b538a5345474acd6a725450979579bf8ecf9591956cbbe1cc4737",
Expand All @@ -197,7 +199,7 @@
"boatstack/references/host-hook-contracts.md": "2a89d44d0e418a53f2e3b6300fed957cdf878f45ea97ce24b55b66065f0eaa1d",
"boatstack/references/irreversible-operation-boundary.md": "b52fef435362d2e80ab5569a0d145d5dd840ebd7cc77f02505b19588a7786386",
"boatstack/references/portability.md": "fb683095991bb0cb06ec56fb8884c49038b283172a7d2f8b203483b7cacb4bae",
"boatstack/references/workflow.md": "53953e9ffb7cb6d375ecc951cd797e9af7f344d75787651076453c5541b1c224",
"boatstack/references/workflow.md": "cf25e53a58279cf7b3e1d8b3619a76ffc8b947e7035fcef31f1ccf21e420e772",
"boatstack/release.go": "82dcb4ca59e8c79a68d5333d650f90e64abd448d04e0c6f504fdf07f42b5ed76",
"boatstack/release_test.go": "5cf2d76fe9b836a91ca68eba53d5585e2c4be5b9421aaf939ea0723063a24690",
"boatstack/repair_budget_conformance_test.go": "05793600dac06bbf39075b15bc1262a9bd1e916738d801dcd6ff515771262b4c",
Expand All @@ -210,13 +212,13 @@
"boatstack/runtime_cache.go": "6f6b023170cce982bf155e7c2fc7752cca2f7acff771967b4a523c1c13ea876f",
"boatstack/runtime_cache_test.go": "b981467ddc9f0f562da6bff5de7a80a9fe5a433a0317541d1e48df268546ac85",
"boatstack/runtime_provenance_test.go": "1d52f1e6b0691cf4667729cc9b9f3c55c128f0aa3321f3a2843a9aa6fd0e73dc",
"boatstack/safety.go": "71507e937a887707befdda03e9d0ed9803d4eeeaa38c9351fea2b8968f95ffa6",
"boatstack/safety_corpus_test.go": "824051705dd893338ac2246e2d75231703e36574cc9c23902237f72ab2d35960",
"boatstack/safety.go": "2c40922405e08c2bb2eb2381e8ad879673d14c73fa93ff6d2e68ea1df0b5f6af",
"boatstack/safety_corpus_test.go": "a91106d6bf3972bd13382faba9688cbe6da2d5f27df4f6da8adb0d223f57e847",
"boatstack/safety_test.go": "7f40f09ce5cb2b815882a529ee7d8516e82b6686fe7e600085a3c04ece58b35a",
"boatstack/safety_update_publisher_test.go": "ed3f8187036623694dfe7c395cdae00fdae14609bab6124d1fdfc6fe73fa2196",
"boatstack/skill_frontmatter.go": "73364df463ce828c2d005aab55f72bb92f7a34d99cf3f53d4e0cd5a4da9dbd0e",
"boatstack/skill_frontmatter_test.go": "5ebf971d2fb0d02b2144a47883067bca7c89863e4285933dfac6f2c5816d560a",
"boatstack/solution_closure_conformance_test.go": "f73e6748dac373e2a10bc9269c2f2e060bd220bb4113bd0d5ff66ca4c8e91a54",
"boatstack/solution_closure_conformance_test.go": "366c0f7d8ed427717572da38ad623ad50f14276af62cdc115939042d040a3ab4",
"boatstack/statemap.go": "0db3a980f2fd00538498f6599b488a6719a5ee0f0764172834165e7d9d8f8057",
"boatstack/statemap_conformance_test.go": "504debd406c1b5ad6cc9cb38715dea08954ef9c258cb5f91c59fb04d1398e53e",
"boatstack/supervisory_control_test.go": "c7ea4bcd678e8ec211dac772c834981c4e21762914be2770a5e181bc24605e06",
Expand All @@ -243,14 +245,14 @@
"docs/benchmark-corpus-audit.md": "f2d206fe8579a514f9da82b2c96c19b343ac004be67617e1bd34f0f8e0e5e6c6",
"docs/benchmark-submission-audit.md": "9518abdd17690729c6423f87cab20418ed47b0915b5faa44b9ef975e9e9c3b79",
"docs/configuration.md": "2ceb050bb67737c725b66d7e191949c2f3b652ecbafc5e44002e99bc785114ab",
"docs/evidence-engineered-coding.md": "e8284c01dea52bb09df673f23588944757b08c831d3d61a106c5989744525e86",
"docs/evidence-engineered-coding.md": "b48fed361457a1a12b426a277447b946096d839956e7d7a8058aa13ab36a0da9",
"docs/generated-files.md": "8679b960bacbdf2ca7b898aa44eb3a486ebb325eca8ce9cc4e316191e7ef5087",
"docs/getting-started.md": "834e6d1c33d5198743a3f896c4e205801713762dcd2fa339e47c99b532df2cf5",
"docs/public-claims.json": "cc6879c53a2598b02e474436d92acd7f5ea7d4f6edf88c231d9ae190f0b84c5f",
"docs/public-claims.json": "93cc3bba122ad9519f1a280e8d0ef5bddafdb59efae08e9f8a5be631e441a6a0",
"docs/public-surface.md": "713f7a050b5f339cf948299103ef3800417dccfecf2cc1a4166397ea6f978907",
"docs/research-and-design.md": "8d78678108f0a6c924e1ff9b32c0f81aae9d1f779e0082843b6f99ad993ae2b6",
"docs/safety.md": "1a2b84e0a4b9aa6322d35d6677ff52662c306089031295692b569233cdd94d8f",
"docs/troubleshooting.md": "84f61b8f61d0ca02274f2e91a4da17802b99bd4bbfe0d116674e1b9398e8192a",
"docs/troubleshooting.md": "252937c97d40197e9122e20f421f90616aecdd5ddf50cee8bdd348bc6c5caf32",
"docs/validation-and-evidence.md": "e7d91ad49c6adb44784ebe7d94feceb6abd445857f9a0716f0758bf6b55296c5",
"docs/why-these-steps.md": "cbe0d769db11ef15bb1dff888009378d6783776ad020e6f5139847a1dd62fa09",
"install.ps1": "f48d0f26a26e806b780d10fa916c261ff9f84ab39758cf9e229f647836845e86",
Expand All @@ -260,7 +262,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": "ac9dd9b50170095d2a1c172695c0ed7e682d910eb834b106640ed2c93a436da8",
"labs/diagram-json/plan.lock.json": "95dfd06cfc3e25dade87d9770659f06904d98a55d95f666948d3f8a24ed6e339",
"labs/diagram-json/plan.md": "3cc4f533b8d69386deff16b3a594a3ba09d4c0c3db636cccd8c4380084ce6a51",
"labs/diagram-json/questions.md": "74733b015002c8a6777c558e7e997fa48c94850b9bd39054fe9366c97ecf728d",
"labs/diagram-json/request.md": "0808fc41c36779c404f4a3a121167da6e76cac56df526e70f9ed6d3e0d4c02ed",
Expand Down Expand Up @@ -416,12 +418,13 @@
"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"
"release-notes/2026-08-05-detached-external-config.md": "b8b5ab914eae695f67c4e25deba3957894439e054b42ab93751bccb614235fda",
"release-notes/2026-08-08-literal-planning-transport.md": "d1abc9e64cb724fffa71fd81eeab2bb07bb982be28de1a50a845016cd878560a"
},
"generator": "operatorstack/intelligence-flow:boatstack-distribution",
"schema_version": 1,
"source": {
"commit": "3c9ed10dcf0c6781023a547effb4469879b8a375",
"commit": "53f0f064a116c6d0edbacd2b07dba935481bba96",
"path": "labs/12-product-engineering-loop",
"repository": "operatorstack/intelligence-flow"
}
Expand Down
2 changes: 1 addition & 1 deletion boatstack/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ Before starting `/auto-plan` for a new feature, check `next-status --repo . --js
13. If Spec Kit is installed, use its constitution/specify/clarify/plan/tasks/analyze/checklist flow as an artifact generator. The canonical artifact contract remains authoritative.
14. For every planned validation, record the exact `criteria` it can support plus `run`, `origin`, `oracle`, and `independence`. Commands, automated tests, external checks, and named human review procedures are all valid forms, but an ambiguous claim without a threshold/rubric and authorized decision remains `BLOCKED`.
14. For every external write, record `affected_paths` plus side-effect kind, immutable target identity, reversibility, failure policy, and `destructive: false`. Reject ambiguous reset rollback or target names.
15. Write only Markdown feature artifacts, including the canonical structured `plan.md`. Author every feature artifact through the owned channel: pass the document to `boatstack-helper planning-write --repo . --feature <feature> --artifact <known-name>` on stdin — it is the primary writer for `.product-loop/features/`, not a fallback, and it remains available after the planning latch denies raw writes. Put the authoritative JSON inside the marked Boatstack block and run `boatstack-helper check-plan --plan <feature>/plan.md`; this command is read-only. The host's ordinary Markdown writer may be used only where the host explicitly permits it. Never use arbitrary shell redirection to evade a host write boundary.
15. Write only Markdown feature artifacts, including the canonical structured `plan.md`. Author every feature artifact through the owned channel: pass the complete document to `.product-loop/bin/boatstack-helper planning-write --repo . --feature <feature> --artifact <known-name>` using the literal planning transport in `.product-loop/workflow.md` — a single-quoted heredoc in a POSIX shell or the UTF-8-scoped single-quoted here-string in PowerShell. This is the primary writer for `.product-loop/features/`, not a fallback, and it remains available after the planning latch denies raw writes. Send the complete envelope in one tool call. Never run the helper without input, split the envelope across calls, use an expansion-capable delimiter, target another repository or helper, or paste Markdown at a shell prompt. Put the authoritative JSON inside the marked Boatstack block and run `.product-loop/bin/boatstack-helper check-plan --plan <feature>/plan.md`; this command is read-only. The host's ordinary Markdown writer may be used only where the host explicitly permits it. Never use arbitrary shell redirection to evade a host write boundary.
16. Keep implementation tasks separate from publication authority. Internal phases remain tasks inside one delivery slice. When the accepted outcome explicitly requires multiple PRs, declare ordered `delivery_slices`; assign every task exactly once and give each slice its own optional base/head branch contract. Plan approval approves this structure but never authorizes a push or PR.
17. End with a **draft**, never an implied approval. Do not generate executable task state, JSON artifacts, locks, or implementation changes from `auto-plan`.

Expand Down
9 changes: 8 additions & 1 deletion boatstack/denial.go
Original file line number Diff line number Diff line change
Expand Up @@ -473,6 +473,13 @@ func denialFor(host string, finding SafetyFinding) Denial {
}
return d

case "planning-transport-invalid":
d.Severity = SeverityAdvisory
d.Qualifier = "planning input incomplete"
d.Detail = "Boatstack did not run the planning write because its literal Markdown envelope was incomplete or ambiguous (PLANNING_TRANSPORT_INVALID:" + finding.Reason + "). Use the single-quoted heredoc or UTF-8-scoped single-quoted PowerShell here-string in `.product-loop/workflow.md` and send it in one call. Do not paste the Markdown at a shell prompt or retry a truncated command."
d.Reassurance = reassureUntouched
return d

case "workflow-state-invalid":
d.Severity = SeverityAdvisory
d.Qualifier = "delivery state unverified"
Expand Down Expand Up @@ -511,7 +518,7 @@ func denialFor(host string, finding SafetyFinding) Denial {
if finding.BlockingFeature != "" {
slug = finding.BlockingFeature
}
d.Detail += fmt.Sprintf(" Planning Markdown is authored through the owned channel: `boatstack-helper planning-write --repo . --feature %s --artifact <name>` with the document on stdin — never a raw host write into `.product-loop/features/`.", slug)
d.Detail += fmt.Sprintf(" Planning Markdown is authored through the owned channel: one complete literal `.product-loop/bin/boatstack-helper planning-write --repo . --feature %s --artifact <name>` envelope from `.product-loop/workflow.md` — never a raw host write into `.product-loop/features/` or a manual shell paste.", slug)
}
d.Reassurance = reassureUntouched
return d
Expand Down
Loading
Loading