From aa51824ccdcbc36b188ae2e7f4dc27c5b8af7109 Mon Sep 17 00:00:00 2001 From: REPPL <77722411+REPPL@users.noreply.github.com> Date: Sun, 11 Oct 2026 00:21:41 +0100 Subject: [PATCH 1/2] fix: ground invariants, naming and personas from their brief files and state why a packed section is partial The disembark probe's invariants, naming and personas adapters now read the section's own brief file as the open-questions and tradeoffs adapters do: an authored file grounds the section, a stub one is cited and lifts a blank to partial with a reason, and a missing one leaves the record reading as it was. Personas loses its partial ceiling, so an authored personas file grounds the section as an authored mental-model or framing file already does; with no file it stays the blank that asks a person. The pack's per-section brief file now prints a partial section's reason as "Why partial:", cleaned like every other untrusted field the lifeboat writes, matching coverage.json and the rendered coverage report. Refs: iss-2610072347247487 Assisted-by: Claude:claude-opus-5-5 --- .../brief/04-surfaces/02-disembark.md | 2 +- internal/core/lifeboat/mdrender_test.go | 11 ++++ internal/core/lifeboat/partial_reason_test.go | 38 +++++++++++ internal/core/lifeboat/plan.go | 12 +++- internal/core/lifeboat/sources_native.go | 64 +++++++++++-------- internal/core/lifeboat/sources_native_test.go | 62 +++++++++++++++++- 6 files changed, 157 insertions(+), 32 deletions(-) diff --git a/.abcd/development/brief/04-surfaces/02-disembark.md b/.abcd/development/brief/04-surfaces/02-disembark.md index 1a54a4712..80977c43d 100644 --- a/.abcd/development/brief/04-surfaces/02-disembark.md +++ b/.abcd/development/brief/04-surfaces/02-disembark.md @@ -137,7 +137,7 @@ a section of its own. ├── _provenance.json # the lifeboat marker and re-pack gate key, written last ├── coverage.json # per-section status (grounded|partial|blank), evidence, what was searched ├── coverage.md # rendered -├── brief/ # the brief, section by section, grounded from the source +├── brief/ # the brief, section by section, grounded from the source; a partial one says why │ ├── 01-product/ … 06-delivery/ │ └── glossary/ ├── graveyard/ # what the project tried and abandoned diff --git a/internal/core/lifeboat/mdrender_test.go b/internal/core/lifeboat/mdrender_test.go index 2861f2b41..54a3c7b9e 100644 --- a/internal/core/lifeboat/mdrender_test.go +++ b/internal/core/lifeboat/mdrender_test.go @@ -195,3 +195,14 @@ func TestBlockValueKeepsATripleBacktickSpanAProseLine(t *testing.T) { } } } + +func TestBriefSectionDocCleansItsPartialReason(t *testing.T) { + md := string(briefSectionDoc(SectionCoverage{ + Name: "product/context", Status: StatusPartial, + Reason: "Found docs/