@antoneeo/kb-agentic-skill 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,134 @@
1
+ ---
2
+ name: kb-agentic
3
+ description: Knowledge-Base & Document-First protocol with risk-proportional triage, Vision as a guide, Signal Distillation, a complete Standalone mode and optional symbiosis with devPNT. Use for user documentation, knowledge extraction, SOPs, research notes, decision logs and knowledge management.
4
+ author: Antonio Pinto (https://github.com/Antoneeo)
5
+ copyright: (c) 2026 Antonio Pinto
6
+ ---
7
+
8
+ # KB Agentic
9
+
10
+ **Why this skill exists:** to prevent *knowledge degradation and myopia* — acting from partial understanding, where new information contradicts un-indexed notes and hard-won knowledge evaporates between sessions. Triage, the Vision Gate, signal distillation, the documentation lifecycle, and operative guide routers are all one defense against that.
11
+
12
+ This skill guides knowledge management and documentation with a Document-First process proportional to risk. It works fully even without devPNT. When devPNT is available and configured for the current project, the skill works in symbiosis with its governance: M-VISION, Master Plan, Action Plan and versioned artifacts become the authoritative frame for milestones and knowledge nodes.
13
+
14
+ Support files in the skill directory:
15
+ - `templates.md`: templates for Vision, Knowledge ANALYSIS, Research SPIKE, SOP GUIDE, audit plan, and handoff.
16
+ - `taxonomy.md`: placing a claim in the topic graph — descent over the generated index, the five verdicts (EXISTS / INADEQUATE / MISSING / GENERALIZES / UNPLACED), the sibling rule, guarded re-parenting, canonicalization. Run at L3 before drafting.
17
+ - `guides.md`: pipeline for distilling user-provided indications into `ai_docs/reference/GUIDE_[topic].md`.
18
+ - `vision.md`: how to write a Vision a cold reviewer can actually apply — the properties that make a rule hold, the minimum operable sections, and the blind check.
19
+ - `distillation.md`: from a source to claim rows — intake (content-addressed originals, stored canonical extraction, every provenance a real file), the claim table, extraction discipline, signal rules (symbiosis with `distill`).
20
+ - `reconciliation.md`: what happens when two claims meet — five outcomes, detect-and-hold (the machine never decides), rulings with mandatory `basis:`, the claim state machine, the batched escalation form.
21
+ - `review.md`: the review discipline — when a review is due, how to request one, how to receive findings, how to review.
22
+ - `dispatch.md`: opt-in subagent execution of an approved plan.
23
+ - `routing.md`: which lens owns this unit of work. Read ONLY when a sibling lens skill is installed alongside this one; a single-lens install never reads it.
24
+ - `scripts/sdlc_check.py` + `scripts/sdlc_core.py`: the mechanical validator for the docs root (`check`, `validate`, `index`, `stale`, `mark`, `gate`, `plan`, `orient`, `migrate`, and the knowledge overlay: `graph`, `corpus`, `claim-id`). Two files: the core is the family's shared spine; the entry point IS the knowledge overlay — the claim ledger and topic-graph checks live inside it, so the core alone runs none of them. Copy both, or neither.
25
+ - `ENFORCEMENT.md`: optional setup for CI and hooks.
26
+
27
+ Read these files only when needed. `SKILL.md` is the operating contract; the support files are progressive resources.
28
+
29
+ ## Knowledge Values
30
+
31
+ - **Understand before writing/updating:** do not modify or create knowledge documents without checking root cause, user constraints, and existing notes — trust the primary sources and existing guides, not memory.
32
+ - **Apply DRY and Single Source of Truth:** do not duplicate knowledge across files; extend existing notes (`ANALYSIS_[topic].md` or `GUIDE_[topic].md`).
33
+ - **Signal & Distillation:** eliminate fluff, filler, and speculative statements; keep deterministic facts, constraints, decisions, and clear SOP steps (symbiosis with `distill`).
34
+ - **Lifecycle & Freshness:** mark superseded knowledge (`status: SUPERSEDED` or `DEPRECATED`) so outdated information does not cause hallucination.
35
+ - **Protect the Vision & User Style:** align all knowledge work with user strategic goals, operational preferences, and expected outcomes.
36
+ - **Map-First Navigation:** rely on `ai_docs/README.md`, `INDEX.md`, and `reference/INDEX.md` router for targeted retrieval before creating new documents.
37
+
38
+ ## Rule Zero: Triage
39
+
40
+ Always classify the request before choosing the process. Declare the chosen level to the user when you start operational work.
41
+
42
+ **Declare the level WITH the router verdict** (one line, for L2, L3 and Spike — L1 declares the level alone): the result of the guide-router lookup described under `## Operative Guides`, i.e. `Level: L2 · router: no match` or `Level: L3 · router: GUIDE_release_sop.md → read`. Name the guide you matched, or `no match`.
43
+
44
+ | Level | Criteria | Required process |
45
+ |---|---|---|
46
+ | **L1 - Quick Fact / Snippet** | Small update to an existing note, typo fix in docs, quick preference update (at most 1-2 files). | Implement edit directly in existing note. No new documents. |
47
+ | **L2 - Local Note / SOP Update** | Specific SOP update, local research note, or small document addition (at most 1-2 files). Low risk. | Mini-analysis in message: objective, impact, sources, validation. Update existing document or create single SOP/note. |
48
+ | **L3 - Major Knowledge Unit / Corpus** | Ingesting large document sets, complex multi-topic research, multi-part guide creation, or restructuring the KB. | Full workflow: Vision Gate, Spec Elicitation, Taxonomy Pass, Knowledge Analysis, Distillation, Review, Indexing. |
49
+ | **Spike - Exploration** | Time-boxed exploratory research or draft without merging into official KB. | Outcome in `ai_docs/solutions/SPIKE_[topic].md`. |
50
+
51
+ Cross-cutting rules:
52
+ - **Domain routing (multi-lens installs only).** After the level is set, and only when a sibling lens skill of this family is installed (`agentic-sdlc`, `mkt-agentic-sdlc`), run the router in `routing.md` for every L2, L3 and Spike: it decides which lens's method and validation rules govern this unit of work. L1 never reaches it, and a single-lens install never reads the file — detection fails open. In such a project, never refer to a document whose meaning differs by lens ("threat model", "vision", `principles.md`, `handoff.md`) by its bare name: qualify it with its domain, or name its path.
53
+ - Personal data, credentials, security-sensitive processes, authN/authZ specs are high-risk: never L1.
54
+ - **Escalation triggers — ANY of these makes it L3, whatever the file count:** the change touches the topic hierarchy (`parents:`, a `GENERALIZES` verdict, a re-parent); it touches more than one node's frontmatter; it creates or supersedes a node other nodes reference. Re-shaping the graph is a unit of change, never a side effect of placing one claim.
55
+ - Adding one claim row to an existing topic is L1: the `id` may be left empty (the validator fills it — `claim-id --fill`), and no check errors on a hand-written row.
56
+ - If a bigger impact emerges during L1/L2 work, stop, reclassify and declare it.
57
+ - When in doubt, pick the higher level.
58
+ - **No useless questions.** Every question to the practitioner passes the legality test of the question discipline (`elicitation.md`): searched first with the search named, and the blocked decision named. Claim-conflict escalations additionally carry their own mandated form and are batched at run end (`reconciliation.md` §4).
59
+
60
+ ## Write Triggers
61
+
62
+ Triage decides IF documentation is due; this table decides WHICH document each event produces, and when. **One event, one destination:** when the trigger fires and the document does not exist, create it; when it exists, update it — never duplicate it.
63
+
64
+ | Document | Write trigger | Phase |
65
+ |---|---|---|
66
+ | `solutions/ANALYSIS_[topic].md` | Every L3, after elicitation and before any drafting. On topic match with an existing analysis, update that one instead of a new file. | 3 |
67
+ | `solutions/SPIKE_[topic].md` | Closing any Spike — including a negative outcome. | — |
68
+ | `vision/features/VISION_[feature].md` | Multi-milestone topic at analysis time, or retroactive trigger (second ANALYSIS on same theme). | 3 |
69
+ | `audit/handoff.md` (workstream registry) | One row per OPEN workstream (topic, level, status, since, next step) — refresh at every L3 closure and session end. ≤ 20 lines. | 5 / session end |
70
+ | `audit/HANDOFF_[topic].md` | Session ends with that topic unfinished AND there is volatile resume state. Ephemeral, deleted at closure. | 4 / 5 / session end |
71
+ | `audit/audit_plan.md` (Standalone) | Bootstrap, and whenever a mapped area changes state (`sdlc_check.py mark`). | 1 |
72
+ | `reference/GUIDE_[topic].md` (`source_kind: document`) | Origin+purpose test (`guides.md`), or a proactive proposal accepted by user. | 4 / 5 |
73
+ | `reference/GUIDE_[topic].md` (`source_kind: code`/`domain`) | Recognized high-complexity domain/concept with no CURRENT guide $\rightarrow$ duty to write autonomously. | 4 / 5 |
74
+ | `audit/reviews/REVIEW_LOG.md` | Every completed review — recorded in log. | 3 / 5 |
75
+ | ADR / Decision Log — `architecture/` or devPNT DB | A strategic decision was taken (pattern, policy, structural change): record before DONE. | 5 |
76
+ | `strategic/architecture.md`, `strategic/existing_features.md` | Bootstrap; update at closure when the knowledge catalog actually changed. | 1 / 5 |
77
+ | `vision/project_vision.md`, `roadmap.md`, `principles.md` | Bootstrap as `Status: DRAFT`; promoted to APPROVED only by explicit user confirmation. | 1 / 2 |
78
+ | `topics/<slug>.md` | A placement verdict creates it (MISSING/INADEQUATE-child, `taxonomy.md`); reconciliation updates its claim rows. One node per topic — a similar-but-distinct concept is a sibling with `related:` + a written distinction, never a merge and never a duplicate. Merged/renamed nodes become tombstones (`status: SUPERSEDED` + `redirect_to:`), never deleted. | 4 |
79
+ | `corpus/given/*` + sidecar | A source arrives: verbatim copy, content-addressed, sidecar with digest/date/`supersedes:`; non-text originals also get their stored canonical extraction (`distillation.md` §1). Never edited after ingest — the digest check is what enforces it. | 4 |
80
+ | `corpus/notes/*` | Something is said (`origin: elicited`), synthesised (`derived_from:`), or ruled (`basis:`). A note with none of the three is refused by the validator. | 4 / 5 |
81
+ | `INDEX.md`, `reference/INDEX.md`, `topics/INDEX.md`, `corpus/INDEX.md` | Regenerated by `sdlc_check.py index` at closure — never by hand; `validate` fails on a hand-edited one. | 5 |
82
+
83
+ ## Operating Modes
84
+
85
+ ### Full Standalone
86
+ Use this mode when devPNT is unavailable, not configured for the current project, or the user explicitly asks for a filesystem-only workflow.
87
+ - Source of truth: `ai_docs/` (`vision/`, `solutions/`, `reference/`, `audit/`, `strategic/`).
88
+
89
+ ### Hybrid in symbiosis with devPNT
90
+ Use this mode when `devpnt_*` tools are available and point at the current project.
91
+ - devPNT governs `M-VISION`, Master Plan, Action Plan, and versioned artifacts.
92
+ - Local `ai_docs/` serves as readable context, Standalone fallback, local handoff, or shadow copy.
93
+
94
+ ## L3 Workflow
95
+
96
+ ### 1. Audit and Alignment
97
+ - Read `ai_docs/audit/handoff.md` (workstream registry) to see active topics.
98
+ - Read `ai_docs/README.md`, `ai_docs/INDEX.md` and `ai_docs/reference/INDEX.md` (the guide router) before exploring notes. The router is a mandatory read, not an optional one: it is the only orientation step that tells you a guide already governs the work you are about to do.
99
+ - If `ai_docs/` is missing, create the bootstrap set: `README.md`, `vision/` docs, `strategic/` docs, and `audit/audit_plan.md`, then run `sdlc_check.py index`.
100
+
101
+ ### 2. Vision Gate
102
+ - Read `project_vision.md`, `roadmap.md`, `principles.md` (or devPNT `M-VISION`).
103
+ - Verify request aligns with expected benefits, user goals, and success signals.
104
+
105
+ ### 3. Request Analysis & Taxonomy Pass
106
+ - Run spec elicitation round (`elicitation.md`) before drafting analysis.
107
+ - Run taxonomy pass (`taxonomy.md`): verify whether topics, categories, or SOPs already exist in `ai_docs/`. Avoid duplication.
108
+ - Create or update `ai_docs/solutions/ANALYSIS_[topic].md`.
109
+ - **Design review gate (end of Phase 3, before any drafting):** the analysis is reviewed by somebody other than its author — a subagent with fresh context, or a declared self-pass when none is available. Follow `review.md`; log the outcome in `audit/reviews/REVIEW_LOG.md`. A knowledge structure reviewed only by the person who chose it is not reviewed.
110
+
111
+ ### 4. Knowledge Processing & Distillation
112
+ - **Isolate the work (Branch/worktree hygiene).** Distillation rewrites existing notes: do it on a branch or a worktree, never directly on the shared corpus, so a half-finished reconciliation is never what the next reader finds.
113
+ - Before drafting (L2/L3; L1 exempt), **consult the guide router** for a guide covering the task and read it first (the consult trigger, `guides.md` §0). A targeted description match, not a blanket read. Its result is the router verdict already declared with the triage level (Rule Zero).
114
+ - Execute knowledge extraction using **Signal Distillation** (`distillation.md`).
115
+ - **Opt-in subagent execution**: for an L3 with an approved analysis, the work MAY be executed via subagents per `dispatch.md`; default stays same-session.
116
+ - Handle conflicting or outdated information via **Reconciliation** (`reconciliation.md`). Mark obsolete files `status: SUPERSEDED`.
117
+
118
+ ### 5. Closure & Indexing
119
+ - Run verification checks (`sdlc_check.py check --root <project_root>`).
120
+ - If the work was governed by user-provided indications and is reusable, **PROPOSE distilling a guide** (proactive trigger, `guides.md` §1) — a proposal for the user, never a silent write, never from model knowledge.
121
+ - Update `audit/handoff.md`.
122
+ - Regenerate manifests: `python <skill_dir>/scripts/sdlc_check.py index --root <project_root>`.
123
+ - Mark output clean and complete.
124
+
125
+ ## Operative Guides & Router
126
+ Guides are consulted, created, and distilled per `guides.md`.
127
+ - **Consult (before acting)**: check `ai_docs/reference/INDEX.md` — the guide router — and declare the verdict with the triage level.
128
+ - **Propose proactively**: when the user hands over indications that will govern future work, propose distilling them into a guide. A proposal, never a silent write, and never from model knowledge — a guide's whole value is that every claim traces to what the user actually provided.
129
+ - Distill from user instructions into `ai_docs/reference/GUIDE_[topic].md`.
130
+
131
+ ## Mechanical Enforcement
132
+ - `scripts/sdlc_check.py index`: updates `ai_docs/INDEX.md` and `ai_docs/reference/INDEX.md`.
133
+ - `scripts/sdlc_check.py validate`: validates YAML frontmatter (`status`, `description`).
134
+ - `scripts/sdlc_check.py check`: checks dirty closures and missing indexes.
@@ -0,0 +1,87 @@
1
+ # Subagent Execution Discipline
2
+
3
+ Opt-in orchestration for L3 work with an approved design: the orchestrator
4
+ drives a `PLAN_[feature].md` through subagents instead of implementing every
5
+ task in the same session. Default stays same-session; this is an escalation,
6
+ never a requirement.
7
+
8
+ ## Trigger
9
+
10
+ Only for L3 (an approved E-TDD in Hybrid, or an ANALYSIS Action Plan in
11
+ Standalone). Never for L1/L2 — the plan/ledger machinery is overhead a small
12
+ change does not need. The plan is always `derived-from` the accepted design:
13
+ it is never independently authored, exactly like an E-TDD is never authored
14
+ without an E-ISP.
15
+
16
+ ## The loop
17
+
18
+ 1. `sdlc_check.py plan validate PLAN_[feature].md` — zero-execution schema +
19
+ confinement + ledger cross-check. Non-zero exit = **no dispatch**. This is
20
+ the hard gate: "no valid plan, no dispatch."
21
+ 2. For each task, in plan order:
22
+ - Read the task's status from the sidecar ledger
23
+ (`PLAN_[feature].ledger.json`). `status: done` (exact sentinel) → skip,
24
+ never re-dispatch. Anything else (pending, failed, missing, or a
25
+ corrupt-but-parseable entry) → treat as pending and dispatch.
26
+ - `sdlc_check.py plan brief PLAN_[feature].md --task <id>` — prints the
27
+ task block, the `produces` of prior-order tasks (interfaces), and
28
+ `guides` pointers (paths, never pasted content) to stdout.
29
+ - Spawn the subagent with that brief as its entire context window.
30
+ - Run `task.verify` out of band (the orchestrator executes it — the
31
+ validator only ever prints it, never runs it) plus the one-shot review
32
+ below.
33
+ - Write `{status, verify_result, timestamp}` back to the ledger. The
34
+ validator never writes the ledger — single-writer, orchestrator-owned.
35
+
36
+ **Guide consumption under dispatch.** Selecting each task's `guides` field IS the
37
+ consult trigger (`guides.md` §0) applied at plan-authoring time: the orchestrator
38
+ runs the router lookup (project router `ai_docs/reference/INDEX.md` + the agent-KB
39
+ router) when populating `guides`. A dispatched context-free subagent does **NOT**
40
+ run its own router consult — it reads the guide pointers handed to it in the
41
+ brief. The router verdict (Rule Zero) is therefore declared ONCE, by the
42
+ orchestrator, when it authors the plan; a dispatched subagent does not declare
43
+ one. (Proactive guide-creation stays at closure — the same broad final pass
44
+ below — so it needs no separate dispatch hook.)
45
+
46
+ ## Model tiers (client-relative, no provider names)
47
+
48
+ - Default dispatch: **economy** implementer tier.
49
+ - After **two** consecutive `verify_result: fail` on the same task: escalate
50
+ to the **deep** tier for the retry (ADR 2026-07-02). Do not escalate on the
51
+ first failure — a single fail is often a brief or environment issue, not a
52
+ capability gap.
53
+
54
+ ## Review slots — one-shot, not iterative
55
+
56
+ Exactly three review touches per task, never a loop:
57
+
58
+ 1. Inline self-review by the implementer subagent before it reports done
59
+ (the standard critical-review pass, not a separate call).
60
+ 2. One reviewer pass per task (Hybrid: reuse the devPNT code-review gate;
61
+ Standalone: the `review.md` discipline).
62
+ 3. One broad final pass over the whole plan at closure, after all tasks are
63
+ DONE — catches cross-task drift a per-task review cannot see.
64
+
65
+ If a review FAILs, fix and re-run `verify` — that is a normal loop iteration
66
+ via the ledger's fail path, not an extra review slot.
67
+
68
+ ## Ledger protocol summary
69
+
70
+ Read → skip-if-done → dispatch-if-pending → write. The ledger is the only
71
+ memory the loop needs across sessions or context compaction: a resumed
72
+ orchestrator re-reads it and picks up exactly where it left off, never
73
+ re-running a DONE task.
74
+
75
+ ## Degradation
76
+
77
+ No subagent-spawning tool available → the orchestrator runs each task in the
78
+ same session, against the same plan and ledger, with the same one-shot review
79
+ slots. No capability is lost, only the parallelism/isolation subagents would
80
+ have added.
81
+
82
+ ## Hybrid note
83
+
84
+ The plan's `derived-from` points at the accepted E-TDD document key. Per-task
85
+ review reuses the devPNT independent reviewers (§4.6 code review gate) rather
86
+ than restating review doctrine — see `review.md` for the single definition
87
+ both modes share.
@@ -0,0 +1,79 @@
1
+ # Distillation — from a source to claim rows
2
+
3
+ **For whom**: the agent ingesting a source into the corpus.
4
+ **Answers**: "what is a claim, how does a source become rows, and where does every kind
5
+ of knowledge get its file".
6
+ **Does not answer**: where a claim's concept lives (above — `taxonomy.md`) or what
7
+ happens when it disagrees with an existing one (`reconciliation.md`).
8
+
9
+ ## 1. Intake — everything becomes a file first
10
+
11
+ Ingest **never touches the graph**. First the source enters the corpus; the graph is fed
12
+ from the corpus, so everything is re-derivable when the rules improve.
13
+
14
+ | What arrives | Where it lands |
15
+ |---|---|
16
+ | a file from the practitioner | `corpus/given/<name>-<hash8>.<ext>` — verbatim, **content-addressed with a raw-byte sha256**; a newer version is a new file whose sidecar says `supersedes: <old>` — never an overwrite |
17
+ | a non-text original (PDF, docx, xlsx) | additionally, its **canonical extraction**: `corpus/given/<name>-<hash8>.txt`, pages separated by form-feed; extractor id, version and normalization recorded in the sidecar. Offsets address THIS file — stored bytes, not a runtime step |
18
+ | something the practitioner says | a transcription in `corpus/notes/`, frontmatter `origin: elicited`, dated |
19
+ | an agent synthesis | a note in `corpus/notes/` with `derived_from:` listing its sources — a note with neither `origin:` nor `derived_from:` nor `basis:` is **model knowledge disguised as a source**, and the validator refuses it |
20
+ | a practitioner ruling | a note with `basis:` (`reconciliation.md`) |
21
+
22
+ Every sidecar (`<original>.meta.md`) carries: the digest, the date, provenance, and
23
+ `supersedes:` when it replaces an earlier version. `corpus/INDEX.md` is generated.
24
+
25
+ ## 2. The claim — one falsifiable assertion
26
+
27
+ The unit of knowledge is the **claim**, not the document. "Doc A and doc B disagree" is
28
+ not actionable; "A says delivery Q1, B says Q3" is. A claim is a sentence that can be
29
+ true or false: "the system is robust" is not one; "the retry runs 3 times with backoff"
30
+ is.
31
+
32
+ Claims live in the owning topic's `## Claims` table (`templates.md` has the template):
33
+
34
+ | id | claim | valid | qty | about | source | prov | state |
35
+ |---|---|---|---|---|---|---|---|
36
+
37
+ - **id** — leave empty when writing by hand; `sdlc_check.py claim-id --fill <file>`
38
+ computes it (`sha256(path#locator#qty)`, text excluded — a paraphrase must not mint a
39
+ new identity). An empty id is a `[note]`, never an error.
40
+ - **valid** — `-`, `from X`, `until X`, `from X until Y`, `if <condition>`. Half-open:
41
+ `until 2026-03-01` and `from 2026-03-01` do NOT overlap. A time-bounded fact is not a
42
+ conflict with its successor — write the scope, or reconciliation will manufacture one.
43
+ - **qty** — `-` or `<value> <unit> <kind>`, kind ∈ effort/cost/duration/count. Effort in
44
+ person-days (8h=1d, 1w=5d, 1mo=21d), duration in calendar days, cost within ONE
45
+ currency. A figure without a unit cannot be summed, compared, or even classified as
46
+ agreement.
47
+ - **about** — `-` or `<predicate> -> <slug>` for a claim about a relationship
48
+ ("depends-on -> phase-1"). Stored once, under the subject; the index computes the
49
+ reverse direction.
50
+ - **source** — `<path>#<locator>`; corroborating sources append with `;`. Locators:
51
+ `p=<n>@<start>-<end>` (character offsets into page n of the stored extraction),
52
+ `L<a>-<b>` (line files), `Sheet<s>!<cell>`. The span must exist — the validator opens
53
+ the file and checks.
54
+ - **prov** — `GIVEN | ELICITED | DERIVED | RULING`. Information for whoever resolves a
55
+ conflict; never a rank.
56
+ - **state** — `OK`, `CONTESTED <ids>`, `SUPERSEDED <id>` (`reconciliation.md` owns the
57
+ transitions).
58
+
59
+ ## 3. Extraction discipline
60
+
61
+ Read the stored extraction (not the original) and emit one row per assertion, each with
62
+ the offset span it came from. The extractor **invents nothing**: no labels, no
63
+ summaries-as-claims, no filling of gaps from model knowledge. What the source does not
64
+ assert does not become a row — it may become a `gaps:` entry on the topic.
65
+
66
+ Extraction is read-only on the corpus and blind to the graph: rows go to placement
67
+ (`taxonomy.md`) afterwards. Ingesting a document set is **L3 by Rule Zero**; the
68
+ ingestion plan derives from the ANALYSIS Action Plan, one task per source, each task's
69
+ `verify` = "claim rows parse; every source resolves under the docs root". Serial in v1:
70
+ correctness first.
71
+
72
+ ## 4. Signal discipline (what "distillation" still means)
73
+
74
+ - Contract-first for any prose you write around the rows (reader, action, payload).
75
+ - Zero speculation: unverified information is marked `[unverified]` or omitted — never
76
+ written as a claim.
77
+ - No noise: no filler, no restated boilerplate; the claim table IS the signal.
78
+ - Lifecycle: every document carries `status:` frontmatter; superseding knowledge marks
79
+ the old file `SUPERSEDED` (documents) or the old row (claims).
@@ -0,0 +1,131 @@
1
+ # Spec Elicitation
2
+
3
+ `## The question discipline` below governs EVERY question to the practitioner —
4
+ any phase, any level, inside or outside the round. The rest of the file is the
5
+ spec elicitation round: it applies when an L3 request enters phase 3 (Request
6
+ Analysis), BEFORE drafting the ANALYSIS document (Standalone) or the D-UC/E-ISP
7
+ (Hybrid).
8
+
9
+ Skip path: if the spec is already complete — an approved Vision or explicit
10
+ user requirements already answer goal, scope, and constraints — skip the
11
+ round and add a one-line note in the analysis stating why it was skipped.
12
+ Do not run the round as a formality when the answers are already on record.
13
+
14
+ Unattended path: when the user is not reachable (a scheduled or autonomous run,
15
+ and a bootstrap Vision is `DRAFT` by mandate, so the skip path above cannot
16
+ apply on a project's first L3), do not stall and do not invent consensus. Write
17
+ the six answers as **declared assumptions** in `## Objective`, mark the ANALYSIS
18
+ `BLOCKED on the user`, and stop before implementation. An assumption on the
19
+ record is reviewable; a guess folded silently into a design is not.
20
+
21
+ ## The question discipline
22
+
23
+ A question to the practitioner spends their attention and stalls the work; the
24
+ round below is the only place the process *plans* that cost. Everywhere, a
25
+ question is legal only when BOTH hold:
26
+
27
+ 1. **Searched first, and the search is named — with its result.** The answer is
28
+ not on record and not derivable from the corpus, the topic graph, `ai_docs/`,
29
+ the Vision or the conversation — and the question states the terms, tools and
30
+ areas you searched **and what they returned**. Same standard as a router
31
+ verdict or a taxonomy-pass MISSING, and it carries their floors: a search
32
+ whose scope does not cover the question is not a search; a hit you did not
33
+ open narrows nothing; and **never fake the search** — "I looked and found
34
+ nothing" that names no terms and no areas is a search not run. A question the
35
+ corpus can answer is a search outsourced to the practitioner.
36
+ 2. **It names what is blocked.** The question states the specific decision or
37
+ fact that cannot be resolved without the reply — what you will do differently
38
+ depending on the answer. If nothing downstream changes, there is no question.
39
+
40
+ Never legal:
41
+
42
+ - **Generic confirmation** — "shall I proceed?", "is this OK?". The process
43
+ authorizes proceeding; if a real risk motivates the ask, name the risk and the
44
+ fork — that is a blocking question and carries the form below.
45
+ - **Preference-fishing** — asking the practitioner to pick among options that
46
+ are equivalent in their effect on the benefit and already decided by the
47
+ project's conventions. Cheapness to undo is NOT the test.
48
+ - **Re-asking the record** — goal, scope or constraints that an APPROVED
49
+ Vision, an earlier reply, or the request itself already states; or a fact a
50
+ claim row already carries with its source.
51
+
52
+ What questions are FOR — what the practitioner uniquely owns: the benefit,
53
+ priorities between conflicting goods, non-goals, acceptance, the approvals
54
+ doctrine reserves to them, and **rulings on contested claims — where their
55
+ answer counts only as a fact they know (`basis:`), never as a preference**
56
+ (`reconciliation.md` §2). Facts about intent come from the practitioner; facts
57
+ about the documents come from the corpus. **Precedence:** a choice the
58
+ practitioner uniquely owns is never preference-fishing; the list above reaches
59
+ choices that are *not* theirs.
60
+
61
+ **Default non-blocking.** An unknown on which no fork of the work depends:
62
+ write it as a **declared assumption** in the artifact it touches, proceed, and
63
+ present the open points **batched**, answered by exception. This branch carries
64
+ the SAME evidence duty as a question: each assumption states **what it is taken
65
+ from** and **the alternative it excludes**, and every declared assumption
66
+ reaches the batch — an assumption nobody is shown is a silent decision. This is
67
+ the same structure as the claim ledger's own escalation rule — keep BOTH sides
68
+ with their sources and surface them, never silently pick one — and it is this
69
+ branch, not the blocking one, where that rule structurally lives: an open
70
+ `CONTESTED` set never stops an ingest (`reconciliation.md` §4).
71
+
72
+ **Blocking is reserved** for three cases: proceeding under ANY assumption would
73
+ waste the work (the forks diverge at once); the doctrine reserves the decision
74
+ to the practitioner; or the doctrine itself mandates the stop. **Exactly two
75
+ mandating files prescribe their own hand-over, and there the general form does
76
+ not apply**: `reconciliation.md` §4's escalation form (the claims in the set,
77
+ each source, date and provenance, and why the machine cannot decide) — the
78
+ mandated form for claim conflicts; and `review.md`'s round cap (the artifact
79
+ plus the open findings). That list is closed. Every other blocking question
80
+ carries the general form:
81
+
82
+ - the fork: the concrete options and what each implies for the work;
83
+ - the evidence: what you searched, read or tried, and what it leaves undecided;
84
+ - why no assumption survives — what work is discarded if you assume and are
85
+ wrong;
86
+ - why it is the practitioner's call;
87
+ - what stays blocked until answered.
88
+
89
+ ## The round
90
+
91
+ Ask ONE structured set of questions, not a drip of follow-ups. Keep each
92
+ question short and numbered; offer concrete options where a real choice
93
+ exists (this narrows the reply and speeds up the round). Cover:
94
+
95
+ 1. **Goal / benefit** — what problem this closes and why now. The answer must
96
+ name what the actor *obtains*, not a mechanism: "a dashboard" is not an
97
+ answer to "never lose the thread" — ask again until it is a benefit
98
+ (`vision.md`: the Vision is the distilled benefit; solutions and preferences
99
+ are what gets filtered out).
100
+ 2. **Actors** — who interacts with this: their role, primary goal, and what
101
+ "good UX" means to them. These become the Vision's `## Actors`; each
102
+ use-case below attaches to one (actor = who they are, use-case = what
103
+ they do). Skip only when an approved Vision already names them.
104
+ 3. **Scope boundaries** — what is explicitly included in this unit of work.
105
+ 4. **Non-goals** — what is explicitly excluded, so scope does not silently
106
+ creep in later.
107
+ 5. **Constraints** — technical, compatibility, and security constraints that
108
+ bound the solution space.
109
+ 6. **Acceptance signals** — how you and the user will both recognize the
110
+ work is done and correct.
111
+
112
+ ## Reflect
113
+
114
+ Fold the answers into the ANALYSIS `## Objective` / `## Vision-Alignment`
115
+ sections (Standalone) or into the D-UC/E-ISP (Hybrid) — do not leave them
116
+ sitting only in the chat transcript. The written document, not the
117
+ conversation, is what the next session and the next reviewer will read.
118
+
119
+ Run a second round only when an answer opens a real fork in the design (a
120
+ genuinely new question the first round could not have anticipated). Do not
121
+ run a second round to double-check answers that were already clear.
122
+
123
+ ## Anti-patterns
124
+
125
+ - **Interrogation**: an endless list of questions, or drip-feeding one
126
+ question at a time across many turns instead of one structured round.
127
+ - **Asking what the approved vision already answers**: re-asking goal or
128
+ non-goals that a `Status: APPROVED` Vision or M-VISION already states.
129
+ - **Collecting answers without folding them in**: getting replies in chat
130
+ and proceeding to design without writing them into the analysis document —
131
+ the next reader has no record of why the scope is what it is.