luciazero 1.5.0 → 2.0.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/CHANGELOG.md +177 -9
- package/README.md +158 -135
- package/README.th.md +156 -137
- package/bin/discipline-report.js +197 -0
- package/bin/luciazero.js +31 -14
- package/bin/update.js +366 -0
- package/claude/agents/catalog.txt +2 -0
- package/claude/agents/reviewer.md +11 -5
- package/claude/hooks/luciazero-verify.sh +58 -29
- package/install-codex.sh +63 -15
- package/install.sh +100 -18
- package/{skills/handoff/SKILL.md → migrations/handoff-v1.5.0.SKILL.md} +8 -1
- package/package.json +3 -2
- package/skills/bisect/SKILL.md +26 -0
- package/skills/bisect/scripts/safe-bisect.sh +124 -0
- package/skills/catalog.txt +10 -0
- package/skills/discipline-report/SKILL.md +18 -0
- package/skills/done/SKILL.md +20 -7
- package/skills/done/scripts/revert-probe.sh +3 -2
- package/skills/lucia-relay/SKILL.md +38 -0
- package/skills/lucia-relay/scripts/relay.py +451 -0
- package/skills/luciazero-bootstrap/SKILL.md +1 -1
- package/skills/luciazero-bootstrap/references/smart-verification.md +29 -0
- package/skills/plan/SKILL.md +28 -0
- package/skills/retro/SKILL.md +1 -1
- package/uninstall-codex.sh +53 -4
- package/uninstall.sh +64 -9
package/CHANGELOG.md
CHANGED
|
@@ -7,18 +7,186 @@ Versioning: [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
-
## [
|
|
10
|
+
## [2.0.1] - 2026-08-13
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **Explicit, channel-aware updates.** `npx luciazero@latest check-update`
|
|
15
|
+
performs a read-only, five-second npm registry check only when invoked;
|
|
16
|
+
`npx luciazero@latest update` detects classic Claude, its hook mode, and
|
|
17
|
+
Codex, then refreshes every detected install through the existing audited
|
|
18
|
+
installers. It refuses to create a fresh install, downgrade a recognized
|
|
19
|
+
newer one, or trust a malformed version sidecar. Legacy installs without the
|
|
20
|
+
sidecar remain updatable. Classic doctrine customization now receives the
|
|
21
|
+
same managed-snapshot backup protection as skills and agents.
|
|
22
|
+
Plugin and skills-only update commands, Claude plugin auto-update, and GitHub
|
|
23
|
+
release notifications are documented separately in both READMEs.
|
|
24
|
+
|
|
25
|
+
### Changed
|
|
26
|
+
|
|
27
|
+
- The release workflow uses the runner's GitHub CLI instead of a Node 20-based
|
|
28
|
+
release action. Re-runs replace the existing zip without recreating the
|
|
29
|
+
release, and GitHub Actions no longer emits the deprecated-runtime warning.
|
|
30
|
+
|
|
31
|
+
## [2.0.0] - 2026-08-13
|
|
11
32
|
|
|
12
33
|
### Changed
|
|
13
34
|
|
|
14
|
-
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
35
|
+
- The canonical Sonnet result is explicitly preliminary (`+31pp`, n=4–5).
|
|
36
|
+
The historical `+37pp` statement is retired because its eight replacement
|
|
37
|
+
raw rows could not be recovered.
|
|
38
|
+
- `eval/report.sh` rejects mixed campaigns/commits/seeds, changed fixture
|
|
39
|
+
hashes, duplicate invocation IDs, and inconsistent pair order. Published
|
|
40
|
+
evidence also enforces registered task/arm/row/invalid/model expectations,
|
|
41
|
+
and discloses Haiku's incomplete per-row model provenance.
|
|
42
|
+
- Eval tasks may provide deterministic offline setup before either arm. Provider
|
|
43
|
+
transcripts now live outside worked trees so they cannot alter Git status,
|
|
44
|
+
repository fingerprints, or final-tree grading.
|
|
45
|
+
- Relay fingerprints encode untracked special files without opening them, so a
|
|
46
|
+
FIFO, socket, or device cannot block inspection or trigger device I/O.
|
|
47
|
+
- GitHub workflows use the Node 24-based `actions/checkout@v5` and
|
|
48
|
+
`actions/setup-node@v5` runtimes.
|
|
49
|
+
- **Breaking: `/handoff` is now `/lucia-relay`.** The branded name avoids
|
|
50
|
+
collisions with generic handoff skills. Installs remove an untouched v1.5
|
|
51
|
+
copy but preserve and warn about customized copies. Relay state is now a
|
|
52
|
+
validated `LUCIA_RELAY.json` manifest plus a generated human view, with a
|
|
53
|
+
repository fingerprint, verification evidence, negative knowledge,
|
|
54
|
+
cross-session/cross-agent routing, drift inspection, and explicit consume.
|
|
55
|
+
- **Risk-routed review.** The single portable reviewer now accepts `general`,
|
|
56
|
+
`security`, and `contract` focus modes, reads callers/consumers, and uses one
|
|
57
|
+
blocker/major/minor policy. `/done` requests separate focused passes when a
|
|
58
|
+
diff crosses both security and contract boundaries.
|
|
59
|
+
- **Smart verification is repo-owned.** Monorepos create `verify-changed` from
|
|
60
|
+
their native task graph and keep `verify-full` for closeout. The global hook
|
|
61
|
+
never guesses dependency impact from path prefixes.
|
|
62
|
+
- **Classic and Codex installs track component ownership.** Exact hidden
|
|
63
|
+
snapshots distinguish Luciazero-managed skills/agents from same-name user or
|
|
64
|
+
third-party components. Updates back up collisions/customizations, and
|
|
65
|
+
uninstall removes only an unchanged managed copy.
|
|
66
|
+
|
|
67
|
+
### Added
|
|
68
|
+
|
|
69
|
+
- Auditable benchmark evidence: canonical Claude raw JSONL, a SHA-256 campaign
|
|
70
|
+
registry, generated README/benchmark tables, and a CI drift check.
|
|
71
|
+
- Result schema 2 records campaign, pair, invocation, repository, fixture,
|
|
72
|
+
prompt, platform, and arm-order metadata. Seeded arm randomization reduces
|
|
73
|
+
fixed-order bias without making campaigns irreproducible.
|
|
74
|
+
- Strict shared result validation rejects unsupported schemas and mistyped
|
|
75
|
+
booleans, criteria, metrics, timestamps, platform, and campaign metadata.
|
|
76
|
+
Output-aware `--resume` fills interrupted pairs without rerunning completed
|
|
77
|
+
invocation IDs; `--run-offset` extends completed batches.
|
|
78
|
+
- Three zero-quota candidate eval tasks cover archive extraction security,
|
|
79
|
+
lossless atomic schema migration, and multi-page cursor integration. Each
|
|
80
|
+
grader proves reference/project/anti-gamed behavior offline.
|
|
81
|
+
- **`relay-transfer` protocol eval** grades portable state, an exact next edit,
|
|
82
|
+
verification evidence, negative knowledge, scope preservation, and a current
|
|
83
|
+
repository fingerprint. CI proves its 6/6 reference and rejects generic
|
|
84
|
+
prose plus a content-complete stale relay without spending model quota.
|
|
85
|
+
- **Lucia Relay demo** drives the shipped producer/receiver implementation in
|
|
86
|
+
a temporary Git repository: render, validate, detect drift, re-run evidence,
|
|
87
|
+
and explicitly consume. The checked-in GIF is generated from the same script
|
|
88
|
+
exercised by CI.
|
|
89
|
+
- **Central component catalogs** drive classic/Codex install, status,
|
|
90
|
+
uninstall, and inventory tests, so a new skill or agent cannot silently ship
|
|
91
|
+
through only one channel.
|
|
92
|
+
- **`/plan`** defines falsifiable acceptance signals and reversible steps,
|
|
93
|
+
while pausing for approval only on ambiguity, high stakes, destructive work,
|
|
94
|
+
public-contract choices, or scope changes.
|
|
95
|
+
- **`/bisect` + `safe-bisect.sh`** locate the first bad commit in a detached
|
|
96
|
+
temporary worktree, repeat endpoints to catch flakes, preserve exit 125
|
|
97
|
+
skips, distinguish missing commands, and clean every exit path.
|
|
98
|
+
- **`npx luciazero discipline` + `/discipline-report`** analyze schema-v2
|
|
99
|
+
local JSONL outcomes with day/project filters and JSON output. The hook logs
|
|
100
|
+
a privacy-preserving project hash and verify mode; legacy records remain
|
|
101
|
+
readable and recommendations distinguish observations from likely causes.
|
|
102
|
+
- **`/lucia-relay` carries memory pointers** — the `Read first`
|
|
103
|
+
section quotes the `docs/lessons.md` entries relevant to the unfinished
|
|
104
|
+
work (a selection, never a copy — the ledger travels with the repo) and
|
|
105
|
+
copies applicable machine-local `luciazero-heuristics.md` entries
|
|
106
|
+
verbatim, since the relay is the only way those cross machines. The
|
|
107
|
+
consume protocol tells the reader to follow the pointers before touching
|
|
108
|
+
code and to adopt carried heuristics that earn their keep.
|
|
109
|
+
|
|
110
|
+
- **`eval/run.sh --use-login`** — run the real eval on an existing Claude
|
|
111
|
+
subscription (Pro/Max) instead of API dollars: seeds each per-run sandbox
|
|
112
|
+
config dir with this machine's login state — `~/.claude.json`, plus
|
|
113
|
+
OAuth tokens from `.credentials.json` (Linux) or a Keychain export
|
|
114
|
+
(macOS). The copy lives only inside the mktemp sandbox and is deleted
|
|
115
|
+
with it. Fail-soft by
|
|
116
|
+
design: if the seed does not authenticate, `check-result.sh` marks the
|
|
117
|
+
arm INVALID and nothing is spent. Plumbing (seed per arm, warn on missing
|
|
118
|
+
login state) is proven offline in `test.sh`.
|
|
119
|
+
|
|
120
|
+
- **`eval/check-result.sh`** — a zero exit code no longer proves the agent
|
|
121
|
+
ran: the CLI has wrapped a `Not logged in` error in subtype `"success"`
|
|
122
|
+
(observed 2026-08-11, caught free by a 1-run smoke). The guard inspects
|
|
123
|
+
the result payload (`is_error`, `terminal_reason: api_error`, login
|
|
124
|
+
errors) and `run.sh` books a refuted arm as INVALID with the reason
|
|
125
|
+
quoted; every accept/reject path is fixture-proven in `test.sh`.
|
|
126
|
+
- **`eval/run.sh --offline`** — synthetic smoke mode: no `claude` CLI, no
|
|
127
|
+
API key, zero cost. Doctrine-style arms get the task's `reference/` tree,
|
|
128
|
+
bare keeps the planted bug, and the whole copy → grade → JSONL → report
|
|
129
|
+
loop runs in seconds. Rows are branded `"offline": true` and `report.sh`
|
|
130
|
+
prints a SYNTHETIC banner so the numbers can never pass as behavioral
|
|
131
|
+
results; end-to-end proven in `test.sh` plus a frozen fixture pair.
|
|
132
|
+
- **README narrative reorder** (EN + TH): the demo GIF and the
|
|
133
|
+
"What it prevents" table now sit directly under the intro, before
|
|
134
|
+
Install — a newcomer sees what the pack does in 30 seconds before being
|
|
135
|
+
asked to install anything.
|
|
136
|
+
|
|
137
|
+
- **README demo GIF** — 15 seconds of the enforcement pack's real behavior:
|
|
138
|
+
edit → `✎ unverified`, stop attempt → the rule-1 nudge, red verify →
|
|
139
|
+
`❌ verify RED`, fix → `✅ verify`. Recorded from the checked-in
|
|
140
|
+
`docs/assets/statusline-demo.sh`, which drives the shipped hooks in a
|
|
141
|
+
sandbox (so the GIF cannot drift from what the scripts actually print),
|
|
142
|
+
via the checked-in `docs/assets/demo.tape` (`vhs`). The driver script is
|
|
143
|
+
under `test.sh`'s shellcheck net.
|
|
144
|
+
|
|
145
|
+
- **`false-green` eval task** (sixth): the false-done trap — the shipped
|
|
146
|
+
suite is green from the start while the CSV escaping bug lives outside
|
|
147
|
+
its coverage. The untouched tree *passes its own tests* and still fails
|
|
148
|
+
the grader (symptom probed on unseen data; bug-restored suite must go
|
|
149
|
+
red), which is doctrine rule 1 stated as a fixture. `gamed/` (comma-only
|
|
150
|
+
half fix) and `gamed-notest/` (correct fix, no test added) are rejected.
|
|
151
|
+
- **`--with-lessons` eval arm** — `eval/run.sh --with-lessons` runs a third
|
|
152
|
+
arm for tasks that ship a `lessons.md` (currently `pipeline` and
|
|
153
|
+
`false-green`): doctrine install plus the task's ledger pre-seeded as
|
|
154
|
+
`docs/lessons.md`, the A/B/C comparison that measures whether the
|
|
155
|
+
learning layer pays. `report.sh` discovers arm columns from the data and
|
|
156
|
+
renders per-arm deltas; frozen three-arm fixture added to `test.sh`.
|
|
157
|
+
- **Per-run resource accounting** — `run.sh --out` now records duration,
|
|
158
|
+
token usage, and cost per run (parsed fail-open from the CLI's
|
|
159
|
+
`--output-format json` result), and `report.sh` appends per-arm resource
|
|
160
|
+
means whenever the data is present — a pass-rate delta is only a win if
|
|
161
|
+
the cost next to it says so.
|
|
162
|
+
- **Community eval issue templates** — `Evaluation result` (report.sh
|
|
163
|
+
output required, null results explicitly welcome) and `New eval task`
|
|
164
|
+
(asks for the doctrine rule probed and the gamed tree that would cheat
|
|
165
|
+
the grader).
|
|
166
|
+
|
|
167
|
+
- **`merge-conflict` eval task** (fifth): an unresolved merge where main's
|
|
168
|
+
bulk discount and the branch's member discount must both survive. The
|
|
169
|
+
grader probes each feature on data the shipped tests never mention, and
|
|
170
|
+
swaps in one-sided feature mutants to prove the worked tests actually
|
|
171
|
+
cover both sides — `gamed/` (HEAD-only resolution, suite green) and
|
|
172
|
+
`gamed-notests/` (correct merge, no tests added) are both rejected.
|
|
173
|
+
- **Machine-readable closeout evidence** — `/done` step 6 now mirrors the
|
|
174
|
+
report as a JSON block (status, verify command + exit code + decisive
|
|
175
|
+
line, not-covered, left-out) when the result feeds CI, a PR comment, or a
|
|
176
|
+
dashboard.
|
|
177
|
+
- **README "What it prevents" section** (EN + TH): failure modes mapped to
|
|
178
|
+
the shipped mechanism that catches each — no promise without a mechanism.
|
|
179
|
+
- **SECURITY.md** — private reporting channel plus the enforced design
|
|
180
|
+
guarantees (no network, no npm lifecycle scripts, fail-open hooks,
|
|
181
|
+
config-dir-only writes) and the documented strict-mode env sharp edge.
|
|
182
|
+
- **GitHub issue templates** — bug report (channel + decisive-output
|
|
183
|
+
evidence required), feature request (doctrine-fit question), security
|
|
184
|
+
contact link.
|
|
185
|
+
|
|
186
|
+
## [1.5.0] - 2026-08-10
|
|
187
|
+
|
|
188
|
+
First version published to npm (`luciazero`); 1.4.x and below were
|
|
189
|
+
development versions.
|
|
22
190
|
|
|
23
191
|
### Added
|
|
24
192
|
|
package/README.md
CHANGED
|
@@ -7,208 +7,231 @@
|
|
|
7
7
|
[](LICENSE)
|
|
8
8
|
|
|
9
9
|
<p align="center">
|
|
10
|
-
<img src="https://raw.githubusercontent.com/ohm41321/luciazero/main/docs/assets/lucia.png" width="
|
|
10
|
+
<img src="https://raw.githubusercontent.com/ohm41321/luciazero/main/docs/assets/lucia.png" width="280" alt="Lucia — Luciazero's mascot">
|
|
11
11
|
</p>
|
|
12
12
|
|
|
13
|
-
Luciazero makes
|
|
13
|
+
Luciazero makes coding agents run a `plan → change → verify → fix` loop instead
|
|
14
|
+
of handing back work they merely believe is finished.
|
|
14
15
|
|
|
15
|
-
> Done is proven by a command, not by my judgment. If no verification command
|
|
16
|
+
> Done is proven by a command, not by my judgment. If no verification command
|
|
17
|
+
> exists, that is the first bug.
|
|
16
18
|
|
|
17
|
-
|
|
19
|
+
It ships a compact [9-rule doctrine](claude/luciazero.md), 9 on-demand skills,
|
|
20
|
+
verification hooks, a risk-routed reviewer, and an eval harness. It is a
|
|
21
|
+
discipline layer, not an agent runtime or overnight orchestrator.
|
|
18
22
|
|
|
19
|
-
##
|
|
20
|
-
|
|
21
|
-
**Claude Code — plugin (recommended).** One install carries the six skills, the `reviewer` agent, the verify-tracking hooks, and the doctrine:
|
|
22
|
-
|
|
23
|
-
```
|
|
24
|
-
/plugin marketplace add ohm41321/luciazero
|
|
25
|
-
/plugin install luciazero@luciazero
|
|
26
|
-
```
|
|
23
|
+
## See it in 15 seconds
|
|
27
24
|
|
|
28
|
-
|
|
25
|
+
This GIF is driven by the shipped hooks, not a mockup:
|
|
29
26
|
|
|
30
|
-
|
|
27
|
+
<p align="center">
|
|
28
|
+
<img src="https://raw.githubusercontent.com/ohm41321/luciazero/main/docs/assets/statusline-demo.gif" width="720" alt="Edit becomes unverified, a red check stays red, and a successful verify turns green">
|
|
29
|
+
</p>
|
|
31
30
|
|
|
32
|
-
```
|
|
33
|
-
|
|
31
|
+
```text
|
|
32
|
+
✎ unverified → edits happened after the last check
|
|
33
|
+
❌ verify RED → the latest check failed
|
|
34
|
+
✅ verify 3m → the latest check passed three minutes ago
|
|
34
35
|
```
|
|
35
36
|
|
|
36
|
-
|
|
37
|
+
## What it prevents
|
|
37
38
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
39
|
+
| Failure mode | Mechanism |
|
|
40
|
+
|---|---|
|
|
41
|
+
| “Done” without running a check | Stop-hook nudge; optional strict gate blocks a red stop |
|
|
42
|
+
| `cat test.sh` counted as testing | Exact `LUCIAZERO_VERIFY_CMD` matching |
|
|
43
|
+
| Tests weakened to reach green | Doctrine rule 3 + check-suppression guard |
|
|
44
|
+
| New tests that pass without the fix | `revert-probe.sh` runs them against the old code |
|
|
45
|
+
| Scope silently dropped | `/done` requires every item delivered or named as left out |
|
|
46
|
+
| The same dead end repeated later | `/retro` records it; `/debug` reads it first |
|
|
47
|
+
| Context lost between agents | `/lucia-relay` transfers evidence, next action, and negative knowledge |
|
|
42
48
|
|
|
43
|
-
|
|
49
|
+
Mechanical guarantees run in `test.sh`; behavioral claims are measured by the
|
|
50
|
+
[eval harness](eval/README.md).
|
|
44
51
|
|
|
45
|
-
##
|
|
52
|
+
## Carry unfinished work across agents
|
|
46
53
|
|
|
47
|
-
|
|
54
|
+
`/lucia-relay` transfers decisions and evidence instead of dumping a chat
|
|
55
|
+
transcript. Session A writes canonical `LUCIA_RELAY.json` plus a generated
|
|
56
|
+
human view; session B checks the Git fingerprint, reads the exact next action
|
|
57
|
+
and refuted hypotheses, re-runs verification, then explicitly consumes the
|
|
58
|
+
relay.
|
|
48
59
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
| A bug survives the first look | `/debug` | Deterministic reproduction, hypothesis ledger seeded from past lessons (`docs/lessons.md` + cross-repo heuristics), closes with a red-before-fix regression test |
|
|
53
|
-
| About to say "done" | `/done` | Full-tier verify with the decisive line quoted, skeptic pass over the diff, `revert-probe.sh` test-honesty check, fixed report format |
|
|
54
|
-
| Stopping while work is unfinished | `/handoff` | Writes the `HANDOFF.md` capsule: goal, verified state, the one literal next command |
|
|
55
|
-
| "Make it faster" requests | `/experiment` | Metric and win threshold before any edit, baseline with repetitions, one variable per run, losers reverted |
|
|
56
|
-
| After a hard task or a long debug | `/retro` | Routes lessons into the project's notes, the `docs/lessons.md` ledger, and cross-repo heuristics; reads the discipline stats log |
|
|
60
|
+
<p align="center">
|
|
61
|
+
<img src="https://raw.githubusercontent.com/ohm41321/luciazero/main/docs/assets/relay-demo.gif" width="720" alt="One session creates a Lucia Relay; another validates it, detects repository drift, re-runs evidence, and consumes it">
|
|
62
|
+
</p>
|
|
57
63
|
|
|
58
|
-
The
|
|
64
|
+
The GIF runs the [shipped implementation](docs/assets/relay-demo.sh) in a
|
|
65
|
+
temporary Git repository. CI's `relay-transfer` fixture scores the complete
|
|
66
|
+
reference 6/6 and rejects a generic Markdown handoff (1/6) plus a
|
|
67
|
+
content-complete but stale fingerprint (5/6). Those are mechanical protocol
|
|
68
|
+
checks—not model-uplift results. See the [method and limits](docs/benchmark.md#skill-protocol-evidence).
|
|
59
69
|
|
|
60
|
-
##
|
|
70
|
+
## Install
|
|
61
71
|
|
|
62
|
-
|
|
72
|
+
### Claude Code plugin — recommended
|
|
63
73
|
|
|
64
|
-
|
|
65
|
-
|---|---|---|
|
|
66
|
-
| `claude/luciazero.md` | Doctrine — 9 rules | Always, every project, every session |
|
|
67
|
-
| `skills/luciazero-bootstrap/` | Procedure — make a repo agent-ready (ships `scripts/detect.sh`) | On demand |
|
|
68
|
-
| `skills/debug/` | Procedure — hypothesis-driven debugging | On demand |
|
|
69
|
-
| `skills/done/` | Procedure — closeout ritual (ships `scripts/revert-probe.sh`) | On demand |
|
|
70
|
-
| `skills/handoff/` | Procedure — state capsule for the next session/agent | On demand |
|
|
71
|
-
| `skills/experiment/` | Procedure — measured-change protocol for perf work | On demand |
|
|
72
|
-
| `skills/retro/` | Procedure — harvest lessons into project notes | On demand |
|
|
73
|
-
| `claude/agents/reviewer.md` | Adversarial reviewer subagent | On demand (before "done") |
|
|
74
|
-
| `claude/hooks/` | Enforcement pack — verify-nudge hooks, opt-in strict gate, statusline | Opt-in |
|
|
75
|
-
| `eval/` | A/B harness — 4 planted-bug tasks, self-proving graders | Manual (costs API money) |
|
|
76
|
-
| `demo.sh` | Two-minute demo — planted bug, your session, objective grader | Manual |
|
|
74
|
+
Carries the doctrine, all skills, reviewer, and verify-tracking hooks:
|
|
77
75
|
|
|
78
|
-
|
|
76
|
+
```text
|
|
77
|
+
/plugin marketplace add ohm41321/luciazero
|
|
78
|
+
/plugin install luciazero@luciazero
|
|
79
|
+
```
|
|
79
80
|
|
|
80
|
-
|
|
81
|
+
Start a repository with `/luciazero:luciazero-bootstrap`. Plugin skills use the
|
|
82
|
+
`/luciazero:` prefix. The plugin has no statusline because Claude Code plugins
|
|
83
|
+
cannot set one.
|
|
81
84
|
|
|
82
|
-
|
|
85
|
+
### Skills only — any compatible agent
|
|
83
86
|
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
Opus | ✅ verify 3m # last verify green, 3 minutes ago
|
|
87
|
-
Opus | ❌ verify RED 40s # last verify failed — the loop is not done
|
|
87
|
+
```bash
|
|
88
|
+
npx skills add ohm41321/luciazero
|
|
88
89
|
```
|
|
89
90
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
```
|
|
93
|
-
Doctrine rule 1: edits were made but no verify command has run since the last
|
|
94
|
-
edit. Run the repo's verify command and quote its decisive line — or finish
|
|
95
|
-
anyway and say plainly that the change is unverified. (This nudge fires once.)
|
|
96
|
-
```
|
|
91
|
+
This installs the 9 skills only: no doctrine, reviewer, or hooks.
|
|
97
92
|
|
|
98
|
-
|
|
93
|
+
### Classic Claude Code and Codex
|
|
99
94
|
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
|
|
95
|
+
```bash
|
|
96
|
+
npx luciazero # Claude Code
|
|
97
|
+
npx luciazero --with-hooks # Claude Code + hooks/statusline; needs Python 3
|
|
98
|
+
npx luciazero codex # Codex CLI
|
|
103
99
|
|
|
104
|
-
|
|
100
|
+
npx luciazero uninstall
|
|
101
|
+
npx luciazero uninstall-codex
|
|
105
102
|
```
|
|
106
103
|
|
|
107
|
-
|
|
104
|
+
Pick either plugin or classic for Claude Code so hooks are not wired twice.
|
|
105
|
+
Classic installs support `--status`; Codex receives the doctrine and skills but
|
|
106
|
+
not Claude-only hooks/statusline. Installers back up name collisions and remove
|
|
107
|
+
only exact Luciazero-managed copies on uninstall.
|
|
108
108
|
|
|
109
|
-
|
|
109
|
+
## Update
|
|
110
110
|
|
|
111
|
-
|
|
111
|
+
Luciazero never changes classic or Codex files in the background.
|
|
112
112
|
|
|
113
113
|
```bash
|
|
114
|
-
|
|
114
|
+
npx luciazero@latest check-update # read-only; contacts npm only now
|
|
115
|
+
npx luciazero@latest update # updates every detected classic/Codex install
|
|
115
116
|
```
|
|
116
117
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
**Strict mode (opt-in on top of opt-in).** Set `LUCIAZERO_STRICT_VERIFY_CMD` to your repo's *fast* verify command — in your **personal** settings, never in anything committed. Honest limitation: the hook reads an environment variable and cannot tell which settings scope set it — a repo's committed `.claude/settings.json` `env` block would reach it too — so treat a repository that ships this variable as hostile and remove it before working there. At session stop the hook actually runs the command (unless the tracked state is already green after the last edit) and **blocks the stop** on red, quoting the failing output. Hard timeout via `LUCIAZERO_STRICT_TIMEOUT` (default 120s); every internal error — timeout, missing command, broken JSON — degrades to the ordinary nudge, never a block. A blocked stop's continuation is never re-blocked (`stop_hook_active`): a speed bump with evidence attached, not a wall.
|
|
122
|
-
|
|
123
|
-
### Verify, update, uninstall
|
|
124
|
-
|
|
125
|
-
`./install.sh --status` is a read-only health check: doctrine, skills, agent, import line, version, and — with the enforcement pack — that hook files are executable *and actually wired* (hooks fail open, so a broken install is otherwise silent). Non-zero exit if a core piece is missing. Update with `git pull && ./install.sh` (idempotent; a version sidecar lets `--status` flag an install older than the checkout). `./uninstall.sh` removes the scripts and cleans exactly our settings entries, matched by full path — run it from a checkout at least as new as the one you installed from.
|
|
126
|
-
|
|
127
|
-
### Codex CLI
|
|
128
|
-
|
|
129
|
-
`./install-codex.sh` (remove with `./uninstall-codex.sh`) — same content, single source of truth, converted at install time:
|
|
130
|
-
|
|
131
|
-
| Piece | Lands in Codex as |
|
|
132
|
-
|---|---|
|
|
133
|
-
| Doctrine | Marker-delimited block in `~/.codex/AGENTS.md` (replaced in place on reinstall) |
|
|
134
|
-
| All six skills | `~/.codex/skills/` — same `SKILL.md` format, copied as-is |
|
|
135
|
-
| `reviewer` agent | `~/.codex/skills/reviewer/` — Codex has no subagents, so it ships as a skill |
|
|
136
|
-
| Enforcement pack | Not installed — Codex has no hooks or statusline |
|
|
137
|
-
|
|
138
|
-
Honors `CODEX_HOME`, backs up `AGENTS.md`, idempotent, writes nothing outside the Codex dir. The doctrine and skills are written platform-neutrally, so the same text works in both CLIs without translation.
|
|
139
|
-
|
|
140
|
-
## What the doctrine says
|
|
141
|
-
|
|
142
|
-
Nine rules in four groups. Full text in `claude/luciazero.md`.
|
|
143
|
-
|
|
144
|
-
**Ground truth** — done is proven by an exit code, and a run that did not happen is reported as exactly that; a missing verify command is the first bug; never weaken a check to reach green.
|
|
118
|
+
`update` preserves whether the Claude classic install uses hooks, repairs stale
|
|
119
|
+
managed files, starts no fresh install when it cannot find one, and stops on a
|
|
120
|
+
known newer version or malformed version metadata. Start a new agent session
|
|
121
|
+
afterward.
|
|
145
122
|
|
|
146
|
-
|
|
123
|
+
Other install channels use their own updater:
|
|
147
124
|
|
|
148
|
-
|
|
125
|
+
```bash
|
|
126
|
+
claude plugin update luciazero@luciazero # then run /reload-plugins
|
|
127
|
+
npx skills update # review the scope prompt
|
|
128
|
+
```
|
|
149
129
|
|
|
150
|
-
|
|
130
|
+
The skills command updates every installed skill in the selected scope, not
|
|
131
|
+
only Luciazero; review its prompt before confirming.
|
|
151
132
|
|
|
152
|
-
|
|
133
|
+
Claude Code can auto-update the plugin at startup: open `/plugin` →
|
|
134
|
+
**Marketplaces** → **luciazero** → **Enable auto-update**. Third-party
|
|
135
|
+
marketplaces leave this off by default. For release-only notifications, use
|
|
136
|
+
GitHub **Watch → Custom → Releases**.
|
|
153
137
|
|
|
154
|
-
##
|
|
138
|
+
## The 9 skills
|
|
155
139
|
|
|
156
|
-
`/luciazero-bootstrap`
|
|
140
|
+
Run `/luciazero-bootstrap` first; the rest activate when their moment arrives.
|
|
157
141
|
|
|
158
|
-
|
|
142
|
+
| Moment | Skill | Result |
|
|
143
|
+
|---|---|---|
|
|
144
|
+
| Entering a repository | `/luciazero-bootstrap` | Finds or creates a verify command and proves it can fail |
|
|
145
|
+
| Before risky or multi-step work | `/plan` | Fixes scope and observable acceptance evidence |
|
|
146
|
+
| A bug survives the first look | `/debug` | Reproduction, hypothesis ledger, regression test |
|
|
147
|
+
| Good and bad revisions are known | `/bisect` | Finds the first bad commit in a temporary worktree |
|
|
148
|
+
| Before claiming completion | `/done` | Full verify, skeptic review, scope report |
|
|
149
|
+
| Work must move elsewhere | `/lucia-relay` | Portable JSON + Markdown state with drift inspection |
|
|
150
|
+
| Optimizing performance | `/experiment` | Baseline, threshold, controlled measurement |
|
|
151
|
+
| Reviewing local verify habits | `/discipline-report` | Time/project-filtered local outcome report |
|
|
152
|
+
| After difficult work | `/retro` | Stores reusable lessons and disproved approaches |
|
|
159
153
|
|
|
160
|
-
|
|
154
|
+
Risky diffs also pass through one read-only `reviewer` with `security`,
|
|
155
|
+
`contract`, or `general` focus. Security and contract risk together receive two
|
|
156
|
+
separate passes.
|
|
161
157
|
|
|
162
|
-
|
|
158
|
+
## Evidence
|
|
163
159
|
|
|
164
|
-
|
|
160
|
+
<!-- BEGIN GENERATED: benchmark-evidence -->
|
|
165
161
|
|
|
166
|
-
|
|
162
|
+
### Claude results
|
|
167
163
|
|
|
168
|
-
|
|
164
|
+
Snapshot: 2026-08-11. All-criteria pass rate generated from checked-in raw rows:
|
|
169
165
|
|
|
170
|
-
|
|
166
|
+
| Claude model | Luciazero | Bare | Difference |
|
|
167
|
+
|---|---:|---:|---:|
|
|
168
|
+
| Haiku†, 10 valid/task | 36/60 (60%) | 27/60 (45%) | +15pp |
|
|
169
|
+
| Sonnet, 4–5 valid/task* | 25/27 (93%) | 16/26 (62%) | +31pp |
|
|
171
170
|
|
|
172
|
-
|
|
171
|
+
The `Luciazero` arm installs the classic pack without hooks; it is not a clean
|
|
172
|
+
doctrine-only ablation. *Sonnet is preliminary because eight invalid rows leave
|
|
173
|
+
several arms at four valid runs. The previously stated `+37pp` top-up is retired
|
|
174
|
+
because its replacement raw rows could not be recovered.
|
|
173
175
|
|
|
174
|
-
|
|
176
|
+
†Model provenance is incomplete for Haiku: only 70/140 rows encode model
|
|
177
|
+
identity. The other 70 are attributed at campaign-file/report level and
|
|
178
|
+
cannot be independently verified per row.
|
|
175
179
|
|
|
176
|
-
|
|
180
|
+
### GPT/Codex pilot — exploratory
|
|
177
181
|
|
|
178
|
-
|
|
182
|
+
Snapshot: 2026-08-12.
|
|
179
183
|
|
|
180
|
-
|
|
184
|
+
| Model | Valid invocations | Paired tasks | Luciazero | Bare | Observed difference |
|
|
185
|
+
|---|---:|---:|---:|---:|---:|
|
|
186
|
+
| GPT-5.6 Terra, medium | 11/12* | 5 | 5/5 runs, 28/28 criteria | 5/5 runs, 28/28 criteria | +0pp† |
|
|
181
187
|
|
|
182
|
-
|
|
188
|
+
*One Luciazero run was invalidated by model capacity. †This is a
|
|
189
|
+
**ceiling-effect warning, not evidence of uplift or no effect**: the pilot has
|
|
190
|
+
only one run per arm per task. See the [full benchmark](docs/benchmark.md),
|
|
191
|
+
[campaign registry](eval/results/campaigns.json), and
|
|
192
|
+
[raw pilot rows](eval/results/gpt-5.6-terra-medium-pilot-2026-08-12.jsonl).
|
|
183
193
|
|
|
184
|
-
|
|
185
|
-
<img src="https://raw.githubusercontent.com/ohm41321/luciazero/main/docs/assets/lucia-laptop.png" width="240" alt="Lucia grinding through the eval harness on her laptop">
|
|
186
|
-
</p>
|
|
194
|
+
<!-- END GENERATED: benchmark-evidence -->
|
|
187
195
|
|
|
188
|
-
|
|
196
|
+
## Requirements and safety
|
|
189
197
|
|
|
190
|
-
|
|
198
|
+
- Node.js 18+ for the CLI and discipline report.
|
|
199
|
+
- Bash for classic installers; Python 3 for hooks and Lucia Relay.
|
|
200
|
+
- Core installers, hooks, helpers, and graders are offline. Real behavioral
|
|
201
|
+
evals invoke a model CLI and consume API credit or subscription quota.
|
|
202
|
+
- Hooks run commands on your machine. Read them before enabling them.
|
|
203
|
+
- Set `LUCIAZERO_VERIFY_CMD` to the repo's exact fast verify command.
|
|
204
|
+
- Put `LUCIAZERO_STRICT_VERIFY_CMD` only in personal settings, never in a
|
|
205
|
+
committed repository config. Strict mode fails open on internal errors.
|
|
191
206
|
|
|
192
|
-
|
|
207
|
+
See [SECURITY.md](SECURITY.md) for the complete trust boundary.
|
|
193
208
|
|
|
194
209
|
## Development
|
|
195
210
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
```
|
|
199
|
-
$ ./test.sh
|
|
200
|
-
PASS all checks green
|
|
211
|
+
```bash
|
|
212
|
+
./test.sh
|
|
201
213
|
```
|
|
202
214
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
215
|
+
The suite covers scripts, hook state, Relay, bisect, plugin/npm manifests,
|
|
216
|
+
self-proving eval graders, and sandboxed install → reinstall → uninstall for
|
|
217
|
+
Claude Code and Codex.
|
|
206
218
|
|
|
207
|
-
|
|
219
|
+
More detail:
|
|
220
|
+
|
|
221
|
+
- [Architecture and trade-offs](docs/comparison.md)
|
|
222
|
+
- [Eval methodology](eval/README.md)
|
|
223
|
+
- [Benchmark results and GPT plan](docs/benchmark.md)
|
|
224
|
+
- [Raw campaign registry](eval/results/campaigns.json)
|
|
225
|
+
- [Experiment log](docs/experiments.md)
|
|
226
|
+
- [Contributing](CONTRIBUTING.md)
|
|
227
|
+
- [Publishing](docs/publishing.md)
|
|
228
|
+
- [Changelog](CHANGELOG.md)
|
|
208
229
|
|
|
209
|
-
|
|
230
|
+
## Lucia family & support
|
|
210
231
|
|
|
211
|
-
|
|
232
|
+
Luciazero shares its mascot with [Lucia](https://lucia-discord-bot.vercel.app),
|
|
233
|
+
a Thai-language Discord bot. If Luciazero saves you review cycles, you can
|
|
234
|
+
[support the project here](https://easydonate.app/itsathitz) 💚
|
|
212
235
|
|
|
213
236
|
## License
|
|
214
237
|
|