@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.
- package/CHANGELOG.md +332 -0
- package/README.md +85 -0
- package/gemini-extension.json +6 -0
- package/package.json +50 -0
- package/scripts/init.js +216 -0
- package/scripts/lib.js +152 -0
- package/scripts/postinstall.js +42 -0
- package/scripts/preuninstall.js +17 -0
- package/skills/kb-agentic-skill/ENFORCEMENT.md +123 -0
- package/skills/kb-agentic-skill/SKILL.md +134 -0
- package/skills/kb-agentic-skill/dispatch.md +87 -0
- package/skills/kb-agentic-skill/distillation.md +79 -0
- package/skills/kb-agentic-skill/elicitation.md +131 -0
- package/skills/kb-agentic-skill/guides.md +287 -0
- package/skills/kb-agentic-skill/reconciliation.md +79 -0
- package/skills/kb-agentic-skill/review.md +168 -0
- package/skills/kb-agentic-skill/routing.md +100 -0
- package/skills/kb-agentic-skill/scripts/sdlc_check.py +846 -0
- package/skills/kb-agentic-skill/scripts/sdlc_core.py +1996 -0
- package/skills/kb-agentic-skill/taxonomy.md +80 -0
- package/skills/kb-agentic-skill/templates.md +579 -0
- package/skills/kb-agentic-skill/vision.md +245 -0
|
@@ -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.
|