wdi-method 0.6.15 → 0.6.18
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 +213 -0
- package/README.md +9 -1
- package/kit/.constitution/method/document/corpus-guide.md +6 -0
- package/kit/.constitution/method/document/decision-guide.md +216 -208
- package/kit/.constitution/method/scripts/timeline.py +676 -663
- package/kit/.constitution/method/scripts/validate.py +124 -16
- package/kit/skills/wdi-autopilot/SKILL.md +3 -2
- package/kit/skills/wdi-decision/SKILL.md +203 -197
- package/kit/skills/wdi-upgrade/SKILL.md +1 -0
- package/package.json +2 -1
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
What changed in `wdi-method`, newest first. Every entry says what it means for a repo that already has
|
|
4
|
+
the method installed — most often nothing beyond `npx wdi-method@latest update`.
|
|
5
|
+
|
|
6
|
+
A version here is a **git tag**. `npm publish` is a separate, deliberate step (see
|
|
7
|
+
[`CONTRIBUTING.md`](CONTRIBUTING.md)), so some versions exist as a tag and a GitHub release without ever
|
|
8
|
+
having been served from npm. The registry always holds the newest published version, and a published
|
|
9
|
+
version contains every fix below it.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 0.6.18 — 2026-09-08
|
|
14
|
+
|
|
15
|
+
- **This file.** The version history was only readable as `git log`, which is the wrong place to look for
|
|
16
|
+
it when you are deciding how carefully to read an `update` diff.
|
|
17
|
+
- **The README had the validator count wrong.** It said twenty-seven; `validate.py` has run twenty-nine
|
|
18
|
+
named checks since `withdrawn-recorded` arrived in 0.6.14. It also now says what the validators treat as
|
|
19
|
+
corpus, which 0.6.17 changed.
|
|
20
|
+
|
|
21
|
+
## 0.6.17 — 2026-09-08
|
|
22
|
+
|
|
23
|
+
- **The corpus walker honours `.gitignore`.** The walk pruned only a hardcoded folder list, so a vendored
|
|
24
|
+
dependency tree inside an ignored folder was read as this product's corpus — one repo saw 172
|
|
25
|
+
`cites-resolve` findings from source code it had deliberately ignored. The ignored set is now computed
|
|
26
|
+
once per run (`git ls-files --others --ignored --exclude-standard --directory`), and the hardcoded list
|
|
27
|
+
stays as the fallback for a checkout that is not a git repository. `.gitignore` still cannot hide real
|
|
28
|
+
corpus: `corpus-in-git` fails when a folder the method commits is ignored.
|
|
29
|
+
- **`timeline.py` no longer crashes on a capability that has tickets.** `cap_tickets()` returns
|
|
30
|
+
`(spec, ticket)` pairs and the span helper read each item as a ticket row, so generating the timeline
|
|
31
|
+
raised `AttributeError` and `/wdi-report progress` could not publish at all.
|
|
32
|
+
|
|
33
|
+
**For a consuming repo:** `update`, then regenerate — a `timeline.md` or `report.md` written before this
|
|
34
|
+
is dated and must not be read as current.
|
|
35
|
+
|
|
36
|
+
## 0.6.16 — 2026-09-07
|
|
37
|
+
|
|
38
|
+
- **A superseded mandate still stands for what it accepted.** `mandate-accept` asked a question about the
|
|
39
|
+
past — was there a mandate on the day this decision was accepted — and answered it with the mandate's
|
|
40
|
+
status *today*. Superseding a mandate, which `wdi-autopilot`'s own instructions call for when a run
|
|
41
|
+
ends, therefore turned every decision that run had accepted permanently red; and an `applied` decision
|
|
42
|
+
is frozen, so there was no repair the corpus was allowed to make. The check now reads the mandate's
|
|
43
|
+
state at the delegation date, and bounds the window by the **earlier** of `mandate.expires` and the date
|
|
44
|
+
of the decision that superseded it — a revoked delegation ends when it was revoked, whatever its
|
|
45
|
+
`expires` still says. `superseded_by` is read from the decision file's frontmatter as well as the
|
|
46
|
+
registry row, because the template puts it there.
|
|
47
|
+
|
|
48
|
+
## 0.6.15 — 2026-09-07
|
|
49
|
+
|
|
50
|
+
- The dangling-promise finding carries its own repair. `withdrawn-recorded` named the problem without
|
|
51
|
+
saying what to write, and a finding nobody can act on is a finding that gets switched off.
|
|
52
|
+
|
|
53
|
+
## 0.6.14 — 2026-09-07
|
|
54
|
+
|
|
55
|
+
- **New validator `withdrawn-recorded`:** a promise that was withdrawn stays in the registry and says who
|
|
56
|
+
withdrew it. Deleting the row loses the fact that it was ever promised.
|
|
57
|
+
|
|
58
|
+
## 0.6.13 — 2026-09-07
|
|
59
|
+
|
|
60
|
+
- A story id already scoped to its wave is not scoped twice — the pre-0.6 rename was double-prefixing ids
|
|
61
|
+
that had been written correctly.
|
|
62
|
+
|
|
63
|
+
## 0.6.12 — 2026-09-07
|
|
64
|
+
|
|
65
|
+
- Flattening a pre-rename wave is `wdi-upgrade`'s work, not a re-cut. The skill was inventing a new
|
|
66
|
+
decomposition where it should have been moving one that already existed.
|
|
67
|
+
|
|
68
|
+
## 0.6.11 — 2026-09-07
|
|
69
|
+
|
|
70
|
+
- `update` leaves a closed spec's folder where it is. Moving a finished spec's folder rewrote history for
|
|
71
|
+
nothing.
|
|
72
|
+
|
|
73
|
+
## 0.6.10 — 2026-09-07
|
|
74
|
+
|
|
75
|
+
- `update` reports the two things `wdi-upgrade` now has to move, instead of leaving them for a reader to
|
|
76
|
+
discover.
|
|
77
|
+
|
|
78
|
+
## 0.6.9 — 2026-09-07
|
|
79
|
+
|
|
80
|
+
- The TUI refuses a missing engine too, in step 2's place. The CLI had checked since 0.6.8; the
|
|
81
|
+
interactive path had not, and that is the path a first install actually takes.
|
|
82
|
+
|
|
83
|
+
## 0.6.8 — 2026-09-07
|
|
84
|
+
|
|
85
|
+
- **The G5 engines are the repo's own, invocable, and BMad's replacements are locked out.** `install` and
|
|
86
|
+
`update` refuse until `to-spec`, `to-tickets`, `implement`, `tdd`, `code-review` and `domain-modeling`
|
|
87
|
+
are in the repo; `wdi-build` invokes them itself, so `wdi-autopilot` can finish a spec unattended; and
|
|
88
|
+
thirteen BMad skills retired at G5 are denied model invocation. A spec also gets one predefined home,
|
|
89
|
+
`.scratch/<spec-id>-<slug>/`.
|
|
90
|
+
|
|
91
|
+
**For a consuming repo:** the largest jump in the 0.6 line. The README section *"Moving a repo from 0.6.7
|
|
92
|
+
or earlier to 0.6.8"* walks all four changes, and `npx wdi-method engines --fix` repairs what can be
|
|
93
|
+
repaired without touching anything you wrote.
|
|
94
|
+
|
|
95
|
+
## 0.6.7 — 2026-09-06
|
|
96
|
+
|
|
97
|
+
- `plan-dates` reported nothing at all, because it raised before it could report; and a legacy story file
|
|
98
|
+
was looked for in the wrong folder.
|
|
99
|
+
- A closed pre-rename wave stays visible to the RTM instead of disappearing from it.
|
|
100
|
+
|
|
101
|
+
## 0.6.6 — 2026-09-06
|
|
102
|
+
|
|
103
|
+
- **New validator `corpus-in-git`:** a folder the method commits MUST NOT be gitignored. A corpus git
|
|
104
|
+
cannot see is a corpus the clone lacks.
|
|
105
|
+
- The git rule is stated where the bootstrap reads it, not only where the detail lives.
|
|
106
|
+
|
|
107
|
+
## 0.6.5 — 2026-09-05
|
|
108
|
+
|
|
109
|
+
- The README said three things that 0.6.2 through 0.6.4 had made untrue.
|
|
110
|
+
|
|
111
|
+
## 0.6.4 — 2026-09-05
|
|
112
|
+
|
|
113
|
+
- The test suite depended on the author's machine, and 0.6.3 failed CI because of it.
|
|
114
|
+
|
|
115
|
+
## 0.6.3 — 2026-09-05
|
|
116
|
+
|
|
117
|
+
- The ticket engines are required, and their config ships pre-answered — so `/setup-matt-pocock-skills` is
|
|
118
|
+
not part of getting started.
|
|
119
|
+
- *"What now"* is answered after install and after update, in the README and in `wdi-help`.
|
|
120
|
+
- Three real migrations, none of them `wdi-upgrade`'s: a mechanical rename, a printed warning, and a skill
|
|
121
|
+
that heals its own ledger.
|
|
122
|
+
|
|
123
|
+
## 0.6.2 — 2026-09-05
|
|
124
|
+
|
|
125
|
+
- **New skill `wdi-autopilot`:** one mandate, then every `FR` in scope delivered unattended, every answer
|
|
126
|
+
recorded in one ledger. It stops at one of three places — done, at capacity, or blocked — and one run
|
|
127
|
+
lands as one pull request. An adversarial review closed ten findings before release, two of them in the
|
|
128
|
+
validator.
|
|
129
|
+
|
|
130
|
+
**For a consuming repo:** `update` renames a pre-0.6.2 ledger to `autopilot-<mandate-id>.md`. The content
|
|
131
|
+
is never rewritten.
|
|
132
|
+
|
|
133
|
+
## 0.6.1 — 2026-09-03
|
|
134
|
+
|
|
135
|
+
- **New skill `wdi-explain-to-me`:** a decision briefing the owner reads, written in the owner's language.
|
|
136
|
+
|
|
137
|
+
## 0.6.0 — 2026-09-03
|
|
138
|
+
|
|
139
|
+
- **Two trees, one home per fact.** The working set points and the rendered page answers, so a human gets
|
|
140
|
+
a complete document while the corpus keeps no copies. This is the release the validators' rule against
|
|
141
|
+
comparing two copies of one fact comes from.
|
|
142
|
+
- The units are renamed: wave and story are retired, `waves.yaml` becomes `specs.yaml`, and size decides
|
|
143
|
+
the spec.
|
|
144
|
+
- The BMad engine layer below G5 is retired in favour of `to-spec`, `to-tickets` and `implement`;
|
|
145
|
+
`wdi-blueprint` wraps `domain-modeling` as its engine.
|
|
146
|
+
- UX runs and **lands** at G2, breaking a deadlock where the container was never in its path.
|
|
147
|
+
- A decision's first home is the document it governs, and no `DEC-` is mandatory.
|
|
148
|
+
- The corpus is present tense, and stale is not a finding.
|
|
149
|
+
- `wdi-review` stopped being a treadmill; gate *shape* and checklist *length* became separate knobs.
|
|
150
|
+
|
|
151
|
+
**For a consuming repo:** run `wdi-upgrade` after updating, before any other skill. The validators read
|
|
152
|
+
the new shape, and a corpus half in the old one answers them wrongly. The untagged 0.5.13 and 0.5.14
|
|
153
|
+
bumps — the review panel dropping its two-CLI-family requirement, and the platform picker aligning with
|
|
154
|
+
BMad — are included here.
|
|
155
|
+
|
|
156
|
+
## 0.5.12 — 2026-08-22
|
|
157
|
+
|
|
158
|
+
- Blueprint actor headings lose the orphaned separator a nameless actor left behind.
|
|
159
|
+
|
|
160
|
+
## 0.5.11 — 2026-08-22
|
|
161
|
+
|
|
162
|
+
- Version bump only; no method change.
|
|
163
|
+
|
|
164
|
+
## 0.5.10 — 2026-08-19
|
|
165
|
+
|
|
166
|
+
- The inventory engine littered the room it was asked to read.
|
|
167
|
+
|
|
168
|
+
## 0.5.9 — 2026-08-19
|
|
169
|
+
|
|
170
|
+
- The package ships no stack at all: a skeleton, and a skill that writes it. A stack baked into a generic
|
|
171
|
+
package is an assumption every consumer inherits.
|
|
172
|
+
|
|
173
|
+
## 0.5.8 — 2026-08-19
|
|
174
|
+
|
|
175
|
+
- `inventory.py`: the engine stays in the package, the stack moves to the room that owns it.
|
|
176
|
+
|
|
177
|
+
## 0.5.7 — 2026-08-19
|
|
178
|
+
|
|
179
|
+
- The method assumed a stack, and a path was only the visible half of that assumption.
|
|
180
|
+
|
|
181
|
+
## 0.5.6 — 2026-08-19
|
|
182
|
+
|
|
183
|
+
- The guard a real component actually needed, which the retired V24 could never have been.
|
|
184
|
+
|
|
185
|
+
## 0.5.5 — 2026-08-19
|
|
186
|
+
|
|
187
|
+
- V24 was unsatisfiable for every consumer, and the language sweep had missed nineteen strings.
|
|
188
|
+
|
|
189
|
+
## 0.5.4 — 2026-08-19
|
|
190
|
+
|
|
191
|
+
- `portability.md` was right about the path and wrong about everything else.
|
|
192
|
+
|
|
193
|
+
## 0.5.3 — 2026-08-19
|
|
194
|
+
|
|
195
|
+
- The 0.5.0 split was unreachable for the repos that needed it.
|
|
196
|
+
- Python bytecode is kept out of the tarball — 0.5.2 shipped 123 kB of it, and a `.pyc` embeds the
|
|
197
|
+
absolute path it was compiled from.
|
|
198
|
+
|
|
199
|
+
## 0.5.2 — 2026-08-19
|
|
200
|
+
|
|
201
|
+
- **The direction was reversed:** a method change is authored *here* and proven against a fixture corpus
|
|
202
|
+
the registry scripts actually run against, instead of being promoted out of a live product. `promote`
|
|
203
|
+
became a rescue tool that refuses to run without `--rescue`.
|
|
204
|
+
- An external audit of 0.5.0 found the `AGENTS.md` block calling the whole kit non-binding.
|
|
205
|
+
- Bahasa Indonesia is swept out of the generic package; the installer's interface is English.
|
|
206
|
+
- Included here: `.constitution/` becoming exactly two folders, `method/` and `project/` (0.5.0), and the
|
|
207
|
+
0.5.1 republish of a kit that had shipped pre-fix overlay content.
|
|
208
|
+
|
|
209
|
+
## 0.3.0 — 2026-08-18
|
|
210
|
+
|
|
211
|
+
- First public release: an interactive installer, a replaceable `AGENTS.md` method block, two language
|
|
212
|
+
settings asked separately, and `.constitution/project/` as the custom room `update` never overwrites and
|
|
213
|
+
`promote` never publishes.
|
package/README.md
CHANGED
|
@@ -379,12 +379,17 @@ A `DEC-` freezes when it is applied. A change of mind produces a new one; it nev
|
|
|
379
379
|
|
|
380
380
|
## The mechanical half
|
|
381
381
|
|
|
382
|
-
`validate.py` runs twenty-
|
|
382
|
+
`validate.py` runs twenty-nine named validators — `goal-has-fr`, `cites-resolve`, `no-cycles`,
|
|
383
383
|
`id-allocated-once`, and the rest, each named for the thing it checks — over the registries and the
|
|
384
384
|
corpus, and `inventory.py` derives the three inventories from code and reports the difference against the
|
|
385
385
|
plan without patching either side. There is no validator that compares two copies of one fact, because
|
|
386
386
|
the corpus keeps no copies.
|
|
387
387
|
|
|
388
|
+
**The corpus is what git tracks.** A vendored dependency tree inside a gitignored folder is not this
|
|
389
|
+
product's writing, and since 0.6.17 the walk skips what the repo ignores. The other half of that rule is
|
|
390
|
+
`corpus-in-git`: a folder the method commits MUST NOT be ignored, so `.gitignore` cannot be used to quiet
|
|
391
|
+
a finding about a file that really is yours.
|
|
392
|
+
|
|
388
393
|
The validators exist because prose that nothing checks is prose that gets contradicted by the first
|
|
389
394
|
person in a hurry. Every one of them also states **the state in which it does not apply** — a rule that
|
|
390
395
|
demands a trace before the trace can exist is a rule that gets switched off, and a validator nobody
|
|
@@ -513,6 +518,9 @@ Open an [issue](https://github.com/wiradigitalid/wdi-method/issues) for a bug or
|
|
|
513
518
|
[`CONTRIBUTING.md`](CONTRIBUTING.md) before sending a pull request — it explains where a change belongs,
|
|
514
519
|
how versioning works here, and what to check before publishing.
|
|
515
520
|
|
|
521
|
+
[`CHANGELOG.md`](CHANGELOG.md) is what changed in each version, and what each change means for a repo
|
|
522
|
+
that already has the method installed. Read it before an `update` that crosses more than a patch.
|
|
523
|
+
|
|
516
524
|
## License
|
|
517
525
|
|
|
518
526
|
MIT — see [LICENSE](LICENSE). Requires Node 20+ and [uv](https://docs.astral.sh/uv/) for the Python
|
|
@@ -63,6 +63,12 @@ decision or a PRD MAY point into it. Research, brainstorming, forge, and PRFAQ r
|
|
|
63
63
|
A run folder MUST NOT be deleted **while anything still needs it** — the `update` intents re-read the original
|
|
64
64
|
inputs in place. "Never deleted" is not the rule; the rule is a **retirement condition**, and it is below.
|
|
65
65
|
|
|
66
|
+
**What git ignores is not corpus.** A vendored upstream checkout kept for reading, a scratch download, a
|
|
67
|
+
build cache — if the product excludes it from git it is in no clone, nobody curates it, and the validators
|
|
68
|
+
do not read it. The other half of that rule is `corpus-in-git`: a folder the method itself keeps MUST NOT be
|
|
69
|
+
excluded, and the two lock together — material is either in git and checked, or ignored and not corpus. What
|
|
70
|
+
`.gitignore` MUST NOT be used for is quieting a finding about a file that really is this product's.
|
|
71
|
+
|
|
66
72
|
### A withdrawn promise STAYS in the registry
|
|
67
73
|
|
|
68
74
|
A `BG` · `CAP` · `FR` · `NFR` · `UC` the product stops promising is marked, never deleted:
|