entropy-machines 0.1.1
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/LICENSE +93 -0
- package/README.md +68 -0
- package/agents/isolated-worker.md +128 -0
- package/agents/verifier.md +158 -0
- package/bin/dispatch +700 -0
- package/bin/doclint +460 -0
- package/bin/drain +507 -0
- package/bin/drain-pick.py +168 -0
- package/bin/drain-prompt.md +67 -0
- package/bin/drain-run.sh +342 -0
- package/bin/entropy-machines-init +285 -0
- package/bin/handoff +1151 -0
- package/bin/init +232 -0
- package/bin/post-fold-audit +377 -0
- package/bin/serve +724 -0
- package/bin/status +208 -0
- package/bin/tracker +153 -0
- package/docs/AGENT-QUICKSTART.md +86 -0
- package/docs/CONFIG.md +68 -0
- package/docs/NPM.md +91 -0
- package/docs/SERVE.md +74 -0
- package/docs/TRACKER-ADAPTER.md +66 -0
- package/doctrine/HANDOFF-PROMPT.md +63 -0
- package/doctrine/README.md +62 -0
- package/doctrine/ROLES.md +27 -0
- package/doctrine/WORKFLOW.md +87 -0
- package/hooks/commit-msg +24 -0
- package/hooks/post-checkout +354 -0
- package/hooks/pre-commit +33 -0
- package/lib/PRD-001-orientation.html +1180 -0
- package/lib/REPORT-TEMPLATE.html +413 -0
- package/lib/changelog-collate.mjs +328 -0
- package/lib/changelog-guard.sh +157 -0
- package/lib/changelog-new.mjs +70 -0
- package/lib/config.mjs +283 -0
- package/lib/config.py +317 -0
- package/lib/doc-template.html +807 -0
- package/lib/entropy-drain.plist.in +59 -0
- package/lib/entropy-drain.service.in +53 -0
- package/lib/entropy-drain.timer.in +36 -0
- package/lib/fail-first.mjs +901 -0
- package/lib/handoff-guard.sh +623 -0
- package/lib/install-hooks.sh +169 -0
- package/lib/notes.py +675 -0
- package/lib/preflight-tree.mjs +82 -0
- package/lib/roots.sh +212 -0
- package/lib/themes/daylight.css +84 -0
- package/lib/themes/high-contrast.css +36 -0
- package/lib/tracker-file +333 -0
- package/lib/tracker-view.py +784 -0
- package/package.json +38 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
Elastic License 2.0
|
|
2
|
+
|
|
3
|
+
URL: https://www.elastic.co/licensing/elastic-license
|
|
4
|
+
|
|
5
|
+
## Acceptance
|
|
6
|
+
|
|
7
|
+
By using the software, you agree to all of the terms and conditions below.
|
|
8
|
+
|
|
9
|
+
## Copyright License
|
|
10
|
+
|
|
11
|
+
The licensor grants you a non-exclusive, royalty-free, worldwide,
|
|
12
|
+
non-sublicensable, non-transferable license to use, copy, distribute, make
|
|
13
|
+
available, and prepare derivative works of the software, in each case subject to
|
|
14
|
+
the limitations and conditions below.
|
|
15
|
+
|
|
16
|
+
## Limitations
|
|
17
|
+
|
|
18
|
+
You may not provide the software to third parties as a hosted or managed
|
|
19
|
+
service, where the service provides users with access to any substantial set of
|
|
20
|
+
the features or functionality of the software.
|
|
21
|
+
|
|
22
|
+
You may not move, change, disable, or circumvent the license key functionality
|
|
23
|
+
in the software, and you may not remove or obscure any functionality in the
|
|
24
|
+
software that is protected by the license key.
|
|
25
|
+
|
|
26
|
+
You may not alter, remove, or obscure any licensing, copyright, or other notices
|
|
27
|
+
of the licensor in the software. Any use of the licensor’s trademarks is subject
|
|
28
|
+
to applicable law.
|
|
29
|
+
|
|
30
|
+
## Patents
|
|
31
|
+
|
|
32
|
+
The licensor grants you a license, under any patent claims the licensor can
|
|
33
|
+
license, or becomes able to license, to make, have made, use, sell, offer for
|
|
34
|
+
sale, import and have imported the software, in each case subject to the
|
|
35
|
+
limitations and conditions in this license. This license does not cover any
|
|
36
|
+
patent claims that you cause to be infringed by modifications or additions to
|
|
37
|
+
the software. If you or your company make any written claim that the software
|
|
38
|
+
infringes or contributes to infringement of any patent, your patent license for
|
|
39
|
+
the software granted under these terms ends immediately. If your company makes
|
|
40
|
+
such a claim, your patent license ends immediately for work on behalf of your
|
|
41
|
+
company.
|
|
42
|
+
|
|
43
|
+
## Notices
|
|
44
|
+
|
|
45
|
+
You must ensure that anyone who gets a copy of any part of the software from you
|
|
46
|
+
also gets a copy of these terms.
|
|
47
|
+
|
|
48
|
+
If you modify the software, you must include in any modified copies of the
|
|
49
|
+
software prominent notices stating that you have modified the software.
|
|
50
|
+
|
|
51
|
+
## No Other Rights
|
|
52
|
+
|
|
53
|
+
These terms do not imply any licenses other than those expressly granted in
|
|
54
|
+
these terms.
|
|
55
|
+
|
|
56
|
+
## Termination
|
|
57
|
+
|
|
58
|
+
If you use the software in violation of these terms, such use is not licensed,
|
|
59
|
+
and your licenses will automatically terminate. If the licensor provides you
|
|
60
|
+
with a notice of your violation, and you cease all violation of this license no
|
|
61
|
+
later than 30 days after you receive that notice, your licenses will be
|
|
62
|
+
reinstated retroactively. However, if you violate these terms after such
|
|
63
|
+
reinstatement, any additional violation of these terms will cause your licenses
|
|
64
|
+
to terminate automatically and permanently.
|
|
65
|
+
|
|
66
|
+
## No Liability
|
|
67
|
+
|
|
68
|
+
*As far as the law allows, the software comes as is, without any warranty or
|
|
69
|
+
condition, and the licensor will not be liable to you for any damages arising
|
|
70
|
+
out of these terms or the use or nature of the software, under any kind of
|
|
71
|
+
legal claim.*
|
|
72
|
+
|
|
73
|
+
## Definitions
|
|
74
|
+
|
|
75
|
+
The **licensor** is the entity offering these terms, and the **software** is the
|
|
76
|
+
software the licensor makes available under these terms, including any portion
|
|
77
|
+
of it.
|
|
78
|
+
|
|
79
|
+
**you** refers to the individual or entity agreeing to these terms.
|
|
80
|
+
|
|
81
|
+
**your company** is any legal entity, sole proprietorship, or other kind of
|
|
82
|
+
organization that you work for, plus all organizations that have control over,
|
|
83
|
+
are under the control of, or are under common control with that
|
|
84
|
+
organization. **control** means ownership of substantially all the assets of an
|
|
85
|
+
entity, or the power to direct its management and policies by vote, contract, or
|
|
86
|
+
otherwise. Control can be direct or indirect.
|
|
87
|
+
|
|
88
|
+
**your licenses** are all the licenses granted to you for the software under
|
|
89
|
+
these terms.
|
|
90
|
+
|
|
91
|
+
**use** means anything you do with the software requiring one of your licenses.
|
|
92
|
+
|
|
93
|
+
**trademark** means trademarks, service marks, and similar rights.
|
package/README.md
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# entropy-machines
|
|
2
|
+
|
|
3
|
+
Escape the terminal. Enter your proto factory.
|
|
4
|
+
|
|
5
|
+
You create PRDs, design with agents, and once your decisions are complete,
|
|
6
|
+
issues are generated from those PRDs. Worker agents execute each issue in
|
|
7
|
+
isolated worktrees — unable to see or corrupt each other's work. A verifier
|
|
8
|
+
sweeps everything on a clean tree. An orchestrator folds verified work in
|
|
9
|
+
and is the only committer. You review what landed in a sprint report, and
|
|
10
|
+
the cycle repeats.
|
|
11
|
+
|
|
12
|
+
**A PRD creates issues, not the other way round.** The questions in a PRD are
|
|
13
|
+
the decisions only you can make. Everything downstream follows from your answers.
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
YOU ANSWER A PRD
|
|
17
|
+
│
|
|
18
|
+
▼
|
|
19
|
+
ISSUES FILED ──▶ WORKED ──▶ VERIFIED ──▶ FOLDED ──▶ SPRINT REPORT
|
|
20
|
+
▲ │
|
|
21
|
+
└─────────────────────────────────────────────────────┘
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Get started
|
|
25
|
+
|
|
26
|
+
```sh
|
|
27
|
+
npx entropy start
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
This vendors the harness into your git repo (if it hasn't been already) and
|
|
31
|
+
launches a local server that opens your first PRD — a set of questions about
|
|
32
|
+
your project that only you can answer. Your answers are saved to disk, not to
|
|
33
|
+
any external service.
|
|
34
|
+
|
|
35
|
+
Once answered, those responses become tracked issues. Point your coding agent
|
|
36
|
+
at [AGENT-QUICKSTART.md](docs/AGENT-QUICKSTART.md) and it takes it from there.
|
|
37
|
+
|
|
38
|
+
## Four roles
|
|
39
|
+
|
|
40
|
+
| Role | Does | Never |
|
|
41
|
+
|---|---|---|
|
|
42
|
+
| **Owner** (you) | Answer PRDs in the browser, review sprint reports, tick the sprint closed | Delegate the ready tick |
|
|
43
|
+
| **Worker** | One scoped issue in its own worktree: the change, its tests, a handoff note | Commit, push, or edit outside its scope |
|
|
44
|
+
| **Verifier** | One sweep per sprint on a clean tree — breadth over depth | Fix, land, or repeat a number it didn't re-run |
|
|
45
|
+
| **Orchestrator** | Dispatch, fold, land, report — the only committer | Land held work without the owner, relay a worker's verification |
|
|
46
|
+
|
|
47
|
+
[ROLES.md](doctrine/ROLES.md) · [WORKFLOW.md](doctrine/WORKFLOW.md)
|
|
48
|
+
|
|
49
|
+
## Reference
|
|
50
|
+
|
|
51
|
+
[CONFIG.md](docs/CONFIG.md) — every knob ·
|
|
52
|
+
[SERVE.md](docs/SERVE.md) — the server contract ·
|
|
53
|
+
[TRACKER-ADAPTER.md](docs/TRACKER-ADAPTER.md) — bring your own tracker ·
|
|
54
|
+
[NPM.md](docs/NPM.md) — the npm wrapper ·
|
|
55
|
+
[AGENT-QUICKSTART.md](docs/AGENT-QUICKSTART.md) — for your coding agent
|
|
56
|
+
|
|
57
|
+
## Requirements
|
|
58
|
+
|
|
59
|
+
Git, a POSIX shell, Python 3. Your project can be written in anything.
|
|
60
|
+
Parallel workers in isolated worktrees is a
|
|
61
|
+
[Claude Code](https://claude.com/claude-code) capability — another runner
|
|
62
|
+
gets the same gates one issue at a time.
|
|
63
|
+
|
|
64
|
+
## License
|
|
65
|
+
|
|
66
|
+
Copyright (c) 2026 modern-sapien. [Elastic License 2.0](LICENSE) — use, copy,
|
|
67
|
+
modify and distribute, including inside a company; no selling it or offering it
|
|
68
|
+
as a hosted service without permission. Source-available, not OSI-approved.
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: isolated-worker
|
|
3
|
+
description: Default agent for any dispatched task that WRITES files in this repo — implementing a tracker issue, fixing a bug, adding tests. Runs in its own git worktree so concurrent agents cannot see or clobber each other's in-progress edits. Use Explore instead for read-only investigation (no worktree cost).
|
|
4
|
+
isolation: worktree
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
You are implementing one scoped change in this repo.
|
|
8
|
+
|
|
9
|
+
This definition targets Claude Code — `isolation: worktree` in the
|
|
10
|
+
frontmatter above is what gives you your own git worktree when a Claude Code
|
|
11
|
+
session dispatches you by name. A different agent runner does not need this
|
|
12
|
+
file verbatim, but needs the same three things it encodes: per-agent
|
|
13
|
+
working-directory isolation, a brief that reaches you directly (see below for
|
|
14
|
+
why that matters more than where the brief technically lives), and a written
|
|
15
|
+
handback the dispatching session can read after you're gone.
|
|
16
|
+
|
|
17
|
+
You are in **your own git worktree**, branched from the dispatching session's
|
|
18
|
+
local HEAD. Nothing you write is visible to the other agents running right
|
|
19
|
+
now, and their half-finished edits are not visible to you. Work normally.
|
|
20
|
+
|
|
21
|
+
**Confirm that before you write anything.** `isolation: worktree` branches the
|
|
22
|
+
repo the *calling session's cwd* is in, not the one this harness is vendored in
|
|
23
|
+
— orchestrate one project from a shell parked in another and you get a worktree
|
|
24
|
+
of the wrong repo, or no worktree at all and a checkout shared with every agent
|
|
25
|
+
running beside you. Run `git rev-parse --git-common-dir`: it prints the MAIN
|
|
26
|
+
repo's `.git` and must contain the project's own directory name. Not
|
|
27
|
+
`--show-toplevel`, which prints your worktree's own path and so can never say
|
|
28
|
+
which repo you branched from; a bare relative `.git` means you are not in a
|
|
29
|
+
worktree. If either is wrong, STOP and report it — never `cd` to make it pass,
|
|
30
|
+
and never write into a shared checkout, where a `git add -A` beside you can
|
|
31
|
+
sweep your unfinished work into someone else's commit. That has happened.
|
|
32
|
+
|
|
33
|
+
## Working agreement
|
|
34
|
+
|
|
35
|
+
You DO receive `CLAUDE.md` — subagents load every level of the
|
|
36
|
+
project-instructions hierarchy in Claude Code (only its built-in `Explore`
|
|
37
|
+
and `Plan` agents skip it). An earlier version of this doctrine claimed the
|
|
38
|
+
opposite — that background agents don't load it at all — which was false
|
|
39
|
+
(see code.claude.com/docs/en/sub-agents) and shaped how briefs got written
|
|
40
|
+
here for a while. The instruction is restated in this file anyway, because
|
|
41
|
+
measured over 225 subagent runs on an earlier version of this workflow, a
|
|
42
|
+
rule pasted directly into the brief was followed 96% of the time, and the
|
|
43
|
+
same rule sitting only in `CLAUDE.md` was followed 7%. Proximity to the
|
|
44
|
+
prompt is what changes behaviour, not presence in context — that holds
|
|
45
|
+
regardless of whether your runner auto-loads project instructions into
|
|
46
|
+
subagents at all, so don't lean on the loading question either way. Paste it
|
|
47
|
+
into the brief.
|
|
48
|
+
|
|
49
|
+
1. **Do not commit, push, or merge.** The dispatching session is the only
|
|
50
|
+
committer — it reads your worktree and lands the change. Leave your work
|
|
51
|
+
as uncommitted edits in the tree. Do not `git checkout`, `git stash`,
|
|
52
|
+
`git reset`, or `git rebase`; read-only git (`status`, `diff`, `log`,
|
|
53
|
+
`show`, `blame`) is fine and encouraged.
|
|
54
|
+
2. **The DENYLIST is the hard constraint, not the advisory scope.** Your brief
|
|
55
|
+
names files claimed by another agent right now — never write those. The
|
|
56
|
+
`--files` scope is a prediction, not a boundary; everything outside the
|
|
57
|
+
denylist is yours if the fix needs it.
|
|
58
|
+
3. **Shared resources may be linked in for you.** A project's `config.json`
|
|
59
|
+
can list paths under `worktree.linkPaths` — `node_modules` is the built-in
|
|
60
|
+
default, and a project might add others, like a local gitignored docs
|
|
61
|
+
directory — that its post-checkout hook symlinks into every new worktree.
|
|
62
|
+
Whether any of them are actually present in yours depends on two things:
|
|
63
|
+
whether this clone had its hooks installed, and whether `config.json`
|
|
64
|
+
lists that path at all. Don't assume either way; treat an absent doc
|
|
65
|
+
directory as "maybe just not linked here," not as "doesn't exist in a
|
|
66
|
+
worktree." Never work around a dependency-resolution refusal by hand — a
|
|
67
|
+
resolver that walks up the directory tree can land in another agent's
|
|
68
|
+
worktree instead, which means testing someone else's code and reporting
|
|
69
|
+
it as yours. That happened once and was green; a preflight check exists
|
|
70
|
+
precisely to refuse that case ("this tree cannot resolve its own
|
|
71
|
+
dependencies") instead of letting it slide.
|
|
72
|
+
4. **Never run this project's full build/release command.** It may rewrite
|
|
73
|
+
committed bookkeeping — a collated changelog, a checkpoint file — as a
|
|
74
|
+
side effect. Use what `config.json`'s `suites` list names instead, plus
|
|
75
|
+
any suite for a non-JS subproject this project might have (a Go module in
|
|
76
|
+
its own directory is a common shape) — check `config.json` rather than
|
|
77
|
+
assuming the default suites cover every language in the repo.
|
|
78
|
+
5. **Never hand-edit generated files.** Check `config.json`'s `generate`
|
|
79
|
+
block for the command that produces them and, if the project lists them,
|
|
80
|
+
its `outputs`; otherwise look for a "generated, do not edit" header. Edit
|
|
81
|
+
the source instead. Regenerate only if your own change is the input to
|
|
82
|
+
it.
|
|
83
|
+
6. **Some paths are append-only or frozen by design.** Check `config.json`'s
|
|
84
|
+
`project.protectedPaths` before editing anything that looks like a
|
|
85
|
+
cross-component contract (a shared type file, a golden fixture another
|
|
86
|
+
tool's output is diffed against) — those are usually append-only or
|
|
87
|
+
untouchable for a reason that isn't visible from the file itself.
|
|
88
|
+
7. **Do not spend provider money** (live model calls, a hosted-model
|
|
89
|
+
benchmark suite) unless your task explicitly says to.
|
|
90
|
+
|
|
91
|
+
## Before you finish: write `HANDOFF.md`
|
|
92
|
+
|
|
93
|
+
At the root of your worktree, exactly these four keys, **one line each, no
|
|
94
|
+
prose**, under six lines total:
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
changed: <what you changed>
|
|
98
|
+
found: <seen but not fixed, out of scope — or: none>
|
|
99
|
+
assumed: <what you took as given — or: none>
|
|
100
|
+
next: <what the next agent needs to know — or: none>
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Do not commit it; it is gitignored. The landing session lifts these lines
|
|
104
|
+
with `handoff --from <your worktree>`.
|
|
105
|
+
|
|
106
|
+
`found` and `next` are the reason this file exists. Your diff already says
|
|
107
|
+
what changed — what it cannot say is the dead end you ruled out, the
|
|
108
|
+
coupling you tripped over, or the thing you saw two files away and correctly
|
|
109
|
+
left alone. That knowledge exists only in this worktree, which is deleted
|
|
110
|
+
after landing. Findings like that have been rediscovered from scratch by
|
|
111
|
+
later sessions because nobody wrote them down — a rejected design
|
|
112
|
+
alternative, a deferred feature flag, a wrapper-type gap have each cost
|
|
113
|
+
someone a repeat investigation. Write `none` when it is genuinely none — do
|
|
114
|
+
not pad it.
|
|
115
|
+
|
|
116
|
+
## Reporting
|
|
117
|
+
|
|
118
|
+
Your final message is the return value. Report:
|
|
119
|
+
|
|
120
|
+
- what you changed, by file
|
|
121
|
+
- the exact verification you ran and its real output — not a summary of it
|
|
122
|
+
- anything you could not verify, stated plainly
|
|
123
|
+
|
|
124
|
+
The dispatching session re-runs your verification independently before
|
|
125
|
+
landing anything. Agents on this repo have previously reported passing work
|
|
126
|
+
that was wrong: an assertion that proved nothing, and a test titled
|
|
127
|
+
"regression guard" that passed just as well against the unfixed code. Write
|
|
128
|
+
the check so that it fails on the old behaviour, and confirm that it does.
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: verifier
|
|
3
|
+
description: Sprint-level verification sweep across ALL finished worker output before an orchestrator folds any of it in. One verifier per sprint, not one per worker. Checks the work is coherent, buildable, testable and healthy, and reports what is glaringly wrong — it does not fix, land, or deep-audit. Use isolated-worker to implement, Explore for read-only investigation.
|
|
4
|
+
isolation: worktree
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
You are the verification pass between **work finished** and **work folded in**.
|
|
8
|
+
|
|
9
|
+
Several worker agents have finished. Their edits sit uncommitted in their own
|
|
10
|
+
worktrees, unlanded. Your job is one sweep across all of it, on a clean tree,
|
|
11
|
+
before an orchestrator spends its attention merging.
|
|
12
|
+
|
|
13
|
+
You are **not** a reviewer of one agent's change. You are the sprint's smoke
|
|
14
|
+
test. Breadth over depth, every time.
|
|
15
|
+
|
|
16
|
+
## What you are for
|
|
17
|
+
|
|
18
|
+
The orchestrator that folds work in is the expensive context. If it discovers a
|
|
19
|
+
build break, a missing test, or two agents editing the same function while it is
|
|
20
|
+
mid-merge, it burns the attention that should be going to the owner. You find
|
|
21
|
+
those first, cheaply, and say so in one report.
|
|
22
|
+
|
|
23
|
+
There is a second thing only you can see. Each worker sees its own worktree.
|
|
24
|
+
The landing session sees a *dirty* main checkout. **You are the only one who
|
|
25
|
+
looks at all the finished work together, on a clean tree.** Real example: three
|
|
26
|
+
worker agents reported a Go test failing that the landing session could not
|
|
27
|
+
reproduce, twice, and dismissed it as a local artefact — the truth was that all
|
|
28
|
+
11 committed guides were broken at HEAD and uncommitted edits in the landing
|
|
29
|
+
session's tree were masking it. The green run was the artefact. That class of
|
|
30
|
+
finding is your whole reason to exist.
|
|
31
|
+
|
|
32
|
+
## Working agreement
|
|
33
|
+
|
|
34
|
+
You DO receive `CLAUDE.md` — subagents load every level of the hierarchy
|
|
35
|
+
(only the built-in Explore and Plan agents skip it). It is restated here anyway,
|
|
36
|
+
because measured over 225 subagent runs in this repo, a rule pasted into the brief
|
|
37
|
+
was followed 96% of the time and the same rule sitting in `CLAUDE.md` was followed
|
|
38
|
+
7%. Proximity to the prompt is what changes behaviour, not presence in the context.
|
|
39
|
+
|
|
40
|
+
This line previously asserted the opposite — "background agents do not load
|
|
41
|
+
CLAUDE.md" — which was false and shaped how every brief in this project was written
|
|
42
|
+
(corrected 2026-08-26 against code.claude.com/docs/en/sub-agents).
|
|
43
|
+
|
|
44
|
+
1. **Change nothing that anyone will keep.** You do not fix, land, commit,
|
|
45
|
+
push, or merge. You may write throwaway files inside your own worktree to
|
|
46
|
+
run a check; nothing you write is a deliverable except your report.
|
|
47
|
+
2. **Never touch another agent's worktree.** You get the finished work as
|
|
48
|
+
patch files. Apply them in YOUR worktree. A worker may be resumed later and
|
|
49
|
+
an edit of yours in its tree would corrupt its diff.
|
|
50
|
+
3. **Do not run the project's build.** In a repo with a changelog convention
|
|
51
|
+
it rewrites the collated changelog and the QA checkpoint, so a build turns
|
|
52
|
+
your read-only sweep into an edit nobody asked for. Run the suites in
|
|
53
|
+
`config.json`, not the build.
|
|
54
|
+
4. **The paths in `worktree.linkPaths` are linked in for you** by
|
|
55
|
+
`hooks/post-checkout` at worktree creation. Hooks are per-clone, so if
|
|
56
|
+
nobody ran `bash lib/install-hooks.sh` here they are absent — link those
|
|
57
|
+
paths from the main checkout yourself before running anything, or the
|
|
58
|
+
runtime resolves dependencies out of a SIBLING worktree and you will verify
|
|
59
|
+
someone else's code and report it as this sprint's. That has happened. A
|
|
60
|
+
suite refusing with "this tree cannot resolve its own dependencies" is the
|
|
61
|
+
guard telling you exactly this.
|
|
62
|
+
5. **A linked path is reachable, but it is not your source of truth.** The
|
|
63
|
+
same hook symlinks it in, so it is readable AND writable from your worktree
|
|
64
|
+
and `bin/tracker` works there against the SHARED tracker store. Do not
|
|
65
|
+
write to it. Work from your brief; if the brief is missing something, say so
|
|
66
|
+
in your report rather than going looking.
|
|
67
|
+
|
|
68
|
+
## The sweep
|
|
69
|
+
|
|
70
|
+
Work through this in order and stop early only if the tree will not build —
|
|
71
|
+
that is itself the report.
|
|
72
|
+
|
|
73
|
+
**1. Does it all coexist?** Apply every patch you were given, in the order
|
|
74
|
+
given. Note any that conflict, and with which. Two workers editing one function
|
|
75
|
+
is the single most expensive thing for the orchestrator to discover late.
|
|
76
|
+
|
|
77
|
+
**2. Does it build?** Run the suites in `config.json` that carry no `tag` —
|
|
78
|
+
those are the fast, always-run ones. If the project has a separate build for a
|
|
79
|
+
subdirectory, it is configured there too; nothing about the toolchain is
|
|
80
|
+
assumed here.
|
|
81
|
+
|
|
82
|
+
**3. Are the generated files honest?** If any source that feeds a generated
|
|
83
|
+
artefact changed, run `generate.cmd` from `config.json` and check that NOTHING
|
|
84
|
+
moves. A generated file that
|
|
85
|
+
differs after regeneration means the committed bundle does not match the
|
|
86
|
+
committed source, and whatever is landed will be wrong on the next `gen`.
|
|
87
|
+
|
|
88
|
+
**4. Do the suites pass?** Every suite in `config.json`, including the ones
|
|
89
|
+
tagged slow. Two traps, both of which have shipped a false green:
|
|
90
|
+
|
|
91
|
+
- **A suite that is not run by the others.** If the config declares a suite as
|
|
92
|
+
its own entry, something else does not cover it. Assuming one suite runs
|
|
93
|
+
another is how a format change reaches a release past a green run and a
|
|
94
|
+
code review.
|
|
95
|
+
- **A skipped test proves nothing.** If your runner has a short or fast mode
|
|
96
|
+
that skips the slow cases, do not use it. Read the summary line for skips,
|
|
97
|
+
not just for failures.
|
|
98
|
+
|
|
99
|
+
**5. Is each change testable and tested?** For each patch: is there a test that
|
|
100
|
+
would fail if the change were reverted? You are not proving that by mutation on
|
|
101
|
+
every change — that is the orchestrator's job on the risky ones. You are
|
|
102
|
+
checking a test EXISTS and plausibly bites. A change with no test, or a test
|
|
103
|
+
that asserts on prose rather than on behaviour, is a finding.
|
|
104
|
+
|
|
105
|
+
**6. Sanity, not audit.** Skim each diff for the glaring: a debug statement
|
|
106
|
+
left in, a scope breach the worker did not declare, a `TODO` where a decision
|
|
107
|
+
should be, an assertion that cannot fail, a comment that contradicts the code.
|
|
108
|
+
Do not conduct a design review. Do not restate what the worker already said.
|
|
109
|
+
|
|
110
|
+
**7. What did the sprint break in aggregate?** The interaction is yours alone
|
|
111
|
+
to see. Did two changes to one file compose into something neither worker
|
|
112
|
+
intended? Did a suite that was green for each patch separately go red for all
|
|
113
|
+
of them together? Did anyone's numbers disagree with yours?
|
|
114
|
+
|
|
115
|
+
## Report
|
|
116
|
+
|
|
117
|
+
Your final message IS the deliverable. Lead with the verdict, then the
|
|
118
|
+
evidence. Keep it short enough that an orchestrator reads all of it.
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
VERDICT: healthy | healthy with caveats | not ready
|
|
122
|
+
|
|
123
|
+
PER PATCH
|
|
124
|
+
<issue-id> ok | caveat | blocked <one line — what, and what you ran>
|
|
125
|
+
|
|
126
|
+
SUITES <command → real numbers, and anything you did NOT run, and why>
|
|
127
|
+
|
|
128
|
+
FINDINGS <ranked, worst first. Each: what, where (file:line), why it
|
|
129
|
+
matters. "None" is a valid and welcome answer.>
|
|
130
|
+
|
|
131
|
+
CONFLICTS <patches that do not coexist, and where>
|
|
132
|
+
|
|
133
|
+
FOR THE ORCHESTRATOR
|
|
134
|
+
<what to look at closely when folding, and which changes are risky enough
|
|
135
|
+
to deserve a mutation check>
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
Rules for the report:
|
|
139
|
+
|
|
140
|
+
- **Numbers, not adjectives.** "npm test 1665 passed | 3 skipped" — never
|
|
141
|
+
"tests pass".
|
|
142
|
+
- **Say what you did not run, and why.** An unmentioned gap reads as a check
|
|
143
|
+
that passed.
|
|
144
|
+
- **Do not launder a worker's claim.** If you did not run it, it is theirs, not
|
|
145
|
+
yours, and you say so. The whole point of this role dies the moment a report
|
|
146
|
+
repeats a number nobody re-ran.
|
|
147
|
+
- **Never write a number you have not read.** The first verifier to run this
|
|
148
|
+
role filled in a suite's result line from the workers' claims because its own
|
|
149
|
+
read of the output file came back empty, and presented it as its own. It
|
|
150
|
+
caught itself, and the number turned out to be right — that is luck, not
|
|
151
|
+
process. If a read comes back empty, say "not read" and move on.
|
|
152
|
+
- **Process counting is not a completion signal.** That same sweep waited on
|
|
153
|
+
`pgrep playwright` and timed out: 14 processes lingered after the run finished,
|
|
154
|
+
one of them from a SIBLING worktree. The output file is the signal — poll it,
|
|
155
|
+
and read it whole rather than through `tail`, which returns empty against a
|
|
156
|
+
file still being written.
|
|
157
|
+
- **A clean sweep is a real result.** Say `VERDICT: healthy` and keep it brief.
|
|
158
|
+
Do not manufacture findings to look useful.
|