[US-351] feat: bootstrap Phase 3.6 — guided authoring of the Criticality Table / Overrides delta - #422
[US-351] feat: bootstrap Phase 3.6 — guided authoring of the Criticality Table / Overrides delta#422rucka wants to merge 7 commits into
Conversation
…on delta - Phase 3.6 exists between Phase 3.5 and Phase 4, one step per owned section - rows proposed from the 3.5 domain model, repo-derived fallback, empty valid - write path = classify's propose-then-write-if-confirmed, never /record-decision - opt-in: declining writes nothing, no HALT, no DoD requires the sections - idempotent on an authored file, reports (never rewrites) a malformed one - quick mode asks nothing and writes nothing; delta declared in quick-mode-defaults - schema referenced from quality-model 3.1/4/6, never restated inline RED: 23 failing, 5 negative guards already green. Refs: #351
…delta - new Phase 3.6 after 3.5: rows proposed FROM the mapped subdomains/contexts, each with a recommended criticality + reason; confirm or edit, never invent - 3.5 skipped/empty => candidates from the repo (workspaces, deployables); no distinct services => single scope; an empty table stays a valid answer - written with classify's propose-then-write-if-confirmed registry pattern (quality-model 5), never through /record-decision; Tag Projection untouched - opt-in and non-blocking: declining writes nothing, KB defaults apply (D21), no HALT added, no DoD may require the sections - idempotent per section; a malformed risk-matrix.md is reported, not rewritten - quick mode asks/writes nothing (no delta is the resolved default) — declared in quick-mode-defaults.md and in the checklist's deliberately-absent list - Step 4.3 summary gains a Classification line; mirrors regenerated GREEN: 28 assertions + 44 pre-existing bootstrap ones. Refs: #351
…estration flow - ADL: position after domain modeling, registry write path (not /record-decision), quick mode writes no delta; alternatives incl. Step 3.1 placement and a heuristic quick-mode map, both rejected with reasons - how-to-02 gains Phase 2.6 pointing at bootstrap Phase 3.6 — the how-to is the orchestration flow of record, a phase living only in the skill would be drift - deliberately NOT added to the how-to Final Quality Checklist: absence of the delta is a supported steady state, not an unchecked box Refs: #351
…aviour - CI/piped stdin has nothing to interview: bootstrap already downgrades to quick, so the phase asks nothing and writes nothing — stated in the phase, not left implicit in the global no-TTY rule - assertion added; mirror regenerated Refs: #351
Verdict
PR: [#422] · Author: rucka · Reviewer: independent reviewer agent · Date: 2026-08-11 · Story: [US-351] · Type: feature Classification matrix — per dimension
Tier = max(assessed) = yellow — confirms the story's refinement-time 🟡 tier requirements (quality-model §4, KB defaults — no AssessmentsSecurity — Input validationVerdict: green — the diff adds no input-handling surface; the only executable file reads fixed repo-relative paths. Details
Security — Output handlingVerdict: green — no rendering, encoding or serialization surface in the diff. Security — AuthenticationVerdict: green — not applicable; no auth surface touched. Security — AuthorizationVerdict: green — not applicable; no access-control surface touched. Security — Introduced vulnerabilitiesVerdict: green — 0 introduced, 0 pre-existing on the touched surfaces. DetailsThe new phase writes two sections into an adoption file the developer explicitly confirms, and never copies the example asset wholesale. CostVerdict: Details
Architecture (Coupling)Verdict: green — no new integration; the one structural change is a second writer on an already-shared file, documented in the ADL but not in the writers registry (M6). Details
DetailsFindings by severityCritical (must fix before merge)
Major (should fix before merge)
Minor (consider)
Questions
Positive feedback
Functionality & requirements (AC coverage)
Edge cases from the story, checked one by one: no distinct services ⇒ single scope ✅ · overrides empty ⇒ KB defaults ✅ · file absent ⇒ created with confirmed sections only, never a copy of the example ✅ · malformed ⇒ reported, not rewritten Testing & quality gatesRe-run independently on head
🟡 gate set (lint + type + build + unit) is green, so nothing caps the verdict mechanically. Coverage of the new assertions is adequate for a prose artifact: 29 assertions across positioning, both question sets, the write path, opt-in/non-blocking, idempotency, quick mode, schema non-restatement, the Step 4.3 summary and the mirror. Two gaps are recorded as m9 (no cross-document anchor pin) and inside Major 3 ( Adoption compliance
Tech debt
No item here is large enough to warrant its own story, and none of them justify TECH-DEBT as a verdict on their own. Documentation
Performance & deployment
Review conduct: 🟡 standard checklist depth (quality-model §4) — sections with nothing to say are stated briefly rather than expanded. |
…ne question per family - parse check hoisted out of Step 3.6.1 into Step 3.6.0 (whole-phase precondition): a malformed-but-headed section could otherwise read as "already authored" and let Step 3.6.2 write into a file §6 makes silently inert - Step 3.6.2 split into two blockquotes (thresholds; reviewer counts/SLAs), the second saying the counts bind a merge only with `Review enforcement: enabled` - Step 3.6.1: single up-front "author the table at all?" gate before the row loop (list to prune, not a form to complete); bounded contexts supply the key, subdomains de-duplicated against them (an unlisted/near-miss key resolves to conservative High) - Output Format `Classification:` is per-section, so a mixed run is representable - version 0.6.0 → 0.7.0 (new phase step + changed output shape + sub-doc touched) - skills-guide § Adoption Files gains the `tech/risk-matrix.md` row (section ownership) - quality-gates-configuration.mdx names the guided path in "How to enable" - 6 new conformance assertions (all fail on the pre-fix content) + 2 cross-document rot guards: quality-model §5 still defines the pattern, classify Step 5 still writes `## Tag Projection` Refs: #351
…dered enforcement value, empty-answer semantics - quality-model §6 gains the Key namespace rule (deployable owning the touched files) so the write side keys what the read side queries; catalogs demoted to candidate/value sources. New ADL, example asset + website mirror aligned. - criticality criterion stated in its own terms (blast radius / exposure / data sensitivity / uptime) with an explicit H/M/L mapping — no longer read off the subdomain class, which §3.1 already spends on Business impact. - reviewer/SLA prompt renders `Review enforcement: [recorded value]` with both branches, instead of asserting the `disabled` default. - "empty is valid" now means no section written; a rowless table is refused. - gate + per-row prompts disclose that an unlisted service resolves to High. - `skipped — quality model not installed` added to the summary line. - decline-is-not-recorded divergence from classify documented (phase + ADL). - Phase 3.5 / Step 3.2 exits route into 3.6 instead of past it. - checklist no longer claims the file stays absent after a quick run. - test helper escapes every dot; prose assertions de-brittled to alternations. Refs: #351
…ion, criterion moved to the model §6 keyed a diff to "the deployable that owns the touched files" (singular) and covered only the single-deployable repo. A change touching several deployables — the normal monorepo diff — resolved by whichever key the executor picked, and since tier = max(dimensions) the whole tier flipped between runs on identical code. §6 now takes the HIGHEST criticality among the touched deployables, with an unlisted one contributing the conservative High; and it resolves the key at refinement time too (story's declared scope; a story naming none falls to the file-absent default, not to unlisted⇒High). The H/M/L criterion moves out of the skill into §6 (Choosing a value) — model semantics, so both authoring routes reason the same way; Step 3.6.1 cites it. Step 3.6.0 gains the quality-model-installed check its own Verify now admits as the third whole-phase state. Degraded (no domain model) rows are recommended by the same criterion instead of offered bare. The render-it directive moves out of the developer-facing blockquote into item 4's prose. ADL #1 Decision 1 reworded to what shipped (deployable keys, empty ANSWER valid, rowless table refused) and cross-references the keying ADL. New guards: multi-deployable + refinement-time §6 rules, §6-owns-the-criterion, how-to-02 Phase 2.6, ADL Decision 1, Step 3.6.0 third state, degraded-path recommendation; two brittle prose assertions widened. Refs #351
PR Information
PR Title: [US-351] feat: bootstrap Phase 3.6 — guided authoring of the Criticality Table / Overrides delta
Story/Epic: #351 — Guided authoring of the Criticality Table / Overrides delta in bootstrap/quickstart (parent epic #208)
Type: Feature
Priority: P2 (Nice-to-Have)
Labels: risk:yellow
Summary
What Changed
Adds a new
/pair-process-bootstrapPhase 3.6: Classification Delta, positioned immediately after Phase 3.5 (Domain Modeling) so the candidate rows fortech/risk-matrix.md's## Criticality Tableare proposed from the subdomains/bounded contexts Phase 3.5 just mapped, rather than asked cold.skipped — quality model not installed) and then that the file parses; a malformedrisk-matrix.mdskips both steps (skipped — file malformed) and continues at Phase 4 — the file is never rewritten over a parse the phase does not trust, and a write into it would be silently inert (§6 falls back to KB defaults entirely).Review enforcementvalue Step 3.2 recorded instead of assuming one./pair-capability-classifyuses for its## Tag Projectionself-write — not routed through/pair-capability-record-decision. The one deliberate divergence (a decline is not recorded, unlikeclassify'sActive: none) is stated in the phase and in the ADL.quick-mode-defaults.md, cascade tier—because nothing is resolved from any tier).Classification:line (criticality: … , overrides: …, or a whole-phaseskipped — quick mode | file malformed | quality model not installed).Key namespace(what a diff resolves to as its service/domain — the deployable / workspace / top-level path scope), its multi-key resolution (a change touching several deployables takes the highest criticality among them, an unlisted one contributing the conservative High — without it the tier flips between runs on identical code, since tier = max of dimensions), its refinement-time resolution (the story's declared scope; a story naming no deployable falls to the file-absent default, not to unlisted⇒High), andChoosing a value(the H/M/L criterion, moved here from the skill so both authoring routes reason the same way). §6's two delta bullets also point at the guided path. Root, dataset mirror, website mirror, andrisk-matrix-example.mdaligned.Why This Change
tech/risk-matrix.mdholds up to three independent sections (quality-model §6).## Tag Projectionalready had a guided authoring path (/pair-capability-classify, self-proposed on first run). The other two —## Criticality Tableand## Overrides— had none: a project could only hand-copy them fromrisk-matrix-example.md. This closes that gap, at the one point in the flow where a domain model already exists to propose rows from — cheaper and more accurate than asking cold, and strictly non-blocking: the file stays optional by design (D21), and no Definition of Done may come to require these sections.Story Context
User Story: As a team bootstrapping a pair project, I want a guided flow to author the
## Criticality Tableand## Overridesdelta oftech/risk-matrix.md, so that the two adoption-delta sections that shape classification have a guided authoring path instead of being hand-copied from the example asset.Acceptance Criteria: All 7 ACs covered —
classify's Tag Projection self-write, not through/pair-capability-record-decision.$mode: quick⇒ asks nothing, writes nothing, reported once in the Step 4.3 summary.Changes Made
Implementation Details
.claude/skills/pair-process-bootstrap/SKILL.md(+ dataset mirror): Steps 3.6.0 (parse precondition), 3.6.1 (Criticality Table), 3.6.2 (Overrides), each with check → skip → act → verify.quick-mode-defaults.md(+ dataset mirror).Key namespacerule + pointers to the guided path (root, dataset,quality-model.mdx);risk-matrix-example.mdstates the keying rule in-file.skills-guide.md§ Adoption Files gains thetech/risk-matrix.mdrow (two writers, section ownership as the invariant);quality-gates-configuration.mdxnames the guided path.Files Changed
0.6.0→0.7.0):.claude/skills/pair-process-bootstrap/SKILL.md·packages/knowledge-hub/dataset/.skills/process/bootstrap/SKILL.md.claude/skills/pair-process-bootstrap/quick-mode-defaults.md·packages/knowledge-hub/dataset/.skills/process/bootstrap/quick-mode-defaults.md.pair/knowledge/guidelines/quality-assurance/quality-model.md(§6: key namespace, multi-deployable + refinement-time resolution,Choosing a valuecriterion, guided-path pointers).pair/knowledge/assets/risk-matrix-example.md·.pair/knowledge/assets/bootstrap-checklist.md.pair/knowledge/how-to/02-how-to-complete-bootstrap-checklist.md·.pair/knowledge/skills-guide.mdapps/website/content/docs/reference/quality-model.mdx·apps/website/content/docs/reference/quality-gates-configuration.mdxpackages/knowledge-hub/src/conformance/bootstrap.test.ts(comment).pair/adoption/decision-log/2026-08-11-criticality-delta-is-authored-after-domain-modeling.md.pair/adoption/decision-log/2026-08-11-criticality-rows-are-keyed-by-the-deployable-a-diff-resolves-to.mdpackages/knowledge-hub/src/conformance/bootstrap-classification-delta.test.tsTesting
Test Coverage
bootstrap-classification-delta.test.ts(933 lines, 57 tests) asserts: phase position and reachability, the parse precondition's ordering/verify/continuation, both steps present, quick-mode delta + cascade tier, no inline schema restatement, write path =classify's propose-then-write-if-confirmed (not/pair-capability-record-decision) with the decline divergence disclosed, idempotency, degradation paths, the key namespace (skill and quality-model §6), the H/M/L recommendation mapping, the unlisted⇒High disclosure inside both prompts, the renderedReview enforcementvalue, the per-section summary slots + all three whole-phase values, the §6 multi-deployable / refinement-time / criterion-ownership rules, and seven cross-document rot guards (quality-model §5/§6 ×4,classifyStep 5,skills-guide.md, how-to-02 Phase 2.6, the positioning ADL's Decision 1).@pair/knowledge-hubsuite green, incl.check:links.Test Results
Testing Strategy
risk-matrix.mdabsent (created with only confirmed sections); malformed file (reported, never rewritten, phase skipped whole);## Tag Projectionalready present (left untouched).Quality Assurance
Code Quality Checklist
/pair-capability-classifyReviewer Guide
Review Focus Areas
Choosing a valuecriterion now all live in §6 — confirm the write side (Step 3.6.1) only applies them, and that the criterion has exactly one definition.classify's pattern (registry write, not/pair-capability-record-decision) and## Tag Projectionis never touched.Testing the Changes
Key Test Scenarios
risk-matrix.mdalready has## Criticality Table— verify no re-proposal; on a malformed file — verify the whole phase skips and nothing is written.$mode: quick— verify zero questions asked andClassification: skipped — quick modein the Step 4.3 summary.Dependencies & Related Work
Related PRs
/pair-capability-classify+ Tag Projection self-write — the pattern this reuses)Type emphasis: Feature → user impact + technical decisions.