sibyl-system 1.2.2 → 1.3.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.
Files changed (4) hide show
  1. package/README.md +32 -2
  2. package/dist/cli.js +356 -187
  3. package/dist/index.js +568 -174
  4. package/package.json +1 -1
package/README.md CHANGED
@@ -164,6 +164,28 @@ Plainly stated:
164
164
  0-confidence REJECT ballot with reason `verdict-unparseable: …`.
165
165
  - There is no lenient mode, by design.
166
166
 
167
+ ## Ballot-integrity laws (W1–W3, added 2026-10-05 after the campaign postmortems)
168
+
169
+ - **Convener recusal (W1).** Every consult/swarm/review run resolves the
170
+ convening execution chain through the engine's own session store
171
+ (`session.get` parent links — never a self-report) and scans it for drafting
172
+ evidence of the artifact (write/edit parts targeting it, or content matches).
173
+ A kinship hit stamps the run `independence=NOT-INDEPENDENT`: the ballot is
174
+ preserved as data but is not in any effective path. A chain that cannot be
175
+ read stamps `UNVERIFIABLE` — unreadable is never silently clean.
176
+ - **Absence is a disability (W2).** Before any tally is honored, every declared
177
+ voter/worker must have left a terminal row (`ok|error|timeout` + detail) in
178
+ the run's `TERMINALS.txt`. A declared seat without its row is counted
179
+ `dead-without-record=N` on the first receipt line and forces `CANNOT_ANSWER` —
180
+ never folded into an approve or a reject. A worker session ending with empty
181
+ content is a failure, not a done ballot.
182
+ - **The ruler rides the ballot (W3).** Each terminal record embeds
183
+ `instrument: {rulesHash, components}` — the sha256 of every persona prompt /
184
+ criteria text the build actually sends (councilors, architect, judge, repair
185
+ grammar, chamber roles). `rulesHash` flips with any ruler edit, so
186
+ "re-evaluate under the new rules" is reproducible and comparable; the
187
+ `rules=<12hex>` label rides the receipt face and `sibyl_status` lines.
188
+
167
189
  ## Security notes
168
190
 
169
191
  - Consult/swarm send the artifact text to your configured model pool providers.
@@ -198,7 +220,15 @@ index.ts plugin entry: parse options → share one RunStore + client
198
220
  │ transcript/disk signal grading, canary veto
199
221
  ├── state/ RunStore + v1.1 chamber records: EOF-append ledger (A5),
200
222
  │ face-last regeneration, CHECKSUMS + spotcheck (A4)
201
- ├── personas.ts registry: 3 councilors + ARCHITECT, model slots
223
+ ├── personas.ts registry: 3 councilors + ARCHITECT + judge/repair texts,
224
+ │ model slots — the single source the W3 face hashes
225
+ ├── terminal.ts W2 terminal-row grammar (ok|error|timeout), parse + the
226
+ │ dead-without-record declared-minus-recorded diff
227
+ ├── instrument.ts W3 ruler face: sha256 set of the live prompt/criteria
228
+ │ texts + deterministic rulesHash fold
229
+ ├── independence.ts W1 convener-recusal: engine-store chain walk +
230
+ │ drafting-evidence scan (INDEPENDENT / NOT-INDEPENDENT /
231
+ │ UNVERIFIABLE, fail-closed on unreadable)
202
232
  ├── options.ts zod v4 schema + parseOptions (never throws)
203
233
  ├── cli.ts v1.1 sibyl-chamber bin: run | status | spotcheck | kill
204
234
  └── tools/ sibyl_consult / sibyl_swarm / sibyl_status / sibyl_review
@@ -250,4 +280,4 @@ MIT
250
280
 
251
281
  ## Release wheel
252
282
 
253
- Tags v* require a packet receipt (docs/release/<ver>.md with a real `gate: PASS` line) and a lease; after cloning run `scripts/install-hooks.sh` — hooks are per-clone and ship empty.
283
+ Tags v* require a packet receipt (docs/release/<ver>.md with a real `gate: PASS` line) and a lease; after cloning run `scripts/install-hooks.sh` — hooks are per-clone and ship empty. **W4 (2026-10-05):** the hook reads the receipt AND `package.json`'s version exclusively from the pushed tag's **object body** (`git show <oid>:<path>`); working-tree reads are forbidden — the tag must carry its own paperwork, and the in-tag version must equal the tag name (ghost-version class killed). Regression-locked in `test/hook-prepush.test.ts` (ref lines fed via stdin).