@michaelmusyoka/eng-os-kit 1.0.0 → 1.1.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 +18 -11
- package/bin/eng-os.mjs +15 -15
- package/package.json +29 -7
- package/rules/engineering-contract.md +5 -2
- package/scripts/placeholder-audit.sh +4 -2
- package/skills/change-handoff/SKILL.md +33 -0
- package/skills/code-review/SKILL.md +3 -0
- package/skills/implementation-prompt/SKILL.md +5 -0
- package/skills/project-scope/SKILL.md +44 -0
- package/skills/repo-inspection/SKILL.md +16 -9
- package/skills/systematic-debugging/SKILL.md +31 -0
- package/skills/test-strategy/SKILL.md +3 -0
- package/state/project-context.md +25 -0
- package/state/roadmap.md +12 -0
package/README.md
CHANGED
|
@@ -9,20 +9,20 @@ Built for **Kilo Code**, and installs just as well into Claude Code, Roo Code, C
|
|
|
9
9
|
Per project (recommended):
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
|
-
npx eng-os-kit init
|
|
12
|
+
npx @michaelmusyoka/eng-os-kit init
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
Every project on this machine:
|
|
16
16
|
|
|
17
17
|
```bash
|
|
18
|
-
npx eng-os-kit init --global
|
|
18
|
+
npx @michaelmusyoka/eng-os-kit init --global
|
|
19
19
|
```
|
|
20
20
|
|
|
21
21
|
Other agents:
|
|
22
22
|
|
|
23
23
|
```bash
|
|
24
|
-
npx eng-os-kit init --agent claude
|
|
25
|
-
npx eng-os-kit init --agent all
|
|
24
|
+
npx @michaelmusyoka/eng-os-kit init --agent claude
|
|
25
|
+
npx @michaelmusyoka/eng-os-kit init --agent all
|
|
26
26
|
```
|
|
27
27
|
|
|
28
28
|
Then **reload your editor** — Kilo Code only reliably picks up new `SKILL.md` files on reload.
|
|
@@ -37,6 +37,8 @@ Then **reload your editor** — Kilo Code only reliably picks up new `SKILL.md`
|
|
|
37
37
|
└── skills-code/ # code + UI skills, Code mode only
|
|
38
38
|
.agent/
|
|
39
39
|
├── state/feature-registry.json # machine-validated project state
|
|
40
|
+
├── state/project-context.md # living: stack, commands, conventions (kept current, not dated)
|
|
41
|
+
├── state/roadmap.md # living: what's next, in order
|
|
40
42
|
├── state/known-issues.md
|
|
41
43
|
├── state/decision-log.md
|
|
42
44
|
├── templates/ # prompt, verification, ADR, incident, feature
|
|
@@ -48,28 +50,33 @@ Then **reload your editor** — Kilo Code only reliably picks up new `SKILL.md`
|
|
|
48
50
|
|
|
49
51
|
| Command | Does |
|
|
50
52
|
|---|---|
|
|
51
|
-
| `npx eng-os-kit init` | install rules, skills and `.agent/` scaffolding |
|
|
52
|
-
| `npx eng-os-kit add security-review test-strategy` | install a subset |
|
|
53
|
-
| `npx eng-os-kit list` | every skill and its trigger description |
|
|
54
|
-
| `npx eng-os-kit check` | run the enforcement scripts (CI-safe, exits non-zero) |
|
|
55
|
-
| `npx eng-os-kit doctor` | what is installed where |
|
|
53
|
+
| `npx @michaelmusyoka/eng-os-kit init` | install rules, skills and `.agent/` scaffolding |
|
|
54
|
+
| `npx @michaelmusyoka/eng-os-kit add security-review test-strategy` | install a subset |
|
|
55
|
+
| `npx @michaelmusyoka/eng-os-kit list` | every skill and its trigger description |
|
|
56
|
+
| `npx @michaelmusyoka/eng-os-kit check` | run the enforcement scripts (CI-safe, exits non-zero) |
|
|
57
|
+
| `npx @michaelmusyoka/eng-os-kit doctor` | what is installed where |
|
|
56
58
|
|
|
57
59
|
Flags: `--agent kilocode|claude|roo|cursor|codex|all`, `--global`, `--skills a,b`, `--link` (symlink so `npm update` propagates), `--force`, `--cwd <path>`.
|
|
58
60
|
|
|
59
61
|
## Skills
|
|
60
62
|
|
|
63
|
+
The work loop, start to finish: `project-scope → repo-inspection → implementation-prompt → (build) → test-strategy → code-review → change-handoff → release-gate`. Run `systematic-debugging` and `incident-response` whenever something breaks, wherever you are in that loop.
|
|
64
|
+
|
|
61
65
|
| Skill | Mode | Triggers on |
|
|
62
66
|
|---|---|---|
|
|
63
67
|
| `engineering-contract` | all | starting non-trivial work, "what's the process" |
|
|
68
|
+
| `project-scope` | architect | new product, planning the next slice, "what's the plan" |
|
|
64
69
|
| `repo-inspection` | architect | unfamiliar codebase, before any edit |
|
|
65
|
-
| `implementation-prompt` | architect | auth/money/migrations/integrations, >3 files |
|
|
70
|
+
| `implementation-prompt` | architect | auth/money/migrations/integrations, >3 files, an undecided design |
|
|
66
71
|
| `api-database-contract` | all | any endpoint, schema, migration, idempotency |
|
|
67
72
|
| `security-review` | all | auth, permissions, uploads, payments, webhooks |
|
|
68
73
|
| `test-strategy` | all | writing tests, "is this tested", bug found |
|
|
74
|
+
| `systematic-debugging` | all | something throws, fails, or behaves wrong |
|
|
69
75
|
| `traceability-audit` | all | "is this done", before release |
|
|
70
76
|
| `verification-evidence` | all | before claiming anything passed |
|
|
71
|
-
| `release-gate` | all | before any production deploy |
|
|
72
77
|
| `code-review` | code | reviewing a diff, after generating code |
|
|
78
|
+
| `change-handoff` | all | change is done, before PR/merge/release |
|
|
79
|
+
| `release-gate` | all | before any production deploy |
|
|
73
80
|
| `incident-response` | all | production broken, writing a postmortem |
|
|
74
81
|
| `signature-dark-ui` | code | any UI work |
|
|
75
82
|
|
package/bin/eng-os.mjs
CHANGED
|
@@ -100,7 +100,7 @@ function cmdInit() {
|
|
|
100
100
|
const root = base();
|
|
101
101
|
const opts = { force: flag("force"), link: flag("link") };
|
|
102
102
|
|
|
103
|
-
say(`${c.b}
|
|
103
|
+
say(`${c.b}${pkg.name} ${pkg.version}${c.x} → ${root}\n`);
|
|
104
104
|
|
|
105
105
|
for (const name of agents) {
|
|
106
106
|
const target = resolveTarget(name);
|
|
@@ -135,18 +135,18 @@ function cmdInit() {
|
|
|
135
135
|
}
|
|
136
136
|
ok(".agent/ state, templates and scripts ready");
|
|
137
137
|
say(`\n${c.d}Next:${c.x} reload your editor, then ask the agent: "read the engineering contract and run discovery".`);
|
|
138
|
-
say(`${c.d}Enforce:${c.x} npx
|
|
138
|
+
say(`${c.d}Enforce:${c.x} npx ${pkg.name} check`);
|
|
139
139
|
}
|
|
140
140
|
|
|
141
141
|
function cmdList() {
|
|
142
|
-
say(`${c.b}Skills in
|
|
142
|
+
say(`${c.b}Skills in ${pkg.name} ${pkg.version}${c.x}\n`);
|
|
143
143
|
for (const s of allSkills()) {
|
|
144
144
|
const fm = frontmatter(s);
|
|
145
145
|
say(`${c.b}${s}${c.x}${fm.mode ? c.d + " [mode: " + fm.mode + "]" + c.x : ""}`);
|
|
146
146
|
say(` ${c.d}${fm.description || ""}${c.x}\n`);
|
|
147
147
|
}
|
|
148
|
-
say(`${c.d}Install all: npx
|
|
149
|
-
say(`${c.d}Install some: npx
|
|
148
|
+
say(`${c.d}Install all: npx ${pkg.name} init${c.x}`);
|
|
149
|
+
say(`${c.d}Install some: npx ${pkg.name} add security-review test-strategy${c.x}`);
|
|
150
150
|
}
|
|
151
151
|
|
|
152
152
|
function cmdAdd() {
|
|
@@ -194,14 +194,14 @@ function cmdDoctor() {
|
|
|
194
194
|
}
|
|
195
195
|
|
|
196
196
|
function cmdHelp() {
|
|
197
|
-
say(`${c.b}
|
|
197
|
+
say(`${c.b}${pkg.name}${c.x} ${pkg.version} — engineering operating system for AI coding agents
|
|
198
198
|
|
|
199
199
|
${c.b}Usage${c.x}
|
|
200
|
-
npx
|
|
201
|
-
npx
|
|
202
|
-
npx
|
|
203
|
-
npx
|
|
204
|
-
npx
|
|
200
|
+
npx ${pkg.name} init [options] install rules + all skills + .agent scaffolding
|
|
201
|
+
npx ${pkg.name} add <skill...> install specific skills only
|
|
202
|
+
npx ${pkg.name} list list bundled skills and their triggers
|
|
203
|
+
npx ${pkg.name} check run the enforcement scripts (CI-safe)
|
|
204
|
+
npx ${pkg.name} doctor show what is installed where
|
|
205
205
|
|
|
206
206
|
${c.b}Options${c.x}
|
|
207
207
|
--agent <name> kilocode (default) | claude | roo | cursor | codex | all
|
|
@@ -212,10 +212,10 @@ ${c.b}Options${c.x}
|
|
|
212
212
|
--cwd <path> target project directory
|
|
213
213
|
|
|
214
214
|
${c.b}Examples${c.x}
|
|
215
|
-
npx
|
|
216
|
-
npx
|
|
217
|
-
npx
|
|
218
|
-
npx
|
|
215
|
+
npx ${pkg.name} init # Kilo Code, this project
|
|
216
|
+
npx ${pkg.name} init --agent kilocode --global # every project on this machine
|
|
217
|
+
npx ${pkg.name} init --link # stay in sync with npm updates
|
|
218
|
+
npx ${pkg.name} add security-review --agent roo
|
|
219
219
|
`);
|
|
220
220
|
}
|
|
221
221
|
|
package/package.json
CHANGED
|
@@ -1,14 +1,36 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@michaelmusyoka/eng-os-kit",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "Production engineering operating system for AI coding agents: rules, Agent Skills, templates and enforcement scripts. Installs into Kilo Code, Claude Code, Roo, Cursor or any Agent Skills compatible agent.",
|
|
5
|
-
"keywords": [
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "Production engineering operating system for AI coding agents: rules, Agent Skills, templates and enforcement scripts. 14 skills covering the full loop from scope to shipped. Installs into Kilo Code, Claude Code, Roo, Cursor or any Agent Skills compatible agent.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"kilocode",
|
|
7
|
+
"kilo-code",
|
|
8
|
+
"agent-skills",
|
|
9
|
+
"skill",
|
|
10
|
+
"claude-code",
|
|
11
|
+
"roo-code",
|
|
12
|
+
"ai-agent",
|
|
13
|
+
"engineering-standards"
|
|
14
|
+
],
|
|
6
15
|
"license": "MIT",
|
|
7
16
|
"type": "module",
|
|
8
|
-
"engines": {
|
|
9
|
-
|
|
10
|
-
|
|
17
|
+
"engines": {
|
|
18
|
+
"node": ">=18"
|
|
19
|
+
},
|
|
20
|
+
"bin": {
|
|
21
|
+
"eng-os": "bin/eng-os.mjs"
|
|
22
|
+
},
|
|
23
|
+
"files": [
|
|
24
|
+
"bin",
|
|
25
|
+
"lib",
|
|
26
|
+
"rules",
|
|
27
|
+
"skills",
|
|
28
|
+
"templates",
|
|
29
|
+
"scripts",
|
|
30
|
+
"state",
|
|
31
|
+
"README.md"
|
|
32
|
+
],
|
|
11
33
|
"scripts": {
|
|
12
34
|
"selftest": "node bin/eng-os.mjs list && node bin/eng-os.mjs --help"
|
|
13
35
|
}
|
|
14
|
-
}
|
|
36
|
+
}
|
|
@@ -25,7 +25,10 @@ Surface material conflicts. Do not resolve them silently.
|
|
|
25
25
|
|
|
26
26
|
`IMPLEMENTED` means code exists. It never means done. Only `VERIFIED` (evidence recorded) and `PRODUCTION_READY` (release gate passed) do.
|
|
27
27
|
|
|
28
|
-
Track every feature in `.agent/state/feature-registry.json`. Conversation memory is not project state.
|
|
28
|
+
Track every feature in `.agent/state/feature-registry.json`. Read and keep current `.agent/state/project-context.md` (stack, commands, conventions — see `repo-inspection`) and `.agent/state/roadmap.md` (what's next — see `project-scope`). Conversation memory is not project state; these files are.
|
|
29
|
+
|
|
30
|
+
## Fresh sessions at handoffs
|
|
31
|
+
Because state lives in files, not conversation, prefer starting a new session at major boundaries — after a merge, before the next feature — rather than continuing one long thread. The files carry the context forward; a shorter session costs less and drifts less. This also makes `code-review`'s second-opinion pass more honest.
|
|
29
32
|
|
|
30
33
|
## Blocked
|
|
31
34
|
When a dependency, credential or decision is missing, stop and report: blocker, impact, what resolution is needed, what you could still verify. Never invent a dependency response.
|
|
@@ -48,4 +51,4 @@ UI → route/API → authentication → authorization → validation → service
|
|
|
48
51
|
Keep it short. Detail belongs in `.agent/prompts/`, `.agent/verification/` and `.agent/audits/`.
|
|
49
52
|
|
|
50
53
|
## Skills available
|
|
51
|
-
`repo-inspection`, `implementation-prompt`, `api-database-contract`, `security-review`, `test-strategy`, `traceability-audit`, `verification-evidence`, `
|
|
54
|
+
`project-scope`, `repo-inspection`, `implementation-prompt`, `api-database-contract`, `security-review`, `test-strategy`, `systematic-debugging`, `traceability-audit`, `verification-evidence`, `code-review`, `change-handoff`, `release-gate`, `incident-response`, `signature-dark-ui`. Load the one that fits; do not work from memory of these standards.
|
|
@@ -13,9 +13,11 @@ SECRET_PATTERN='(AKIA[0-9A-Z]{16})|(sk_live_[0-9a-zA-Z]{10,})|(-----BEGIN (RSA |
|
|
|
13
13
|
EXCLUDES=(--exclude-dir=node_modules --exclude-dir=.git --exclude-dir=dist --exclude-dir=build
|
|
14
14
|
--exclude-dir=.next --exclude-dir=coverage --exclude-dir=vendor --exclude-dir=.venv
|
|
15
15
|
--exclude-dir=__tests__ --exclude-dir=tests --exclude-dir=test --exclude-dir=e2e
|
|
16
|
-
--exclude-dir=.agent --exclude-dir=.kilocode --exclude-dir=.claude
|
|
16
|
+
--exclude-dir=.agent --exclude-dir=.kilocode --exclude-dir=.claude --exclude-dir=.roo
|
|
17
|
+
--exclude-dir=.cursor --exclude-dir=.agents --exclude-dir=.github
|
|
17
18
|
--exclude=*.test.* --exclude=*.spec.* --exclude=*.md --exclude=*.lock --exclude=*.map
|
|
18
|
-
--exclude=placeholder-audit.sh --exclude=validate-registry.mjs --exclude=capture-evidence.sh
|
|
19
|
+
--exclude=placeholder-audit.sh --exclude=validate-registry.mjs --exclude=capture-evidence.sh
|
|
20
|
+
--exclude=eng-os.mjs)
|
|
19
21
|
|
|
20
22
|
fail=0
|
|
21
23
|
scan() {
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: change-handoff
|
|
3
|
+
description: Write the PR description, changelog entry, and release note from the actual diff, then reconcile the feature registry and known issues to what really shipped. Use this when a change is finished and ready for review or merge, before opening a pull request, and before tagging a release. Load this instead of writing the PR body from memory of the original plan.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Change Handoff
|
|
7
|
+
|
|
8
|
+
Implementation drifts from the plan. Write the human-facing summary from `git diff`, not from the implementation prompt you started with — they are often no longer the same thing.
|
|
9
|
+
|
|
10
|
+
## PR description
|
|
11
|
+
- **What changed and why** — in the diff's own terms, not the ticket's
|
|
12
|
+
- **How it was verified** — point at the evidence in `.agent/verification/`, don't restate it
|
|
13
|
+
- **Breaking changes / migration notes** — explicit, even if "none"
|
|
14
|
+
- **Linked feature ID** from the registry
|
|
15
|
+
|
|
16
|
+
## Changelog entry
|
|
17
|
+
Group under `Added` / `Changed` / `Fixed` / `Security` / `Removed` (Keep a Changelog style). One line per entry, user-facing language — "what changed for someone using this," not internal refactor detail unless it affects them.
|
|
18
|
+
|
|
19
|
+
## Release note
|
|
20
|
+
Only for user-facing changes in a tagged release. Skip internal-only changes.
|
|
21
|
+
|
|
22
|
+
## Reconcile state — do this before calling the change done
|
|
23
|
+
Implementation and planning drift during real work. Close the loop:
|
|
24
|
+
- Update the feature's `status` and `evidence` in `.agent/state/feature-registry.json` to match what actually merged — not what was originally scoped
|
|
25
|
+
- If a decision got made mid-implementation that wasn't in the original prompt, add it to `.agent/state/decision-log.md`
|
|
26
|
+
- If this change resolves an entry in `.agent/state/known-issues.md`, remove it; if it introduces a new deferred item, add it
|
|
27
|
+
- If the stack, commands, or conventions changed, update `.agent/state/project-context.md` (see `repo-inspection`) so the next session isn't working from stale facts
|
|
28
|
+
- If this closes or reorders an item in `.agent/state/roadmap.md`, update it (see `project-scope`)
|
|
29
|
+
|
|
30
|
+
A change is not handed off until the files, not just the code, reflect reality. The next session — yours or someone else's — reads these files, not this conversation.
|
|
31
|
+
|
|
32
|
+
## Postmortems
|
|
33
|
+
For a production incident writeup, use `incident-response` instead — this skill is for routine merges, not outages.
|
|
@@ -29,6 +29,9 @@ Logging without sensitive data, metrics for the new failure mode, migration safe
|
|
|
29
29
|
## Reviewing your own output
|
|
30
30
|
Look specifically for: leftover mocks, hardcoded values that should be config, copy-pasted blocks with one unchanged variable, an `await` that was dropped, error handlers that log and continue when they should abort, and confident code paths you never executed.
|
|
31
31
|
|
|
32
|
+
## Second opinion
|
|
33
|
+
A reviewer that already believes its own code is correct misses fewer of its own mistakes at random, not zero. For anything critical, prefer running this review in a fresh session — a new conversation with no memory of writing the code, or a different model — rather than immediately after implementing. Ask the same questions above as if handed someone else's diff with no context.
|
|
34
|
+
|
|
32
35
|
## Output
|
|
33
36
|
```
|
|
34
37
|
## Blocking
|
|
@@ -36,3 +36,8 @@ Good: "A valid payment request creates exactly one payment record and returns it
|
|
|
36
36
|
|
|
37
37
|
## After approval
|
|
38
38
|
Implement strictly to the prompt. If reality forces a deviation, amend the prompt and say so in the report — do not silently expand scope.
|
|
39
|
+
|
|
40
|
+
## The gate
|
|
41
|
+
If building this feature would mean inventing an undecided architectural choice — which provider, what data model, how a page should look, which library — stop and write the decision here before continuing. Do not quietly pick one and move on; that decision becomes invisible the moment the session ends.
|
|
42
|
+
|
|
43
|
+
You may proceed without full approval only when the user explicitly says to. If they do, the decision is not free: write it to `.agent/state/decision-log.md` tagged `ASSUMED — needs ratification`, and add a matching note on the feature's registry entry. Leave the flag in place until someone deliberately revisits and confirms or overturns it — it is a reminder that a decision is owed, not a blocker on shipping. `traceability-audit` should treat an unresolved `ASSUMED` flag on a `critical` feature as a finding.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: project-scope
|
|
3
|
+
description: Turn a product idea into a living, ordered plan of what to build next, and keep it current as work ships. Use this when starting a new product, when planning the next slice of work on an existing one, when asked "what should we build" or "what's the plan" at the whole-project level, or when the feature registry has entries but no sense of order. Distinct from traceability-audit (is a specific thing done) and implementation-prompt (how to build one feature) — this is what's next, across the whole project.
|
|
4
|
+
mode: architect
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Project Scope
|
|
8
|
+
|
|
9
|
+
The feature registry tracks status once a feature exists. This skill decides what gets a registry entry next, and in what order.
|
|
10
|
+
|
|
11
|
+
## Output
|
|
12
|
+
`.agent/state/roadmap.md` — a short, ordered list of slices (not a full backlog dump):
|
|
13
|
+
```
|
|
14
|
+
## Now
|
|
15
|
+
- [ ] F-00X — <slice> — <why this one is next>
|
|
16
|
+
|
|
17
|
+
## Next
|
|
18
|
+
- [ ] <slice> — depends on F-00X
|
|
19
|
+
|
|
20
|
+
## Later
|
|
21
|
+
- <coarse, unordered — don't over-plan work you'll re-scope anyway>
|
|
22
|
+
```
|
|
23
|
+
Coarse and current beats detailed and stale. Re-derive order after every merge that changes what's next (see `change-handoff`).
|
|
24
|
+
|
|
25
|
+
## Starting a new product (greenfield)
|
|
26
|
+
1. Scope the idea into ordered slices, thinnest first.
|
|
27
|
+
2. Decide the stack and architecture (`implementation-prompt`) before scaffolding — the roadmap depends on what's feasible.
|
|
28
|
+
3. Scaffold the project.
|
|
29
|
+
4. Run `repo-inspection` on the *real* scaffolded project to seed `.agent/state/project-context.md` — not on an empty repository.
|
|
30
|
+
5. Enter the feature loop per slice: `implementation-prompt` → build → `test-strategy` → `code-review` → `change-handoff`.
|
|
31
|
+
|
|
32
|
+
## Adding to an existing product (brownfield)
|
|
33
|
+
1. Run `repo-inspection` first — the plan must account for what already exists, not assume a blank slate.
|
|
34
|
+
2. Enroll existing functionality into the registry at whatever status it actually has (don't backfill fake `VERIFIED` status for old code no one has evidence for — mark it honestly, e.g. `IMPLEMENTED` with a note).
|
|
35
|
+
3. Plan the next slice on top of that reality.
|
|
36
|
+
|
|
37
|
+
## Monorepo
|
|
38
|
+
One roadmap per workspace: `.agent/state/roadmap-<workspace>.md`, each with its own ordering, since workspaces ship independently.
|
|
39
|
+
|
|
40
|
+
## Depth is a judgement call, not a fixed track
|
|
41
|
+
Not every slice needs every gate in the work loop. A throwaway prototype might skip straight to `develop` and a self-check; a critical, user-facing slice should run the full loop through `code-review` and `change-handoff`. Decide the depth per slice and say so in the roadmap entry — don't apply the heaviest process to a one-off script, and don't skip verification on anything touching auth, money, or data because the rest of the project moves fast.
|
|
42
|
+
|
|
43
|
+
## Rule
|
|
44
|
+
This file records decisions about order and scope, not a copy of the registry's detail. If it starts duplicating `feature-registry.json`, it has grown past what it's for — prune it back to the next few slices.
|
|
@@ -19,15 +19,22 @@ Never assume structure. Read it.
|
|
|
19
19
|
8. CI workflows and deployment config
|
|
20
20
|
9. Project skills and installed framework docs (for fast-moving frameworks, read the installed docs rather than trusting memory)
|
|
21
21
|
|
|
22
|
-
##
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
22
|
+
## Two outputs, not one
|
|
23
|
+
|
|
24
|
+
**A dated snapshot**, `.agent/audits/discovery-<date>.md` — the full inspection as of today: technology inventory with versions, repository map, existing feature inventory, auth and permission model as actually implemented, test inventory and how to run each layer, deployment path, security observations, and **unknowns** — list them; do not fill them with guesses. This is a point-in-time record; never edit an old one.
|
|
25
|
+
|
|
26
|
+
**A living context file**, `.agent/state/project-context.md` — the current facts every other skill relies on, kept up to date rather than re-derived each session:
|
|
27
|
+
```
|
|
28
|
+
## Stack
|
|
29
|
+
## Commands (build, dev, lint, typecheck, test — the ones that actually work)
|
|
30
|
+
## Test framework (and how test-strategy should invoke it)
|
|
31
|
+
## Conventions (naming, file layout, patterns already in use)
|
|
32
|
+
## Auth model
|
|
33
|
+
## Deployment path
|
|
34
|
+
```
|
|
35
|
+
Create it if it doesn't exist; update it — don't append a new dated copy — whenever the facts change (a dependency upgrade, a new test runner, a changed deploy path). `change-handoff` updates this file too when a merge changes any of the above. Stale facts here are worse than no file: they get trusted.
|
|
36
|
+
|
|
37
|
+
For a monorepo, write one context file per workspace: `.agent/state/context-<workspace>.md`.
|
|
31
38
|
|
|
32
39
|
## Red flags to record immediately
|
|
33
40
|
- a deploy that fires without a passing test gate
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: systematic-debugging
|
|
3
|
+
description: A disciplined root-cause loop for anything that throws, fails, or behaves wrong — as opposed to incident-response, which is for live production outages. Use this the moment something breaks during development, when a test fails unexpectedly, when behaviour doesn't match the spec, or before proposing any fix. Load this instead of guessing and editing until it goes away.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Systematic Debugging
|
|
7
|
+
|
|
8
|
+
Guessing and re-running is not debugging. It burns time and often "fixes" the symptom while the cause ships anyway.
|
|
9
|
+
|
|
10
|
+
## Loop
|
|
11
|
+
1. **Reproduce.** If you cannot reliably reproduce it, that is the first finding, not an excuse to guess. Note the exact input, state, and steps.
|
|
12
|
+
2. **Read before theorizing.** The full error, stack trace, and the actual line it points to — not the line you assume is wrong.
|
|
13
|
+
3. **Bisect.** If this used to work, find the exact commit or change that broke it (`git bisect`, or narrow by feature flag/branch) before reading a single line of application logic. This is faster than reasoning about a large diff.
|
|
14
|
+
4. **Instrument, don't speculate.** Prefer a log line, a breakpoint, or a failing assertion that proves where reality diverges from your model, over editing code on a hunch.
|
|
15
|
+
5. **One hypothesis at a time.** State it, predict what a specific check will show if it's true, run the check. Do not change two things at once — you will not know which one mattered.
|
|
16
|
+
6. **Find the root cause, not the nearest symptom.** A null check that silences a crash is not a fix if the value should never have been null. Trace back to where the invalid state was produced.
|
|
17
|
+
7. **Time-box.** After three failed hypotheses, stop and re-read the actual requirement and the actual data. Most stuck debugging comes from an unexamined assumption made in step 1.
|
|
18
|
+
|
|
19
|
+
## Before you call it fixed
|
|
20
|
+
- Can you explain, in one sentence, why the bug happened? If not, you have a workaround, not a fix.
|
|
21
|
+
- Hand a regression test to `test-strategy` that fails on the old code and passes on the new. Reference the defect in the test name.
|
|
22
|
+
- If the root cause is systemic (a missing validation layer, a whole class of unguarded null values, a pattern repeated elsewhere), record it in `.agent/state/known-issues.md` rather than fixing only the one instance you tripped over.
|
|
23
|
+
|
|
24
|
+
## Traps to name out loud when you notice them
|
|
25
|
+
- "It works now" without knowing why — the bug likely still exists, just relocated.
|
|
26
|
+
- Patching around a flaky test instead of finding the race condition — flag it, don't hide it.
|
|
27
|
+
- Fixing in the UI what is actually a server-side authorization or validation gap (check `security-review`).
|
|
28
|
+
- A fix that only works for the exact input you tested — check the boundary and the empty/null case too.
|
|
29
|
+
|
|
30
|
+
## Escalate rather than fabricate
|
|
31
|
+
If you cannot reproduce it, cannot access the environment where it happens, or the fix requires a decision you're not authorized to make, say so plainly and mark the item `BLOCKED` per `engineering-contract`. Do not report a fix you have not actually verified.
|
|
@@ -34,3 +34,6 @@ Every material defect gets a test that fails before the fix and passes after. Re
|
|
|
34
34
|
|
|
35
35
|
## Release blockers
|
|
36
36
|
Do not release with failing critical tests, failing security tests, a failing type check, a failing production build, failing critical E2E, unverified migrations, or unresolved critical vulnerabilities.
|
|
37
|
+
|
|
38
|
+
## Don't re-derive the framework every session
|
|
39
|
+
The first time you work out how tests actually run here — framework, config, the real command, per-package differences in a monorepo — write it to `.agent/state/project-context.md` (see `repo-inspection`). Future sessions read that instead of searching the repo again.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Project Context
|
|
2
|
+
|
|
3
|
+
Kept current, not a dated snapshot — see `repo-inspection`. Overwrite sections in place when facts change; do not append duplicate copies.
|
|
4
|
+
|
|
5
|
+
## Stack
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
## Commands
|
|
9
|
+
- build:
|
|
10
|
+
- dev:
|
|
11
|
+
- lint:
|
|
12
|
+
- typecheck:
|
|
13
|
+
- test:
|
|
14
|
+
|
|
15
|
+
## Test framework
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
## Conventions
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
## Auth model
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
## Deployment path
|
|
25
|
+
|