@antoneeo/kb-agentic-skill 1.32.0 → 1.33.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 +44 -0
- package/README.md +56 -15
- package/gemini-extension.json +1 -1
- package/package.json +1 -1
- package/scripts/init.js +6 -6
- package/skills/kb-agentic-skill/SKILL.md +2 -2
- package/skills/kb-agentic-skill/review.md +28 -0
- package/skills/kb-agentic-skill/scripts/sdlc_core.py +54 -14
- package/skills/kb-agentic-skill/templates.md +3 -0
- package/skills/kb-agentic-skill/vision.md +308 -308
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,50 @@
|
|
|
2
2
|
|
|
3
3
|
Every significant change to this skill is recorded here.
|
|
4
4
|
|
|
5
|
+
## [1.33.0] - 2026-10-31
|
|
6
|
+
|
|
7
|
+
### What's new
|
|
8
|
+
|
|
9
|
+
**You approve the design before any drafting.** On significant work, once the independent design review passes, the agent stops and shows you a short summary of the design: what it will produce, for whom, what it touches, the risks and how they are handled, and what the review found. Drafting starts only after your yes, which the agent records in the unit's request record. A "go ahead" given before you saw the design does not count, and in a session with nobody to answer the unit waits for you.
|
|
10
|
+
|
|
11
|
+
**The npm page tells you what is new.** This section, at the top of the package page, now summarizes each version for the people who install it.
|
|
12
|
+
|
|
13
|
+
**From 1.32.0, published without notes:**
|
|
14
|
+
- **You know what the knowledge base has not read yet.** It tells you how much of the project remains to be examined, and before answering "no information" it checks where the answer could be.
|
|
15
|
+
- **What you told others stays a statement.** What you wrote to a client or a partner does not become a fact about the product. If it contradicts what the knowledge base holds, it is flagged.
|
|
16
|
+
- **Decisions from other projects no longer apply by themselves.** Importing a topic from another project brings the knowledge whole, but the decisions taken there stay pending until one of you approves them.
|
|
17
|
+
- **The process checks can no longer be bypassed by accident.** Quoting a work level inside a sentence no longer counts as declaring it, and protected parts of the project stay protected when the agent changes folder.
|
|
18
|
+
|
|
19
|
+
#### What to do
|
|
20
|
+
|
|
21
|
+
**1. Update (everyone).** The changes arrive only with the update.
|
|
22
|
+
1. Run `npm install -g @antoneeo/kb-agentic-skill@latest`, then `kb-agentic-install-skill`.
|
|
23
|
+
2. Close and reopen your agent sessions: the new version loads only at startup.
|
|
24
|
+
|
|
25
|
+
To check: `npm ls -g @antoneeo/kb-agentic-skill` shows 1.33.0.
|
|
26
|
+
|
|
27
|
+
**2. Approving the design (significant units).**
|
|
28
|
+
- **This concerns you if** you use the skill for significant (L3) work. Nothing to configure: after the design review passes, the agent asks whether to proceed. Answer yes to start the drafting, or say what to change; the design is then revised and, where the change touches what the review judged, reviewed again before you are asked again.
|
|
29
|
+
- **A unit already in progress.** Units started before 2026-10-31 are not affected. If a unit started on or after 2026-10-31 with an earlier version is already in progress or finished, `sdlc_check.py validate` shows a `[note]` saying it has `no design approval in its request record`. Why: the earlier version never asked you. To clear it, tell the agent that you approve the design as it was implemented; it records your words under a label that begins `design approved` (for example `design approved after implementation`). The note never fails a check, so you can also leave it.
|
|
30
|
+
- **To check:** on your next significant unit, the agent stops after the design review and asks you before any drafting starts.
|
|
31
|
+
|
|
32
|
+
**3. Decisions imported from another project (only if you used `import` before 1.32.0).**
|
|
33
|
+
- **This concerns you if** you used the knowledge base's `import` command to bring topics from another project with version 1.31.0 or earlier. If you never did, skip this point.
|
|
34
|
+
- **Why:** the knowledge base leaves open the questions on which sources disagree, and only a reasoned decision of yours closes them. The earlier version brought another project's decisions in already in force. For example, if someone in project A had settled "the right price is 49 €", importing into B made that price the truth in B too, without anyone in B deciding it. The update corrects future imports only; past ones stay as they are.
|
|
35
|
+
- **Steps:** the simplest way is to ask the agent: "convert the imported decisions as described in portability.md §4". Or by hand: delete the imported topic together with the files that came with it, then run `import` again on the same bundle with the new version; you can try it first with `--dry-run`.
|
|
36
|
+
- **To check:** `sdlc_check.py check` is clean; the other project's decisions appear as imported, and the questions they closed are open again. To make one yours, write your own decision with your own reasoning.
|
|
37
|
+
|
|
38
|
+
**4. Protected folders in a repository with several `ai_docs/` (only if you use them; from 1.32.0).**
|
|
39
|
+
- **This concerns you if** your agent settings contain `gate --hook --protected` and the repository has more than one `ai_docs/` folder, for example a package with its own.
|
|
40
|
+
- **Why:** protected paths are now read from the `ai_docs/` nearest to the edited file. A path written from the repository root, such as `packages/api/src/auth`, no longer matches the files inside `packages/api`, so the agent could change them without an analysis.
|
|
41
|
+
- **Steps:** rewrite those paths from the package: `packages/api/src/auth` becomes `src/auth`. Note that `src/auth` then protects the folder with that name in every project that has its own `ai_docs/`.
|
|
42
|
+
- **To check:** in a session with no open analysis, ask the agent for a small change to a protected file. It must be refused.
|
|
43
|
+
|
|
44
|
+
### Changed
|
|
45
|
+
- After the design review's final PASS, an L3 unit stops: the agent presents a short summary of the design and asks the owner whether to proceed; drafting starts only after a yes, recorded in the request record under a label that begins `design approved`. Unattended, the unit is `BLOCKED on the user`; in Hybrid the approval in devPNT counts. The rule is in the shared `review.md`; `SKILL.md` and `templates.md` point at it (F-087).
|
|
46
|
+
- The shared validator: `validate` notes an L3 ANALYSIS in implementation, started on or after 2026-10-31, whose request record holds no entry whose label begins `design approved`. It is a `[note]`: `--strict` exits as before. The `gate` refusal message adds that at L3 the ANALYSIS goes `IN_PROGRESS` only after the owner's design approval; its exit codes are unchanged (F-087).
|
|
47
|
+
- The package's npm page (its README) gains a "What's new in <version>" section right after the introduction, written for the people who install the package and linking the full CHANGELOG. It appears from the first version that carries one; each version's notes are the `### What's new` at the top of its CHANGELOG section (F-070). The "Shared project memory" section moves from the top of the page to just after the features, unchanged.
|
|
48
|
+
|
|
5
49
|
## [1.32.0] - 2026-10-27
|
|
6
50
|
|
|
7
51
|
### Added
|
package/README.md
CHANGED
|
@@ -1,24 +1,50 @@
|
|
|
1
1
|
# KB Agentic Skill for Claude Code, Gemini CLI, Google Antigravity & Codex
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
`kb-agentic` turns an AI agent into the keeper of a second brain built **on the documents you supply** — not on what the model remembers. It supports Claude Code, Codex, Gemini CLI, Google Antigravity 2.0, Cursor/Windsurf-style project instructions, and optional devPNT governance.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
not a second skill just for recall. `index` registers guides, decisions and plans
|
|
7
|
-
in the docs root's `memory/INDEX.md`, linking originals without copying them.
|
|
8
|
-
`recall "onboarding"` finds related metadata across domains; optional
|
|
9
|
-
`topics: [onboarding]` links documents by subject. Read the originals for authority,
|
|
10
|
-
status and evidence: discovery is not approval or proof of implementation.
|
|
5
|
+
The sibling of [`@antoneeo/agentic-sdlc-skill`](https://www.npmjs.com/package/@antoneeo/agentic-sdlc-skill), transplanted from source code to knowledge: same process, one different fidelity discipline.
|
|
11
6
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
taxonomy. Marketing retains its numerical validators. See the skill's `memory.md`.
|
|
16
|
-
Vendoring requires all three files: the entry point, `sdlc_core.py`, `knowledge.py`.
|
|
7
|
+
<!-- whats-new:begin -->
|
|
8
|
+
<!-- generated by scripts/whats_new.js from distributions/kb-agentic-skill/CHANGELOG.md: edit the CHANGELOG, then run node scripts/whats_new.js --write -->
|
|
9
|
+
## What's new in 1.33.0
|
|
17
10
|
|
|
11
|
+
**You approve the design before any drafting.** On significant work, once the independent design review passes, the agent stops and shows you a short summary of the design: what it will produce, for whom, what it touches, the risks and how they are handled, and what the review found. Drafting starts only after your yes, which the agent records in the unit's request record. A "go ahead" given before you saw the design does not count, and in a session with nobody to answer the unit waits for you.
|
|
18
12
|
|
|
19
|
-
|
|
13
|
+
**The npm page tells you what is new.** This section, at the top of the package page, now summarizes each version for the people who install it.
|
|
20
14
|
|
|
21
|
-
|
|
15
|
+
**From 1.32.0, published without notes:**
|
|
16
|
+
- **You know what the knowledge base has not read yet.** It tells you how much of the project remains to be examined, and before answering "no information" it checks where the answer could be.
|
|
17
|
+
- **What you told others stays a statement.** What you wrote to a client or a partner does not become a fact about the product. If it contradicts what the knowledge base holds, it is flagged.
|
|
18
|
+
- **Decisions from other projects no longer apply by themselves.** Importing a topic from another project brings the knowledge whole, but the decisions taken there stay pending until one of you approves them.
|
|
19
|
+
- **The process checks can no longer be bypassed by accident.** Quoting a work level inside a sentence no longer counts as declaring it, and protected parts of the project stay protected when the agent changes folder.
|
|
20
|
+
|
|
21
|
+
#### What to do
|
|
22
|
+
|
|
23
|
+
**1. Update (everyone).** The changes arrive only with the update.
|
|
24
|
+
1. Run `npm install -g @antoneeo/kb-agentic-skill@latest`, then `kb-agentic-install-skill`.
|
|
25
|
+
2. Close and reopen your agent sessions: the new version loads only at startup.
|
|
26
|
+
|
|
27
|
+
To check: `npm ls -g @antoneeo/kb-agentic-skill` shows 1.33.0.
|
|
28
|
+
|
|
29
|
+
**2. Approving the design (significant units).**
|
|
30
|
+
- **This concerns you if** you use the skill for significant (L3) work. Nothing to configure: after the design review passes, the agent asks whether to proceed. Answer yes to start the drafting, or say what to change; the design is then revised and, where the change touches what the review judged, reviewed again before you are asked again.
|
|
31
|
+
- **A unit already in progress.** Units started before 2026-10-31 are not affected. If a unit started on or after 2026-10-31 with an earlier version is already in progress or finished, `sdlc_check.py validate` shows a `[note]` saying it has `no design approval in its request record`. Why: the earlier version never asked you. To clear it, tell the agent that you approve the design as it was implemented; it records your words under a label that begins `design approved` (for example `design approved after implementation`). The note never fails a check, so you can also leave it.
|
|
32
|
+
- **To check:** on your next significant unit, the agent stops after the design review and asks you before any drafting starts.
|
|
33
|
+
|
|
34
|
+
**3. Decisions imported from another project (only if you used `import` before 1.32.0).**
|
|
35
|
+
- **This concerns you if** you used the knowledge base's `import` command to bring topics from another project with version 1.31.0 or earlier. If you never did, skip this point.
|
|
36
|
+
- **Why:** the knowledge base leaves open the questions on which sources disagree, and only a reasoned decision of yours closes them. The earlier version brought another project's decisions in already in force. For example, if someone in project A had settled "the right price is 49 €", importing into B made that price the truth in B too, without anyone in B deciding it. The update corrects future imports only; past ones stay as they are.
|
|
37
|
+
- **Steps:** the simplest way is to ask the agent: "convert the imported decisions as described in portability.md §4". Or by hand: delete the imported topic together with the files that came with it, then run `import` again on the same bundle with the new version; you can try it first with `--dry-run`.
|
|
38
|
+
- **To check:** `sdlc_check.py check` is clean; the other project's decisions appear as imported, and the questions they closed are open again. To make one yours, write your own decision with your own reasoning.
|
|
39
|
+
|
|
40
|
+
**4. Protected folders in a repository with several `ai_docs/` (only if you use them; from 1.32.0).**
|
|
41
|
+
- **This concerns you if** your agent settings contain `gate --hook --protected` and the repository has more than one `ai_docs/` folder, for example a package with its own.
|
|
42
|
+
- **Why:** protected paths are now read from the `ai_docs/` nearest to the edited file. A path written from the repository root, such as `packages/api/src/auth`, no longer matches the files inside `packages/api`, so the agent could change them without an analysis.
|
|
43
|
+
- **Steps:** rewrite those paths from the package: `packages/api/src/auth` becomes `src/auth`. Note that `src/auth` then protects the folder with that name in every project that has its own `ai_docs/`.
|
|
44
|
+
- **To check:** in a session with no open analysis, ask the agent for a small change to a protected file. It must be refused.
|
|
45
|
+
|
|
46
|
+
Full history: [CHANGELOG](https://github.com/Antoneeo/agentic-sdlc-skill/blob/main/distributions/kb-agentic-skill/CHANGELOG.md)
|
|
47
|
+
<!-- whats-new:end -->
|
|
22
48
|
|
|
23
49
|
## What it does
|
|
24
50
|
|
|
@@ -50,7 +76,7 @@ Deliberately absent: any per-node coverage or completion state. `gaps:` says wha
|
|
|
50
76
|
- **Portable knowledge**: `export` bundles a subgraph together with the bytes its claims cite — a closure, not a selection, because a claim whose source cannot be reopened is model knowledge arriving by another route. `import` merges it into another project **additively**: it never overwrites a node and never deletes, and claims already present are recognised by id rather than by comparing text, since the same artifact cited at the same span mints the same id in every project. Knowledge crosses the project boundary; **authority does not** — an imported ruling arrives as `prov: IMPORTED` on a renamed copy of its note that names its origin, keeps its original `basis:`, and the question it had closed is open again (`CONTESTED`) until you ratify it with a ruling of your own.
|
|
51
77
|
- **Several people, one project**: the workstream registry (`audit/handoff.md`) is **generated** from one file per open workstream, so two people opening or closing two workstreams on two branches edit two different files and their merge is clean. Row-per-workstream alone was not enough — a file-global `Date:` header defeats row-level ownership — so the header is derived from the sources and no writer touches it. The generated view can still conflict; that conflict is resolved by re-running `index`, never by hand, and `validate` refuses CLEAN until the file matches its sources. The append-only review log gets `merge=union` (a built-in driver, no per-clone configuration). It all works with no VCS at all: it is files and a generator.
|
|
52
78
|
- **Vision-guided governance**: Standalone projects use `ai_docs/vision/`; Hybrid projects use devPNT `M-VISION` as the milestone north star. `DRAFT` informs, `APPROVED` binds, promotion is the user's alone. Every Vision, the M-VISION included, is written only after a six-question **owner interview** and your explicit approval of a one- or two-sentence north star in your own words — the agent never writes one alone.
|
|
53
|
-
- **Independent review, twice**: the design before it is implemented, the result before it is declared done — fresh-context subagent > one-shot run > a declared self-pass, 3 rounds max, one log line each, and a PASS is invalid on "found nothing".
|
|
79
|
+
- **Independent review, twice**: the design before it is implemented, the result before it is declared done — fresh-context subagent > one-shot run > a declared self-pass, 3 rounds max, one log line each, and a PASS is invalid on "found nothing". After the design review passes, the owner approves the design before any drafting.
|
|
54
80
|
- **Question discipline**: a real doubt is asked when it emerges, before its answer is written, with the pros and cons of each option; a choice whose pros clearly win is taken with the weighing written next to it. A question is legal only when the agent searched first, names the search with its result, and names the decision it unblocks.
|
|
55
81
|
- **Verbatim request record**: every L3 starts `audit/requests/REQUEST_[topic].md` before the Vision Gate — the practitioner's own words and every later decision (answers, approvals, costs, rulings), append-only and redacted for secrets — so analyses cite what was asked instead of paraphrasing it, and reviews check owner statements against it.
|
|
56
82
|
- **Operative guides + agent-global KB**: distil user-provided indications into source-faithful `GUIDE_*.md` (`source_kind: document`) — verbatim snapshot plus hash, so drift is detected mechanically.
|
|
@@ -58,6 +84,21 @@ Deliberately absent: any per-node coverage or completion state. `gaps:` says wha
|
|
|
58
84
|
- **Installed support files**: Claude, Codex, Gemini and Google Antigravity receive the full skill folder — `SKILL.md`, `templates.md`, `taxonomy.md`, `distillation.md`, `reconciliation.md`, `guides.md`, `vision.md`, `elicitation.md`, `review.md`, `dispatch.md`, `routing.md`, `ENFORCEMENT.md`, `memory.md`, and the validator's three files, `scripts/sdlc_check.py` + `scripts/sdlc_core.py` + `scripts/knowledge.py` (copy all three) — plus the docs site generator `scripts/docs_site.py` and its page `docs_site/`, and the `LICENSE` and `NOTICE` it ships under.
|
|
59
85
|
- **Docs site** (`scripts/docs_site.py --root <project> [--open] [--zip <file>]`): a static, offline, read-only website of what the agent reads in the project — reading guide, Vision, rules, documents, open work with each next step, analyses and, with a knowledge base, the topic map, each fact with its exact source passage, and the source documents. Written to `.docs-site/` (added to `.gitignore` on the first run), outside `ai_docs/`; nothing is ranked or recommended.
|
|
60
86
|
|
|
87
|
+
## Shared project memory
|
|
88
|
+
|
|
89
|
+
All four lenses include project memory by default; install the lens you need,
|
|
90
|
+
not a second skill just for recall. `index` registers guides, decisions and plans
|
|
91
|
+
in the docs root's `memory/INDEX.md`, linking originals without copying them.
|
|
92
|
+
`recall "onboarding"` finds related metadata across domains; optional
|
|
93
|
+
`topics: [onboarding]` links documents by subject. Read the originals for authority,
|
|
94
|
+
status and evidence: discovery is not approval or proof of implementation.
|
|
95
|
+
|
|
96
|
+
Registration happens at `index`/documentation closure, not through a background
|
|
97
|
+
watcher. Existing projects acquire the catalog on their next `index`; `recall`
|
|
98
|
+
also sees live metadata. The KB lens remains the specialist for ingestion and
|
|
99
|
+
taxonomy. Marketing retains its numerical validators. See the skill's `memory.md`.
|
|
100
|
+
Vendoring requires all three files: the entry point, `sdlc_core.py`, `knowledge.py`.
|
|
101
|
+
|
|
61
102
|
## Installation
|
|
62
103
|
|
|
63
104
|
```bash
|
package/gemini-extension.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kb-agentic-skill",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.33.0",
|
|
4
4
|
"description": "Knowledge-Base & Document-First protocol with risk triage, Vision governance, signal distillation and optional devPNT integration.",
|
|
5
5
|
"author": "Antonio Pinto (https://github.com/Antoneeo)"
|
|
6
6
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@antoneeo/kb-agentic-skill",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.33.0",
|
|
4
4
|
"description": "Knowledge-Base & Document-First protocol for Claude Code, Gemini CLI, Google Antigravity and Codex with risk triage, Vision governance, signal distillation and optional devPNT integration.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"claude-code",
|
package/scripts/init.js
CHANGED
|
@@ -196,16 +196,16 @@ in the skill's \`routing.md\`: it decides which lens's method and validation rul
|
|
|
196
196
|
that unit. L1 never reaches it. Never refer to a document whose meaning differs by lens
|
|
197
197
|
("threat model", "vision", \`principles.md\`, \`handoff.md\`) by its bare name.
|
|
198
198
|
|
|
199
|
-
Select the owning lens by the unit's purpose, then apply only its risk scale.
|
|
200
|
-
The project's always-on pointer stays intact: consult the selected skill rather than
|
|
201
|
-
merging multiple mandatory ladders. All lenses already carry shared project memory
|
|
202
|
-
(\`memory.md\`); another installation is not needed for cross-domain recall.
|
|
199
|
+
Select the owning lens by the unit's purpose, then apply only its risk scale.
|
|
200
|
+
The project's always-on pointer stays intact: consult the selected skill rather than
|
|
201
|
+
merging multiple mandatory ladders. All lenses already carry shared project memory
|
|
202
|
+
(\`memory.md\`); another installation is not needed for cross-domain recall.
|
|
203
203
|
This file is NOT auto-loaded by any client: it is a note for you, deliberately additive.
|
|
204
|
-
Delete this note once the routing pointer is integrated.
|
|
204
|
+
Delete this note once the routing pointer is integrated.
|
|
205
205
|
`, 'multi-lens routing note');
|
|
206
206
|
if (wrote && protocolPreexisting) {
|
|
207
207
|
console.log(' ⚠️ A protocol pointer already existed and was NOT overwritten.');
|
|
208
|
-
console.log(' Integrate the routing pointer from AGENTIC_MULTI_LENS.md; keep one risk scale per unit.');
|
|
208
|
+
console.log(' Integrate the routing pointer from AGENTIC_MULTI_LENS.md; keep one risk scale per unit.');
|
|
209
209
|
}
|
|
210
210
|
}
|
|
211
211
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: kb-agentic
|
|
3
|
-
version: 1.
|
|
3
|
+
version: 1.33.0
|
|
4
4
|
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, knowledge management — and for answering project questions from the claim ledger and topic graph.
|
|
5
5
|
author: Antonio Pinto (https://github.com/Antoneeo)
|
|
6
6
|
copyright: (c) 2026 Antonio Pinto
|
|
@@ -143,7 +143,7 @@ Use this mode when `devpnt_*` tools are available and point at the current proje
|
|
|
143
143
|
- Run spec elicitation round (`elicitation.md`) before drafting analysis.
|
|
144
144
|
- Run taxonomy pass (`taxonomy.md`): verify whether topics, categories, or SOPs already exist in `ai_docs/`. Avoid duplication.
|
|
145
145
|
- Create or update `ai_docs/solutions/ANALYSIS_[topic].md`.
|
|
146
|
-
- **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 no higher rung is usable — a permission-gated rung is asked about, never silently skipped (`review.md`). 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.
|
|
146
|
+
- **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 no higher rung is usable — a permission-gated rung is asked about, never silently skipped (`review.md`). 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. Then the owner approves the design before any drafting (`review.md` §When a review is due).
|
|
147
147
|
|
|
148
148
|
### 4. Knowledge Processing & Distillation
|
|
149
149
|
- **Isolate the work (Branch/worktree hygiene).** Distillation rewrites existing notes — full re-read per `## Revision` — and does 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. Where a project does not isolate (one shared checkout), that is a departure from this rule, not a second mode: Rule Zero's step save commit and its declared residual apply. A session that may run while another session uses the same checkout works in its **own git worktree**, and never switches branch, stashes, resets or runs `index` in a checkout another session may be using. Parallel work also shares ids: choose a new unit's id **after fetching**, as the first id free on every branch and tag the checkout can see (`check` names a collision while the unit is open).
|
|
@@ -198,6 +198,34 @@ is a belief: the row would say a gate ran and never whether it could do its job,
|
|
|
198
198
|
the correlation with `revise_rounds` and `findings_real` — the only evidence the
|
|
199
199
|
policy pays — could not be drawn.
|
|
200
200
|
|
|
201
|
+
**The owner approves the design before the work starts (L3).** The reviewer judges
|
|
202
|
+
whether the design holds and serves the Vision; only the owner can say whether it is
|
|
203
|
+
what they meant beyond what the Vision wrote, and an intent error costs least before
|
|
204
|
+
the work exists. So the final design PASS — final once any scoped re-review it owed
|
|
205
|
+
has passed (§Review-driven corrections) — does not start the work: the agent
|
|
206
|
+
presents the design and asks the owner whether to proceed, in the form
|
|
207
|
+
`elicitation.md` §The form of a question gives a reserved approval. The presentation
|
|
208
|
+
is a short summary — what the change does (the Functional Spec, or the lens's
|
|
209
|
+
equivalent), for whom and through which surfaces (use cases, contract), what it
|
|
210
|
+
touches (Impact), the threats and their mitigations, the review's verdict with any
|
|
211
|
+
open findings — and the path of the full design. At the round cap, the hand-over the
|
|
212
|
+
cap prescribes, followed by this one question, takes the place of the form, and the
|
|
213
|
+
owner's answer settles both. An approval is recorded verbatim in the request record
|
|
214
|
+
under a label that begins `design approved`; a no or a correction takes its own
|
|
215
|
+
label, and the design goes back — where the revision changes what the review judged,
|
|
216
|
+
moment 1 runs again on that part first (the delta rule above). Only after the
|
|
217
|
+
approval does the ANALYSIS go `PLANNED` → `IN_PROGRESS` and the work start: code,
|
|
218
|
+
drafting or production, by lens. An instruction given before the design was shown
|
|
219
|
+
("carry on", "do the whole unit") does not approve it. Where a lens's own phases
|
|
220
|
+
already have the owner approve the design — the marketing lens's strategy USER GATE
|
|
221
|
+
— that gate is this approval, never a second question, and the lens's own unattended
|
|
222
|
+
path applies. Otherwise, unattended, the unit is `BLOCKED on the user`
|
|
223
|
+
(`elicitation.md` Unattended path), never approved by assumption; a late arrival
|
|
224
|
+
(moment 1b) asks before any further work. Hybrid: the owner's approval of the
|
|
225
|
+
`E-ISP`/`E-TDD` proposal in devPNT, under devPNT's own authorization rules, is this
|
|
226
|
+
approval. In Standalone, `validate` notes an L3 ANALYSIS in implementation, started
|
|
227
|
+
on or after 2026-10-31, whose request record holds no `design approved` entry.
|
|
228
|
+
|
|
201
229
|
**One schema for both modes**, meaning one required CORE plus each mode's own
|
|
202
230
|
**mode-specific** realization columns. The core is what both modes actually share: `date`, `doc_key`,
|
|
203
231
|
`tier`, `model`, `findings_raised`, `findings_real`, `verdict`, `revise_rounds`.
|
|
@@ -100,6 +100,10 @@ CHRONOLOGY_EPOCH = "2026-10-18"
|
|
|
100
100
|
# filled '## Guide check'. The day AFTER the rule was written, so the analyses
|
|
101
101
|
# opened that day by parallel units (which never saw the template) stay quiet.
|
|
102
102
|
GUIDE_CHECK_EPOCH = "2026-10-24"
|
|
103
|
+
# Owner design approval (F-087): an L3 started on/after this date owes a request-
|
|
104
|
+
# record entry labelled `design approved` before implementation. The day AFTER the
|
|
105
|
+
# rule was written, like GUIDE_CHECK_EPOCH.
|
|
106
|
+
DESIGN_APPROVAL_EPOCH = "2026-10-31"
|
|
103
107
|
NEXT_MAX_CHARS = 240 # this repository's longest `next:` was 214 at the epoch
|
|
104
108
|
ID_SCAN_MAX_REFS = 300 # A3 is skipped above it (one advisory says so, T9)
|
|
105
109
|
ID_SCAN_REFS_PER_CALL = 50 # keeps one git command line far below 32k chars
|
|
@@ -1479,17 +1483,50 @@ def id_advisories(root):
|
|
|
1479
1483
|
return out
|
|
1480
1484
|
|
|
1481
1485
|
|
|
1482
|
-
def
|
|
1483
|
-
"""True when an L3 ANALYSIS
|
|
1484
|
-
|
|
1485
|
-
shipped. PLANNED is exempt -- the review is due at the END of Phase 3, so an
|
|
1486
|
-
analysis still being drafted is not late."""
|
|
1486
|
+
def _l3_in_work_since(meta, epoch):
|
|
1487
|
+
"""True when an L3 ANALYSIS is in implementation or done and began on/after
|
|
1488
|
+
`epoch` (an ISO date string)."""
|
|
1487
1489
|
if meta.get("level", "").upper() != "L3":
|
|
1488
1490
|
return False
|
|
1489
1491
|
if meta.get("status") not in ("IN_PROGRESS", "COMPLETED"):
|
|
1490
1492
|
return False
|
|
1491
1493
|
started = parse_iso((meta.get("start_date") or "").strip().strip("'\""))
|
|
1492
|
-
return started is not None and started >= parse_iso(
|
|
1494
|
+
return started is not None and started >= parse_iso(epoch)
|
|
1495
|
+
|
|
1496
|
+
|
|
1497
|
+
def design_review_due(meta):
|
|
1498
|
+
"""True when an L3 ANALYSIS owes a design-review row (review.md moment 1):
|
|
1499
|
+
implementation has started or finished, and it began on/after the gate
|
|
1500
|
+
shipped. PLANNED is exempt -- the review is due at the END of Phase 3, so an
|
|
1501
|
+
analysis still being drafted is not late."""
|
|
1502
|
+
return _l3_in_work_since(meta, DESIGN_REVIEW_EPOCH)
|
|
1503
|
+
|
|
1504
|
+
|
|
1505
|
+
def design_approval_due(meta):
|
|
1506
|
+
"""True when an L3 ANALYSIS owes the owner's design approval (review.md
|
|
1507
|
+
section When a review is due): in implementation or done, begun on/after
|
|
1508
|
+
DESIGN_APPROVAL_EPOCH. PLANNED is exempt -- the question comes after the PASS."""
|
|
1509
|
+
return _l3_in_work_since(meta, DESIGN_APPROVAL_EPOCH)
|
|
1510
|
+
|
|
1511
|
+
|
|
1512
|
+
def requests_naming(root, analysis_name):
|
|
1513
|
+
"""The request records whose `analysis:` field names this ANALYSIS file."""
|
|
1514
|
+
req = ai_path(root, "audit", "requests")
|
|
1515
|
+
if not req.is_dir():
|
|
1516
|
+
return []
|
|
1517
|
+
return [r for r in sorted(req.glob("REQUEST_*.md"))
|
|
1518
|
+
if str(load_frontmatter(read_text(r).splitlines()).get("analysis") or "")
|
|
1519
|
+
.strip().strip("'\"`") == analysis_name]
|
|
1520
|
+
|
|
1521
|
+
|
|
1522
|
+
def design_approval_logged(root, analysis_name):
|
|
1523
|
+
"""True when a request record naming this ANALYSIS has an entry whose LABEL
|
|
1524
|
+
begins `design approved` (case-insensitive). Only the label is read, never
|
|
1525
|
+
the quoted words: a quotation is data, and a 'design approved?' inside a
|
|
1526
|
+
refusal approves nothing."""
|
|
1527
|
+
return any(label.lower().startswith("design approved")
|
|
1528
|
+
for r in requests_naming(root, analysis_name)
|
|
1529
|
+
for _, _, label, _ in request_entries(read_text(r))[0])
|
|
1493
1530
|
|
|
1494
1531
|
|
|
1495
1532
|
def review_logged(root, analysis_name):
|
|
@@ -1801,6 +1838,12 @@ def cmd_validate(root, strict=False, hybrid=False):
|
|
|
1801
1838
|
advisories.append(f"{rel}: L3 in implementation with no design-review row in "
|
|
1802
1839
|
f"{review_log_rel()} -- the design was reviewed by nobody but its "
|
|
1803
1840
|
"author before code was written (review.md moment 1)")
|
|
1841
|
+
if (not hybrid and design_approval_due(meta)
|
|
1842
|
+
and not design_approval_logged(root, p.name)):
|
|
1843
|
+
advisories.append(f"{rel}: L3 in implementation with no design approval in its "
|
|
1844
|
+
"request record (no entry whose label begins 'design approved') -- the "
|
|
1845
|
+
"owner never said the design was what they meant before the "
|
|
1846
|
+
"work started (review.md, When a review is due)")
|
|
1804
1847
|
if ledger_due(meta) and not has_ledger_heading(text):
|
|
1805
1848
|
advisories.append(f"{rel}: L3 without '## Capability Ledger' -- the architect pass "
|
|
1806
1849
|
"left no record (architect.md); run it before the Impact")
|
|
@@ -2562,7 +2605,8 @@ def cmd_gate(args):
|
|
|
2562
2605
|
sys.stderr.write(
|
|
2563
2606
|
f"[sdlc gate] '{rel}' is on a protected path but no ANALYSIS_*.md is IN_PROGRESS. "
|
|
2564
2607
|
"If your analysis already exists, set its frontmatter to 'status: IN_PROGRESS' "
|
|
2565
|
-
"(that flip is what opens the gate
|
|
2608
|
+
"(that flip is what opens the gate; at L3, only after the owner's design approval, "
|
|
2609
|
+
"review.md); otherwise write it first (Phase 3).\n")
|
|
2566
2610
|
return 2
|
|
2567
2611
|
|
|
2568
2612
|
|
|
@@ -3063,13 +3107,9 @@ def _unit_documents(root, p):
|
|
|
3063
3107
|
reading or writing any of them is working on the unit."""
|
|
3064
3108
|
slug = p.stem[len("ANALYSIS_"):]
|
|
3065
3109
|
docs = {p, ai_path(root, "audit", f"HANDOFF_{slug}.md")}
|
|
3066
|
-
|
|
3067
|
-
|
|
3068
|
-
|
|
3069
|
-
meta = load_frontmatter(read_text(r).splitlines())
|
|
3070
|
-
if str(meta.get("analysis") or "").strip().strip("'\"`") == p.name:
|
|
3071
|
-
docs.add(r)
|
|
3072
|
-
docs.add(ai_path(root, "audit", f"HANDOFF_{r.stem[len('REQUEST_'):]}.md"))
|
|
3110
|
+
for r in requests_naming(root, p.name):
|
|
3111
|
+
docs.add(r)
|
|
3112
|
+
docs.add(ai_path(root, "audit", f"HANDOFF_{r.stem[len('REQUEST_'):]}.md"))
|
|
3073
3113
|
return {_norm_rel(d.resolve().as_posix()) for d in docs}
|
|
3074
3114
|
|
|
3075
3115
|
|
|
@@ -289,6 +289,9 @@ Context (agent): "the question it answered, quoted"
|
|
|
289
289
|
entered only as `[NOT VERBATIM — from <source>]`, never as a quote.
|
|
290
290
|
- **Unattended**: R1 quotes the trigger that started the unit, labelled as such.
|
|
291
291
|
Declared assumptions are not owner statements and never enter the record.
|
|
292
|
+
- **Design approval** (L3): the owner's approval of the design is an entry whose
|
|
293
|
+
label begins `design approved`; a no or a correction takes its own label
|
|
294
|
+
(`review.md` §When a review is due).
|
|
292
295
|
- **Elicited notes**: a domain decision also lands in `corpus/notes/` (`origin: elicited`)
|
|
293
296
|
naming its entry; the note keeps its own transcription because an export carries
|
|
294
297
|
the corpus, not `audit/`.
|
|
@@ -1,308 +1,308 @@
|
|
|
1
|
-
# Writing a Vision that a cold reviewer can actually apply
|
|
2
|
-
|
|
3
|
-
Support file for `ai_docs/vision/project_vision.md`, `vision/features/VISION_*.md`
|
|
4
|
-
and (Hybrid) the devPNT M-VISION. Read it when writing or amending any of them.
|
|
5
|
-
The template lives in `templates.md`; this file is the *why it works*.
|
|
6
|
-
|
|
7
|
-
**The problem this solves.** A Vision's job is to be read cold — by a later
|
|
8
|
-
session, by a reviewer, by another agent — and to produce a ruling on a proposed
|
|
9
|
-
change. Most Visions cannot do that: they read as intent to whoever wrote them and
|
|
10
|
-
as ambiguity to everyone else, and the gap is invisible until something wrong gets
|
|
11
|
-
through. Writing one and then discovering the holes by adversarial rounds works,
|
|
12
|
-
but it costs several rewrites. The checklist below exists so a Vision is
|
|
13
|
-
verifiable on the **first** draft.
|
|
14
|
-
|
|
15
|
-
Everything here was derived empirically: six blind adversarial rounds against one
|
|
16
|
-
real Vision, reviewers with no repository access, ~25 attack proposals. Rules that
|
|
17
|
-
survived every attack and rules that fell were compared for structure. What
|
|
18
|
-
follows is that difference.
|
|
19
|
-
|
|
20
|
-
## What a Vision IS
|
|
21
|
-
|
|
22
|
-
A Vision states **what is to be obtained — the benefit — while leaving the most
|
|
23
|
-
degrees of freedom possible. It binds nothing that does not obstruct that
|
|
24
|
-
benefit.**
|
|
25
|
-
|
|
26
|
-
Four consequences, each operational:
|
|
27
|
-
|
|
28
|
-
- **State the benefit, not the mechanism.** What the actor *obtains*, never how —
|
|
29
|
-
and concrete enough that an obstacle to it is *recognizable*. This is the test a
|
|
30
|
-
North Star must pass: from "best-in-class" no constraint is derivable and none
|
|
31
|
-
is refutable, because nothing recognizably obstructs it. From "everything the
|
|
32
|
-
methodology produces stays usable in full without paying", a metering ban
|
|
33
|
-
follows and can be checked.
|
|
34
|
-
- **The deletion test — the generative rule for every constraint.** Remove the
|
|
35
|
-
rule: is the benefit still reachable? If **yes**, delete the rule — it was
|
|
36
|
-
spending a degree of freedom on nothing. If **no**, keep it, and its sentence
|
|
37
|
-
must name the obstacle it removes. This is also the stop rule: when nothing on
|
|
38
|
-
the table would obstruct the benefit, the Vision needs no new rule.
|
|
39
|
-
- **Constraints accumulate as the work reveals obstacles.** The first draft is the
|
|
40
|
-
benefit plus the few constraints already known — usually almost none, and that
|
|
41
|
-
is correct (`DRAFT` informs, `APPROVED` binds). Each constraint added later
|
|
42
|
-
*sharpens* the Vision without shrinking it more than the obstacle requires.
|
|
43
|
-
- **A constraint never obstructs the Vision.** A proposed rule that conflicts with
|
|
44
|
-
the benefit is not a constraint to negotiate in place — it is a Vision
|
|
45
|
-
**amendment**, and amending is the owner's decision, never a side effect of a
|
|
46
|
-
downstream edit.
|
|
47
|
-
|
|
48
|
-
Extracting the benefit from a discussion is real work: a discourse arrives with
|
|
49
|
-
solutions, preferences and constraints tangled together, and the Vision is the
|
|
50
|
-
distilled benefit only. The owner interview below asks for it — and a mechanism
|
|
51
|
-
("a dashboard") is not an acceptable answer to a benefit question ("never lose
|
|
52
|
-
the thread"); ask again until the answer names what the actor obtains.
|
|
53
|
-
|
|
54
|
-
The deletion test decides **which** rules exist. Everything below decides **how**
|
|
55
|
-
to write a rule so it holds once you know it must exist.
|
|
56
|
-
|
|
57
|
-
## The owner interview (before any Vision text)
|
|
58
|
-
|
|
59
|
-
A Vision is the **owner's** statement of what is to be obtained. Nothing in this
|
|
60
|
-
file after this section can detect a Vision the author wrote alone: the blind
|
|
61
|
-
check (§6) tests whether the rules survive a hostile reader, never whether they
|
|
62
|
-
are the owner's. So every Vision is born from an interview of the owner, and its
|
|
63
|
-
north star is approved **before** a line of it is drafted.
|
|
64
|
-
|
|
65
|
-
**Scope — every Vision, in every mode:** `project_vision.md`, a feature
|
|
66
|
-
`VISION_*.md`, a lens Vision (course, marketing), and the devPNT M-VISION in
|
|
67
|
-
Hybrid; also an ANALYSIS `## Feature Vision` that states a benefit no existing
|
|
68
|
-
Vision names (one that cites an approved Vision's benefit is alignment, not a
|
|
69
|
-
Vision). An amendment re-runs the questions whose answers it changes, and Gate 1
|
|
70
|
-
again when the north star changes. **There is no skip path**: one sentence from
|
|
71
|
-
the user plus a spike is not a complete spec — that exact shortcut produced a
|
|
72
|
-
Vision with an imported prohibition, no north star and a missing actor, and four
|
|
73
|
-
downstream artifacts built on it (field case, 2026-10). A reply already on record
|
|
74
|
-
in the owner's words is read back for confirmation, never re-asked as an open
|
|
75
|
-
question; an answer the author derived (from a spike, the code, another Vision)
|
|
76
|
-
is never an answer — it is a proposal the owner confirms or rejects.
|
|
77
|
-
|
|
78
|
-
**The questions, in this order.** Each is repeated until its answer has the form
|
|
79
|
-
stated; the wrong form is named so it can be recognized and asked again.
|
|
80
|
-
|
|
81
|
-
| # | Question | Right form | Wrong form — ask again |
|
|
82
|
-
|---|---|---|---|
|
|
83
|
-
| 1 | **Problem** — which concrete case today does not get the expected result? | one real case, with an example | a missing feature ("there is no drawing tool") |
|
|
84
|
-
| 2 | **Benefit** — once solved, who obtains what? | a result for a named actor | a function or mechanism ("a renderer") |
|
|
85
|
-
| 3 | **Actors** — who receives the benefit, who acts, who has the initiative? | all three named, initiative included | only the one who asks — the actor who acts unprompted goes missing |
|
|
86
|
-
| 4 | **Success** — what observable signal shows the benefit arrived? | a signal with its starting value | a feeling, or a signal with no baseline |
|
|
87
|
-
| 5 | **Boundaries** — what does this NOT pursue? | scope excluded from this work | a ban on behaviour ("X must never happen") — that is a constraint (6) or an obligation (2, 4) |
|
|
88
|
-
| 6 | **Known constraints** — each with its provenance: owner, a quoted line of a higher Vision, or author inference | every constraint sourced; every inference asked here | a constraint written in silently, or imported from a higher Vision without asking whether it applies here |
|
|
89
|
-
|
|
90
|
-
A **Non-Goal bounds scope**: it rejects a proposal that pursues what it names; it
|
|
91
|
-
is not a ban on behaviour that already exists, and it creates no obligation.
|
|
92
|
-
Obligations come from the Benefit and the Success Signals.
|
|
93
|
-
|
|
94
|
-
**Gate 1 — north star.** One or two sentences, in the owner's words, explicitly
|
|
95
|
-
approved by the owner. The author may compose a wording from the answers; the
|
|
96
|
-
approval is of that exact text, recorded verbatim in the request record
|
|
97
|
-
(`audit/requests/REQUEST_[unit].md`; a Vision written outside any unit, such as
|
|
98
|
-
the project Vision after bootstrap, records its interview in
|
|
99
|
-
`audit/requests/REQUEST_project_vision.md`). **Without it no Vision text is written** —
|
|
100
|
-
not a DRAFT, not a reconstruction: bootstrap writes a stub awaiting the
|
|
101
|
-
interview, and what the agent observed goes to `strategic/`.
|
|
102
|
-
Unattended, the unit is `BLOCKED on the user` (`elicitation.md` Unattended path).
|
|
103
|
-
|
|
104
|
-
**Gate 2 — the full Vision**, written from the answers. Every section traces to
|
|
105
|
-
an answer or a stated provenance (`REQUEST_[unit].md#R<n>`); every rule carries
|
|
106
|
-
its provenance; an author inference the owner did not confirm is not in it. The
|
|
107
|
-
blind check (§6) verifies that it holds; the approved north star verifies that it
|
|
108
|
-
is the owner's. Promotion to APPROVED still needs the owner's explicit
|
|
109
|
-
confirmation — Gate 2 is that confirmation, given on the written text.
|
|
110
|
-
|
|
111
|
-
## 0. The one-line test
|
|
112
|
-
|
|
113
|
-
> Could a reader who has never seen this project rule ACCEPT or REJECT on a
|
|
114
|
-
> proposed change, quoting one line of this document, without asking anyone
|
|
115
|
-
> anything?
|
|
116
|
-
|
|
117
|
-
If a section cannot contribute to that, it is background — keep it if it helps a
|
|
118
|
-
human, but know it carries no gate weight.
|
|
119
|
-
|
|
120
|
-
## 1. The nine properties of a rule that holds
|
|
121
|
-
|
|
122
|
-
Each is stated as a drafting action, with the attack it defeats.
|
|
123
|
-
|
|
124
|
-
1. **Key the rule to a property observable in the artifact — never to intent,
|
|
125
|
-
commitment, plan or purpose.** Test while drafting: *could I verify compliance
|
|
126
|
-
by reading the diff, without asking the author what they meant?*
|
|
127
|
-
→ Defeats: the proposer simply promises the opposite. A rule that forbids
|
|
128
|
-
"committing to track someone's format" is satisfied by saying "we commit to
|
|
129
|
-
nothing"; a rule that forbids "code in this repo that parses a format we do
|
|
130
|
-
not define" is not.
|
|
131
|
-
2. **Write it as one yes/no question with BOTH branches answered.**
|
|
132
|
-
→ Defeats: a gate that can only reject. A prohibition-only Vision rejects the
|
|
133
|
-
work it wants (new client support, packaging, bug fixes) and is abandoned.
|
|
134
|
-
3. **Phrase the question counterfactually about capability, not about the status
|
|
135
|
-
quo** — "could the user obtain this…", not "does the product currently do it".
|
|
136
|
-
→ Defeats: "we never shipped it, so nothing is being taken away."
|
|
137
|
-
4. **Enumerate the near-miss verbs, not just the headline one** — charge / count /
|
|
138
|
-
cap / condition / gate / degrade / delay / require-signup.
|
|
139
|
-
→ Defeats: the soft form. A generous cap, a free-but-registered tier, a
|
|
140
|
-
zero-cost counter — all are the same harm and none is the headline verb.
|
|
141
|
-
5. **Define every term the rule turns on by EFFECT, and close the list.** A
|
|
142
|
-
definition that enumerates mechanisms is a list of the ways you already thought
|
|
143
|
-
of; end it with "…and anything else the user must give, accept or obtain from
|
|
144
|
-
us."
|
|
145
|
-
→ Defeats: the third mechanism. "Charge = payment or account" is walked past by
|
|
146
|
-
"requires opting into telemetry".
|
|
147
|
-
6. **Enumerate the FORMS a violation can take, then state a closure rule** —
|
|
148
|
-
"anything not named here is out unless it is X".
|
|
149
|
-
→ Defeats: the unnamed variant. "A step, a required field, a check, or a cost
|
|
150
|
-
that varies but is never zero" kills "auto-filled, zero human input", because
|
|
151
|
-
the form is still a required field.
|
|
152
|
-
7. **State the subject predicate of any enumerated test in checkable terms.** If
|
|
153
|
-
the test applies to "a record of work", say what makes something one.
|
|
154
|
-
→ Defeats: denying the subject. The proposer agrees with every item on your
|
|
155
|
-
list and asserts the list does not apply.
|
|
156
|
-
8. **Give one IN and one OUT example on the same axis, differing in a single
|
|
157
|
-
variable.** The pair carries the discriminator; without it the reader invents
|
|
158
|
-
one.
|
|
159
|
-
→ Defeats: the borderline case, which is where every real argument happens.
|
|
160
|
-
9. **Name the re-descriptions you expect, inside the rule's own sentence** —
|
|
161
|
-
"in any presentation", "however the code got here", "not by a component that
|
|
162
|
-
does not exist yet", "storing it as Markdown changes nothing".
|
|
163
|
-
→ Defeats: relabeling. A board called a "view" is still a board.
|
|
164
|
-
|
|
165
|
-
## 2. The five clauses a Vision needs around its rules
|
|
166
|
-
|
|
167
|
-
Rules do not hold alone. These structural clauses were the difference between a
|
|
168
|
-
rule that survived and the same rule leaking.
|
|
169
|
-
|
|
170
|
-
- **Supremacy clause** — on any rule a second layer, product, tier or future
|
|
171
|
-
component could route around: *"these bind the product as a whole; shipping a
|
|
172
|
-
forbidden thing in the paid layer does not put it out of reach."*
|
|
173
|
-
- **Exceptions attached to the rule they limit, in the same bullet, phrased
|
|
174
|
-
affirmatively.** An exception in another section is a leak; an exception phrased
|
|
175
|
-
only as a negation produces CANNOT DECIDE. *"This rule does not reach X;
|
|
176
|
-
supporting one more X is squarely wanted."*
|
|
177
|
-
- **Anti-abuse clause on every exemption, naming the only permitted outcomes.**
|
|
178
|
-
A maintenance exemption without one lets any forbidden thing that already
|
|
179
|
-
shipped be maintained forever, and any new one be framed as a fix to it:
|
|
180
|
-
*"work framed as a fix to something that should never have shipped is not
|
|
181
|
-
exempt — it is the removal of that thing, or it is out."*
|
|
182
|
-
- **Stated defaults, per path including the exempt path** — "anything unreached is
|
|
183
|
-
out"; "an exempt fix that preserves a forbidden thing is out". A test that says
|
|
184
|
-
"admitted only if" gives new capability a default; exempt work has none unless
|
|
185
|
-
you write one.
|
|
186
|
-
- **Precedence, when two sentences can both apply.** Two adjacent statements
|
|
187
|
-
pointing opposite ways are decided by whichever the reader reaches first.
|
|
188
|
-
|
|
189
|
-
## 3. Only prohibitions can reject; only positives can admit
|
|
190
|
-
|
|
191
|
-
This is the most common structural failure and it is invisible from the inside.
|
|
192
|
-
|
|
193
|
-
- **A Goal cannot reject anything.** If the admission test says "advances a Goal
|
|
194
|
-
and violates no Non-Goal", then rejection power lives *only* in the Non-Goals
|
|
195
|
-
(and the Invariants, where the Vision has them).
|
|
196
|
-
- **A Non-Goal rejects scope, not behaviour.** It turns away a proposal that
|
|
197
|
-
pursues what it names; it never forbids a behaviour the product already has, and
|
|
198
|
-
it never creates an obligation — obligations come from the Benefit and the
|
|
199
|
-
Success Signals. A behaviour the product must never have is an Invariant, or a
|
|
200
|
-
constraint with its provenance (§The owner interview, question 6). Written as a
|
|
201
|
-
Non-Goal, it reads as a ban the owner never stated.
|
|
202
|
-
A Goal that says "scale cost to risk in both directions" cannot stop cost
|
|
203
|
-
inflation — you need a prohibition for that.
|
|
204
|
-
- **A prohibition scoped to one rung of your own scale protects only that rung.**
|
|
205
|
-
Banning ceremony on trivial edits invites the same ceremony one level up.
|
|
206
|
-
- **A criterion phrased as an already-true state cannot be advanced.** "The check
|
|
207
|
-
is CLEAN at every closure" is a state, so "advances this signal" is meaningless
|
|
208
|
-
and any proposal citing it is undecidable. Give every positive criterion a
|
|
209
|
-
**baseline with headroom**: a current value and date, or an explicit list of
|
|
210
|
-
improvement categories that count.
|
|
211
|
-
- **Give recurring legitimate work an explicit authorization clause**, or it will
|
|
212
|
-
be rejected by your own test: packaging and installation, the product's own
|
|
213
|
-
tests, reducing what the agent must read, supporting one more client. Each needs
|
|
214
|
-
a home in the positive sources — otherwise "moves nothing this document commits
|
|
215
|
-
to" fires on exactly the maintenance the product needs.
|
|
216
|
-
|
|
217
|
-
## 4. Minimum operable sections
|
|
218
|
-
|
|
219
|
-
A Vision is a gate. These are the load-bearing parts; anything else is
|
|
220
|
-
orientation for humans and should be recognized as such.
|
|
221
|
-
|
|
222
|
-
| Section | Must contain | Enables |
|
|
223
|
-
|---|---|---|
|
|
224
|
-
| Authority & scope | what it binds (all layers, tiers, future components), that packaging is irrelevant, precedence among its own sections, the approval line | both |
|
|
225
|
-
| Defaults | the default ruling for anything unreached, stated per path | both |
|
|
226
|
-
| Admission test | one sentence naming *exactly which* sections are positive sources and *exactly which* are prohibitions | ACCEPT |
|
|
227
|
-
| Positive sources | Goals / Actor commitments / Success Signals — each with a baseline and headroom, checkable against a named artifact | ACCEPT |
|
|
228
|
-
| Prohibitions | property-based, closed enumerations, named re-descriptions, in/out pairs | REJECT |
|
|
229
|
-
| Invariants | the decision question with both branches answered, plus an anti-laundering clause | both |
|
|
230
|
-
| Exemptions | each with its anti-abuse clause | prevents laundering |
|
|
231
|
-
| Definitions & imported facts | terms defined by effect; **any fact from another document a ruling depends on, restated here** with the reason | standalone use |
|
|
232
|
-
| Pointers | what deliberately lives elsewhere, so an absence reads as intentional | prevents false CANNOT DECIDE |
|
|
233
|
-
|
|
234
|
-
**Imported facts matter more than they look.** If a ruling needs your triage
|
|
235
|
-
levels, your risk tiers or your lifecycle states, restate the boundaries in the
|
|
236
|
-
Vision — routing the reader to another file breaks the cold-read premise the
|
|
237
|
-
whole gate rests on. Keep the procedure elsewhere; bring the boundaries here.
|
|
238
|
-
|
|
239
|
-
**Keep competitive positioning OUT.** A Vision defined by comparison to another
|
|
240
|
-
product rots silently: the comparison target moves and no one edits your document.
|
|
241
|
-
Put it in a dated snapshot elsewhere and point to it.
|
|
242
|
-
|
|
243
|
-
## 5. What no wording can fix — use a mechanism instead
|
|
244
|
-
|
|
245
|
-
Five failure classes are structural. Prose cannot close them; do not try.
|
|
246
|
-
|
|
247
|
-
| Failure | Mechanism |
|
|
248
|
-
|---|---|
|
|
249
|
-
| "Advances a Goal" is a claim about the world, not the text | Measure it: run the ruling battery before and after, admit on measured improvement |
|
|
250
|
-
| **Cumulative ratchet** — each addition defensible, the sum is the ceremony the Vision forbids | A measured budget: steps per level, tokens the agent loads, artifacts per change; add-one-remove-one |
|
|
251
|
-
| Facts the proposal never states ("a quota of *what*?") | A proposal template that demands them, and a stated rule that omission resolves against the proposal |
|
|
252
|
-
| Structural compliance without truth — every rule satisfied, the artifact still wrong | Independent review; a Vision cannot detect this |
|
|
253
|
-
| An accepted change silently falsifying the Vision | Require the amendment in the same change; check cross-document facts mechanically |
|
|
254
|
-
|
|
255
|
-
And the sixth, which is why this file exists:
|
|
256
|
-
|
|
257
|
-
**Adversarial re-description is unbounded.** Every patch names the evasions seen so
|
|
258
|
-
far; a new one always exists. Patch-after-defeat is a treadmill. The only thing
|
|
259
|
-
that converts it into a ratchet is a **standing battery**: keep every attack
|
|
260
|
-
proposal that ever worked as a fixture and re-run the whole set against every
|
|
261
|
-
Vision edit. A Vision without a battery decays the moment someone motivated reads
|
|
262
|
-
it.
|
|
263
|
-
|
|
264
|
-
## 6. The blind check (procedure)
|
|
265
|
-
|
|
266
|
-
Run this **before promoting any Vision to APPROVED, and before any amendment of an
|
|
267
|
-
approved one**. It runs on a Vision that already passed Gate 1 (§The owner
|
|
268
|
-
interview): it tests whether the rules hold against a hostile reader, and it
|
|
269
|
-
cannot see whether they are the owner's — a Vision the author wrote alone passes
|
|
270
|
-
it cleanly. Not for DRAFT edits — promotion is when authority is granted, and
|
|
271
|
-
it is rare, so the cost lands where it buys most.
|
|
272
|
-
|
|
273
|
-
1. **Give the reviewer the document text and nothing else.** Not a path — the
|
|
274
|
-
text, pasted. Forbid opening files, searching, and web access explicitly. A
|
|
275
|
-
term the reviewer cannot resolve is then a property of the document, not of
|
|
276
|
-
their tooling.
|
|
277
|
-
2. **Fresh context, and a different model from the author where the client allows
|
|
278
|
-
it.** Author self-review is structurally blind to its own omissions.
|
|
279
|
-
3. **Hand them a battery, not an open question.** Concrete proposals to rule on:
|
|
280
|
-
- the standing fixtures (every attack that ever worked — see §5);
|
|
281
|
-
- **reject-side** proposals aimed at each prohibition;
|
|
282
|
-
- **accept-side** proposals the document plainly wants (a bug fix, packaging
|
|
283
|
-
work, supporting one more client, a documentation improvement). *A gate that
|
|
284
|
-
can only reject is half a gate, and the accept side is where most Visions
|
|
285
|
-
fail without anyone noticing.*
|
|
286
|
-
4. **Ask for the mechanism, not just the verdict.** For each ruling: the exact
|
|
287
|
-
quoted line, or precisely what the document fails to say. Then: *which rules
|
|
288
|
-
could you not get around, and what structural property defeated you?* That
|
|
289
|
-
answer is worth more than the findings.
|
|
290
|
-
5. **Ask for rewords.** "Slip a bad proposal past this document, including one
|
|
291
|
-
dressed in its own approving vocabulary." A rule nobody can reword is done; a
|
|
292
|
-
rule that falls to the first attempt was never a rule.
|
|
293
|
-
6. **Every finding is answered — fixed, or refused with reasoning** (`review.md`
|
|
294
|
-
§Receiving). Add every successful reword to the standing battery, whether or
|
|
295
|
-
not you fix it this round.
|
|
296
|
-
|
|
297
|
-
Three lenses are worth running for a product-level Vision: **comprehension** (what
|
|
298
|
-
is this, what could you not resolve), **gate operability** (the battery above),
|
|
299
|
-
**durability** (what rots, what is unfalsifiable, what is a time bomb). For a
|
|
300
|
-
feature-level Vision or an M-VISION, the gate lens alone is usually enough.
|
|
301
|
-
|
|
302
|
-
## 7. Cost, honestly
|
|
303
|
-
|
|
304
|
-
A first draft written against §1–§4 will still have findings — the checklist
|
|
305
|
-
removes the structural classes, not judgement errors. Expect one blind round to
|
|
306
|
-
find real things and a second to confirm. What it should NOT take is five rounds
|
|
307
|
-
of discovering the same class of defect in a new disguise; that is the specific
|
|
308
|
-
waste this file exists to prevent.
|
|
1
|
+
# Writing a Vision that a cold reviewer can actually apply
|
|
2
|
+
|
|
3
|
+
Support file for `ai_docs/vision/project_vision.md`, `vision/features/VISION_*.md`
|
|
4
|
+
and (Hybrid) the devPNT M-VISION. Read it when writing or amending any of them.
|
|
5
|
+
The template lives in `templates.md`; this file is the *why it works*.
|
|
6
|
+
|
|
7
|
+
**The problem this solves.** A Vision's job is to be read cold — by a later
|
|
8
|
+
session, by a reviewer, by another agent — and to produce a ruling on a proposed
|
|
9
|
+
change. Most Visions cannot do that: they read as intent to whoever wrote them and
|
|
10
|
+
as ambiguity to everyone else, and the gap is invisible until something wrong gets
|
|
11
|
+
through. Writing one and then discovering the holes by adversarial rounds works,
|
|
12
|
+
but it costs several rewrites. The checklist below exists so a Vision is
|
|
13
|
+
verifiable on the **first** draft.
|
|
14
|
+
|
|
15
|
+
Everything here was derived empirically: six blind adversarial rounds against one
|
|
16
|
+
real Vision, reviewers with no repository access, ~25 attack proposals. Rules that
|
|
17
|
+
survived every attack and rules that fell were compared for structure. What
|
|
18
|
+
follows is that difference.
|
|
19
|
+
|
|
20
|
+
## What a Vision IS
|
|
21
|
+
|
|
22
|
+
A Vision states **what is to be obtained — the benefit — while leaving the most
|
|
23
|
+
degrees of freedom possible. It binds nothing that does not obstruct that
|
|
24
|
+
benefit.**
|
|
25
|
+
|
|
26
|
+
Four consequences, each operational:
|
|
27
|
+
|
|
28
|
+
- **State the benefit, not the mechanism.** What the actor *obtains*, never how —
|
|
29
|
+
and concrete enough that an obstacle to it is *recognizable*. This is the test a
|
|
30
|
+
North Star must pass: from "best-in-class" no constraint is derivable and none
|
|
31
|
+
is refutable, because nothing recognizably obstructs it. From "everything the
|
|
32
|
+
methodology produces stays usable in full without paying", a metering ban
|
|
33
|
+
follows and can be checked.
|
|
34
|
+
- **The deletion test — the generative rule for every constraint.** Remove the
|
|
35
|
+
rule: is the benefit still reachable? If **yes**, delete the rule — it was
|
|
36
|
+
spending a degree of freedom on nothing. If **no**, keep it, and its sentence
|
|
37
|
+
must name the obstacle it removes. This is also the stop rule: when nothing on
|
|
38
|
+
the table would obstruct the benefit, the Vision needs no new rule.
|
|
39
|
+
- **Constraints accumulate as the work reveals obstacles.** The first draft is the
|
|
40
|
+
benefit plus the few constraints already known — usually almost none, and that
|
|
41
|
+
is correct (`DRAFT` informs, `APPROVED` binds). Each constraint added later
|
|
42
|
+
*sharpens* the Vision without shrinking it more than the obstacle requires.
|
|
43
|
+
- **A constraint never obstructs the Vision.** A proposed rule that conflicts with
|
|
44
|
+
the benefit is not a constraint to negotiate in place — it is a Vision
|
|
45
|
+
**amendment**, and amending is the owner's decision, never a side effect of a
|
|
46
|
+
downstream edit.
|
|
47
|
+
|
|
48
|
+
Extracting the benefit from a discussion is real work: a discourse arrives with
|
|
49
|
+
solutions, preferences and constraints tangled together, and the Vision is the
|
|
50
|
+
distilled benefit only. The owner interview below asks for it — and a mechanism
|
|
51
|
+
("a dashboard") is not an acceptable answer to a benefit question ("never lose
|
|
52
|
+
the thread"); ask again until the answer names what the actor obtains.
|
|
53
|
+
|
|
54
|
+
The deletion test decides **which** rules exist. Everything below decides **how**
|
|
55
|
+
to write a rule so it holds once you know it must exist.
|
|
56
|
+
|
|
57
|
+
## The owner interview (before any Vision text)
|
|
58
|
+
|
|
59
|
+
A Vision is the **owner's** statement of what is to be obtained. Nothing in this
|
|
60
|
+
file after this section can detect a Vision the author wrote alone: the blind
|
|
61
|
+
check (§6) tests whether the rules survive a hostile reader, never whether they
|
|
62
|
+
are the owner's. So every Vision is born from an interview of the owner, and its
|
|
63
|
+
north star is approved **before** a line of it is drafted.
|
|
64
|
+
|
|
65
|
+
**Scope — every Vision, in every mode:** `project_vision.md`, a feature
|
|
66
|
+
`VISION_*.md`, a lens Vision (course, marketing), and the devPNT M-VISION in
|
|
67
|
+
Hybrid; also an ANALYSIS `## Feature Vision` that states a benefit no existing
|
|
68
|
+
Vision names (one that cites an approved Vision's benefit is alignment, not a
|
|
69
|
+
Vision). An amendment re-runs the questions whose answers it changes, and Gate 1
|
|
70
|
+
again when the north star changes. **There is no skip path**: one sentence from
|
|
71
|
+
the user plus a spike is not a complete spec — that exact shortcut produced a
|
|
72
|
+
Vision with an imported prohibition, no north star and a missing actor, and four
|
|
73
|
+
downstream artifacts built on it (field case, 2026-10). A reply already on record
|
|
74
|
+
in the owner's words is read back for confirmation, never re-asked as an open
|
|
75
|
+
question; an answer the author derived (from a spike, the code, another Vision)
|
|
76
|
+
is never an answer — it is a proposal the owner confirms or rejects.
|
|
77
|
+
|
|
78
|
+
**The questions, in this order.** Each is repeated until its answer has the form
|
|
79
|
+
stated; the wrong form is named so it can be recognized and asked again.
|
|
80
|
+
|
|
81
|
+
| # | Question | Right form | Wrong form — ask again |
|
|
82
|
+
|---|---|---|---|
|
|
83
|
+
| 1 | **Problem** — which concrete case today does not get the expected result? | one real case, with an example | a missing feature ("there is no drawing tool") |
|
|
84
|
+
| 2 | **Benefit** — once solved, who obtains what? | a result for a named actor | a function or mechanism ("a renderer") |
|
|
85
|
+
| 3 | **Actors** — who receives the benefit, who acts, who has the initiative? | all three named, initiative included | only the one who asks — the actor who acts unprompted goes missing |
|
|
86
|
+
| 4 | **Success** — what observable signal shows the benefit arrived? | a signal with its starting value | a feeling, or a signal with no baseline |
|
|
87
|
+
| 5 | **Boundaries** — what does this NOT pursue? | scope excluded from this work | a ban on behaviour ("X must never happen") — that is a constraint (6) or an obligation (2, 4) |
|
|
88
|
+
| 6 | **Known constraints** — each with its provenance: owner, a quoted line of a higher Vision, or author inference | every constraint sourced; every inference asked here | a constraint written in silently, or imported from a higher Vision without asking whether it applies here |
|
|
89
|
+
|
|
90
|
+
A **Non-Goal bounds scope**: it rejects a proposal that pursues what it names; it
|
|
91
|
+
is not a ban on behaviour that already exists, and it creates no obligation.
|
|
92
|
+
Obligations come from the Benefit and the Success Signals.
|
|
93
|
+
|
|
94
|
+
**Gate 1 — north star.** One or two sentences, in the owner's words, explicitly
|
|
95
|
+
approved by the owner. The author may compose a wording from the answers; the
|
|
96
|
+
approval is of that exact text, recorded verbatim in the request record
|
|
97
|
+
(`audit/requests/REQUEST_[unit].md`; a Vision written outside any unit, such as
|
|
98
|
+
the project Vision after bootstrap, records its interview in
|
|
99
|
+
`audit/requests/REQUEST_project_vision.md`). **Without it no Vision text is written** —
|
|
100
|
+
not a DRAFT, not a reconstruction: bootstrap writes a stub awaiting the
|
|
101
|
+
interview, and what the agent observed goes to `strategic/`.
|
|
102
|
+
Unattended, the unit is `BLOCKED on the user` (`elicitation.md` Unattended path).
|
|
103
|
+
|
|
104
|
+
**Gate 2 — the full Vision**, written from the answers. Every section traces to
|
|
105
|
+
an answer or a stated provenance (`REQUEST_[unit].md#R<n>`); every rule carries
|
|
106
|
+
its provenance; an author inference the owner did not confirm is not in it. The
|
|
107
|
+
blind check (§6) verifies that it holds; the approved north star verifies that it
|
|
108
|
+
is the owner's. Promotion to APPROVED still needs the owner's explicit
|
|
109
|
+
confirmation — Gate 2 is that confirmation, given on the written text.
|
|
110
|
+
|
|
111
|
+
## 0. The one-line test
|
|
112
|
+
|
|
113
|
+
> Could a reader who has never seen this project rule ACCEPT or REJECT on a
|
|
114
|
+
> proposed change, quoting one line of this document, without asking anyone
|
|
115
|
+
> anything?
|
|
116
|
+
|
|
117
|
+
If a section cannot contribute to that, it is background — keep it if it helps a
|
|
118
|
+
human, but know it carries no gate weight.
|
|
119
|
+
|
|
120
|
+
## 1. The nine properties of a rule that holds
|
|
121
|
+
|
|
122
|
+
Each is stated as a drafting action, with the attack it defeats.
|
|
123
|
+
|
|
124
|
+
1. **Key the rule to a property observable in the artifact — never to intent,
|
|
125
|
+
commitment, plan or purpose.** Test while drafting: *could I verify compliance
|
|
126
|
+
by reading the diff, without asking the author what they meant?*
|
|
127
|
+
→ Defeats: the proposer simply promises the opposite. A rule that forbids
|
|
128
|
+
"committing to track someone's format" is satisfied by saying "we commit to
|
|
129
|
+
nothing"; a rule that forbids "code in this repo that parses a format we do
|
|
130
|
+
not define" is not.
|
|
131
|
+
2. **Write it as one yes/no question with BOTH branches answered.**
|
|
132
|
+
→ Defeats: a gate that can only reject. A prohibition-only Vision rejects the
|
|
133
|
+
work it wants (new client support, packaging, bug fixes) and is abandoned.
|
|
134
|
+
3. **Phrase the question counterfactually about capability, not about the status
|
|
135
|
+
quo** — "could the user obtain this…", not "does the product currently do it".
|
|
136
|
+
→ Defeats: "we never shipped it, so nothing is being taken away."
|
|
137
|
+
4. **Enumerate the near-miss verbs, not just the headline one** — charge / count /
|
|
138
|
+
cap / condition / gate / degrade / delay / require-signup.
|
|
139
|
+
→ Defeats: the soft form. A generous cap, a free-but-registered tier, a
|
|
140
|
+
zero-cost counter — all are the same harm and none is the headline verb.
|
|
141
|
+
5. **Define every term the rule turns on by EFFECT, and close the list.** A
|
|
142
|
+
definition that enumerates mechanisms is a list of the ways you already thought
|
|
143
|
+
of; end it with "…and anything else the user must give, accept or obtain from
|
|
144
|
+
us."
|
|
145
|
+
→ Defeats: the third mechanism. "Charge = payment or account" is walked past by
|
|
146
|
+
"requires opting into telemetry".
|
|
147
|
+
6. **Enumerate the FORMS a violation can take, then state a closure rule** —
|
|
148
|
+
"anything not named here is out unless it is X".
|
|
149
|
+
→ Defeats: the unnamed variant. "A step, a required field, a check, or a cost
|
|
150
|
+
that varies but is never zero" kills "auto-filled, zero human input", because
|
|
151
|
+
the form is still a required field.
|
|
152
|
+
7. **State the subject predicate of any enumerated test in checkable terms.** If
|
|
153
|
+
the test applies to "a record of work", say what makes something one.
|
|
154
|
+
→ Defeats: denying the subject. The proposer agrees with every item on your
|
|
155
|
+
list and asserts the list does not apply.
|
|
156
|
+
8. **Give one IN and one OUT example on the same axis, differing in a single
|
|
157
|
+
variable.** The pair carries the discriminator; without it the reader invents
|
|
158
|
+
one.
|
|
159
|
+
→ Defeats: the borderline case, which is where every real argument happens.
|
|
160
|
+
9. **Name the re-descriptions you expect, inside the rule's own sentence** —
|
|
161
|
+
"in any presentation", "however the code got here", "not by a component that
|
|
162
|
+
does not exist yet", "storing it as Markdown changes nothing".
|
|
163
|
+
→ Defeats: relabeling. A board called a "view" is still a board.
|
|
164
|
+
|
|
165
|
+
## 2. The five clauses a Vision needs around its rules
|
|
166
|
+
|
|
167
|
+
Rules do not hold alone. These structural clauses were the difference between a
|
|
168
|
+
rule that survived and the same rule leaking.
|
|
169
|
+
|
|
170
|
+
- **Supremacy clause** — on any rule a second layer, product, tier or future
|
|
171
|
+
component could route around: *"these bind the product as a whole; shipping a
|
|
172
|
+
forbidden thing in the paid layer does not put it out of reach."*
|
|
173
|
+
- **Exceptions attached to the rule they limit, in the same bullet, phrased
|
|
174
|
+
affirmatively.** An exception in another section is a leak; an exception phrased
|
|
175
|
+
only as a negation produces CANNOT DECIDE. *"This rule does not reach X;
|
|
176
|
+
supporting one more X is squarely wanted."*
|
|
177
|
+
- **Anti-abuse clause on every exemption, naming the only permitted outcomes.**
|
|
178
|
+
A maintenance exemption without one lets any forbidden thing that already
|
|
179
|
+
shipped be maintained forever, and any new one be framed as a fix to it:
|
|
180
|
+
*"work framed as a fix to something that should never have shipped is not
|
|
181
|
+
exempt — it is the removal of that thing, or it is out."*
|
|
182
|
+
- **Stated defaults, per path including the exempt path** — "anything unreached is
|
|
183
|
+
out"; "an exempt fix that preserves a forbidden thing is out". A test that says
|
|
184
|
+
"admitted only if" gives new capability a default; exempt work has none unless
|
|
185
|
+
you write one.
|
|
186
|
+
- **Precedence, when two sentences can both apply.** Two adjacent statements
|
|
187
|
+
pointing opposite ways are decided by whichever the reader reaches first.
|
|
188
|
+
|
|
189
|
+
## 3. Only prohibitions can reject; only positives can admit
|
|
190
|
+
|
|
191
|
+
This is the most common structural failure and it is invisible from the inside.
|
|
192
|
+
|
|
193
|
+
- **A Goal cannot reject anything.** If the admission test says "advances a Goal
|
|
194
|
+
and violates no Non-Goal", then rejection power lives *only* in the Non-Goals
|
|
195
|
+
(and the Invariants, where the Vision has them).
|
|
196
|
+
- **A Non-Goal rejects scope, not behaviour.** It turns away a proposal that
|
|
197
|
+
pursues what it names; it never forbids a behaviour the product already has, and
|
|
198
|
+
it never creates an obligation — obligations come from the Benefit and the
|
|
199
|
+
Success Signals. A behaviour the product must never have is an Invariant, or a
|
|
200
|
+
constraint with its provenance (§The owner interview, question 6). Written as a
|
|
201
|
+
Non-Goal, it reads as a ban the owner never stated.
|
|
202
|
+
A Goal that says "scale cost to risk in both directions" cannot stop cost
|
|
203
|
+
inflation — you need a prohibition for that.
|
|
204
|
+
- **A prohibition scoped to one rung of your own scale protects only that rung.**
|
|
205
|
+
Banning ceremony on trivial edits invites the same ceremony one level up.
|
|
206
|
+
- **A criterion phrased as an already-true state cannot be advanced.** "The check
|
|
207
|
+
is CLEAN at every closure" is a state, so "advances this signal" is meaningless
|
|
208
|
+
and any proposal citing it is undecidable. Give every positive criterion a
|
|
209
|
+
**baseline with headroom**: a current value and date, or an explicit list of
|
|
210
|
+
improvement categories that count.
|
|
211
|
+
- **Give recurring legitimate work an explicit authorization clause**, or it will
|
|
212
|
+
be rejected by your own test: packaging and installation, the product's own
|
|
213
|
+
tests, reducing what the agent must read, supporting one more client. Each needs
|
|
214
|
+
a home in the positive sources — otherwise "moves nothing this document commits
|
|
215
|
+
to" fires on exactly the maintenance the product needs.
|
|
216
|
+
|
|
217
|
+
## 4. Minimum operable sections
|
|
218
|
+
|
|
219
|
+
A Vision is a gate. These are the load-bearing parts; anything else is
|
|
220
|
+
orientation for humans and should be recognized as such.
|
|
221
|
+
|
|
222
|
+
| Section | Must contain | Enables |
|
|
223
|
+
|---|---|---|
|
|
224
|
+
| Authority & scope | what it binds (all layers, tiers, future components), that packaging is irrelevant, precedence among its own sections, the approval line | both |
|
|
225
|
+
| Defaults | the default ruling for anything unreached, stated per path | both |
|
|
226
|
+
| Admission test | one sentence naming *exactly which* sections are positive sources and *exactly which* are prohibitions | ACCEPT |
|
|
227
|
+
| Positive sources | Goals / Actor commitments / Success Signals — each with a baseline and headroom, checkable against a named artifact | ACCEPT |
|
|
228
|
+
| Prohibitions | property-based, closed enumerations, named re-descriptions, in/out pairs | REJECT |
|
|
229
|
+
| Invariants | the decision question with both branches answered, plus an anti-laundering clause | both |
|
|
230
|
+
| Exemptions | each with its anti-abuse clause | prevents laundering |
|
|
231
|
+
| Definitions & imported facts | terms defined by effect; **any fact from another document a ruling depends on, restated here** with the reason | standalone use |
|
|
232
|
+
| Pointers | what deliberately lives elsewhere, so an absence reads as intentional | prevents false CANNOT DECIDE |
|
|
233
|
+
|
|
234
|
+
**Imported facts matter more than they look.** If a ruling needs your triage
|
|
235
|
+
levels, your risk tiers or your lifecycle states, restate the boundaries in the
|
|
236
|
+
Vision — routing the reader to another file breaks the cold-read premise the
|
|
237
|
+
whole gate rests on. Keep the procedure elsewhere; bring the boundaries here.
|
|
238
|
+
|
|
239
|
+
**Keep competitive positioning OUT.** A Vision defined by comparison to another
|
|
240
|
+
product rots silently: the comparison target moves and no one edits your document.
|
|
241
|
+
Put it in a dated snapshot elsewhere and point to it.
|
|
242
|
+
|
|
243
|
+
## 5. What no wording can fix — use a mechanism instead
|
|
244
|
+
|
|
245
|
+
Five failure classes are structural. Prose cannot close them; do not try.
|
|
246
|
+
|
|
247
|
+
| Failure | Mechanism |
|
|
248
|
+
|---|---|
|
|
249
|
+
| "Advances a Goal" is a claim about the world, not the text | Measure it: run the ruling battery before and after, admit on measured improvement |
|
|
250
|
+
| **Cumulative ratchet** — each addition defensible, the sum is the ceremony the Vision forbids | A measured budget: steps per level, tokens the agent loads, artifacts per change; add-one-remove-one |
|
|
251
|
+
| Facts the proposal never states ("a quota of *what*?") | A proposal template that demands them, and a stated rule that omission resolves against the proposal |
|
|
252
|
+
| Structural compliance without truth — every rule satisfied, the artifact still wrong | Independent review; a Vision cannot detect this |
|
|
253
|
+
| An accepted change silently falsifying the Vision | Require the amendment in the same change; check cross-document facts mechanically |
|
|
254
|
+
|
|
255
|
+
And the sixth, which is why this file exists:
|
|
256
|
+
|
|
257
|
+
**Adversarial re-description is unbounded.** Every patch names the evasions seen so
|
|
258
|
+
far; a new one always exists. Patch-after-defeat is a treadmill. The only thing
|
|
259
|
+
that converts it into a ratchet is a **standing battery**: keep every attack
|
|
260
|
+
proposal that ever worked as a fixture and re-run the whole set against every
|
|
261
|
+
Vision edit. A Vision without a battery decays the moment someone motivated reads
|
|
262
|
+
it.
|
|
263
|
+
|
|
264
|
+
## 6. The blind check (procedure)
|
|
265
|
+
|
|
266
|
+
Run this **before promoting any Vision to APPROVED, and before any amendment of an
|
|
267
|
+
approved one**. It runs on a Vision that already passed Gate 1 (§The owner
|
|
268
|
+
interview): it tests whether the rules hold against a hostile reader, and it
|
|
269
|
+
cannot see whether they are the owner's — a Vision the author wrote alone passes
|
|
270
|
+
it cleanly. Not for DRAFT edits — promotion is when authority is granted, and
|
|
271
|
+
it is rare, so the cost lands where it buys most.
|
|
272
|
+
|
|
273
|
+
1. **Give the reviewer the document text and nothing else.** Not a path — the
|
|
274
|
+
text, pasted. Forbid opening files, searching, and web access explicitly. A
|
|
275
|
+
term the reviewer cannot resolve is then a property of the document, not of
|
|
276
|
+
their tooling.
|
|
277
|
+
2. **Fresh context, and a different model from the author where the client allows
|
|
278
|
+
it.** Author self-review is structurally blind to its own omissions.
|
|
279
|
+
3. **Hand them a battery, not an open question.** Concrete proposals to rule on:
|
|
280
|
+
- the standing fixtures (every attack that ever worked — see §5);
|
|
281
|
+
- **reject-side** proposals aimed at each prohibition;
|
|
282
|
+
- **accept-side** proposals the document plainly wants (a bug fix, packaging
|
|
283
|
+
work, supporting one more client, a documentation improvement). *A gate that
|
|
284
|
+
can only reject is half a gate, and the accept side is where most Visions
|
|
285
|
+
fail without anyone noticing.*
|
|
286
|
+
4. **Ask for the mechanism, not just the verdict.** For each ruling: the exact
|
|
287
|
+
quoted line, or precisely what the document fails to say. Then: *which rules
|
|
288
|
+
could you not get around, and what structural property defeated you?* That
|
|
289
|
+
answer is worth more than the findings.
|
|
290
|
+
5. **Ask for rewords.** "Slip a bad proposal past this document, including one
|
|
291
|
+
dressed in its own approving vocabulary." A rule nobody can reword is done; a
|
|
292
|
+
rule that falls to the first attempt was never a rule.
|
|
293
|
+
6. **Every finding is answered — fixed, or refused with reasoning** (`review.md`
|
|
294
|
+
§Receiving). Add every successful reword to the standing battery, whether or
|
|
295
|
+
not you fix it this round.
|
|
296
|
+
|
|
297
|
+
Three lenses are worth running for a product-level Vision: **comprehension** (what
|
|
298
|
+
is this, what could you not resolve), **gate operability** (the battery above),
|
|
299
|
+
**durability** (what rots, what is unfalsifiable, what is a time bomb). For a
|
|
300
|
+
feature-level Vision or an M-VISION, the gate lens alone is usually enough.
|
|
301
|
+
|
|
302
|
+
## 7. Cost, honestly
|
|
303
|
+
|
|
304
|
+
A first draft written against §1–§4 will still have findings — the checklist
|
|
305
|
+
removes the structural classes, not judgement errors. Expect one blind round to
|
|
306
|
+
find real things and a second to confirm. What it should NOT take is five rounds
|
|
307
|
+
of discovering the same class of defect in a new disguise; that is the specific
|
|
308
|
+
waste this file exists to prevent.
|