sibyl-system 1.4.0 → 1.6.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 +24 -5
  2. package/dist/cli.js +1631 -771
  3. package/dist/index.js +3945 -15322
  4. package/package.json +10 -5
package/README.md CHANGED
@@ -104,8 +104,8 @@ stderr, registers nothing, and returns empty hooks.
104
104
  | `sibyl_status` | `{ runId? }` | Read-only. Lists all recorded runs (newest last) + the last chamber-ledger rows, or shows one run's full record and space dir. |
105
105
  | `sibyl_review` | `{ target, goal, seed?, maxRounds? }` | v1.1 general democratic-centralism chamber: launches the isolated evidence→clash→judge pipeline detached and returns a receipt (explicitly NOT a verdict); the single voice lands in the run record at terminal state. CLI twin: `sibyl-chamber`. |
106
106
  | `sibyl_anchor_check` | `{ sessionId, index?, body?, expectSha256?, label? }` | Read-only verifier for "human anchor" claims (an order/approval message the owner says they sent): re-checks the claim against the engine's own session store instead of trusting a transcribed string. Closed 4-state verdict `MATCH` / `MISMATCH` / `ABSENT` / `ERROR`; the receipt carries a hash of the canonical view read, so later store mutation shows up as a view-hash difference. No `expectSha256` claim → non-verdict. |
107
- | `sibyl_time_probe` | `{ endpoints?, toleranceMs? }` | Clock-integrity check against independent HTTP `Date` headers (default pool: cloudflare / google / mozilla; sources with the same owner dept collapse to ONE source). Verdict: `SYNCED` / `DRIFT` / `INSUFFICIENT-SOURCES` (< 2 distinct owners is never consent). Default tolerance 300000 ms. Reads remote endpoints; sends no data beyond a HEAD request. |
108
- | `sibyl_attribute` | `{ moves, commits, roster }` | Pure comparator (zero network/git of its own): attributes git ref-moves to committer identities against a roster. Per-move verdict: `ATTRIBUTED` / `UNATTRIBUTED` (the silent-egress case) / `AMBIGUOUS` (byte-equal roster pair = registry defect, blocks, never picks). Identity matching is byte-exact by design — no normalization. |
107
+ | `sibyl_time_probe` | `{ endpoints?, toleranceMs? }` | Clock-integrity check against independent HTTP `Date` headers (default pool: cloudflare / google / mozilla; sources with the same owner dept collapse to ONE source). Verdict: `SYNCED` / `DRIFT` / `INSUFFICIENT-SOURCES` (< 2 distinct owners is never consent). Default tolerance 300000 ms. `endpoints` JSON is shape-validated and every URL passes the egress gate before any fetch (reserved/internal shapes refused by rule name; blocked = failed receipt, never consent). HEAD only, zero payload, redirects not followed. |
108
+ | `sibyl_attribute` | `{ moves, commits, roster }` | Pure comparator (zero network/git of its own): attributes git ref-moves to committer identities against a roster. Per-move verdict: `ATTRIBUTED` / `UNATTRIBUTED` (the silent-egress case) / `AMBIGUOUS` (byte-equal roster pair = registry defect, blocks, never picks). Identity matching is byte-exact by design — no normalization. `moves`/`roster` JSON is shape-validated; malformed input is refused by name (entry-indexed), never guessed at. |
109
109
 
110
110
  ## Options
111
111
 
@@ -208,13 +208,28 @@ Plainly stated:
208
208
 
209
209
  ## Security notes
210
210
 
211
+ See **[SECURITY.md](SECURITY.md)** for the disclosure channel (private GitHub
212
+ advisory), the full data-egress map, and the honestly-named limitations.
213
+ Summary:
214
+
211
215
  - Consult/swarm send the artifact text to your configured model pool providers.
