From bc8a8f2ca9c252e8c93de38645bfcf0325919a7f Mon Sep 17 00:00:00 2001 From: "operator-stack-publisher[bot]" Date: Sun, 19 Jul 2026 12:04:37 +0000 Subject: [PATCH] Sync Boatstack from Intelligence Flow Labs @ 9a20177c48c2 --- CONTRIBUTING.md | 2 +- UPSTREAM.json | 15 +-- boatstack/next.go | 56 ++++----- boatstack/next_test.go | 107 +++++++++++++++++- docs/evidence-engineered-coding.md | 2 +- docs/public-claims.json | 24 ++-- labs/diagram-json/plan.lock.json | 2 +- .../2026-07-19-new-worktree-intent.md | 7 ++ 8 files changed, 160 insertions(+), 55 deletions(-) create mode 100644 release-notes/2026-07-19-new-worktree-intent.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 20513fb..047595b 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/17376b5e74eb69d341c6df1b69251f2e07d47c4f/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/9a20177c48c292c1c6e1b967e0fd710f2e410a7c/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 ea6e636..3c17fa4 100644 --- a/UPSTREAM.json +++ b/UPSTREAM.json @@ -12,7 +12,7 @@ }, "files": { ".gitignore": "a7079e923a776f14f1bb3a6aa0a11a133a8e1dfb35af020f327623357b7e3957", - "CONTRIBUTING.md": "f679c93d361def0a2c8903c1b5714d4bf707add3eeeeec88370b8ceef936a8e0", + "CONTRIBUTING.md": "486ff0833aa62521ba078542bc648f4cb868550bc5bd7372393e3befccbde35d", "README.md": "a840004db57a129ecd361bb0421adfe02065d86751736dd91953c8a8b178e5ef", "assets/boatstack-journey.svg": "c1f7fe2741f5e9ca66bb3fe9b103e6364ba5acbca8b7a8054768ffd85cf325ea", "assets/boatstack-mark.svg": "ec96165583b15cfd446c27049d49217973f3e9b1defa5771cc08eec0c9542ce4", @@ -47,8 +47,8 @@ "boatstack/init_test.go": "fa48be69d07691fa7842224ec831e5f290504d8b6565263c9735d2dabd9b43b8", "boatstack/init_transaction.go": "112456c4e1c4db54c4137bcf4f7a9a9e63399a6f5971e9b3dc952d0c4b2aa4b6", "boatstack/integrations.go": "75b39ce2e662fccd66bf4b9bff0e097a4db558f23b3aa1d9bc83a5fc6373444c", - "boatstack/next.go": "9a9b3b9dde0a528991d2b6ac358638b249a791a4eb3e7a2656bd43b652a2c628", - "boatstack/next_test.go": "1244fdf5e447646793ffdab81b8ff9403b849e9fa050a41bc9e7145bca08a0d2", + "boatstack/next.go": "80ac943af42127177549c33bb87a1a226f6b2e6e4bad64c0bcf15046120dcbe1", + "boatstack/next_test.go": "57828f76257ad7344c383084a97399f6523cbbced28ac2bbe4c14b9da84ccf32", "boatstack/plan.go": "2497e1d32d88a8e433bc5996b57d175bda4e6ba334cf2510efb7c84fd88a98f3", "boatstack/plan_test.go": "006cdc6681f77e579c5a0f709e30ede759c337132d4f2f5193b7b79b29bd7149", "boatstack/planning.go": "1237ae552a72d5312c1ef61e30f430976f526d5473d91c7fbfcb9148eb7079b9", @@ -80,10 +80,10 @@ "docs/account-recovery-walkthrough.md": "676034974594a7d1a559b24dbed31d7ccc429eb81404b203ca07bbdaa19ec3d3", "docs/benchmark-corpus-audit.md": "f2d206fe8579a514f9da82b2c96c19b343ac004be67617e1bd34f0f8e0e5e6c6", "docs/benchmark-submission-audit.md": "9518abdd17690729c6423f87cab20418ed47b0915b5faa44b9ef975e9e9c3b79", - "docs/evidence-engineered-coding.md": "c418dfc92d3e0a38996162f4b4c120693817c93056be15dfa7828295011457eb", + "docs/evidence-engineered-coding.md": "159f34fbd92328ea7f887db304b4fe2d5cbed178859318e3349b68a940615b5f", "docs/generated-files.md": "136422baf0c7fc2bd5100cfe0ebdb3d9d0705dfd7e7d54bf745dd1037e63492c", "docs/getting-started.md": "eacc814fdffdfa3c7d8052b7cd99a79c04da5c75d88d8b44f3fb68d9afec0316", - "docs/public-claims.json": "df3d78d6c2a9b20d3a6c20bbea1c3d5eb5d7fbedfad60e34cbb121498e9a7c84", + "docs/public-claims.json": "8e6ff12e30ae1bc6646814154e91dcd34646f5aad146dbea6f8ca3639dfe8224", "docs/public-surface.md": "713f7a050b5f339cf948299103ef3800417dccfecf2cc1a4166397ea6f978907", "docs/research-and-design.md": "d65c66e323037bda5d45aacef5d48afa6bf93da55901378891d235aca3a5684f", "docs/safety.md": "7b9b5c515d36e683767ec8d3d9d6d119ac93650b2f629d351deadd4c600ed6a6", @@ -97,7 +97,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": "f18205ea54ae03756bd5bb7513a48ac494b9ed6e5bce8015bd72fee7d8b46c42", + "labs/diagram-json/plan.lock.json": "18d2b1c3b0045e8d43e28ad130ddafc2f0edefdea8ffcba437b2ecb9e9cc88e6", "labs/diagram-json/plan.md": "3cc4f533b8d69386deff16b3a594a3ba09d4c0c3db636cccd8c4380084ce6a51", "labs/diagram-json/questions.md": "74733b015002c8a6777c558e7e997fa48c94850b9bd39054fe9366c97ecf728d", "labs/diagram-json/request.md": "0808fc41c36779c404f4a3a121167da6e76cac56df526e70f9ed6d3e0d4c02ed", @@ -123,13 +123,14 @@ "release-notes/2026-07-18-startup-recovery-routing.md": "c305a1c2b8347e1bc6d7fcbd4a8e629438cdeb4bcf6f181a7d6fc154a88f4318", "release-notes/2026-07-19-cross-harness-hook-conformance.md": "15dc22cc3b534c6d0bd89f34cd69cabf94a3610d445a039ba111fd8bce727e68", "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" }, "generator": "operatorstack/intelligence-flow:boatstack-distribution", "schema_version": 1, "source": { - "commit": "17376b5e74eb69d341c6df1b69251f2e07d47c4f", + "commit": "9a20177c48c292c1c6e1b967e0fd710f2e410a7c", "path": "labs/12-product-engineering-loop", "repository": "operatorstack/intelligence-flow" } diff --git a/boatstack/next.go b/boatstack/next.go index b7bb87c..67f3f1a 100644 --- a/boatstack/next.go +++ b/boatstack/next.go @@ -224,6 +224,34 @@ func ResolveNext(repoPath string) (NextStatus, error) { return status, nil } + orphans, err := orphanedFeatureArtifacts(repo) + if err != nil { + return NextStatus{}, err + } + if len(orphans) > 0 { + return blockedNextStatus("INVALID_STATE", "repair-state", "Boatstack found a PR preview without the plan lock required to verify it. Preserve the artifacts and restore the feature evidence before continuing.", orphans...), nil + } + + sourcePlans, sourceErr := unclaimedSourcePlanCandidates(repo) + if sourceErr != nil { + return NextStatus{}, sourceErr + } + if len(sourcePlans) == 1 { + base.VerificationStatus = "VERIFIED" + base.ObservedStage = "SOURCE_PLAN_READY" + base.NextOperation = "auto-plan" + base.Reason = fmt.Sprintf("Saved Plan-mode file %q is ready to become a Boatstack feature.", sourcePlans[0]) + return base, nil + } + if len(sourcePlans) > 1 { + base.VerificationStatus = "BLOCKED" + base.ObservedStage = "AMBIGUOUS" + base.NextOperation = "resolve-ambiguity" + base.Reason = "Multiple unclaimed Plan-mode files are available; Boatstack will not choose by recency." + base.BlockingAmbiguity = sourcePlans + return base, nil + } + candidates, err := featurePlanCandidates(repo) if err != nil { return NextStatus{}, err @@ -253,34 +281,6 @@ func ResolveNext(repoPath string) (NextStatus, error) { return base, nil } - orphans, err := orphanedFeatureArtifacts(repo) - if err != nil { - return NextStatus{}, err - } - if len(orphans) > 0 { - return blockedNextStatus("INVALID_STATE", "repair-state", "Boatstack found a PR preview without the plan lock required to verify it. Preserve the artifacts and restore the feature evidence before continuing.", orphans...), nil - } - - sourcePlans, sourceErr := unclaimedSourcePlanCandidates(repo) - if sourceErr != nil { - return NextStatus{}, sourceErr - } - if len(sourcePlans) == 1 { - base.VerificationStatus = "VERIFIED" - base.ObservedStage = "SOURCE_PLAN_READY" - base.NextOperation = "auto-plan" - base.Reason = fmt.Sprintf("Saved Plan-mode file %q is ready to become a Boatstack feature.", sourcePlans[0]) - return base, nil - } - if len(sourcePlans) > 1 { - base.VerificationStatus = "BLOCKED" - base.ObservedStage = "AMBIGUOUS" - base.NextOperation = "resolve-ambiguity" - base.Reason = "Multiple unclaimed Plan-mode files are available; Boatstack will not choose by recency." - base.BlockingAmbiguity = sourcePlans - return base, nil - } - completed, err := completedManagedStates(repo) if err != nil { return blockedNextStatus("INVALID_STATE", "repair-state", "Boatstack found invalid completed delivery state. Preserve the artifacts and restore its evidence before continuing: "+err.Error()), nil diff --git a/boatstack/next_test.go b/boatstack/next_test.go index 593d677..c7cdacd 100644 --- a/boatstack/next_test.go +++ b/boatstack/next_test.go @@ -45,6 +45,28 @@ func writeNextDelivery(t *testing.T, repo, feature, status string, activeIndex i } } +func writeSavedFeaturePlan(t *testing.T, repo, feature string) { + t.Helper() + directory := filepath.Join(repo, ".product-loop", "features", feature) + if err := os.MkdirAll(directory, 0o755); err != nil { + t.Fatal(err) + } + if err := os.WriteFile(filepath.Join(directory, "plan.md"), []byte("# Plan\n"), 0o644); err != nil { + t.Fatal(err) + } +} + +func writeIntakePlan(t *testing.T, repo, name string) { + t.Helper() + directory := filepath.Join(repo, ".product-loop", "intake") + if err := os.MkdirAll(directory, 0o755); err != nil { + t.Fatal(err) + } + if err := os.WriteFile(filepath.Join(directory, name), []byte("# Source plan\n"), 0o644); err != nil { + t.Fatal(err) + } +} + func TestResolveNextReportsNotStartedWhenNoFeatureExists(t *testing.T) { repo := nextTestRepo(t) status, err := ResolveNext(repo) @@ -58,19 +80,94 @@ func TestResolveNextReportsNotStartedWhenNoFeatureExists(t *testing.T) { func TestResolveNextReportsSavedSourcePlan(t *testing.T) { repo := nextTestRepo(t) - intake := filepath.Join(repo, ".product-loop", "intake") - if err := os.MkdirAll(intake, 0o755); err != nil { + writeIntakePlan(t, repo, "feature.md") + status, err := ResolveNext(repo) + if err != nil { t.Fatal(err) } - if err := os.WriteFile(filepath.Join(intake, "feature.md"), []byte("# Feature\n"), 0o644); err != nil { + if status.ObservedStage != "SOURCE_PLAN_READY" || status.NextOperation != "auto-plan" { + t.Fatalf("unexpected status: %+v", status) + } +} + +func TestResolveNextPrefersUniqueSourcePlanOverHistoricalPlans(t *testing.T) { + repo := nextTestRepo(t) + writeSavedFeaturePlan(t, repo, "historical-one") + writeSavedFeaturePlan(t, repo, "historical-two") + writeIntakePlan(t, repo, "current.md") + + status, err := ResolveNext(repo) + if err != nil { t.Fatal(err) } + if status.VerificationStatus != "VERIFIED" || status.ObservedStage != "SOURCE_PLAN_READY" || status.NextOperation != "auto-plan" { + t.Fatalf("new source plan did not outrank historical plans: %+v", status) + } +} + +func TestResolveNextBlocksMultipleSourcePlansBeforeHistoricalPlans(t *testing.T) { + repo := nextTestRepo(t) + writeSavedFeaturePlan(t, repo, "historical-one") + writeSavedFeaturePlan(t, repo, "historical-two") + writeIntakePlan(t, repo, "first.md") + writeIntakePlan(t, repo, "second.md") + status, err := ResolveNext(repo) if err != nil { t.Fatal(err) } - if status.ObservedStage != "SOURCE_PLAN_READY" || status.NextOperation != "auto-plan" { - t.Fatalf("unexpected status: %+v", status) + want := []string{".product-loop/intake/first.md", ".product-loop/intake/second.md"} + if status.VerificationStatus != "BLOCKED" || status.ObservedStage != "AMBIGUOUS" || !reflect.DeepEqual(status.BlockingAmbiguity, want) { + t.Fatalf("unexpected source-plan ambiguity: %+v", status) + } +} + +func TestResolveNextActiveDeliveryOutranksSourcePlan(t *testing.T) { + repo := nextTestRepo(t) + writeNextDelivery(t, repo, "active-feature", "BUILD", 0) + writeIntakePlan(t, repo, "new-feature.md") + + status, err := ResolveNext(repo) + if err != nil { + t.Fatal(err) + } + if status.Feature != "active-feature" || status.ObservedStage != "BUILD" || status.NextOperation != "build" { + t.Fatalf("source plan displaced active delivery: %+v", status) + } +} + +func TestResolveNextOrphanedEvidenceOutranksSourcePlan(t *testing.T) { + repo := nextTestRepo(t) + directory := filepath.Join(repo, ".product-loop", "features", "orphan") + if err := os.MkdirAll(directory, 0o755); err != nil { + t.Fatal(err) + } + if err := os.WriteFile(filepath.Join(directory, "pr.md"), []byte("# Preview\n"), 0o644); err != nil { + t.Fatal(err) + } + writeIntakePlan(t, repo, "new-feature.md") + + status, err := ResolveNext(repo) + if err != nil { + t.Fatal(err) + } + if status.VerificationStatus != "BLOCKED" || status.ObservedStage != "INVALID_STATE" || status.NextOperation != "repair-state" { + t.Fatalf("source plan bypassed orphaned evidence: %+v", status) + } +} + +func TestResolveNextBlocksHistoricalPlansWithoutSourceIntent(t *testing.T) { + repo := nextTestRepo(t) + writeSavedFeaturePlan(t, repo, "historical-one") + writeSavedFeaturePlan(t, repo, "historical-two") + + status, err := ResolveNext(repo) + if err != nil { + t.Fatal(err) + } + want := []string{"historical-one", "historical-two"} + if status.VerificationStatus != "BLOCKED" || status.ObservedStage != "AMBIGUOUS" || !reflect.DeepEqual(status.BlockingAmbiguity, want) { + t.Fatalf("unexpected historical-plan ambiguity: %+v", status) } } diff --git a/docs/evidence-engineered-coding.md b/docs/evidence-engineered-coding.md index 25ee94b..c2cf4fa 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 [`17376b5e74eb69d341c6df1b69251f2e07d47c4f`](https://github.com/operatorstack/intelligence-flow/tree/17376b5e74eb69d341c6df1b69251f2e07d47c4f/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 [`9a20177c48c292c1c6e1b967e0fd710f2e410a7c`](https://github.com/operatorstack/intelligence-flow/tree/9a20177c48c292c1c6e1b967e0fd710f2e410a7c/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 5487cfd..7690006 100644 --- a/docs/public-claims.json +++ b/docs/public-claims.json @@ -1,6 +1,6 @@ { "schema_version": 1, - "source_commit": "17376b5e74eb69d341c6df1b69251f2e07d47c4f", + "source_commit": "9a20177c48c292c1c6e1b967e0fd710f2e410a7c", "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:17376b5e74eb69d341c6df1b69251f2e07d47c4f" + "last_verified_version": "source:9a20177c48c292c1c6e1b967e0fd710f2e410a7c" }, { "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:17376b5e74eb69d341c6df1b69251f2e07d47c4f" + "last_verified_version": "source:9a20177c48c292c1c6e1b967e0fd710f2e410a7c" }, { "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:17376b5e74eb69d341c6df1b69251f2e07d47c4f" + "last_verified_version": "source:9a20177c48c292c1c6e1b967e0fd710f2e410a7c" }, { "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:17376b5e74eb69d341c6df1b69251f2e07d47c4f" + "last_verified_version": "source:9a20177c48c292c1c6e1b967e0fd710f2e410a7c" }, { "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:17376b5e74eb69d341c6df1b69251f2e07d47c4f" + "last_verified_version": "source:9a20177c48c292c1c6e1b967e0fd710f2e410a7c" }, { "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:17376b5e74eb69d341c6df1b69251f2e07d47c4f" + "last_verified_version": "source:9a20177c48c292c1c6e1b967e0fd710f2e410a7c" }, { "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:17376b5e74eb69d341c6df1b69251f2e07d47c4f" + "last_verified_version": "source:9a20177c48c292c1c6e1b967e0fd710f2e410a7c" }, { "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:17376b5e74eb69d341c6df1b69251f2e07d47c4f" + "last_verified_version": "source:9a20177c48c292c1c6e1b967e0fd710f2e410a7c" }, { "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:17376b5e74eb69d341c6df1b69251f2e07d47c4f" + "last_verified_version": "source:9a20177c48c292c1c6e1b967e0fd710f2e410a7c" }, { "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:17376b5e74eb69d341c6df1b69251f2e07d47c4f" + "last_verified_version": "source:9a20177c48c292c1c6e1b967e0fd710f2e410a7c" }, { "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:17376b5e74eb69d341c6df1b69251f2e07d47c4f" + "last_verified_version": "source:9a20177c48c292c1c6e1b967e0fd710f2e410a7c" } ] } diff --git a/labs/diagram-json/plan.lock.json b/labs/diagram-json/plan.lock.json index 24e37b4..56a6300 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": "17376b5e74eb69d341c6df1b69251f2e07d47c4f", + "source_commit": "9a20177c48c292c1c6e1b967e0fd710f2e410a7c", "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-07-19-new-worktree-intent.md b/release-notes/2026-07-19-new-worktree-intent.md new file mode 100644 index 0000000..081cbe2 --- /dev/null +++ b/release-notes/2026-07-19-new-worktree-intent.md @@ -0,0 +1,7 @@ +### Start new work reliably in mature repositories + +Boatstack now recognizes one unclaimed Plan-mode file as the current planning +intent before considering historical feature packages that have no delivery +state in a fresh linked worktree. Active deliveries and invalid evidence still +take precedence, while genuinely ambiguous new or historical plans remain +blocked for an explicit choice.