@antoneeo/agentic-sdlc-skill 1.15.0 → 1.19.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 +55 -0
- package/README.md +4 -1
- package/gemini-extension.json +6 -6
- package/package.json +48 -46
- package/scripts/init.js +3 -1
- package/skills/agentic-sdlc-skill/ENFORCEMENT.md +6 -2
- package/skills/agentic-sdlc-skill/SKILL.md +32 -13
- package/skills/agentic-sdlc-skill/architect.md +215 -0
- package/skills/agentic-sdlc-skill/dispatch.md +3 -1
- package/skills/agentic-sdlc-skill/elicitation.md +12 -1
- package/skills/agentic-sdlc-skill/guides.md +25 -0
- package/skills/agentic-sdlc-skill/review.md +90 -7
- package/skills/agentic-sdlc-skill/scripts/sdlc_check.py +387 -17
- package/skills/agentic-sdlc-skill/templates.md +196 -23
- package/skills/agentic-sdlc-skill/vision.md +245 -0
|
@@ -77,9 +77,10 @@ Curated must-read index, by hand (it is NOT the generated manifest). Created at
|
|
|
77
77
|
Must-reads for this project, in order. The full manifest of canonical docs is
|
|
78
78
|
`INDEX.md` (generated — regenerate with `sdlc_check.py index`, never edit by hand).
|
|
79
79
|
|
|
80
|
-
1. `
|
|
81
|
-
2. `
|
|
82
|
-
3. `
|
|
80
|
+
1. `reference/INDEX.md` — the guide router: which guide already governs the work you are about to do (generated).
|
|
81
|
+
2. `vision/project_vision.md` — why the project exists (check its Status first).
|
|
82
|
+
3. `strategic/architecture.md` — how it is built.
|
|
83
|
+
4. `audit/handoff.md` — where work stopped last session (if present).
|
|
83
84
|
|
|
84
85
|
Directory purposes: `vision/` (project direction), `strategic/` (architecture and
|
|
85
86
|
feature catalog), `reference/` (operative guides), `solutions/` (per-feature
|
|
@@ -88,23 +89,81 @@ analyses, discovery-by-grep), `audit/` (audit plan and handoff).
|
|
|
88
89
|
|
|
89
90
|
## ai_docs/vision/project_vision.md
|
|
90
91
|
|
|
92
|
+
A Vision states **the benefit to be obtained while leaving the most degrees of
|
|
93
|
+
freedom possible** — it binds nothing that does not obstruct that benefit (the
|
|
94
|
+
deletion test, `vision.md` §What-a-Vision-IS). It is *applied* as a **gate**: a
|
|
95
|
+
cold reader must be able to rule ACCEPT or REJECT on a proposed change, quoting
|
|
96
|
+
one line, without asking anyone anything. Write it against `vision.md` §1–§4 from
|
|
97
|
+
the first draft — the properties that make a rule survive a motivated reader are
|
|
98
|
+
cheap to apply while writing and expensive to retrofit. `vision.md` §6 is the
|
|
99
|
+
blind check that gates promotion to APPROVED.
|
|
100
|
+
|
|
101
|
+
Sections below marked **[gate]** are load-bearing for that ruling; the others are
|
|
102
|
+
orientation for humans. Keep the human ones — just know which is which.
|
|
103
|
+
|
|
91
104
|
```markdown
|
|
92
105
|
# Project Vision
|
|
93
106
|
Status: DRAFT
|
|
94
107
|
<!-- Status: DRAFT (reconstructed by the agent, NOT a gating authority)
|
|
95
|
-
or APPROVED (by <who>, <date>) — only after the user's explicit confirmation
|
|
108
|
+
or APPROVED (by <who>, <date>) — only after the user's explicit confirmation
|
|
109
|
+
AND the blind check in vision.md §6. -->
|
|
96
110
|
|
|
97
111
|
## North Star
|
|
112
|
+
<!-- [gate, partly] The BENEFIT to be obtained — what the actor gets, never the
|
|
113
|
+
mechanism, and never by comparison to another product (a comparative
|
|
114
|
+
definition rots silently when the comparison target moves). Concrete enough
|
|
115
|
+
that an obstacle to it is recognizable: that is what makes every Non-Goal
|
|
116
|
+
below derivable and refutable. Also restate here any boundary a ruling
|
|
117
|
+
depends on but that is defined elsewhere: risk tiers, lifecycle states,
|
|
118
|
+
scale levels. Routing the reader to another file breaks the cold-read
|
|
119
|
+
premise. -->
|
|
120
|
+
## Core Problem
|
|
121
|
+
<!-- Human orientation: what goes wrong without this product. Carries no gate
|
|
122
|
+
weight unless the admission test names it. -->
|
|
98
123
|
## Actors
|
|
99
|
-
<!-- the cast this product serves. One light line per actor:
|
|
124
|
+
<!-- [gate] the cast this product serves. One light line per actor:
|
|
100
125
|
**Role** — primary goal; good UX = what a good experience means to them.
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
126
|
+
The "good UX =" clauses are admissible work, not decoration — say so in the
|
|
127
|
+
admission test. Define each actor ONCE here; use-cases (Standalone) / D-UC
|
|
128
|
+
(Hybrid) reference them by role and never re-describe them (anti-DRY).
|
|
129
|
+
Proportional: a role list, not persona research. -->
|
|
105
130
|
## Goals
|
|
131
|
+
<!-- [gate — the ACCEPT side] Each with a baseline and headroom, so "advances this"
|
|
132
|
+
has meaning. A goal phrased as an already-true state cannot be advanced.
|
|
133
|
+
Include the recurring legitimate work explicitly (packaging and installation,
|
|
134
|
+
the product's own tests, reducing what the agent must read, one more client) —
|
|
135
|
+
otherwise your own test rejects the maintenance the product needs. -->
|
|
136
|
+
## Invariants
|
|
137
|
+
<!-- [gate] The promises that outrank everything: what the user is guaranteed, what
|
|
138
|
+
the architecture must always be true of. State each as ONE decision question
|
|
139
|
+
with BOTH branches answered, plus an anti-laundering clause naming the
|
|
140
|
+
re-descriptions you expect. Omit the section if the product has none. -->
|
|
106
141
|
## Non-Goals
|
|
142
|
+
<!-- [gate — the REJECT side; this is your ENTIRE rejection surface]
|
|
143
|
+
Derive every rule by the deletion test: remove it — if the benefit is still
|
|
144
|
+
reachable, the rule does not belong (it spends a degree of freedom on
|
|
145
|
+
nothing); if not, keep it and name the obstacle it removes. Constraints
|
|
146
|
+
accumulate as work reveals obstacles — an almost-empty first draft is
|
|
147
|
+
correct, not incomplete.
|
|
148
|
+
Open with a supremacy clause: what these bind (all layers, tiers, paid
|
|
149
|
+
components, future components), and that packaging or naming is irrelevant.
|
|
150
|
+
Each rule: an observable property of the artifact (never intent or a promise),
|
|
151
|
+
a closed enumeration with a closure rule, the near-miss verbs, an IN and an OUT
|
|
152
|
+
example on the same axis, and its exception attached in the same bullet.
|
|
153
|
+
Nothing here that cannot be violated by a proposed change — a rule about this
|
|
154
|
+
document's own prose can never fire, and wastes a slot. -->
|
|
155
|
+
## The admission test
|
|
156
|
+
<!-- [gate] One sentence naming EXACTLY which sections are positive sources and
|
|
157
|
+
EXACTLY which are prohibitions. State what the test does NOT govern (defect
|
|
158
|
+
fixes, performance, maintenance) and give that exemption its own anti-abuse
|
|
159
|
+
clause. State the default for anything unreached, per path. -->
|
|
107
160
|
## Success Signals
|
|
161
|
+
<!-- [gate] Each checkable against a NAMED artifact or command by someone who was
|
|
162
|
+
not here. Not "we are the best" — a file, a command, a battery, and what the
|
|
163
|
+
result must be. -->
|
|
164
|
+
## Where the rest lives
|
|
165
|
+
<!-- Pointers, so an absence reads as intentional rather than as a gap. Competitive
|
|
166
|
+
positioning goes here as a dated snapshot, never in the Vision body. -->
|
|
108
167
|
```
|
|
109
168
|
|
|
110
169
|
## ai_docs/vision/roadmap.md
|
|
@@ -179,8 +238,27 @@ end_date:
|
|
|
179
238
|
use-case = what they do. Derived from the elicitation round; the Impact below
|
|
180
239
|
must cover each, and the closure review checks coverage + actor UX fit. -->
|
|
181
240
|
|
|
241
|
+
## Capability Ledger
|
|
242
|
+
<!-- the architect pass (`architect.md`), run BEFORE the Impact below. One row per
|
|
243
|
+
capability the feature requires the system to be able to DO — a verb over a
|
|
244
|
+
domain noun, naming no file. Verdict EXISTS (name the component and where) /
|
|
245
|
+
INADEQUATE (same, plus the gap) / MISSING (say what you searched). Every
|
|
246
|
+
INADEQUATE or MISSING row becomes a component with its own contract, stated
|
|
247
|
+
without naming this feature, and lands in the Impact below. Evidence is what
|
|
248
|
+
makes a verdict falsifiable: for EXISTS/INADEQUATE the one guarantee you
|
|
249
|
+
re-read to confirm it; for MISSING the terms, the tool and the areas searched
|
|
250
|
+
(and say "provisional" when the area is still PENDING in the audit plan).
|
|
251
|
+
A question, not a form: when every capability plainly exists, one line under
|
|
252
|
+
this heading answers it — still naming the component and where it lives. -->
|
|
253
|
+
|
|
254
|
+
| Capability | Verdict | Component / gap | Evidence |
|
|
255
|
+
|---|---|---|---|
|
|
256
|
+
| persist an order | EXISTS | `path/to/store.py#OrderStore` | re-read `save()`: durable, returns the id |
|
|
257
|
+
| notify the customer | MISSING | — | grep notify/alert/dispatch + send, over src/ and legacy/; no owner |
|
|
258
|
+
|
|
182
259
|
## Impact
|
|
183
|
-
<!-- existing files touched, APIs/contracts, performance, new dependencies
|
|
260
|
+
<!-- existing files touched, APIs/contracts, performance, new dependencies.
|
|
261
|
+
Derived from the ledger above: every INADEQUATE/MISSING row appears here. -->
|
|
184
262
|
|
|
185
263
|
## Security and Threat Model
|
|
186
264
|
<!-- ALWAYS mandatory, also in Standalone.
|
|
@@ -277,26 +355,94 @@ States: PENDING (to analyze) | ANALYZED (analyzed, with reference) | SKIPPED (wi
|
|
|
277
355
|
| vendor/ | SKIPPED | - | vendored code |
|
|
278
356
|
```
|
|
279
357
|
|
|
280
|
-
## ai_docs/audit/handoff.md
|
|
358
|
+
## ai_docs/audit/handoff.md — the workstream registry
|
|
281
359
|
|
|
282
|
-
|
|
360
|
+
One row per OPEN workstream, ≤ 20 lines. **Parallel-safe by construction**: closing
|
|
361
|
+
one milestone removes one row and never touches another's resume point — the defect
|
|
362
|
+
this replaces was a single narrative slot where the last session to close overwrote
|
|
363
|
+
everyone else's handoff. It is an **inventory for lookup** (like the generated
|
|
364
|
+
manifest), not a work board: no assignment, no due dates, no execution ordering.
|
|
283
365
|
|
|
284
|
-
|
|
366
|
+
Updated at every L3 closure (row removed) AND at session end with work still
|
|
367
|
+
IN_PROGRESS (row refreshed) — see Write Triggers.
|
|
368
|
+
|
|
369
|
+
**Coming from a pre-1.17 project** (narrative handoff with `## Active features` /
|
|
370
|
+
`## Next step` / `## Session notes`): nothing is broken and nothing is urgent — the
|
|
371
|
+
validator only checks the `Date:` header and its age, and the orientation hook reads
|
|
372
|
+
the file verbatim. Read it as a one-row registry, and convert it the next time the
|
|
373
|
+
write trigger fires: each `## Active features` bullet becomes a row, `## Next step`
|
|
374
|
+
becomes that row's next step, `## Session notes` becomes `## Project-wide notes`.
|
|
375
|
+
Migrating a repository that is not being worked on buys nothing.
|
|
285
376
|
|
|
286
377
|
```markdown
|
|
287
|
-
# Handoff
|
|
378
|
+
# Handoff — workstream registry
|
|
288
379
|
Date: 2026-06-11 (UTC)
|
|
289
|
-
Branch: feature/sso-login
|
|
290
|
-
Agent: Claude
|
|
291
380
|
|
|
292
|
-
|
|
293
|
-
|
|
381
|
+
| Workstream | Level | Branch | Status | Since | Next step | Details |
|
|
382
|
+
|---|---|---|---|---|---|---|
|
|
383
|
+
| F-001 SSO login | L3 | feature/sso-login | PROGRESS | 2026-06-10 | wire callback tests | HANDOFF_login_sso.md · ANALYSIS_login_sso.md |
|
|
384
|
+
| F-002 Audit refresh | L3 | feature/audit | PAUSED | 2026-06-02 | resume at Phase 4 | ANALYSIS_audit_refresh.md (no volatile state) |
|
|
385
|
+
|
|
386
|
+
## Project-wide notes
|
|
387
|
+
<!-- one or two lines: release pending, environment quirks that affect everyone -->
|
|
388
|
+
```
|
|
294
389
|
|
|
295
|
-
##
|
|
296
|
-
<!-- one line -->
|
|
390
|
+
## ai_docs/audit/reviews/REVIEW_LOG.md
|
|
297
391
|
|
|
298
|
-
|
|
299
|
-
|
|
392
|
+
One row per completed review (`review.md` §When a review is due). Append-only; it
|
|
393
|
+
is the record that the gate ran and what it was worth. **One schema for both
|
|
394
|
+
modes** — a Hybrid project's devPNT gates write to this same file, so Standalone
|
|
395
|
+
adds values to the existing columns rather than a second table.
|
|
396
|
+
|
|
397
|
+
```markdown
|
|
398
|
+
# Independent Review Log
|
|
399
|
+
|
|
400
|
+
| date | doc_key | tier | reviewer | findings_raised | findings_real | verdict | revise_rounds |
|
|
401
|
+
|---|---|---|---|---|---|---|---|
|
|
402
|
+
| 2026-06-11 | ANALYSIS_login_sso.md | design | subagent (opus, fresh ctx) | 4 | 3 | PASS | 2 |
|
|
403
|
+
| 2026-06-12 | diff feature/sso-login | closure | self-pass (declared; no subagent facility) | 2 | 2 | PASS | 1 |
|
|
404
|
+
|
|
405
|
+
## Notes
|
|
406
|
+
<!-- One short paragraph per review that found something worth remembering: what
|
|
407
|
+
the findings actually were, and what changed because of them. The table
|
|
408
|
+
answers "was it reviewed and by what"; this answers "what did it find" —
|
|
409
|
+
which is where `review.md`'s per-finding outcomes live. Omit for a clean
|
|
410
|
+
review; a row with 0 findings needs no note. -->
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
`tier` is the moment plus, in Hybrid, the reviewer weight: `design`, `design (late)`
|
|
414
|
+
and `closure` (Standalone); `deep`, `light`, `code`, `guide`, `vision` (devPNT gates
|
|
415
|
+
and the Vision blind check). The validator reads this column by its header name, so
|
|
416
|
+
extra or reordered columns are fine — but the header must say `tier`. `reviewer`
|
|
417
|
+
records the realization actually used — fresh subagent, one-shot client run, or a
|
|
418
|
+
**declared** self-pass. Writing `self-pass` where independence was unavailable is
|
|
419
|
+
honest; writing nothing, or implying independence you did not have, is the failure
|
|
420
|
+
this column exists to prevent. `findings_real` is how many raised findings survived
|
|
421
|
+
triage: over time it is the only evidence of whether the gate earns its cost.
|
|
422
|
+
|
|
423
|
+
## ai_docs/audit/HANDOFF_[feature].md — volatile resume logistics (ephemeral)
|
|
424
|
+
|
|
425
|
+
**Resume logistics ONLY; the ANALYSIS Diary keeps the durable narrative (DRY).**
|
|
426
|
+
The boundary: Diary = what happened and why (decisions, state of the work — survives
|
|
427
|
+
forever); this file = how to pick the work back up (branch/worktree, uncommitted
|
|
428
|
+
state, environment notes, the next concrete command — worthless once resumed).
|
|
429
|
+
Created only when a session pauses the feature WITH volatile state to record;
|
|
430
|
+
**DELETED at the feature's closure**, in the same step that flips the ANALYSIS to
|
|
431
|
+
COMPLETED — anything in it worth keeping was in the wrong file.
|
|
432
|
+
|
|
433
|
+
```markdown
|
|
434
|
+
# HANDOFF: [feature] (ephemeral — deleted at closure)
|
|
435
|
+
Updated: 2026-06-11 (UTC)
|
|
436
|
+
Branch: feature/sso-login (worktree ../wt-sso)
|
|
437
|
+
|
|
438
|
+
## Resume state
|
|
439
|
+
<!-- uncommitted files, half-run migrations, env vars, running services -->
|
|
440
|
+
|
|
441
|
+
## Next command
|
|
442
|
+
<!-- the literal next thing to run or edit -->
|
|
443
|
+
|
|
444
|
+
## Watch out
|
|
445
|
+
<!-- traps discovered this session that bite on resume (locks, CRLF, flaky test) -->
|
|
300
446
|
```
|
|
301
447
|
|
|
302
448
|
## ai_docs/strategic/architecture.md and existing_features.md
|
|
@@ -305,12 +451,39 @@ Canonical docs: they open with the header (`description:`/`status:`) so they ent
|
|
|
305
451
|
|
|
306
452
|
```markdown
|
|
307
453
|
---
|
|
308
|
-
description: Stack, directory structure and architectural patterns of the project.
|
|
454
|
+
description: Stack, directory structure, component map and architectural patterns of the project.
|
|
309
455
|
status: CURRENT
|
|
310
456
|
---
|
|
311
457
|
# Project Architecture
|
|
312
458
|
## Technology Stack
|
|
313
459
|
## Directory Structure
|
|
460
|
+
## Component Map
|
|
461
|
+
<!-- The inventory the architect pass reads BEFORE searching the code
|
|
462
|
+
(`architect.md` §2). One row per component that OWNS a capability:
|
|
463
|
+
Capability = what it lets the system DO (a verb over a domain noun, naming
|
|
464
|
+
no file). Contract = what it guarantees its consumers, in one line, stated
|
|
465
|
+
without naming any single consumer. Where = a path, or `path#symbol` when
|
|
466
|
+
the component is smaller than its file.
|
|
467
|
+
Seeded at bootstrap; a row is added or corrected in the SAME closure that
|
|
468
|
+
builds — or merely discovers — a component, and the area is marked ANALYZED.
|
|
469
|
+
A directory is not a component: rows name what owns a capability, not where
|
|
470
|
+
files sit (that is ## Directory Structure above). An absent or stale map is
|
|
471
|
+
why the next feature rules the same capability MISSING a second time and
|
|
472
|
+
builds it again. -->
|
|
473
|
+
|
|
474
|
+
Coverage: whatever `audit/audit_plan.md` marks ANALYZED — **read it, do not trust a
|
|
475
|
+
list restated here** (a hand-copied list is a cache with no invalidation). Outside
|
|
476
|
+
those areas this map is **unread, not empty**: it can never ground a MISSING
|
|
477
|
+
verdict, and the code is searched instead (`architect.md` §2).
|
|
478
|
+
|
|
479
|
+
| Component | Capability it owns | Contract | Where |
|
|
480
|
+
|---|---|---|---|
|
|
481
|
+
| ... | ... | ... | ... |
|
|
482
|
+
|
|
483
|
+
<!-- Where is `path/to/file.py#Symbol`. Leave the placeholder row untouched until
|
|
484
|
+
the map has a real component: the validator skips an all-`...` row, so a
|
|
485
|
+
freshly seeded project is never nagged about a table nobody has filled in. -->
|
|
486
|
+
|
|
314
487
|
## Architectural Patterns
|
|
315
488
|
```
|
|
316
489
|
|
|
@@ -0,0 +1,245 @@
|
|
|
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 elicitation round (`elicitation.md`) asks for it first
|
|
51
|
+
— and a mechanism ("a dashboard") is not an acceptable answer to a benefit
|
|
52
|
+
question ("never lose the thread"); ask again until the answer names what the
|
|
53
|
+
actor obtains.
|
|
54
|
+
|
|
55
|
+
The deletion test decides **which** rules exist. Everything below decides **how**
|
|
56
|
+
to write a rule so it holds once you know it must exist.
|
|
57
|
+
|
|
58
|
+
## 0. The one-line test
|
|
59
|
+
|
|
60
|
+
> Could a reader who has never seen this project rule ACCEPT or REJECT on a
|
|
61
|
+
> proposed change, quoting one line of this document, without asking anyone
|
|
62
|
+
> anything?
|
|
63
|
+
|
|
64
|
+
If a section cannot contribute to that, it is background — keep it if it helps a
|
|
65
|
+
human, but know it carries no gate weight.
|
|
66
|
+
|
|
67
|
+
## 1. The nine properties of a rule that holds
|
|
68
|
+
|
|
69
|
+
Each is stated as a drafting action, with the attack it defeats.
|
|
70
|
+
|
|
71
|
+
1. **Key the rule to a property observable in the artifact — never to intent,
|
|
72
|
+
commitment, plan or purpose.** Test while drafting: *could I verify compliance
|
|
73
|
+
by reading the diff, without asking the author what they meant?*
|
|
74
|
+
→ Defeats: the proposer simply promises the opposite. A rule that forbids
|
|
75
|
+
"committing to track someone's format" is satisfied by saying "we commit to
|
|
76
|
+
nothing"; a rule that forbids "code in this repo that parses a format we do
|
|
77
|
+
not define" is not.
|
|
78
|
+
2. **Write it as one yes/no question with BOTH branches answered.**
|
|
79
|
+
→ Defeats: a gate that can only reject. A prohibition-only Vision rejects the
|
|
80
|
+
work it wants (new client support, packaging, bug fixes) and is abandoned.
|
|
81
|
+
3. **Phrase the question counterfactually about capability, not about the status
|
|
82
|
+
quo** — "could the user obtain this…", not "does the product currently do it".
|
|
83
|
+
→ Defeats: "we never shipped it, so nothing is being taken away."
|
|
84
|
+
4. **Enumerate the near-miss verbs, not just the headline one** — charge / count /
|
|
85
|
+
cap / condition / gate / degrade / delay / require-signup.
|
|
86
|
+
→ Defeats: the soft form. A generous cap, a free-but-registered tier, a
|
|
87
|
+
zero-cost counter — all are the same harm and none is the headline verb.
|
|
88
|
+
5. **Define every term the rule turns on by EFFECT, and close the list.** A
|
|
89
|
+
definition that enumerates mechanisms is a list of the ways you already thought
|
|
90
|
+
of; end it with "…and anything else the user must give, accept or obtain from
|
|
91
|
+
us."
|
|
92
|
+
→ Defeats: the third mechanism. "Charge = payment or account" is walked past by
|
|
93
|
+
"requires opting into telemetry".
|
|
94
|
+
6. **Enumerate the FORMS a violation can take, then state a closure rule** —
|
|
95
|
+
"anything not named here is out unless it is X".
|
|
96
|
+
→ Defeats: the unnamed variant. "A step, a required field, a check, or a cost
|
|
97
|
+
that varies but is never zero" kills "auto-filled, zero human input", because
|
|
98
|
+
the form is still a required field.
|
|
99
|
+
7. **State the subject predicate of any enumerated test in checkable terms.** If
|
|
100
|
+
the test applies to "a record of work", say what makes something one.
|
|
101
|
+
→ Defeats: denying the subject. The proposer agrees with every item on your
|
|
102
|
+
list and asserts the list does not apply.
|
|
103
|
+
8. **Give one IN and one OUT example on the same axis, differing in a single
|
|
104
|
+
variable.** The pair carries the discriminator; without it the reader invents
|
|
105
|
+
one.
|
|
106
|
+
→ Defeats: the borderline case, which is where every real argument happens.
|
|
107
|
+
9. **Name the re-descriptions you expect, inside the rule's own sentence** —
|
|
108
|
+
"in any presentation", "however the code got here", "not by a component that
|
|
109
|
+
does not exist yet", "storing it as Markdown changes nothing".
|
|
110
|
+
→ Defeats: relabeling. A board called a "view" is still a board.
|
|
111
|
+
|
|
112
|
+
## 2. The five clauses a Vision needs around its rules
|
|
113
|
+
|
|
114
|
+
Rules do not hold alone. These structural clauses were the difference between a
|
|
115
|
+
rule that survived and the same rule leaking.
|
|
116
|
+
|
|
117
|
+
- **Supremacy clause** — on any rule a second layer, product, tier or future
|
|
118
|
+
component could route around: *"these bind the product as a whole; shipping a
|
|
119
|
+
forbidden thing in the paid layer does not put it out of reach."*
|
|
120
|
+
- **Exceptions attached to the rule they limit, in the same bullet, phrased
|
|
121
|
+
affirmatively.** An exception in another section is a leak; an exception phrased
|
|
122
|
+
only as a negation produces CANNOT DECIDE. *"This rule does not reach X;
|
|
123
|
+
supporting one more X is squarely wanted."*
|
|
124
|
+
- **Anti-abuse clause on every exemption, naming the only permitted outcomes.**
|
|
125
|
+
A maintenance exemption without one lets any forbidden thing that already
|
|
126
|
+
shipped be maintained forever, and any new one be framed as a fix to it:
|
|
127
|
+
*"work framed as a fix to something that should never have shipped is not
|
|
128
|
+
exempt — it is the removal of that thing, or it is out."*
|
|
129
|
+
- **Stated defaults, per path including the exempt path** — "anything unreached is
|
|
130
|
+
out"; "an exempt fix that preserves a forbidden thing is out". A test that says
|
|
131
|
+
"admitted only if" gives new capability a default; exempt work has none unless
|
|
132
|
+
you write one.
|
|
133
|
+
- **Precedence, when two sentences can both apply.** Two adjacent statements
|
|
134
|
+
pointing opposite ways are decided by whichever the reader reaches first.
|
|
135
|
+
|
|
136
|
+
## 3. Only prohibitions can reject; only positives can admit
|
|
137
|
+
|
|
138
|
+
This is the most common structural failure and it is invisible from the inside.
|
|
139
|
+
|
|
140
|
+
- **A Goal cannot reject anything.** If the admission test says "advances a Goal
|
|
141
|
+
and violates no Non-Goal", then rejection power lives *only* in the Non-Goals.
|
|
142
|
+
A Goal that says "scale cost to risk in both directions" cannot stop cost
|
|
143
|
+
inflation — you need a prohibition for that.
|
|
144
|
+
- **A prohibition scoped to one rung of your own scale protects only that rung.**
|
|
145
|
+
Banning ceremony on trivial edits invites the same ceremony one level up.
|
|
146
|
+
- **A criterion phrased as an already-true state cannot be advanced.** "The check
|
|
147
|
+
is CLEAN at every closure" is a state, so "advances this signal" is meaningless
|
|
148
|
+
and any proposal citing it is undecidable. Give every positive criterion a
|
|
149
|
+
**baseline with headroom**: a current value and date, or an explicit list of
|
|
150
|
+
improvement categories that count.
|
|
151
|
+
- **Give recurring legitimate work an explicit authorization clause**, or it will
|
|
152
|
+
be rejected by your own test: packaging and installation, the product's own
|
|
153
|
+
tests, reducing what the agent must read, supporting one more client. Each needs
|
|
154
|
+
a home in the positive sources — otherwise "moves nothing this document commits
|
|
155
|
+
to" fires on exactly the maintenance the product needs.
|
|
156
|
+
|
|
157
|
+
## 4. Minimum operable sections
|
|
158
|
+
|
|
159
|
+
A Vision is a gate. These are the load-bearing parts; anything else is
|
|
160
|
+
orientation for humans and should be recognized as such.
|
|
161
|
+
|
|
162
|
+
| Section | Must contain | Enables |
|
|
163
|
+
|---|---|---|
|
|
164
|
+
| Authority & scope | what it binds (all layers, tiers, future components), that packaging is irrelevant, precedence among its own sections, the approval line | both |
|
|
165
|
+
| Defaults | the default ruling for anything unreached, stated per path | both |
|
|
166
|
+
| Admission test | one sentence naming *exactly which* sections are positive sources and *exactly which* are prohibitions | ACCEPT |
|
|
167
|
+
| Positive sources | Goals / Actor commitments / Success Signals — each with a baseline and headroom, checkable against a named artifact | ACCEPT |
|
|
168
|
+
| Prohibitions | property-based, closed enumerations, named re-descriptions, in/out pairs | REJECT |
|
|
169
|
+
| Invariants | the decision question with both branches answered, plus an anti-laundering clause | both |
|
|
170
|
+
| Exemptions | each with its anti-abuse clause | prevents laundering |
|
|
171
|
+
| Definitions & imported facts | terms defined by effect; **any fact from another document a ruling depends on, restated here** with the reason | standalone use |
|
|
172
|
+
| Pointers | what deliberately lives elsewhere, so an absence reads as intentional | prevents false CANNOT DECIDE |
|
|
173
|
+
|
|
174
|
+
**Imported facts matter more than they look.** If a ruling needs your triage
|
|
175
|
+
levels, your risk tiers or your lifecycle states, restate the boundaries in the
|
|
176
|
+
Vision — routing the reader to another file breaks the cold-read premise the
|
|
177
|
+
whole gate rests on. Keep the procedure elsewhere; bring the boundaries here.
|
|
178
|
+
|
|
179
|
+
**Keep competitive positioning OUT.** A Vision defined by comparison to another
|
|
180
|
+
product rots silently: the comparison target moves and no one edits your document.
|
|
181
|
+
Put it in a dated snapshot elsewhere and point to it.
|
|
182
|
+
|
|
183
|
+
## 5. What no wording can fix — use a mechanism instead
|
|
184
|
+
|
|
185
|
+
Five failure classes are structural. Prose cannot close them; do not try.
|
|
186
|
+
|
|
187
|
+
| Failure | Mechanism |
|
|
188
|
+
|---|---|
|
|
189
|
+
| "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 |
|
|
190
|
+
| **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 |
|
|
191
|
+
| 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 |
|
|
192
|
+
| Structural compliance without truth — every rule satisfied, the artifact still wrong | Independent review; a Vision cannot detect this |
|
|
193
|
+
| An accepted change silently falsifying the Vision | Require the amendment in the same change; check cross-document facts mechanically |
|
|
194
|
+
|
|
195
|
+
And the sixth, which is why this file exists:
|
|
196
|
+
|
|
197
|
+
**Adversarial re-description is unbounded.** Every patch names the evasions seen so
|
|
198
|
+
far; a new one always exists. Patch-after-defeat is a treadmill. The only thing
|
|
199
|
+
that converts it into a ratchet is a **standing battery**: keep every attack
|
|
200
|
+
proposal that ever worked as a fixture and re-run the whole set against every
|
|
201
|
+
Vision edit. A Vision without a battery decays the moment someone motivated reads
|
|
202
|
+
it.
|
|
203
|
+
|
|
204
|
+
## 6. The blind check (procedure)
|
|
205
|
+
|
|
206
|
+
Run this **before promoting any Vision to APPROVED, and before any amendment of an
|
|
207
|
+
approved one**. Not for DRAFT edits — promotion is when authority is granted, and
|
|
208
|
+
it is rare, so the cost lands where it buys most.
|
|
209
|
+
|
|
210
|
+
1. **Give the reviewer the document text and nothing else.** Not a path — the
|
|
211
|
+
text, pasted. Forbid opening files, searching, and web access explicitly. A
|
|
212
|
+
term the reviewer cannot resolve is then a property of the document, not of
|
|
213
|
+
their tooling.
|
|
214
|
+
2. **Fresh context, and a different model from the author where the client allows
|
|
215
|
+
it.** Author self-review is structurally blind to its own omissions.
|
|
216
|
+
3. **Hand them a battery, not an open question.** Concrete proposals to rule on:
|
|
217
|
+
- the standing fixtures (every attack that ever worked — see §5);
|
|
218
|
+
- **reject-side** proposals aimed at each prohibition;
|
|
219
|
+
- **accept-side** proposals the document plainly wants (a bug fix, packaging
|
|
220
|
+
work, supporting one more client, a documentation improvement). *A gate that
|
|
221
|
+
can only reject is half a gate, and the accept side is where most Visions
|
|
222
|
+
fail without anyone noticing.*
|
|
223
|
+
4. **Ask for the mechanism, not just the verdict.** For each ruling: the exact
|
|
224
|
+
quoted line, or precisely what the document fails to say. Then: *which rules
|
|
225
|
+
could you not get around, and what structural property defeated you?* That
|
|
226
|
+
answer is worth more than the findings.
|
|
227
|
+
5. **Ask for rewords.** "Slip a bad proposal past this document, including one
|
|
228
|
+
dressed in its own approving vocabulary." A rule nobody can reword is done; a
|
|
229
|
+
rule that falls to the first attempt was never a rule.
|
|
230
|
+
6. **Every finding is answered — fixed, or refused with reasoning** (`review.md`
|
|
231
|
+
§Receiving). Add every successful reword to the standing battery, whether or
|
|
232
|
+
not you fix it this round.
|
|
233
|
+
|
|
234
|
+
Three lenses are worth running for a product-level Vision: **comprehension** (what
|
|
235
|
+
is this, what could you not resolve), **gate operability** (the battery above),
|
|
236
|
+
**durability** (what rots, what is unfalsifiable, what is a time bomb). For a
|
|
237
|
+
feature-level Vision or an M-VISION, the gate lens alone is usually enough.
|
|
238
|
+
|
|
239
|
+
## 7. Cost, honestly
|
|
240
|
+
|
|
241
|
+
A first draft written against §1–§4 will still have findings — the checklist
|
|
242
|
+
removes the structural classes, not judgement errors. Expect one blind round to
|
|
243
|
+
find real things and a second to confirm. What it should NOT take is five rounds
|
|
244
|
+
of discovering the same class of defect in a new disguise; that is the specific
|
|
245
|
+
waste this file exists to prevent.
|