216
+ - `sibyl_time_probe` fetches nothing before the URL passes the egress gate
217
+ (v1.5.0): reserved/internal address shapes, single-label hosts, non-http(s)
218
+ schemes, userinfo and non-default ports are refused by rule name; a blocked
219
+ source is a failed receipt, never consent.
212
220
  - The plugin writes under its state paths (the runs file and the per-run space) and,
213
221
  for chamber/exam lanes, sealed run directories under `lane.runRoot`
214
222
  (default `/tmp`), every plugin-created dir `0700` (mkdir mode + explicit chmod:
215
223
  unreachable to group/other regardless of umask — v1.4.0 private-dir law) —
216
224
  role homes, transcripts, pidfiles, CHECKSUMS.
217
225
  - Voter/worker turns run with `bash`, `edit`, and `write` disabled per prompt.
226
+ - Supply-chain seating (v1.6.0): actions SHA-pinned, CI installs with
227
+ `--ignore-scripts`, weekly scheduled `npm audit` witnessed server-side by the
228
+ pre-publish liveness gate (fresh green run bound to the released commit).
229
+ Honest status ledger of every vector, open or closed: [OPEN-VECTORS.md](OPEN-VECTORS.md).
230
+ - Engine sessions this product spawns are retained under bounded ages
231
+ (`npm run reap`, dry-run by default; audit conveners >= 90 days per owner
232
+ ruling, reconciliation face preserved in the sealed manifest).
218
233
 
219
234
  ## Architecture (`src/`)
220
235
 
@@ -253,8 +268,10 @@ index.ts plugin entry: parse options → share one RunStore + client
253
268
  ├── independence.ts W1 convener-recusal: engine-store chain walk +
254
269
  │ drafting-evidence scan (INDEPENDENT / NOT-INDEPENDENT /
255
270
  │ UNVERIFIABLE, fail-closed on unreadable)
256
- ├── options.ts zod v4 schema + parseOptions (never throws)
271
+ ├── options.ts zod v4 schema + parseOptions (never throws); home of the
272
+ │ config-default single sources (DEFAULT_TIMEOUT_MS)
257
273
  ├── cli.ts v1.1 sibyl-chamber bin: run | status | spotcheck | kill
274
+ ├── util.ts v1.5.0 single definitions: withTimeout + errMessage
258
275
  └── tools/ sibyl_consult / sibyl_swarm / sibyl_status / sibyl_review
259
276
  + audit primitives (anchor / time probe / attribution)
260
277
  glue + shared helpers (model-slot chain, artifact reader)
@@ -272,7 +289,9 @@ PLAN→MINT→DISPATCH→AGGREGATE pipeline over ordinary child sessions.
272
289
 
273
290
  ```bash
274
291
  npm run typecheck # tsc --noEmit, strict + noUncheckedIndexedAccess + exactOptionalPropertyTypes
275
- npm test # full unit suite, fully offline (no network, no LLM; 459 at v1.4.0 — the run prints the exact count)
292
+ npm test # full unit suite, fully offline (no network, no LLM; 497 at v1.6.0 — the run prints the exact count)
293
+ npm run reap # session-retention reaper: dry-run manifest by default; -- --apply deletes via the engine API
294
+ npm run coverage # offline suite + coverage floor ratchet (lines 55 / branches 80 / funcs 90 — floors only move up; CI door)
276
295
  npm run build # esbuild bundle → dist/index.js + dist/cli.js (ESM)
277
296
  node smoke/run-smoke.mjs # offline smoke of the shipped surface (see smoke/README.md)
278
297
  ./ship.sh # the full release gate: all of the above + portability scan of the packed tarball
@@ -304,4 +323,4 @@ MIT
304
323
 
305
324
  ## Release wheel
306
325
 
307
- 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).
326
+ 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). **Tag-body hygiene (2026-10-24):** annotated-tag message bodies are scanned on push — home-path and email shapes refuse by rule name (the message is public release content; anchor facts by hash/run-id, not machine paths). Regression-locked in `test/hook-prepush.test.ts` (ref lines fed via stdin).