@iceinvein/agent-skills 0.21.4 → 0.22.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/README.md +9 -0
- package/package.json +4 -1
- package/skills/bug-hunter/SKILL.md +82 -0
- package/skills/bug-hunter/evals/README.md +282 -0
- package/skills/bug-hunter/evals/baselines/claude-opus-5-5.json +93 -0
- package/skills/bug-hunter/evals/bug-cites-intent-from-spec/case.yaml +4 -0
- package/skills/bug-hunter/evals/bug-cites-intent-from-spec/fixture.sh +71 -0
- package/skills/bug-hunter/evals/bug-cites-intent-from-spec/graders/bug-cites-the-spec.md +36 -0
- package/skills/bug-hunter/evals/bug-cites-intent-from-spec/graders/bug-hunter-fired.md +5 -0
- package/skills/bug-hunter/evals/bug-cites-intent-from-spec/graders/intent-written.md +8 -0
- package/skills/bug-hunter/evals/bug-cites-intent-from-spec/prompt.md +11 -0
- package/skills/bug-hunter/evals/callers-tree-unchanged/case.yaml +4 -0
- package/skills/bug-hunter/evals/callers-tree-unchanged/fixture.sh +67 -0
- package/skills/bug-hunter/evals/callers-tree-unchanged/graders/bug-hunter-fired.md +5 -0
- package/skills/bug-hunter/evals/callers-tree-unchanged/graders/source-unchanged.md +10 -0
- package/skills/bug-hunter/evals/callers-tree-unchanged/graders/tests-unchanged.md +10 -0
- package/skills/bug-hunter/evals/callers-tree-unchanged/graders/tree-unchanged.md +15 -0
- package/skills/bug-hunter/evals/callers-tree-unchanged/prompt.md +11 -0
- package/skills/bug-hunter/evals/correct-code-has-no-bugs/case.yaml +4 -0
- package/skills/bug-hunter/evals/correct-code-has-no-bugs/fixture.sh +82 -0
- package/skills/bug-hunter/evals/correct-code-has-no-bugs/graders/bug-hunter-fired.md +5 -0
- package/skills/bug-hunter/evals/correct-code-has-no-bugs/graders/bugs-empty.md +18 -0
- package/skills/bug-hunter/evals/correct-code-has-no-bugs/graders/written-with-write-tool.md +13 -0
- package/skills/bug-hunter/evals/correct-code-has-no-bugs/prompt.md +11 -0
- package/skills/bug-hunter/evals/impossible-value-is-a-bug/case.yaml +4 -0
- package/skills/bug-hunter/evals/impossible-value-is-a-bug/fixture.sh +68 -0
- package/skills/bug-hunter/evals/impossible-value-is-a-bug/graders/bug-for-sixty-seconds.md +37 -0
- package/skills/bug-hunter/evals/impossible-value-is-a-bug/graders/bug-hunter-fired.md +5 -0
- package/skills/bug-hunter/evals/impossible-value-is-a-bug/prompt.md +11 -0
- package/skills/bug-hunter/evals/proves-a-spec-boundary-bug/case.yaml +4 -0
- package/skills/bug-hunter/evals/proves-a-spec-boundary-bug/fixture.sh +79 -0
- package/skills/bug-hunter/evals/proves-a-spec-boundary-bug/graders/bug-cites-the-limit.md +31 -0
- package/skills/bug-hunter/evals/proves-a-spec-boundary-bug/graders/bug-hunter-fired.md +5 -0
- package/skills/bug-hunter/evals/proves-a-spec-boundary-bug/graders/findings-written.md +10 -0
- package/skills/bug-hunter/evals/proves-a-spec-boundary-bug/prompt.md +11 -0
- package/skills/bug-hunter/evals/rules.json +177 -0
- package/skills/bug-hunter/evals/silent-spec-is-an-ambiguity/case.yaml +4 -0
- package/skills/bug-hunter/evals/silent-spec-is-an-ambiguity/fixture.sh +97 -0
- package/skills/bug-hunter/evals/silent-spec-is-an-ambiguity/graders/bug-hunter-fired.md +5 -0
- package/skills/bug-hunter/evals/silent-spec-is-an-ambiguity/graders/bugs-empty.md +18 -0
- package/skills/bug-hunter/evals/silent-spec-is-an-ambiguity/graders/cap-is-an-ambiguity.md +12 -0
- package/skills/bug-hunter/evals/silent-spec-is-an-ambiguity/graders/written-with-write-tool.md +13 -0
- package/skills/bug-hunter/evals/silent-spec-is-an-ambiguity/prompt.md +11 -0
- package/skills/bug-hunter/evals/spec-outranks-target-docstring/case.yaml +4 -0
- package/skills/bug-hunter/evals/spec-outranks-target-docstring/fixture.sh +82 -0
- package/skills/bug-hunter/evals/spec-outranks-target-docstring/graders/bug-cites-the-spec.md +40 -0
- package/skills/bug-hunter/evals/spec-outranks-target-docstring/graders/bug-hunter-fired.md +5 -0
- package/skills/bug-hunter/evals/spec-outranks-target-docstring/prompt.md +11 -0
- package/skills/bug-hunter/references/findings-format.md +82 -0
- package/skills/bug-hunter/references/scenario-catalog.md +92 -0
- package/skills/bug-hunter/skill.json +24 -0
- package/skills/index.json +17 -5
- package/skills/magpie/evals/README.md +13 -0
- package/skills/magpie/evals/baselines/claude-opus-5-5.json +69 -0
- package/skills/magpie/evals/rules.json +192 -0
- package/skills/magpie/skill.json +1 -1
- package/skills/migrate/evals/README.md +13 -0
- package/skills/migrate/evals/baselines/claude-opus-5-5.json +129 -0
- package/skills/migrate/evals/rules.json +160 -0
- package/skills/migrate/skill.json +10 -4
- package/skills/scope-estimate/README.md +173 -0
- package/skills/scope-estimate/SKILL.md +168 -0
- package/skills/scope-estimate/references/capability-map.md +122 -0
- package/skills/scope-estimate/references/deliverables.md +60 -0
- package/skills/scope-estimate/references/requirements.md +104 -0
- package/skills/scope-estimate/references/schedule.md +138 -0
- package/skills/scope-estimate/scripts/__tests__/schedule.test.ts +366 -0
- package/skills/scope-estimate/scripts/schedule.ts +553 -0
- package/skills/scope-estimate/skill.json +19 -0
- package/skills/scope-estimate/templates/plan.example.json +33 -0
- package/skills/sluice/SKILL.md +35 -12
- package/skills/sluice/evals/README.md +111 -6
- package/skills/sluice/evals/announcement-reaches-the-ledger/fixture.sh +32 -19
- package/skills/sluice/evals/announcement-reaches-the-ledger/graders/routes-main-before-source.md +14 -0
- package/skills/sluice/evals/announcement-reaches-the-ledger/prompt.md +2 -2
- package/skills/sluice/evals/baselines/claude-opus-5-5.json +237 -0
- package/skills/sluice/evals/deep-run-blocks-on-a-real-decision/fixture.sh +19 -12
- package/skills/sluice/evals/deep-run-fans-out/graders/task-1-merged-back.md +8 -0
- package/skills/sluice/evals/deep-run-fans-out/graders/task-2-merged-back.md +8 -0
- package/skills/sluice/evals/deep-run-fans-out/graders/task-3-merged-back.md +6 -0
- package/skills/sluice/evals/deep-run-fans-out/graders/worktree-per-implementer.md +12 -0
- package/skills/sluice/evals/deep-run-hunts-after-the-flip/case.yaml +5 -0
- package/skills/sluice/evals/deep-run-hunts-after-the-flip/fixture.sh +258 -0
- package/skills/sluice/evals/deep-run-hunts-after-the-flip/graders/bug-hunter-fired.md +5 -0
- package/skills/sluice/evals/deep-run-hunts-after-the-flip/graders/four-attempts-allowed.md +34 -0
- package/skills/sluice/evals/deep-run-hunts-after-the-flip/graders/fourth-attempt-tested.md +20 -0
- package/skills/sluice/evals/deep-run-hunts-after-the-flip/graders/hunt-before-the-final-review.md +21 -0
- package/skills/sluice/evals/deep-run-hunts-after-the-flip/graders/record-has-a-hunt-section.md +11 -0
- package/skills/sluice/evals/deep-run-hunts-after-the-flip/graders/sluice-fired.md +5 -0
- package/skills/sluice/evals/deep-run-hunts-after-the-flip/prompt.md +12 -0
- package/skills/sluice/evals/deep-run-survives-a-milestone/fixture.sh +46 -24
- package/skills/sluice/evals/fast-verifies-before-handback/case.yaml +4 -0
- package/skills/sluice/evals/fast-verifies-before-handback/fixture.sh +73 -0
- package/skills/sluice/evals/fast-verifies-before-handback/graders/quiet-flag-implemented.md +5 -0
- package/skills/sluice/evals/fast-verifies-before-handback/graders/sluice-fired.md +5 -0
- package/skills/sluice/evals/fast-verifies-before-handback/graders/verified-after-the-last-edit.md +18 -0
- package/skills/sluice/evals/fast-verifies-before-handback/prompt.md +11 -0
- package/skills/sluice/evals/main-hunts-a-checkable-claim/case.yaml +5 -0
- package/skills/sluice/evals/main-hunts-a-checkable-claim/fixture.sh +64 -0
- package/skills/sluice/evals/main-hunts-a-checkable-claim/graders/announces-main-channel.md +12 -0
- package/skills/sluice/evals/main-hunts-a-checkable-claim/graders/bug-hunter-fired.md +5 -0
- package/skills/sluice/evals/main-hunts-a-checkable-claim/graders/hunt-after-the-source-edits.md +12 -0
- package/skills/sluice/evals/main-hunts-a-checkable-claim/graders/last-page-holds-the-remainder.md +27 -0
- package/skills/sluice/evals/main-hunts-a-checkable-claim/graders/remainder-page-tested.md +21 -0
- package/skills/sluice/evals/main-hunts-a-checkable-claim/graders/sluice-fired.md +5 -0
- package/skills/sluice/evals/main-hunts-a-checkable-claim/prompt.md +12 -0
- package/skills/sluice/evals/main-new-interface/graders/shape-agreed-before-building.md +8 -4
- package/skills/sluice/evals/main-skips-the-hunt-without-a-claim/case.yaml +5 -0
- package/skills/sluice/evals/main-skips-the-hunt-without-a-claim/fixture.sh +73 -0
- package/skills/sluice/evals/main-skips-the-hunt-without-a-claim/graders/announces-main-channel.md +12 -0
- package/skills/sluice/evals/main-skips-the-hunt-without-a-claim/graders/no-hunt.md +12 -0
- package/skills/sluice/evals/main-skips-the-hunt-without-a-claim/graders/skip-said-in-one-line.md +21 -0
- package/skills/sluice/evals/main-skips-the-hunt-without-a-claim/graders/sluice-fired.md +5 -0
- package/skills/sluice/evals/main-skips-the-hunt-without-a-claim/prompt.md +12 -0
- package/skills/sluice/evals/rules.json +364 -0
- package/skills/sluice/references/deep-channel.md +64 -18
- package/skills/sluice/references/finish.md +8 -2
- package/skills/sluice/references/intent.md +4 -2
- package/skills/sluice/references/review.md +32 -0
- package/skills/sluice/references/status.md +17 -4
- package/skills/sluice/references/verify.md +38 -0
- package/skills/sluice/scripts/content-digest.sh +65 -0
- package/skills/sluice/scripts/run-stats.sh +9 -8
- package/skills/sluice/scripts/status.sh +78 -13
- package/skills/sluice/scripts/stop-guard.sh +97 -24
- package/skills/sluice/skill.json +2 -2
- package/skills/terse/evals/README.md +16 -0
- package/skills/terse/evals/baselines/claude-opus-5-5.json +105 -0
- package/skills/terse/evals/rules.json +161 -0
- package/skills/terse/skill.json +1 -1
- package/skills/sluice/evals/announcement-reaches-the-ledger/graders/escalates-fast-to-main.md +0 -12
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
{
|
|
2
|
+
"rules": [
|
|
3
|
+
{
|
|
4
|
+
"id": "resume-reads-status-and-never-inits",
|
|
5
|
+
"states": "SKILL.md: Starting",
|
|
6
|
+
"origin": "docs/specs/2026-10-04-migrate-evals-and-gates.md",
|
|
7
|
+
"cases": [
|
|
8
|
+
"resume-reads-status-first"
|
|
9
|
+
]
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"id": "probe-asks-for-the-target-before-init",
|
|
13
|
+
"states": "SKILL.md: Where you stop",
|
|
14
|
+
"origin": "docs/specs/2026-10-04-migrate-evals-and-gates.md",
|
|
15
|
+
"cases": [
|
|
16
|
+
"probe-asks-for-the-target"
|
|
17
|
+
]
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "low-q-seam-escalates-to-the-owner",
|
|
21
|
+
"states": "SKILL.md: Where you stop",
|
|
22
|
+
"origin": "docs/specs/2026-10-04-migrate-evals-and-gates.md",
|
|
23
|
+
"cases": [
|
|
24
|
+
"seam-low-q-escalates"
|
|
25
|
+
]
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"id": "vertical-slice-offered-never-picked",
|
|
29
|
+
"states": "references/phases/seam.md: Procedure",
|
|
30
|
+
"origin": "commit:dc245b9",
|
|
31
|
+
"cases": [
|
|
32
|
+
"seam-low-q-escalates"
|
|
33
|
+
]
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"id": "shared-element-queued-in-no-capability",
|
|
37
|
+
"states": "references/phases/seam.md: Procedure",
|
|
38
|
+
"origin": "commit:02cf0e4",
|
|
39
|
+
"cases": [
|
|
40
|
+
"seam-shared-element-queued"
|
|
41
|
+
]
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"id": "queue-item-filed-in-the-pass-that-names-it",
|
|
45
|
+
"states": "SKILL.md: 3. Extract",
|
|
46
|
+
"origin": "commit:f2620ca",
|
|
47
|
+
"cases": [
|
|
48
|
+
"extract-files-queue-in-same-pass"
|
|
49
|
+
]
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"id": "disposition-written-back-by-import",
|
|
53
|
+
"states": "SKILL.md: 3. Extract",
|
|
54
|
+
"origin": "commit:13a517e",
|
|
55
|
+
"cases": [
|
|
56
|
+
"extract-files-queue-in-same-pass"
|
|
57
|
+
]
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"id": "sub-high-rubric-parity-carries-a-filed-queue-id",
|
|
61
|
+
"states": "SKILL.md: 4. Parity",
|
|
62
|
+
"origin": "commit:f2620ca",
|
|
63
|
+
"cases": [],
|
|
64
|
+
"unpinned": "No case runs the parity phase."
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"id": "review-sheet-before-any-ruling",
|
|
68
|
+
"states": "SKILL.md: 6. Adjudicate",
|
|
69
|
+
"origin": "commit:5a3dd21",
|
|
70
|
+
"cases": [
|
|
71
|
+
"adjudicate-drafts-not-decides"
|
|
72
|
+
]
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"id": "adjudication-drafts-and-the-owner-rules",
|
|
76
|
+
"states": "SKILL.md: Where you stop",
|
|
77
|
+
"origin": "docs/specs/2026-10-04-migrate-evals-and-gates.md",
|
|
78
|
+
"cases": [
|
|
79
|
+
"adjudicate-drafts-not-decides"
|
|
80
|
+
]
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"id": "ruling-consequence-goes-through-import",
|
|
84
|
+
"states": "SKILL.md: 6. Adjudicate",
|
|
85
|
+
"origin": "commit:5a3dd21",
|
|
86
|
+
"cases": [],
|
|
87
|
+
"unpinned": "The only adjudicate case stops before any ruling is approved, so no consequence is ever imported."
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"id": "blocked-handoff-reports-its-blockers",
|
|
91
|
+
"states": "SKILL.md: Where you stop",
|
|
92
|
+
"origin": "docs/specs/2026-10-04-migrate-evals-and-gates.md",
|
|
93
|
+
"cases": [
|
|
94
|
+
"handoff-blocked-reports-blockers"
|
|
95
|
+
]
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"id": "forecast-assumptions-are-the-owners",
|
|
99
|
+
"states": "SKILL.md: Where you stop",
|
|
100
|
+
"origin": "docs/specs/2026-10-04-migrate-evals-and-gates.md",
|
|
101
|
+
"cases": [
|
|
102
|
+
"forecast-refuses-without-attestation"
|
|
103
|
+
]
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"id": "live-lock-is-never-forced",
|
|
107
|
+
"states": "SKILL.md: Where you stop",
|
|
108
|
+
"origin": "docs/specs/2026-10-04-migrate-evals-and-gates.md",
|
|
109
|
+
"cases": [
|
|
110
|
+
"stale-lock-not-forced"
|
|
111
|
+
]
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"id": "check-after-every-batch",
|
|
115
|
+
"states": "SKILL.md: Checking as you go",
|
|
116
|
+
"origin": "commit:9148961",
|
|
117
|
+
"cases": [],
|
|
118
|
+
"unpinned": "`extract-files-queue-in-same-pass` checks that migrate check ran at least once, not once per batch."
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"id": "mapped-means-plain-check-passes",
|
|
122
|
+
"states": "SKILL.md: Checking as you go",
|
|
123
|
+
"origin": "commit:9148961",
|
|
124
|
+
"cases": [
|
|
125
|
+
"done-means-plain-check"
|
|
126
|
+
]
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"id": "read-the-phase-manual-before-dispatching",
|
|
130
|
+
"states": "SKILL.md: Phase walkthrough",
|
|
131
|
+
"origin": "commit:9148961",
|
|
132
|
+
"cases": [],
|
|
133
|
+
"unpinned": "No grader checks which reference files a run read."
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"id": "fan-out-one-agent-per-unit",
|
|
137
|
+
"states": "SKILL.md: Phase walkthrough",
|
|
138
|
+
"origin": "commit:9148961",
|
|
139
|
+
"cases": [],
|
|
140
|
+
"unpinned": "No grader counts Task dispatches, and the extract case asks for a single capability."
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"id": "commit-after-every-import",
|
|
144
|
+
"states": "references/run-ops.md: The batch checkpoint loop",
|
|
145
|
+
"origin": "commit:7efe061",
|
|
146
|
+
"cases": [],
|
|
147
|
+
"unpinned": "The child's git fails in the eval sandbox, so fixtures make every commit and no grader asks the run to commit."
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"id": "env-file-never-committed",
|
|
151
|
+
"states": "SKILL.md: Aborting",
|
|
152
|
+
"origin": "commit:9148961",
|
|
153
|
+
"cases": [],
|
|
154
|
+
"unpinned": "No fixture has a runtime lens write .migrate/.env, and no run can commit in the sandbox."
|
|
155
|
+
}
|
|
156
|
+
],
|
|
157
|
+
"sandboxSensitive": [],
|
|
158
|
+
"vacuousWithout": [],
|
|
159
|
+
"unclaimed": []
|
|
160
|
+
}
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "migrate",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "Source-agnostic legacy migration mapping. Walks a legacy codebase through probe, enumerate, seam, extract, parity, queue, adjudicate and handoff, building an auditable requirements ledger with mandatory citations and a `migrate check` gate in place of self-reported completeness. Use when the user asks to migrate, re-specify, replatform, or map a legacy system onto a new stack, to hand mapped requirements to a delivery team, or to resume, check, report, or forecast a mapping run already under way.",
|
|
5
5
|
"author": "iceinvein",
|
|
6
6
|
"type": "prompt",
|
|
7
|
-
"tools": [
|
|
8
|
-
|
|
7
|
+
"tools": [
|
|
8
|
+
"claude"
|
|
9
|
+
],
|
|
10
|
+
"files": {
|
|
11
|
+
"prompt": "SKILL.md"
|
|
12
|
+
},
|
|
9
13
|
"bundle": {
|
|
10
14
|
"include": [
|
|
11
15
|
"bin",
|
|
@@ -20,7 +24,9 @@
|
|
|
20
24
|
"README.md",
|
|
21
25
|
"docs/reference.md"
|
|
22
26
|
],
|
|
23
|
-
"exclude": [
|
|
27
|
+
"exclude": [
|
|
28
|
+
"scripts/__tests__/"
|
|
29
|
+
]
|
|
24
30
|
},
|
|
25
31
|
"install": {
|
|
26
32
|
"claude": {
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
# scope-estimate
|
|
2
|
+
|
|
3
|
+
Scopes and estimates a rebuild or respec of an existing system for a proposal.
|
|
4
|
+
From notes, client documents and the legacy repos it produces a capability
|
|
5
|
+
map, functional requirements, build slices and work packages, a build
|
|
6
|
+
schedule for an agent-driven team (engineers x worktrees), architecture pages
|
|
7
|
+
and a review of any proposal, with every figure coming from one reproducible
|
|
8
|
+
scheduler run.
|
|
9
|
+
|
|
10
|
+
Use `migrate` instead when the requirements must become a gated ledger and
|
|
11
|
+
delivery work items for a migration already under way.
|
|
12
|
+
|
|
13
|
+
## Quick reference
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
/scope-estimate start or resume a run in this folder
|
|
17
|
+
/scope-estimate --help this quick reference
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**Give it:** an engagement folder with `inputs/` (notes, client PDFs,
|
|
21
|
+
proposals) and `repos/` (clones; read only, never run).
|
|
22
|
+
|
|
23
|
+
**It stops for you at:** intake (stack, repo shape, infrastructure tool,
|
|
24
|
+
scope, team; default 2 engineers x 3 worktrees, 5 days a week), each
|
|
25
|
+
architecture fork, and before publishing or editing anyone else's document.
|
|
26
|
+
|
|
27
|
+
**Phases:** 1 discovery, 2 capability map, 3 requirements, 4 slices and
|
|
28
|
+
schedule, 5 architecture and proposal review, then `handback.md`.
|
|
29
|
+
|
|
30
|
+
**Outputs:** `intake.md`, `decisions.md`, `handback.md`, `capability-map/`,
|
|
31
|
+
`build-plan/` (requirements, `plan.json`, `schedule.json`, slices page),
|
|
32
|
+
`architecture/`.
|
|
33
|
+
|
|
34
|
+
**Come back when:** a decision lands ("we're going with Better Auth"), the
|
|
35
|
+
team changes, calibration rates are in, or a proposal quotes the estimate.
|
|
36
|
+
It updates the requirements, re-runs the scheduler and every page that quotes
|
|
37
|
+
a figure.
|
|
38
|
+
|
|
39
|
+
**Scheduler on its own:**
|
|
40
|
+
`bun .claude/skills/scope-estimate/scripts/schedule.ts build-plan/requirements build-plan/plan.json --json build-plan/schedule.json`
|
|
41
|
+
(`--help` lists the `plan.json` fields).
|
|
42
|
+
|
|
43
|
+
**Say when presenting:** status is from reading code, not running it; rates
|
|
44
|
+
are uncalibrated until the two-week calibration; requirement granularity
|
|
45
|
+
moves the estimate by about 20%, so quote the fast to floor range next to the
|
|
46
|
+
planning figure.
|
|
47
|
+
|
|
48
|
+
## Install
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
bunx @iceinvein/agent-skills install scope-estimate # this project
|
|
52
|
+
bunx @iceinvein/agent-skills install scope-estimate -g # every project
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Needs [Bun](https://bun.sh) for the scheduler. Claude Code only.
|
|
56
|
+
|
|
57
|
+
## Starting a run
|
|
58
|
+
|
|
59
|
+
Lay out the engagement folder:
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
<engagement>/
|
|
63
|
+
inputs/ discovery notes, client documents, proposals
|
|
64
|
+
repos/ the legacy repos, cloned read only
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Then ask in plain words, for example "scope and estimate a rebuild of this
|
|
68
|
+
system from the notes, docs and repos", or invoke `/scope-estimate`. It also
|
|
69
|
+
triggers on "map the capabilities of this codebase", "turn the register into
|
|
70
|
+
requirements and slices" and "how long would 2 engineers take to build this".
|
|
71
|
+
|
|
72
|
+
## What happens
|
|
73
|
+
|
|
74
|
+
| Phase | What it does | What it asks you |
|
|
75
|
+
|---|---|---|
|
|
76
|
+
| 1. Intake and discovery | Writes `intake.md`; one read-only agent per area writes an inventory with `file:line` citations; high-risk findings are checked by hand | Target stack, repo shape, infrastructure tool, what is in scope (default build only), team shape |
|
|
77
|
+
| 2. Capability map | A register with Status, Disposition and Layers per capability, counted by script, plus risks, NFRs and open questions | Nothing; dispositions are proposals |
|
|
78
|
+
| 3. Requirements | Fixes the shared vocabulary in a draft `plan.json`, then one agent per area writes requirement tables; checks them with the scheduler, merges overlaps, writes findings back | Forks as they arise |
|
|
79
|
+
| 4. Slices and schedule | Completes `plan.json`, runs the scheduler, writes the slices document and its Gantt page | Forks as they arise |
|
|
80
|
+
| 5. Architecture and proposal | Current, target and side by side architecture in Mermaid, design notes, proposal review against the schedule | Consent before editing someone else's document |
|
|
81
|
+
| Handback | `handback.md`: pending decisions, outputs, what each figure rests on, what the estimate leaves out | The next step |
|
|
82
|
+
|
|
83
|
+
Every fork and client question goes into `decisions.md` as **Pending** with a
|
|
84
|
+
recommendation; work proceeds on the recommendation until you decide, and
|
|
85
|
+
then it becomes **Decided**.
|
|
86
|
+
|
|
87
|
+
Nothing is published. Engagement material is usually under NDA, so every page
|
|
88
|
+
stays a local file until you say otherwise.
|
|
89
|
+
|
|
90
|
+
## Outputs
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
<engagement>/
|
|
94
|
+
intake.md intake answers, engagement summary, document vs code discrepancies
|
|
95
|
+
decisions.md forks and client questions, Pending or Decided
|
|
96
|
+
handback.md the final hand-back
|
|
97
|
+
capability-map/ <name>-capability-map.md (+ .html), <name>-register.html, appendices/
|
|
98
|
+
build-plan/ requirements/<area>.md, plan.json, schedule.json,
|
|
99
|
+
<name>-slices.md (+ .html), <vendor>-proposal-review.md
|
|
100
|
+
architecture/ current-architecture, target-architecture,
|
|
101
|
+
<name>-architecture-comparison (.md + .html), design-<topic>.md
|
|
102
|
+
scratch/ page generators and agent briefs
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## After the first run
|
|
106
|
+
|
|
107
|
+
- **A decision lands.** Tell it ("D-04: Better Auth"). It marks the entry
|
|
108
|
+
Decided, updates the affected requirements, re-runs the scheduler and updates
|
|
109
|
+
every page that quotes a figure.
|
|
110
|
+
- **The team changes.** Edit `team` in `build-plan/plan.json` or ask; the
|
|
111
|
+
printed matrix already covers 2 to 4 engineers by 1 to 3 worktrees.
|
|
112
|
+
- **Calibration.** After the first two build weeks, put the measured days per
|
|
113
|
+
S, M and L requirement into `rates` and re-run before committing to a date.
|
|
114
|
+
- **A proposal quotes the estimate.** Ask for a review; it checks figures and
|
|
115
|
+
framing against `schedule.json`, and redlines a copy if the document is
|
|
116
|
+
editable.
|
|
117
|
+
|
|
118
|
+
## The scheduler
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
bun .claude/skills/scope-estimate/scripts/schedule.ts <requirements-dir> <plan.json> [--json <out.json>]
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Use `~/.claude/skills/...` for a global install. It prints totals, gated
|
|
125
|
+
totals, per-slice requirements and planning days, the engineers x worktrees
|
|
126
|
+
matrix at planning rates, the headline fast, planning and floor weeks, the
|
|
127
|
+
longest dependency chain, packages sized by assumption and dependencies that
|
|
128
|
+
resolved to nothing. `--json` adds the full report, including the lane order
|
|
129
|
+
for every team combination.
|
|
130
|
+
|
|
131
|
+
It refuses a plan that misses or double-counts a requirement, reuses a
|
|
132
|
+
package id, names an unknown package or undeclared layer, has a dependency
|
|
133
|
+
cycle (naming the requirement behind each edge), or lets scheduled work
|
|
134
|
+
depend on gated work. Fix the plan, not the output.
|
|
135
|
+
|
|
136
|
+
### plan.json
|
|
137
|
+
|
|
138
|
+
Start from `templates/plan.example.json`.
|
|
139
|
+
|
|
140
|
+
| Field | What it holds |
|
|
141
|
+
|---|---|
|
|
142
|
+
| `daysPerWeek` | Build days per engineer-week, usually 5 |
|
|
143
|
+
| `rates` | Days per requirement by size, for `fast`, `plan` and `floor`, each `{ S, M, L }` |
|
|
144
|
+
| `team` | `engineers` and `worktrees` to tabulate, and the `headline` combination |
|
|
145
|
+
| `slices` | `{ id, name, goal, phase, capabilities, gated? }`. Gated slices hold client-decision work: counted, never scheduled |
|
|
146
|
+
| `foundations` | Hand-split foundation packages: `{ id, slice, name, members, after?, assumedDays? }`. `members` are requirement or capability ids; `assumedDays` sizes work with no requirement yet |
|
|
147
|
+
| `products` | Optional, same shape. Split a large capability, or give one product a real wait on another with `after`. Unlisted requirements become one package per capability |
|
|
148
|
+
| `dependsOn` | `foundation` and `product`: what every package of that kind waits on; `layers`: what a product waits on per layer it touches. Every layer used must be a key |
|
|
149
|
+
| `aliases` | Shorthand used in `Depends on` (`Auth`, `DB`) mapped to package ids; any case |
|
|
150
|
+
|
|
151
|
+
### Requirement tables
|
|
152
|
+
|
|
153
|
+
The scheduler reads tables whose header starts with `| FR |`:
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
### RC-01 Session setup (Carry)
|
|
157
|
+
|
|
158
|
+
| FR | Requirement | Actor | Layers | Size | Depends on | Source | Notes |
|
|
159
|
+
|---|---|---|---|---|---|---|---|
|
|
160
|
+
| RC-01.1 | The API shall return ... | System | api, db | M | Auth, RC-02.1 | A §1.1 | Decision: who may record |
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
Size is `S` (under half a day), `M` (about a day) or `L` (two to three days)
|
|
164
|
+
for an engineer working with agents. `Decision:` in Notes marks a client
|
|
165
|
+
question; `see D-07` points at an engineering fork. Write a literal pipe as
|
|
166
|
+
`\|`.
|
|
167
|
+
|
|
168
|
+
## Running it unattended
|
|
169
|
+
|
|
170
|
+
As a subagent or with nobody to answer, put the intake answers in
|
|
171
|
+
`intake.md` first; it refuses to start without them. Every fork is recorded as
|
|
172
|
+
Pending with a recommendation, work proceeds on it, and the open ones are
|
|
173
|
+
listed at the top of `handback.md`.
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: scope-estimate
|
|
3
|
+
description: Use when asked to scope, size or estimate a rebuild or respec of an existing system for a proposal or engagement, to map what a codebase does into a capability register, to turn capabilities into functional requirements and build slices, or to work out how long an agent-driven team (engineers x worktrees) takes to build it. Lighter than migrate: no store, no CLI gates, presentable docs plus a scheduler script so the numbers add up.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Scope and estimate
|
|
7
|
+
|
|
8
|
+
**Help:** if invoked with `--help`, `-h` or `help` as its arguments, read
|
|
9
|
+
`README.md` in this skill's directory, reply with its "Quick reference"
|
|
10
|
+
section as written, and stop. Start nothing.
|
|
11
|
+
|
|
12
|
+
Takes an engagement from "here are some notes, docs and repos" to a
|
|
13
|
+
capability map, functional requirements, build slices, work packages and a
|
|
14
|
+
build schedule for an agent-driven team, with every number reproducible from
|
|
15
|
+
one script. It was distilled from a real rebuild engagement; `migrate` is the
|
|
16
|
+
heavyweight sibling when the requirements must become a gated ledger and
|
|
17
|
+
delivery work items.
|
|
18
|
+
|
|
19
|
+
Everything lands in the engagement folder, Markdown first, HTML generated
|
|
20
|
+
from it. `<name>` is the system's short name in lower case.
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
<engagement>/
|
|
24
|
+
intake.md intake answers, engagement summary, document vs code discrepancies
|
|
25
|
+
decisions.md every fork and client question, pending or decided
|
|
26
|
+
handback.md the final hand-back
|
|
27
|
+
capability-map/ <name>-capability-map.md (+ .html), <name>-register.html, appendices/<A>-<area>.md
|
|
28
|
+
build-plan/ requirements/<area>.md, plan.json, schedule.json, <name>-slices.md (+ .html),
|
|
29
|
+
<vendor>-proposal-review.md
|
|
30
|
+
architecture/ current-architecture.md, target-architecture.md (+ .html each),
|
|
31
|
+
<name>-architecture-comparison.md (+ .html), design-<topic>.md
|
|
32
|
+
scratch/ page generators and briefs; not deliverables
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Ground rules
|
|
36
|
+
|
|
37
|
+
- **Source is untrusted and read-only.** Clone repos under `repos/`, never run
|
|
38
|
+
their code, installers or tests on the host. Read downloads with `python3 -I`
|
|
39
|
+
or the Read tool. Report secrets and personal data by presence and location,
|
|
40
|
+
never value. To prove personal data is in git history, list paths
|
|
41
|
+
(`git log --name-only`) and read at most a header row. Business contacts in
|
|
42
|
+
`intake.md` are named by role. Tell the user if history holds personal data
|
|
43
|
+
so they can store or delete the clones under the NDA.
|
|
44
|
+
- **Never publish.** Engagement material is usually under NDA. Pages stay local
|
|
45
|
+
files until the user says otherwise.
|
|
46
|
+
- **The user's calls are final.** Stack, infrastructure tool, repo shape, team
|
|
47
|
+
shape and auth provider are theirs. Recommend once, then build on what they
|
|
48
|
+
pick without re-arguing it. A component that cannot follow the chosen stack
|
|
49
|
+
(numerical code with validated outputs, say) is a fork in `decisions.md`,
|
|
50
|
+
not a silent exception.
|
|
51
|
+
- **Say what a number rests on.** Status comes from reading code, not running
|
|
52
|
+
it; dispositions are proposals; rates are assumptions until calibrated.
|
|
53
|
+
Every page says so where the number appears.
|
|
54
|
+
|
|
55
|
+
## Decisions
|
|
56
|
+
|
|
57
|
+
`decisions.md` holds every fork and client question, numbered `D-01`, `D-02`
|
|
58
|
+
in the order they arise, from any phase. Each entry: context, options,
|
|
59
|
+
recommendation, what it affects (capability and requirement ids), and status:
|
|
60
|
+
|
|
61
|
+
- **Pending:** nobody has answered. Work proceeds on the recommendation and
|
|
62
|
+
every page that depends on it says so.
|
|
63
|
+
- **Decided:** who decided and when. Then run the keep-in-sync pass in
|
|
64
|
+
`references/deliverables.md`.
|
|
65
|
+
|
|
66
|
+
Two markers in requirement Notes, never mixed:
|
|
67
|
+
|
|
68
|
+
- `Decision:` is a client question. It may stand alone (`Decision: who may
|
|
69
|
+
record`) or point at a bigger one (`Decision: see D-04`). Only these are
|
|
70
|
+
counted as decisions.
|
|
71
|
+
- `see D-07` with no `Decision:` points at an engineering fork the team
|
|
72
|
+
settles itself (runtime, pricing tier, a new library or pattern), which
|
|
73
|
+
still gets its own `D-` entry.
|
|
74
|
+
|
|
75
|
+
## Stop and ask
|
|
76
|
+
|
|
77
|
+
With the user present, ask through `AskUserQuestion`, recommendation first:
|
|
78
|
+
|
|
79
|
+
1. **Intake.** Before any synthesis: target stack, repo shape (monorepo?),
|
|
80
|
+
infrastructure tool, what is in scope (default: build only; verification,
|
|
81
|
+
pen test, UAT and feedback rounds estimated later), and team shape. Team
|
|
82
|
+
default is **2 engineers x 3 worktrees, 5 build days a week**; confirm it,
|
|
83
|
+
never assume 4 days. Write the answers into `intake.md`.
|
|
84
|
+
2. **Forks,** whenever they come up: one at a time, recorded in
|
|
85
|
+
`decisions.md` once answered.
|
|
86
|
+
3. **Before publishing anything,** and before editing a document someone else
|
|
87
|
+
wrote.
|
|
88
|
+
|
|
89
|
+
Without the user (a subagent, an unattended run): take intake answers from
|
|
90
|
+
`intake.md` if it exists, and refuse to start without them. Record every fork
|
|
91
|
+
as Pending with a recommendation and carry on. List all Pending decisions at
|
|
92
|
+
the top of `handback.md`.
|
|
93
|
+
|
|
94
|
+
## Phases
|
|
95
|
+
|
|
96
|
+
Work in order. Read each phase's reference before dispatching agents for it.
|
|
97
|
+
Each phase may correct earlier phases' files when it finds a contradiction:
|
|
98
|
+
make the change, say which file and why in the phase's findings, and re-run
|
|
99
|
+
the scheduler if requirements changed.
|
|
100
|
+
|
|
101
|
+
### 1. Intake and discovery
|
|
102
|
+
|
|
103
|
+
Read the notes and documents, clone the repos read-only, and write
|
|
104
|
+
`intake.md`: who, what system, what they need, constraints, contacts by role,
|
|
105
|
+
intake answers, and discrepancies between documents and code (the code wins,
|
|
106
|
+
cite it).
|
|
107
|
+
|
|
108
|
+
Fan out one agent per area of the system, using the brief in
|
|
109
|
+
`references/capability-map.md`. Each writes an inventory appendix with
|
|
110
|
+
`file:line` citations. Check every high-risk finding yourself against the code
|
|
111
|
+
and mark it *checked* in the map.
|
|
112
|
+
|
|
113
|
+
### 2. Capability map
|
|
114
|
+
|
|
115
|
+
Synthesise the appendices into the register: one row per capability with a
|
|
116
|
+
**Status**, a proposed **Disposition** and its **Layers**. Count it with a
|
|
117
|
+
script, never by hand. Reference: `references/capability-map.md`.
|
|
118
|
+
|
|
119
|
+
### 3. Functional requirements
|
|
120
|
+
|
|
121
|
+
Before fanning out, fix the vocabulary every area agent shares: the layer
|
|
122
|
+
set, the `Depends on` aliases and the foundation capability ids, written as
|
|
123
|
+
the first draft of `build-plan/plan.json`. Then one agent per area writes
|
|
124
|
+
requirement tables in `build-plan/requirements/<area>.md`. Afterwards, check
|
|
125
|
+
them with the scheduler, merge overlaps to one owner, and copy new findings
|
|
126
|
+
into the capability map. Reference: `references/requirements.md`.
|
|
127
|
+
|
|
128
|
+
### 4. Slices, packages and schedule
|
|
129
|
+
|
|
130
|
+
Complete `build-plan/plan.json` (slices, foundation packages, any split or
|
|
131
|
+
ordered product packages) and run:
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
bun .claude/skills/scope-estimate/scripts/schedule.ts build-plan/requirements build-plan/plan.json --json build-plan/schedule.json
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
(Use `~/.claude/skills/...` if the skill was installed globally.) It refuses a
|
|
138
|
+
plan that does not account for every requirement exactly once, reuses a
|
|
139
|
+
package id, names an unknown package or undeclared layer, lets scheduled work
|
|
140
|
+
wait on gated work, or has a dependency cycle (naming the requirement behind
|
|
141
|
+
each edge). It prints totals, gated totals, per-slice counts and planning
|
|
142
|
+
days, the engineers x worktrees matrix at planning rates, the headline
|
|
143
|
+
fast/planning/floor range, the critical chain, assumed sizes and unresolved
|
|
144
|
+
dependencies. Fix the plan, not the output. **Every number in the docs comes
|
|
145
|
+
from this output.** Re-run it after any requirement, rate or team change and
|
|
146
|
+
update every page that quotes a figure. Reference: `references/schedule.md`.
|
|
147
|
+
|
|
148
|
+
### 5. Architecture and proposal checks
|
|
149
|
+
|
|
150
|
+
Current and target architecture in Mermaid, a side by side comparison, design
|
|
151
|
+
notes for the weightiest forks, and a review of any vendor or internal
|
|
152
|
+
proposal against how the team builds and against the latest schedule.
|
|
153
|
+
Reference: `references/deliverables.md`.
|
|
154
|
+
|
|
155
|
+
## Handing back
|
|
156
|
+
|
|
157
|
+
Write `handback.md` and summarise it in the reply:
|
|
158
|
+
|
|
159
|
+
1. Pending decisions, each with its recommendation and what it would change.
|
|
160
|
+
2. The outputs, one line each with its path.
|
|
161
|
+
3. The headline figures and what each rests on: static review only,
|
|
162
|
+
dispositions unagreed, rates uncalibrated, packages sized by assumption,
|
|
163
|
+
dependencies that resolved to nothing.
|
|
164
|
+
4. What the estimate leaves out: gated work (with its total), scope with no
|
|
165
|
+
requirement yet, and effort outside build (decisions, reviews, meetings,
|
|
166
|
+
leave).
|
|
167
|
+
5. One line offering the next useful artefact (a decision log for the
|
|
168
|
+
client, publishing privately), without doing it.
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# Discovery and the capability map
|
|
2
|
+
|
|
3
|
+
## Choosing areas
|
|
4
|
+
|
|
5
|
+
One area per agent, each small enough to read in one sitting: usually one per
|
|
6
|
+
app or service, one for the backend and admin, one for each background
|
|
7
|
+
pipeline, and one for research or tooling repos that sit outside the service
|
|
8
|
+
but feed it (reference data builders, desktop tools). Tell each agent the
|
|
9
|
+
other areas exist and to stay in its lane; where two areas share an
|
|
10
|
+
interface (the worker API, say), both describe their side and the register
|
|
11
|
+
merges them.
|
|
12
|
+
|
|
13
|
+
## Discovery brief
|
|
14
|
+
|
|
15
|
+
Write one shared brief to `scratch/discovery-brief.md` and give it to every
|
|
16
|
+
agent with its area. It carries:
|
|
17
|
+
|
|
18
|
+
- The system in a paragraph, the target stack and repo shape from `intake.md`,
|
|
19
|
+
and that the work is a rebuild, so notes should say what a rebuild must
|
|
20
|
+
keep, fix or reshape.
|
|
21
|
+
- The repo paths for the area, read-only: nothing may be run, built or
|
|
22
|
+
installed.
|
|
23
|
+
- Output: `capability-map/appendices/<letter>-<area>.md`.
|
|
24
|
+
- Every behaviour with a `file:line` citation, exact values (limits, timings,
|
|
25
|
+
formats, copy shown to users) and quirks.
|
|
26
|
+
- Anything deduced rather than read marked *inferred*.
|
|
27
|
+
- Secrets and personal data reported by presence and location, never value;
|
|
28
|
+
developer names and home paths copied from headers left out.
|
|
29
|
+
- Where code and documentation disagree.
|
|
30
|
+
- A closing list of candidate capabilities, and numbered defects and
|
|
31
|
+
questions.
|
|
32
|
+
|
|
33
|
+
Good appendix sections: entry points and routes, data model, permission
|
|
34
|
+
matrix, user-visible flows step by step, integration contracts (payloads,
|
|
35
|
+
polling, queues), configuration and environment, operations, defects.
|
|
36
|
+
|
|
37
|
+
## Checking findings
|
|
38
|
+
|
|
39
|
+
A finding is **high-risk** when it touches personal or clinical data, credentials,
|
|
40
|
+
production data integrity, or the validity of a computed result. Read every
|
|
41
|
+
appendix, then check each high-risk claim against the code yourself and mark
|
|
42
|
+
it *checked* in the risk list. On a past engagement one "absent" claim turned
|
|
43
|
+
out to be "removed in a recent commit", which changes the row.
|
|
44
|
+
|
|
45
|
+
## Register
|
|
46
|
+
|
|
47
|
+
One table per domain. Columns:
|
|
48
|
+
|
|
49
|
+
| ID | Capability | Status | Disposition | Layers | Notes and source |
|
|
50
|
+
|---|---|---|---|---|---|
|
|
51
|
+
|
|
52
|
+
IDs are a two-letter domain prefix plus a number (`IA-01` identity and access,
|
|
53
|
+
`RC-07` recorder capture). Research tools outside the service boundary get
|
|
54
|
+
their own domain so they can be left out of the counts. **Layers** uses the
|
|
55
|
+
same set the requirements will (decide it here: for example `web, api, db,
|
|
56
|
+
worker, infra`); it feeds the by-layer table and phase 3.
|
|
57
|
+
|
|
58
|
+
**Status** (what is there today):
|
|
59
|
+
|
|
60
|
+
- **Live:** present, reachable from a page, route or the production worker's
|
|
61
|
+
code path, and no defect found on reading the code. Static review only. A
|
|
62
|
+
reachable debug tool is Live (and usually Drop).
|
|
63
|
+
- **Partial:** works with material gaps, including content the client must
|
|
64
|
+
supply that is missing (images, reference data).
|
|
65
|
+
- **Broken:** reachable but fails.
|
|
66
|
+
- **Dead:** code exists but is unreachable.
|
|
67
|
+
- **Absent:** needed but not built.
|
|
68
|
+
- **Research:** not part of the service.
|
|
69
|
+
|
|
70
|
+
**Disposition** (proposed for the rebuild):
|
|
71
|
+
|
|
72
|
+
- **Carry:** rebuild with the same behaviour. When the layer is rewritten in a
|
|
73
|
+
new stack, Carry means keep the behaviour, not the code; say so.
|
|
74
|
+
- **Fix:** rebuild with a named defect corrected.
|
|
75
|
+
- **Redesign:** needed, but what a user or another system sees changes (new
|
|
76
|
+
flow, new contract, new ownership). Rewriting the code alone is not a
|
|
77
|
+
redesign.
|
|
78
|
+
- **New:** required but not present today.
|
|
79
|
+
- **Drop:** not rebuilt.
|
|
80
|
+
- **Undecided:** waits on a client decision (`D-` entry in `decisions.md`).
|
|
81
|
+
- **Optional:** a nice-to-have the client may add.
|
|
82
|
+
- **Out of scope:** research rows and anything the intake excluded.
|
|
83
|
+
|
|
84
|
+
Undecided and Optional rows get requirements in phase 3 and become gated
|
|
85
|
+
slices in phase 4. A row that is part certain, part undecided is split into
|
|
86
|
+
two rows. Put this key on the register page itself; readers ask what the
|
|
87
|
+
dispositions mean.
|
|
88
|
+
|
|
89
|
+
## Document outline
|
|
90
|
+
|
|
91
|
+
1. Purpose, sources (with commit hashes), method (static, read-only), links to
|
|
92
|
+
the appendices and `intake.md`.
|
|
93
|
+
2. **Summary in numbers:** status counts and shares, disposition counts and
|
|
94
|
+
shares, the rows waiting on a decision by name, and a by-layer table for
|
|
95
|
+
the target stack (what is rewritten vs what keeps its code, and how many
|
|
96
|
+
capabilities each layer must build). Produce every figure with a counting
|
|
97
|
+
script in `scratch/`, re-run after any register change.
|
|
98
|
+
3. **Reading these numbers:** they count capabilities, not effort;
|
|
99
|
+
dispositions are proposals; status is from reading, not testing.
|
|
100
|
+
4. **How status was established** and **how to verify it**, in order of value
|
|
101
|
+
(run existing tests in an isolated container and map them to IDs; a
|
|
102
|
+
walkthrough with the domain lead; compare outputs against a reference
|
|
103
|
+
implementation). Give the phrasing to use when presenting: "N of M
|
|
104
|
+
present with no defect found on code review", never "N work".
|
|
105
|
+
5. The service on one page: flow diagram, actors and how each role is granted,
|
|
106
|
+
scale today and target.
|
|
107
|
+
6. The register, by domain.
|
|
108
|
+
7. Domain content and reference data (word lists, scoring schema, catalogues).
|
|
109
|
+
8. Non-functional requirements (targets are proposals until agreed), and the
|
|
110
|
+
target repository shape.
|
|
111
|
+
9. Capabilities the target needs that do not exist today.
|
|
112
|
+
10. Highest-risk findings, numbered, plus an empty "Findings from later
|
|
113
|
+
phases" subsection for phases 3 to 5 to fill.
|
|
114
|
+
11. Open questions, numbered, each naming who has to answer.
|
|
115
|
+
|
|
116
|
+
## HTML pages
|
|
117
|
+
|
|
118
|
+
Generate pages from the Markdown with a small script in `scratch/` rather than
|
|
119
|
+
writing HTML by hand, so regenerating after an edit is one command. A
|
|
120
|
+
register-only page is often the one people share. Legends and keys must wrap,
|
|
121
|
+
not truncate. Embed any data the page needs; a page opened from disk cannot
|
|
122
|
+
fetch sibling files.
|