@printpractical/cruze 0.0.10 → 0.0.11

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/README.md CHANGED
@@ -10,7 +10,7 @@ It works with any agent that supports the [Agent Skills](https://agentskills.io)
10
10
 
11
11
  ## Status
12
12
 
13
- Version 0.0.10 is the tenth preview. Intent now survives from the first idea to every design: the vision holds the principles every design follows and the capabilities that must stay possible, envision takes in any input and hands each part to the step that takes it up, and the design reviewer checks every design against them. Steps read less, through an element index and lookup, one rubric per review and a word budget on the skills. Early development. The CLI is complete for the V1 lifecycle. The document formats ship as the `cruze-formats` skill, the standards an agent designs and codes to ship as knowledge skills, and the whole workflow, from explore to land, ships as workflow skills. Claude Code is the agent tested so far.
13
+ Version 0.0.11 is the eleventh preview. A change no longer loops between build, verify and rethink over edge cases: a code review finding blocks only when ordinary use reaches a failure that loses data, crashes, hangs or spins, a verify after a send-back reviews only the code changed since, and a missing limit, message or error case is settled as a detail inside build or verify. Early development. The CLI is complete for the V1 lifecycle. The document formats ship as the `cruze-formats` skill, the standards an agent designs and codes to ship as knowledge skills, and the whole workflow, from explore to land, ships as workflow skills. Claude Code is the agent tested so far.
14
14
 
15
15
  ## Why
16
16
 
@@ -35,7 +35,7 @@ The skills run `cruze` commands, so the agent needs `cruze` on its path. Install
35
35
  From a GitHub Release, without npm. Each release attaches the packed package:
36
36
 
37
37
  ```sh
38
- npm install -g https://github.com/PrintPractical/cruze/releases/download/v0.0.10/printpractical-cruze-0.0.10.tgz
38
+ npm install -g https://github.com/PrintPractical/cruze/releases/download/v0.0.11/printpractical-cruze-0.0.11.tgz
39
39
  ```
40
40
 
41
41
  From npm, once a version is published there:
@@ -47,7 +47,7 @@ npm install -g @printpractical/cruze
47
47
  From the git repository, at a tag or `#main`. This needs git and access to the repository. npm 11 needs `--install-links` for a global git install, and the first `cruze` command builds the CLI, which takes a moment:
48
48
 
49
49
  ```sh
50
- npm install -g --install-links github:PrintPractical/cruze#v0.0.10
50
+ npm install -g --install-links github:PrintPractical/cruze#v0.0.11
51
51
  ```
52
52
 
53
53
  ### 2. Set up a repository
@@ -61,7 +61,7 @@ cruze init
61
61
  When you didn't install from npm, tell `init` where Cruze came from, so the CI it writes runs the same source instead of the npm package:
62
62
 
63
63
  ```sh
64
- cruze init --package https://github.com/PrintPractical/cruze/releases/download/v0.0.10/printpractical-cruze-0.0.10.tgz
64
+ cruze init --package https://github.com/PrintPractical/cruze/releases/download/v0.0.11/printpractical-cruze-0.0.11.tgz
65
65
  ```
66
66
 
67
67
  `init` asks for the project name, and which coding agent you use: `claude` for Claude Code, or `other` for any agent that reads `AGENTS.md` and `.agents/skills/`, such as Codex or OpenCode. It doesn't ask when you pass `--agent claude` or `--agent other`, or when the repository already has `CLAUDE.md` or `.claude/`. With `--yes`, or without a terminal, it sets up Claude Code. Then it creates:
@@ -24,14 +24,14 @@ const OPTIONAL_FIELDS = {
24
24
  rethink: ["missed_by"],
25
25
  review: ["nits", "checked_by"],
26
26
  disposition: ["decided"],
27
- verification: ["back_to"],
27
+ verification: ["back_to", "commit"],
28
28
  };
29
29
 
30
30
  /** The workflow steps and checks that find or miss a problem, so a retro can count them. */
31
31
  export const STEPS = ["envision", "architect", "research", "design-review", "walkthrough", "plan", "plan-review", "build", "code-review", "verify", "land", "realign", "improve", "validate", "check", "user"];
32
32
 
33
33
  export const FIELD_VALUES = {
34
- level: ["task", "change", "feature", "architecture", "vision"],
34
+ level: ["task", "detail", "change", "feature", "architecture", "vision"],
35
35
  kind: ["defect", "discovery"],
36
36
  disposition: ["fixed", "waived", "deferred", "rejected", "rethink"],
37
37
  decided: ["agent", "user"],
@@ -94,7 +94,7 @@ export function recordedEventProblems(event , fields
94
94
  if (allowed !== undefined && !allowed.includes(value)) problems.push(`${field} must be one of ${allowed.join(", ")}`);
95
95
  if (COUNT_FIELDS.includes(field) && !/^\d+$/.test(value)) problems.push(`${field} must be a whole number`);
96
96
  }
97
- if (event === "checks" && fields["commit"] !== undefined && !/^[0-9a-f]{7,40}$/.test(fields["commit"])) {
97
+ if ((event === "checks" || event === "verification") && fields["commit"] !== undefined && !/^[0-9a-f]{7,40}$/.test(fields["commit"])) {
98
98
  problems.push("commit must be a commit hash, such as the output of git rev-parse --short HEAD");
99
99
  }
100
100
  if (event === "disposition" && fields["decided"] === "agent" && fields["disposition"] !== "fixed") {
@@ -11,7 +11,7 @@ export const MAX_FILE_WORDS = 2100;
11
11
  * 0.0.10 the skills grew by half while nothing was removed. Lower this when text is cut. Raising it
12
12
  * is the maintainer's decision, with the reason in the commit that raises it.
13
13
  */
14
- export const BUNDLE_WORD_BUDGET = 44500;
14
+ export const BUNDLE_WORD_BUDGET = 44800;
15
15
 
16
16
  /** Data the CLI reads or renders, rather than instructions an agent reads. */
17
17
  const NOT_INSTRUCTIONS = /(^|\/)(templates|notes)\//;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@printpractical/cruze",
3
- "version": "0.0.10",
3
+ "version": "0.0.11",
4
4
  "description": "Spec-driven development for coding agents: one living model of the system, small deltas, convergent review.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Chris Buchter",
@@ -49,12 +49,12 @@ The plan is design. Within a task you decide only what is local and reversible.
49
49
  - a new element, port operation or scenario;
50
50
  - a file outside the owner's module, other than the test support module;
51
51
  - a change to an approved scenario's behaviour, or to its test;
52
- - a dependency, or a feature of an approved dependency, that the design doesn't name. Ask for it as `.agents/skills/cruze-dependency-approval/SKILL.md` says, and never write around it with hand-written code or a shell command;
53
- - a limit, timeout, buffer size, message or error case the design doesn't give. Picking one in code hides a gap in the design: the user decides it, at feature level. Two projects settled 35 of them as deviations.
52
+ - a dependency, or a feature of an approved dependency, that the design doesn't name. Ask for it as `.agents/skills/cruze-dependency-approval/SKILL.md` says, and never write around it with hand-written code or a shell command.
54
53
 
55
54
  Explain what you found, with the evidence, and don't work around it. Completed tasks keep their commits.
56
- - **Read a deviation back before you record it.** One that says the design gives no value, text, error or outcome and names the one you chose, or that the code can't keep a promise a port or use case makes, is a rethink, not a deviation. In one change, two deviations worded that way came back as code-review blockers and sent it back at verify.
57
- - Never edit `feature.md`, `docs/architecture.md` or `docs/specs/` during build. Design changes go through `rethink`.
55
+ - **Settle a detail with the user,** as "Detail" in `.agents/skills/cruze-rethink/levels.md` says, when the code needs a limit, timeout, buffer size, message or error case the design doesn't give. Never offer a deviation instead: two projects settled 35 details as deviations.
56
+ - **Read a deviation back before you record it.** One naming a value, text, error or outcome the design doesn't give is a detail; one saying the code can't keep a promise a port or use case makes is a rethink.
57
+ - Never edit `feature.md`, `docs/architecture.md` or `docs/specs/` during build. Design changes go through `rethink`, a detail included.
58
58
 
59
59
  ## Protecting the check
60
60
 
@@ -0,0 +1,15 @@
1
+ # Realign notes: 0.0.11
2
+
3
+ ## New work only
4
+
5
+ ### review-severity: A blocker is a failure ordinary use reaches, not every gap in the design
6
+ - Applies to: new work only
7
+ - Rule: `.agents/skills/cruze-roles/code-reviewer.md`, "Findings"
8
+
9
+ ### reverify-scope: A verify after a send-back reviews only the code changed since the last verify
10
+ - Applies to: new work only
11
+ - Rule: `.agents/skills/cruze-verify/SKILL.md`, "Steps", steps 1 and 10
12
+
13
+ ### detail-amendments: A missing limit, timeout, message or error case is settled as a detail inside build or verify
14
+ - Applies to: new work only
15
+ - Rule: `.agents/skills/cruze-rethink/levels.md`, "Detail"
@@ -13,6 +13,7 @@ Each release that changes what Cruze expects of a project ships a notes file, `n
13
13
  - [0.0.8](notes/0.0.8.md)
14
14
  - [0.0.9](notes/0.0.9.md)
15
15
  - [0.0.10](notes/0.0.10.md)
16
+ - [0.0.11](notes/0.0.11.md)
16
17
 
17
18
  ## Format
18
19
 
@@ -26,7 +26,7 @@ Finding a design flaw mid-build is information, not failure. Rethink amends the
26
26
  7. **Record the rethink.** Draft the entry and show it to the user in one line. When they confirm, run:
27
27
 
28
28
  ```sh
29
- cruze journal add rethink --set level=<task|change|feature|architecture|vision> --set kind=<defect|discovery> \
29
+ cruze journal add rethink --set level=<task|detail|change|feature|architecture|vision> --set kind=<defect|discovery> \
30
30
  --set summary="<what changed>" --set wrong="<document and element, and what was wrong>" \
31
31
  --set found_by=<step> [--set missed_by=<step>] \
32
32
  --set agent="<the agent you run in>" [--item <ref>]
@@ -43,6 +43,7 @@ Done when `cruze status` shows every document approved and current, or names onl
43
43
  | Level | Example | Amend | Then |
44
44
  | --- | --- | --- | --- |
45
45
  | Task | A helper belongs in a different file of the same module | Nothing. Record it with `cruze task deviation` | Carry on building. This is not a rethink, so record no rethink entry |
46
+ | Detail | Build or verify needs a limit, timeout, message or error case | The element's text, with the code | The user approves it, with no review. Run from build or verify, as [levels.md](levels.md) says |
46
47
  | Change | A test plan row or a task's file is wrong, with no design change | `change.md`: its test plan or tasks | Plan review of the diff, then re-approve the change |
47
48
  | Feature | A use case needs a second port operation; a scenario is wrong | `feature.md`: its deltas and Changes table, or a standalone `change.md`'s deltas | Design review of the diff, walkthrough of the changed parts, then re-approve the feature and its changes |
48
49
  | Architecture | An entity boundary is wrong, or a new port is needed | `docs/architecture.md` directly, plus an ADR when it passes the ADR test | Design review of the diff when it changes an operation, port, error or `XC` rule, walkthrough of the diff, then `cruze approve architecture`, with `--replan` for built elements whose code must change |
@@ -1,5 +1,14 @@
1
1
  # Amending each level
2
2
 
3
+ ## Detail
4
+
5
+ A detail settles a limit, timeout, buffer size, message or error case that an element of the work in progress doesn't give, with no new element, port operation or dependency, and no change to an approved scenario. Build and verify run it without leaving their step: one message length settled as a full rethink took 75 minutes.
6
+
7
+ 1. Ask the user, recommending a value and saying what the code then does.
8
+ 2. Amend the element where it lives, in the delta or `docs/architecture.md`, adding at most one failure scenario and its test plan row for a new error case. Run `cruze validate`; done when it reports no errors.
9
+ 3. Commit the text with the code and its test, naming the task. Tasks stay ticked.
10
+ 4. The user approves the amended document. Re-stamp what went stale, and record the rethink with `level=detail`, as the skill's steps 6 and 7 say.
11
+
3
12
  ## Change
4
13
 
5
14
  1. Edit the change's `## Test plan` or `## Tasks` so they are right. The scope doesn't change at this level; a scope change is a feature-level rethink.
@@ -35,7 +35,7 @@ A review has at most two rounds. Only blockers can force the second one.
35
35
  - Its fix changes behaviour: it adds, removes or rewrites a requirement or scenario, or changes what a person sees or does beyond what the spec says. Making the code or the plan meet a scenario as written is not a change of behaviour.
36
36
  - Its fix changes a port, a port's `Operations` or a public contract that the approved design names.
37
37
  - Its fix changes another decision the grilling skill leaves to the user: a context, dependency direction or a dependency.
38
- - You recommend anything but `fixed`: waiving, deferring or rejecting it, or a rethink because it needs a design change.
38
+ - You recommend anything but `fixed`: waiving, deferring or rejecting it, or a rethink because it needs a design change. A fix through a detail amendment is an exception too.
39
39
  - You would fix it differently from the reviewer's proposed fix.
40
40
 
41
41
  Every other finding is yours, blockers included: you fix it as the reviewer proposes. When `review.decide` in `.cruze/config.yaml` is `all`, every finding is an exception. Nits are a count, not findings: when a report lists any, they get no disposition and you don't bring them to the user.
@@ -45,7 +45,7 @@ A review has at most two rounds. Only blockers can force the second one.
45
45
  - `deferred`: it belongs to later work. When it is future scope, add it with `cruze features add <slug> --summary <text> --goals <ids>`.
46
46
  - `rejected`: the finding is wrong, with the reason.
47
47
 
48
- A finding whose fix would change an approved element, such as one marked `Needs design change`, is never `deferred` or `waived`. Recommend `rethink` at that element's level now. Once the rethink is done and the code follows it, record the finding as `fixed`. When the user wants the rethink later, record it as `rethink` instead, with `--item` naming the feature or change it amends: `cruze next` and the build gate hold that work until a rethink is recorded for it.
48
+ A finding whose fix would change an approved element, such as one marked `Needs design change`, is never `waived`. Recommend `fixed` through a detail amendment when it qualifies, as "Detail" in `.agents/skills/cruze-rethink/levels.md` says, otherwise `rethink` at that element's level now, or `deferred` for a concern later work can carry. Once the rethink is done and the code follows it, record the finding as `fixed`. When the user wants the rethink later, record it as `rethink` instead, with `--item` naming the feature or change it amends: `cruze next` and the build gate hold that work until a rethink is recorded for it.
49
49
 
50
50
  Then one line for each finding you are fixing yourself. When there are no exceptions, say what you are fixing and carry on without waiting. The user can object to any line until the work is approved, and that finding becomes an exception: revert its fix and let them decide it.
51
51
  5. **Record every disposition:** `cruze journal add disposition --set finding="<rubric item>: <summary>" --set disposition=<fixed|waived|deferred|rejected|rethink> --set reason="<reason>" --set review=<design|plan|code> --set decided=<agent|user>`, with the same `--item`. Use `decided=user` for each exception, once the user decides it, and `decided=agent` for each finding you fixed yourself. The CLI refuses `decided=agent` for anything but `fixed`. A recorded disposition is never raised again.
@@ -5,7 +5,7 @@ You review the code a change adds, before it lands. You work in two lanes. The s
5
5
  ## Inputs
6
6
 
7
7
  - The change's `change.md`, and the output of `cruze show <ref>`: the elements it builds, the scenarios it delivers, the settled decisions and the ledger. Read an element it lists as cited only when the diff calls it, with `cruze show <ID>`.
8
- - The diff under review, from `git diff <base>` for the base commit you are given.
8
+ - The diff under review, from `git diff <base>` for the base commit you are given. When the base is where an earlier verify stopped, review older code only where the diff changes what it does.
9
9
  - The ADRs in `docs/adr/`, and the specs in `docs/specs/` for the capabilities the change touches.
10
10
  - The references `cruze show` lists, at the sections the change's elements cite.
11
11
  - The settled ledger, as `.agents/skills/cruze-roles/SKILL.md` defines it, with the output of `cruze journal list --event disposition --item <ref>`.
@@ -32,7 +32,7 @@ Review against these items and nothing else. Each finding names one.
32
32
  8. **Idiom.** The code is idiomatic for the language, uses its standard tooling, and follows the language file's rules, including where tests live. Tests reuse the fixtures and harnesses in the test support module rather than redefining them. Each `expect`, `unwrap` or panic in the diff has a reason its case can't happen; one a caller, the clock or a concurrent call can reach is a finding.
33
33
  9. **Libraries.** Nothing hand-writes what a mature library does without a recorded `build` decision, and every new dependency has a recorded approval. No code works around a dependency or a feature: hand-written code, a shell command or a less idiomatic construct chosen because the clean one needs a dependency is a finding.
34
34
  10. **Contracts.** Each adapter honours its port's `Operations`, and each fake passes the same contract tests as the real adapter.
35
- 11. **Deviations.** Each deviation the change recorded is a choice build may make on its own: a private helper or a new file inside the owner's module, a `check.exceptions` entry, a fixture in the test support module, or two tasks swapped. A deviation that added an element, port operation or scenario, wrote a file outside the owner's module, changed an approved scenario's behaviour or its test, worked around a dependency or a feature, or settled a limit, timeout, message or error case the design doesn't give, needed a rethink: a blocker, with `Needs design change` naming the element. Two projects recorded 13 such deviations.
35
+ 11. **Deviations.** Each deviation the change recorded is a choice build may make on its own: a private helper or a new file inside the owner's module, a `check.exceptions` entry, a fixture in the test support module, or two tasks swapped. A deviation that added an element, port operation or scenario, wrote a file outside the owner's module, changed an approved scenario's behaviour or its test, worked around a dependency or a feature, or settled a limit, timeout, message or error case the design doesn't give, needed a design amendment: a blocker, with `Needs design change` naming the element.
36
36
 
37
37
  ## Findings
38
38
 
@@ -47,7 +47,8 @@ Each finding has this shape:
47
47
  - Needs design change: <the approved element whose text the fix must change, such as a port's `Operations`, or `no`>
48
48
  ```
49
49
 
50
- - A **blocker** means a scenario fails or is untested, a protected test was weakened, a layering rule is broken, an unapproved dependency was added, or an adapter can't honour its port's `Operations`. A finding that needs a design change is a blocker. Everything else is a **concern**.
50
+ - A **blocker** means a scenario fails or is untested, a protected test was weakened, a layering rule is broken, an unapproved dependency was added, or an adapter can't honour its port's `Operations`. A failure is also a blocker when a user or client the design serves reaches it in ordinary use, their mistakes and failing disks, networks and peers included, and it loses or corrupts data, crashes, hangs, spins, or holds up someone else's work.
51
+ - Everything else is a **concern**, even when its fix needs a design change, such as a failure only hand-made input reaches that harms only its sender: in one change, such cases were the only blockers of two verifies in a row. Say who reaches the failure, and how.
51
52
  - List every blocker. List at most 5 concerns, or one per 5 tasks of the change when that is more, the most important first. Count the rest as nits: give only their number, never their text. Report only what would go wrong: no concerns is a valid report, and a small change usually has few.
52
53
  - Drop any finding that contradicts the settled ledger. The only exception is a blocker with new evidence, which you mark `New evidence:` and explain.
53
54
  - When a finding could be caught mechanically, add `Check: <the cruze check rule or linter setting that would catch it>`.
@@ -9,14 +9,14 @@ Verify answers one question: does this change work when someone uses it? Green t
9
9
 
10
10
  ## Steps
11
11
 
12
- 1. **Check it is ready.** Run `cruze next`. It must name `verify` for this change, on this branch. Find the base commit the change branched from with `git merge-base main HEAD`.
12
+ 1. **Check it is ready.** Run `cruze next`. It must name `verify` for this change, on this branch. Find the base commit the change branched from with `git merge-base main HEAD`. The code review's base is the same, unless `cruze journal list --event verification --item <ref>` shows an earlier verify: then it is that entry's commit, or `git rev-list -1 --before=<its at> HEAD` for one without, since the code before it was reviewed.
13
13
  2. **Run the mechanical checks.** Run `cruze validate`, `cruze check --ci` and `cruze trace --change <ref>`, and quote each result.
14
14
  - Run `cruze journal list --event checks --item <ref>`. When its last entry's commit has no code changes since, that is when `git diff --quiet <commit> HEAD -- . ':(exclude)docs' ':(exclude).cruze'` succeeds, quote that entry for the format, lint, build and test commands instead of running them again.
15
15
  - Otherwise run the format, lint and build commands and the full suite, as `.agents/skills/cruze-formats/reference/config.md` defines it under `commands`. When they pass, record them with `cruze journal add checks --set commit=<commit> --item <ref>`, where the commit is the output of `git rev-parse --short HEAD`.
16
16
  - When one fails, fix the code in a commit and run them again. When a fix needs design, stop and offer `rethink`.
17
- 3. **Check the dependencies.** Follow "Checking" in `.agents/skills/cruze-dependency-approval/SKILL.md` against the base commit. An unrecorded dependency is a blocker.
17
+ 3. **Check the dependencies.** Follow "Checking" in `.agents/skills/cruze-dependency-approval/SKILL.md` against the merge base. An unrecorded dependency is a blocker.
18
18
  4. **Run the verifier.** Run the verifier role from `.agents/skills/cruze-roles/SKILL.md` for the change, with the mechanical checks' results and the commit they ran at. It must be able to build and run the system. When it runs through `cruze review`, check that `review.command` in `.cruze/config.yaml` allows the project's build and run commands, and add them with the user's agreement. Done when you have its report, with a result for every delivered scenario.
19
- 5. **Review the code.** Run the review in the roles skill with the code reviewer, `review=code`, `--item <ref>` and the base commit. Fix each finding whose disposition is `fixed` in a commit, running the tests each fix touches, and `test` when `commands:` has a `test_full`. Then check the fixes yourself, as round 2 in the roles skill says.
19
+ 5. **Review the code.** Run the review in the roles skill with the code reviewer, `review=code`, `--item <ref>` and the code review's base. Fix each finding whose disposition is `fixed` in a commit, through a detail amendment when it needs one, running the tests each fix touches, and `test` when `commands:` has a `test_full`. Then check the fixes yourself, as round 2 in the roles skill says.
20
20
  6. **Write the manual test script** as `manual-test.md` in the change folder, following [manual-test.md](manual-test.md). Commit it.
21
21
  7. **Check the fixes once.** When code changed since the last `checks` entry, run the format, lint and build commands and the full suite once more, and record them as in step 2. Done when the last `checks` entry is at a commit with no code changes since.
22
22
  8. **Report.** Show the user four things:
@@ -25,7 +25,7 @@ Verify answers one question: does this change work when someone uses it? Green t
25
25
  - The review's outcome, with each finding's disposition.
26
26
  - The path to `manual-test.md`, with a recommendation to run it before accepting.
27
27
  9. **Ask for the decision:** "Do you accept this change, or send it back?"
28
- 10. **Record it** with `cruze journal add verification --set result=accepted --set summary="<one line>" --item <ref>`, or `--set result=sent-back --set back_to=<build|rethink>`. On sent-back, say what goes back:
28
+ 10. **Record it** with `cruze journal add verification --set result=<accepted|sent-back> --set summary="<one line>" --set commit=<commit> --item <ref>`, where the commit is the output of `git rev-parse --short HEAD`, adding `--set back_to=<build|rethink>` when it is sent back. On sent-back, say what goes back:
29
29
  - A defect in code a task already built: `back_to=build`, then `cruze task reopen T<n> "<reason>"`.
30
30
  - A design that can't deliver the scenario: `back_to=rethink`. Leave the tasks to the rethink, which reopens the ones its amendment changes, and `cruze next` names `rethink` until it is recorded.
31
31
 
@@ -34,8 +34,8 @@ Done when the decision is recorded.
34
34
  ## Rules
35
35
 
36
36
  - A scenario the verifier couldn't run isn't passed. Mark it clearly in the report and in `manual-test.md`.
37
- - Findings from the review are dispositions in the journal, never edits to `change.md`.
38
- - Fixes made during verify are code commits that stay within the tasks' files. When a fix needs a new file or owner, it is a deviation or a rethink, exactly as in build.
37
+ - Findings from the review are dispositions in the journal. They edit `change.md` only through a detail amendment.
38
+ - Fixes made during verify are code commits that stay within the tasks' files. When a fix needs a new file or owner, or a detail, handle it exactly as build does.
39
39
 
40
40
  ## Next step
41
41
 
@@ -24,14 +24,14 @@ const OPTIONAL_FIELDS: Record<string, string[]> = {
24
24
  rethink: ["missed_by"],
25
25
  review: ["nits", "checked_by"],
26
26
  disposition: ["decided"],
27
- verification: ["back_to"],
27
+ verification: ["back_to", "commit"],
28
28
  };
29
29
 
30
30
  /** The workflow steps and checks that find or miss a problem, so a retro can count them. */
31
31
  export const STEPS = ["envision", "architect", "research", "design-review", "walkthrough", "plan", "plan-review", "build", "code-review", "verify", "land", "realign", "improve", "validate", "check", "user"];
32
32
 
33
33
  export const FIELD_VALUES: Record<string, string[]> = {
34
- level: ["task", "change", "feature", "architecture", "vision"],
34
+ level: ["task", "detail", "change", "feature", "architecture", "vision"],
35
35
  kind: ["defect", "discovery"],
36
36
  disposition: ["fixed", "waived", "deferred", "rejected", "rethink"],
37
37
  decided: ["agent", "user"],
@@ -94,7 +94,7 @@ export function recordedEventProblems(event: string, fields: Record<string, stri
94
94
  if (allowed !== undefined && !allowed.includes(value)) problems.push(`${field} must be one of ${allowed.join(", ")}`);
95
95
  if (COUNT_FIELDS.includes(field) && !/^\d+$/.test(value)) problems.push(`${field} must be a whole number`);
96
96
  }
97
- if (event === "checks" && fields["commit"] !== undefined && !/^[0-9a-f]{7,40}$/.test(fields["commit"])) {
97
+ if ((event === "checks" || event === "verification") && fields["commit"] !== undefined && !/^[0-9a-f]{7,40}$/.test(fields["commit"])) {
98
98
  problems.push("commit must be a commit hash, such as the output of git rev-parse --short HEAD");
99
99
  }
100
100
  if (event === "disposition" && fields["decided"] === "agent" && fields["disposition"] !== "fixed") {
@@ -11,7 +11,7 @@ export const MAX_FILE_WORDS = 2100;
11
11
  * 0.0.10 the skills grew by half while nothing was removed. Lower this when text is cut. Raising it
12
12
  * is the maintainer's decision, with the reason in the commit that raises it.
13
13
  */
14
- export const BUNDLE_WORD_BUDGET = 44500;
14
+ export const BUNDLE_WORD_BUDGET = 44800;
15
15
 
16
16
  /** Data the CLI reads or renders, rather than instructions an agent reads. */
17
17
  const NOT_INSTRUCTIONS = /(^|\/)(templates|notes)\//;