@arnilo/prism 0.0.8 → 0.0.10
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 +30 -3
- package/dist/agent-loops.js +7 -3
- package/dist/agents.js +16 -1
- package/dist/contracts.d.ts +2 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/provider-events.d.ts +2 -0
- package/dist/provider-events.js +21 -13
- package/dist/providers/openai-compatible.js +8 -5
- package/dist/providers/transport.d.ts +10 -1
- package/dist/providers/transport.js +24 -8
- package/dist/tools.js +2 -0
- package/docs/agent-events.md +3 -2
- package/docs/agent-loops.md +2 -2
- package/docs/browser-automation.md +124 -0
- package/docs/coding-agent-tools.md +111 -14
- package/docs/coding-security.md +84 -11
- package/docs/evaluations.md +13 -2
- package/docs/guardrails.md +2 -1
- package/docs/host-security.md +4 -2
- package/docs/index.md +10 -7
- package/docs/migration.md +68 -0
- package/docs/performance.md +29 -0
- package/docs/provider-conformance.md +1 -1
- package/docs/provider-primitives.md +7 -1
- package/docs/release-and-install.md +89 -45
- package/docs/review-coverage-2026-07-20-phase-4.md +175 -0
- package/docs/review-coverage-2026-07-21-phase-5.md +172 -0
- package/docs/structured-output.md +2 -2
- package/docs/tools.md +3 -0
- package/docs/web-tools.md +1 -1
- package/docs/workflows.md +1 -0
- package/package.json +5 -4
package/docs/performance.md
CHANGED
|
@@ -6,6 +6,25 @@ Evaluation defaults are finite: 100 trace rows × 20 pages and 4 MiB aggregate t
|
|
|
6
6
|
|
|
7
7
|
This page states Prism runtime limits that keep slow consumers and long sessions from becoming unbounded memory or latency problems.
|
|
8
8
|
|
|
9
|
+
## Release 0.0.10 reproducible workspace-mode evidence
|
|
10
|
+
|
|
11
|
+
Run `node scripts/benchmark-0.0.10.mjs`; `PRISM_BENCH_ITERATIONS` accepts 10–100,000 (default 100). Schema/bounds test: `node --test scripts/benchmark-0.0.10.test.mjs`. Default mode is network-free: host-composition write/read/list plus sandbox-fake composition write/read/list/search (in-memory `DisposableSandbox`). Emits environment, scenario mode, throughput, p50/p95 latency, heap, disk bytes, process counts, zero external cost, backpressure, and resource-limit signals. Optional `PRISM_BENCH_DOCKER=1` (with `PRISM_TEST_DOCKER_*`) appends real local Docker composition rows. Unified workspace mode reuses existing sandbox/repo hard caps and adds no unbounded host↔container sync. These are evidence fields, not CI timing gates.
|
|
12
|
+
|
|
13
|
+
## Release 0.0.9 reproducible coding/browser evidence
|
|
14
|
+
|
|
15
|
+
Run `node scripts/benchmark-0.0.9.mjs`; `PRISM_BENCH_ITERATIONS` accepts 10–100,000 (default 100). Schema/bounds test: `node --test scripts/benchmark-0.0.9.test.mjs`. Default mode is network-free fake/in-process only and emits environment, scenario mode, throughput, p50/p95 latency, heap, disk bytes, process counts, zero external cost, backpressure, and resource-limit signals for repository list/search, Git status, and browser open/snapshot/action/close. Optional `PRISM_BENCH_DOCKER=1` (with `PRISM_TEST_DOCKER_*`) and `PRISM_BENCH_PLAYWRIGHT=1` append real local Docker / protected Playwright rows. These are evidence fields, not CI timing gates.
|
|
16
|
+
|
|
17
|
+
2026-07-21 baseline: Node v24.18.0, Linux x64, 100 iterations/scenario, network=false, credentials=false, docker=false, playwright=false.
|
|
18
|
+
|
|
19
|
+
| Scenario | mode | ops/s | p95 ms | heap bytes | disk bytes | processes | cost USD | backpressure | resource limits |
|
|
20
|
+
| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
|
|
21
|
+
| repo-list | fake-in-process | 1,343 | 1.11 | 14,747,560 | 0 | 1 | 0 | 0 | 0 |
|
|
22
|
+
| repo-search | fake-in-process | 380 | 3.72 | 16,093,176 | 0 | 1 | 0 | 0 | 0 |
|
|
23
|
+
| git-status | fake-in-process | 479 | 2.62 | 13,821,688 | 0 | 1 | 0 | 0 | 0 |
|
|
24
|
+
| browser-open-snapshot-action-close | fake-in-process | 17,141 | 0.11 | 18,590,488 | 0 | 1 | 0 | 0 | 0 |
|
|
25
|
+
|
|
26
|
+
Rows exercise shipped repository/Git helpers and fake Playwright APIs only. Real Docker sandbox and Playwright browser timings remain explicit protected-gate evidence (`PRISM_TEST_DOCKER_SANDBOX=1`, `PRISM_LIVE_PLAYWRIGHT=1` / `PRISM_BENCH_DOCKER=1` / `PRISM_BENCH_PLAYWRIGHT=1`) because this release-candidate host did not enable those gates for the dated baseline. No live claim is inferred from skipped gates.
|
|
27
|
+
|
|
9
28
|
## Release 0.0.8 reproducible synthetic evidence
|
|
10
29
|
|
|
11
30
|
Run `node scripts/benchmark-0.0.8.mjs`; `PRISM_BENCH_ITERATIONS` accepts 10–100,000. Script uses no network/credentials and emits environment, throughput, p50/p95 latency, heap, synthetic disk bytes, zero external cost, and backpressure signals. These are evidence fields, not CI timing gates.
|
|
@@ -29,6 +48,16 @@ Security automation is isolated from `npm test`: CodeQL/supply-chain jobs have 1
|
|
|
29
48
|
|
|
30
49
|
Web tools default/hard ceilings are query 4/16 KiB, results 10/20, URLs 5/20, request 256 KiB/1 MiB, response/aggregate 2/16 MiB, Markdown 1/8 MiB, extraction 256 KiB/1 MiB, schema 64/256 KiB, concurrency 4/16, retries 2/4, polling 20/100, and wall time 60 seconds/30 minutes. Bounds charge before request, retention, retry, or polling; overflow fails rather than truncating citation/extraction evidence.
|
|
31
50
|
|
|
51
|
+
Docker sandbox defaults/hard caps from `@arnilo/prism-coding-security`: startup 30 s/120 s; wall 20 min/30 min; idle 5 min/15 min; CPUs 2/8; memory 2 GiB/16 GiB (swap equal to memory); PIDs 256/1,024; FDs 1,024/8,192; workspace/tmp/download tmpfs 1 GiB/8 GiB, 256 MiB/2 GiB, 64 MiB/512 MiB; commands 100/256 with concurrent execs 1/8; env 64/256 names and 64 KiB/256 KiB values; export 50,000/250,000 entries and 256 MiB/2 GiB bytes with 16/64 retained artifacts; stop grace 5 s/30 s and cleanup 30 s/120 s. Caps validate before `docker create`/exec/export; overflow aborts and cleans the recorded container. Output still streams into the coding-agent `OutputAccumulator` ceilings (64 MiB/1 GiB).
|
|
52
|
+
|
|
53
|
+
Repository list/search defaults/hard caps from `@arnilo/prism-coding-agent`: depth 32/128; entries/files 10,000/100,000; page/results 1,000/10,000; search scan 64 MiB/1 GiB aggregate and 8 MiB/64 MiB per file; matches 1,000/10,000; pattern 512 B/4 KiB; line 50 KiB/1 MiB; context 5/20; wall 30 s/300 s; concurrency config 8/32. Walks stream via `opendir`/`lstat`, never follow symlink escapes, and stop immediately on aggregate limits or abort.
|
|
54
|
+
|
|
55
|
+
Structured Git/check/handoff defaults/hard caps: paths 1,000/10,000; refs 1 KiB/4 KiB; commit message 64 KiB/256 KiB; inline Git output 4 MiB/64 MiB; diff lines 10,000/100,000; changed files 1,000/10,000; patch input 16 MiB/64 MiB; worktrees 4/16; named checks 8/32 names, concurrency 1/4, timeout 10 min/60 min, diagnostic lines 2,000/100,000, output 4 MiB/64 MiB; PR handoff JSON 256 KiB/1 MiB with 100/1,000 commits. Git tools use typed argument arrays (never shell), disable hooks/credential prompts/external diff by default, and emit host-owned PR handoff data only — no push/network/PR client.
|
|
56
|
+
|
|
57
|
+
Durable coding plan/checkpoint defaults/hard caps: plan Markdown 256 KiB/1 MiB; todos 1,000/10,000 with 512 B/4 KiB text; checkpoint metadata 64 KiB/512 KiB; artifact references 16/64 at 256 MiB/2 GiB each; check summaries 1 KiB/8 KiB. Checkpoints store URI/hash/summaries/fingerprints only; resume revalidates workspace root, base branch, plan hash, and tool/policy/image fingerprints before import.
|
|
58
|
+
|
|
59
|
+
Browser automation defaults/hard caps from `@arnilo/prism-browser`: pages 4/16; actions 100/256; queued actions 16/64; snapshot refs 2,000/10,000; depth 30/100; snapshot bytes 256 KiB/2 MiB; navigation 30 s/120 s; action 10 s/60 s; wait 30 s/120 s; run wall 20 min/30 min; popups 4/16; dialogs 16/64; listeners 64/256; action input 64 KiB/256 KiB; close grace 5 s/30 s; network requests 1,000/10,000 with 10/32 redirects per request and 8/32 WebSockets; screenshots 16/64 with 16/64 megapixels and 10 MiB/32 MiB encoded; uploads 8/32 files, 16 MiB/64 MiB each, 64 MiB/256 MiB aggregate; downloads 8/32 files, 32 MiB/256 MiB each, 64 MiB/512 MiB aggregate. Caps charge before context/page/action/queue/snapshot/network/artifact retention. Host supplies Playwright and egress proxy attestation; package import launches nothing.
|
|
60
|
+
|
|
32
61
|
Current surfaces:
|
|
33
62
|
|
|
34
63
|
- `SubscribeOptions` for bounded live `AgentEvent` subscriber queues.
|
|
@@ -45,7 +45,7 @@ Helpers accept normal `AIProvider`, `ProviderRequest`, `ProviderEvent`, `Usage`,
|
|
|
45
45
|
- `collectProviderEvents()` returns provider events in stream order.
|
|
46
46
|
- `assertProviderStreamConforms()` returns collected events after verifying the stream ends with `done` or `error`, terminal events are last, and optional text/usage expectations match.
|
|
47
47
|
- `assertAbortIsObserved()` passes an already-aborted signal and expects provider generation to reject. This is the supported timeout primitive; use a host abort controller or `RunOptions.signal` rather than deprecated provider-level `timeoutMs`.
|
|
48
|
-
- `assertToolCallDeltasReconstruct()` rebuilds streamed `tool_call_delta` fragments into tool calls and validates expected id/name/arguments. The runtime uses the same reconstruction
|
|
48
|
+
- `assertToolCallDeltasReconstruct()` rebuilds streamed `tool_call_delta` fragments into tool calls and validates expected id/name/arguments. Malformed JSON with id+name present yields `argumentsError` (no throw); missing id/name throws typed `incomplete_delta`. The runtime uses the same reconstruction before tool execution when a provider streams deltas.
|
|
49
49
|
- `assertUsageAccounting()` finds `usage` or `done.usage` and checks selected token fields including `cacheReadTokens` and `cacheWriteTokens`. This is the provider-neutral check for normalized cache read/write token extraction; every first-party provider package exercises it against server-specific fields (`cached_tokens`, `cache_read_input_tokens`, etc.).
|
|
50
50
|
- `assertSerializedRequestCoversContent()` scans a serialized provider request body for primitive canaries from each Prism content block and fails if any supported block type is silently dropped. Provider-valid transcripts place assistant `tool_call` messages before matching role `tool` `tool_result` messages; runtime, cache-aware input layout, and observational-memory worker loops preserve that order before serialization.
|
|
51
51
|
- `assertProviderOwnedHeadersWin()` compares captured request headers against the provider's authoritative owned header values and a caller-supplied header bag; it fails if any owned header (`authorization`, `content-type`, session/security headers) was overridden by caller headers, and also fails if a non-owned caller header was dropped. This is the provider-neutral check that caller `ProviderRequest.options.headers` cannot hijack provider credentials or sessions; every first-party provider package exercises it.
|
|
@@ -110,7 +110,7 @@ export interface SseEvent {
|
|
|
110
110
|
}
|
|
111
111
|
|
|
112
112
|
export class ProviderTransportError extends Error {
|
|
113
|
-
readonly code: "sse_buffer_overflow" | "sse_event_overflow" | "response_body_overflow" | "aborted";
|
|
113
|
+
readonly code: "sse_buffer_overflow" | "sse_event_overflow" | "response_body_overflow" | "aborted" | "invalid_json_arguments" | "incomplete_delta";
|
|
114
114
|
readonly limitBytes?: number;
|
|
115
115
|
}
|
|
116
116
|
|
|
@@ -131,6 +131,12 @@ export function parseJsonObjectArguments(
|
|
|
131
131
|
text: string,
|
|
132
132
|
options?: { toolName?: string; maxBytes?: number },
|
|
133
133
|
): JsonObject;
|
|
134
|
+
|
|
135
|
+
/** Non-throwing variant for recoverable tool-call recovery; prefer with \`toolCallFromArgumentsText\`. */
|
|
136
|
+
export function tryParseJsonObjectArguments(
|
|
137
|
+
text: string,
|
|
138
|
+
options?: { toolName?: string; maxBytes?: number },
|
|
139
|
+
): { ok: true; value: JsonObject } | { ok: false; error: ProviderTransportError };
|
|
134
140
|
```
|
|
135
141
|
|
|
136
142
|
**Performance:** Single pass over chunks; retained memory is `O(min(buffer, maxBufferBytes))`, not `O(stream)`. No full-stream accumulation.
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
## What it does
|
|
4
4
|
|
|
5
|
-
Prism is published as one core package, twenty-
|
|
5
|
+
Prism is published as one core package, twenty-five first-party capability packages, and six pure-manifest family/profile packages. This page describes how they are packed, what each tarball contains, how to install them, the required `@arnilo/prism` peer dependency, the release workflow, and the offline test budget.
|
|
6
6
|
|
|
7
7
|
Core package:
|
|
8
8
|
|
|
9
9
|
- `@arnilo/prism` — the runtime, contracts, registries, streaming events, CLI (including `prism init`), and the `/docs` hub. `files`: `dist` (with `!dist/__tests__` and `!dist/**/*.map` negations), `docs`, `templates`, `CHANGELOG.md`. `bin`: `prism` -> `dist/cli.js`. `sideEffects`: `["dist/cli.js"]`.
|
|
10
10
|
|
|
11
|
-
First-party workspace packages (each has non-optional `@arnilo/prism@0.0.
|
|
11
|
+
First-party workspace packages (each has non-optional `@arnilo/prism@0.0.10` peer and `sideEffects: false`; RAG also peers on memory, and server also peers on workflows):
|
|
12
12
|
|
|
13
13
|
- `@arnilo/prism-provider-openai`, `@arnilo/prism-provider-openrouter`, `@arnilo/prism-provider-kimi`, `@arnilo/prism-provider-zai`, `@arnilo/prism-provider-opencode-go`, `@arnilo/prism-provider-neuralwatt` — provider adapters.
|
|
14
14
|
- `@arnilo/prism-provider-ai-sdk` — optional AI SDK `LanguageModelV4` adapter; included by the provider and all umbrellas.
|
|
@@ -27,6 +27,7 @@ First-party workspace packages (each has non-optional `@arnilo/prism@0.0.8` peer
|
|
|
27
27
|
- `@arnilo/prism-server` — optional framework-free authorized Web agent/workflow routes (peers on workflows).
|
|
28
28
|
- `@arnilo/prism-supervisor` — optional bounded child delegation and A2A 1.0 card/server/client interoperability.
|
|
29
29
|
- `@arnilo/prism-web-tools` — optional bounded host-selected Brave/Exa search and Firecrawl Markdown/schema extraction; native fetch, no vendor SDK/browser.
|
|
30
|
+
- `@arnilo/prism-browser` — optional host-supplied Playwright browser tools (`browser_open`/`browser_snapshot`/`browser_act`/`browser_close`); import launches nothing; `playwright-core@1.61.0` optional peer.
|
|
30
31
|
|
|
31
32
|
Family/profile packages (pure manifests, no code or `dist`; ship `README.md` and `CHANGELOG.md`; use exact hard `dependencies`):
|
|
32
33
|
|
|
@@ -36,9 +37,9 @@ Family/profile packages (pure manifests, no code or `dist`; ship `README.md` and
|
|
|
36
37
|
- `@arnilo/prism-code` — base + coding-agent + coding-security + MCP; providers and persistence remain explicit choices.
|
|
37
38
|
- `@arnilo/prism-sdk` — base + workflows + MCP + Node credentials + OpenTelemetry; providers and persistence remain explicit choices.
|
|
38
39
|
- `@arnilo/prism-evals` remains optional and network-free by default; model judges are host callbacks and live credentialed gates run separately. `examples/evaluation-gate.ts` demonstrates non-zero threshold gating.
|
|
39
|
-
- `@arnilo/prism-all` — every first-party package: code + SDK + providers + persistence + evals + memory/RAG + server + supervisor + web tools. Installation alone activates no network/listener, telemetry, database, memory, evaluation, delegation, MCP, shell, or
|
|
40
|
+
- `@arnilo/prism-all` — every first-party package: code + SDK + providers + persistence + evals + memory/RAG + server + supervisor + web tools + browser. Installation alone activates no network/listener, telemetry, database, memory, evaluation, delegation, MCP, shell, filesystem, or browser capability.
|
|
40
41
|
|
|
41
|
-
Profile footprint snapshot (Node 24/npm 11, lockfile graph, 2026-07-19): `base` reaches 6 first-party packages and one external dependency root (Ajv); `code` reaches 10 and three (Ajv, MCP SDK, diff); `sdk` reaches 11 and three (Ajv, MCP SDK, keyring); `all` reaches all
|
|
42
|
+
Profile footprint snapshot (Node 24/npm 11, lockfile graph, 2026-07-19): `base` reaches 6 first-party packages and one external dependency root (Ajv); `code` reaches 10 and three (Ajv, MCP SDK, diff); `sdk` reaches 11 and three (Ajv, MCP SDK, keyring); `all` reaches all 32 first-party manifests and seven external roots (those plus better-sqlite3, pg, and AI SDK provider types). Native database drivers stay out of base/code/sdk; both appear only in all.
|
|
42
43
|
|
|
43
44
|
Each code package's `files` array is `["dist", "!dist/__tests__", "!dist/**/*.map", "README.md", "CHANGELOG.md"]`; `README.md`, `LICENSE`, and `CHANGELOG.md` ship in every code-package tarball, the core tarball also ships the `docs/` directory, and family/profile tarballs ship `README.md` + `CHANGELOG.md` + `package.json`.
|
|
44
45
|
|
|
@@ -61,13 +62,14 @@ Consumers install the core package for the runtime and add first-party packages
|
|
|
61
62
|
| Install everything | `npm install @arnilo/prism-all` |
|
|
62
63
|
| Install core + a single provider | `npm install @arnilo/prism @arnilo/prism-provider-openai` |
|
|
63
64
|
| Install bounded web research tools | `npm install @arnilo/prism @arnilo/prism-web-tools @arnilo/prism-tool-validator-json-schema` |
|
|
65
|
+
| Install browser automation tools | `npm install @arnilo/prism @arnilo/prism-browser playwright-core@1.61.0` |
|
|
64
66
|
| Build everything (core + workspaces) | `npm run build` |
|
|
65
67
|
| Run the default (network-free) test suite | `npm test` |
|
|
66
68
|
| Dry-run pack core + every package | `npm run pack:dry-run` |
|
|
67
69
|
| Local mirror of the release verify gate | `npm run release:dry-run` |
|
|
68
|
-
| Validate clean tag/version/ranges and reject registry collisions | `npm run release:check -- --version 0.0.
|
|
69
|
-
| Preview deterministic publish order | `npm run release:publish -- --version 0.0.
|
|
70
|
-
| Resume interrupted tagged publication | `npm run release:publish -- --version 0.0.
|
|
70
|
+
| Validate clean tag/version/ranges and reject registry collisions | `npm run release:check -- --version 0.0.10` |
|
|
71
|
+
| Preview deterministic publish order | `npm run release:publish -- --version 0.0.10 --dry-run --allow-dirty --allow-untagged` |
|
|
72
|
+
| Resume interrupted tagged publication | `npm run release:publish -- --version 0.0.10 --resume --report release-artifacts/publish-report.json` |
|
|
71
73
|
| Full SDK readiness gate (typecheck + offline tests + pack) | `npm run sdk:ready` |
|
|
72
74
|
|
|
73
75
|
Public core import specifiers (from the root `exports` map):
|
|
@@ -104,7 +106,7 @@ A packed tarball contains only public compiled output and release files:
|
|
|
104
106
|
- Code packages ship `README.md`, `LICENSE`, and `CHANGELOG.md`; family/profile packages ship `README.md` and `CHANGELOG.md`.
|
|
105
107
|
- The core tarball additionally ships the full `docs/` directory (the docs hub) and `templates/init/` used by `prism init`.
|
|
106
108
|
- `dist/cli.js` and the `bin` link in core.
|
|
107
|
-
- **Tarball filenames.** npm strips the `@scope/` prefix, so the core package `@arnilo/prism` produces a tarball named `arnilo-prism-0.0.
|
|
109
|
+
- **Tarball filenames.** npm strips the `@scope/` prefix, so the core package `@arnilo/prism` produces a tarball named `arnilo-prism-0.0.10.tgz`; first-party packages produce `arnilo-prism-provider-<name>-0.0.10.tgz` / `arnilo-prism-compaction-<name>-0.0.10.tgz` / `arnilo-prism-coding-agent-0.0.10.tgz`; family/profile packages produce `arnilo-prism-{providers,compaction,base,code,sdk,all}-0.0.10.tgz`. The CLI bin name `prism` is unaffected by the package name (`npx prism` still works; npm allows the bin field to differ from the package name).
|
|
108
110
|
|
|
109
111
|
Excluded from every tarball by `files` negation:
|
|
110
112
|
|
|
@@ -123,9 +125,9 @@ Excluded from every tarball by `files` negation:
|
|
|
123
125
|
"name": "host-app",
|
|
124
126
|
"type": "module",
|
|
125
127
|
"dependencies": {
|
|
126
|
-
"@arnilo/prism": "0.0.
|
|
127
|
-
"@arnilo/prism-provider-openai": "0.0.
|
|
128
|
-
"@arnilo/prism-compaction-observational-memory": "0.0.
|
|
128
|
+
"@arnilo/prism": "0.0.10",
|
|
129
|
+
"@arnilo/prism-provider-openai": "0.0.10",
|
|
130
|
+
"@arnilo/prism-compaction-observational-memory": "0.0.10"
|
|
129
131
|
}
|
|
130
132
|
}
|
|
131
133
|
```
|
|
@@ -135,7 +137,7 @@ Installing the provider/compaction packages without `@arnilo/prism` present prod
|
|
|
135
137
|
```text
|
|
136
138
|
npm error code ERESOLVE
|
|
137
139
|
npm error Could not resolve dependency:
|
|
138
|
-
npm error peer @arnilo/prism@"0.0.
|
|
140
|
+
npm error peer @arnilo/prism@"0.0.10" from @arnilo/prism-provider-openai@0.0.10
|
|
139
141
|
```
|
|
140
142
|
|
|
141
143
|
## Implementation example
|
|
@@ -168,11 +170,11 @@ For SDK readiness, run the same one-command gate directly. It composes existing
|
|
|
168
170
|
npm run sdk:ready
|
|
169
171
|
```
|
|
170
172
|
|
|
171
|
-
Release publication derives all
|
|
173
|
+
Release publication derives all 32 packages from the workspace once, validates exact `0.0.10` manifest/lockfile/internal ranges, then uses deterministic dependency order. `release:check` requires a clean commit tagged `v0.0.10` and rejects any existing registry version. `release:publish --resume` skips only registry versions whose internal dependency fingerprint matches the local manifest; conflicting versions fail closed. Each attempted package is written immediately to the JSON report, so a failed job can rerun safely. `--dry-run` still performs registry availability checks and invokes `npm publish --dry-run` with explicit public access, provenance, and `latest` tag.
|
|
172
174
|
|
|
173
175
|
```bash
|
|
174
|
-
npm run release:check -- --version 0.0.
|
|
175
|
-
npm run release:publish -- --version 0.0.
|
|
176
|
+
npm run release:check -- --version 0.0.10
|
|
177
|
+
npm run release:publish -- --version 0.0.10 --dry-run --allow-dirty --allow-untagged
|
|
176
178
|
```
|
|
177
179
|
|
|
178
180
|
`--allow-dirty` and `--allow-untagged` exist only for local preview; real publication and CI never pass them. npm registry calls occur only in these release preflight/publication commands, never build/test/package discovery.
|
|
@@ -183,9 +185,9 @@ Optional live smoke tests stay separate from SDK readiness because they require
|
|
|
183
185
|
PRISM_LIVE_PROVIDER_TESTS=1 npm run test --workspaces --if-present
|
|
184
186
|
```
|
|
185
187
|
|
|
186
|
-
### 0.0.
|
|
188
|
+
### 0.0.10 publish handoff
|
|
187
189
|
|
|
188
|
-
**Decision: GO after operator prerequisites below.** Code, tests, package graph
|
|
190
|
+
**Decision: GO after operator prerequisites below.** Phase 5 coding-harness unified workspace: required `workspaceMode`, fail-closed mixed wiring, sandbox FS auto-wire, tree identity, adversarial consistency tests, and `scripts/benchmark-0.0.10.mjs` evidence. Code, tests, exact `0.0.10` package graph (retargeted from post-ship `0.0.96`), packed artifacts, security gates, and dependency-ordered publication dry-run passed from the Phase 5 release-candidate tree. Clean protected-branch CI, signed commit/tag, npm authentication, OIDC attestation, protected Docker/Playwright live gates (when host-provisioned), and actual publication remain operator/workflow prerequisites. No package was published during readiness work. Scope is coding-harness P0 only; **no Office** package, binary, SDK, wrapper, docs page, test, or release gate exists. Host mode never claims disposable containment.
|
|
189
191
|
|
|
190
192
|
#### npm authentication prerequisite
|
|
191
193
|
|
|
@@ -193,7 +195,7 @@ The existing GitHub Actions secret `NPM_TOKEN` is used only by the publish step
|
|
|
193
195
|
|
|
194
196
|
#### Release commit and tag
|
|
195
197
|
|
|
196
|
-
Merge through the protected release branch, then run these commands from a clean checkout of the protected merge commit. `git push origin v0.0.
|
|
198
|
+
Merge through the protected release branch, then run these commands from a clean checkout of the protected merge commit. `git push origin v0.0.10` is the workflow dispatch; there is no manual publish command.
|
|
197
199
|
|
|
198
200
|
```bash
|
|
199
201
|
# Prepare and push the release commit.
|
|
@@ -202,22 +204,22 @@ npm ci
|
|
|
202
204
|
npm run sdk:ready
|
|
203
205
|
git add -A
|
|
204
206
|
git diff --cached --check
|
|
205
|
-
git commit -S -m "Release 0.0.
|
|
207
|
+
git commit -S -m "Release 0.0.10"
|
|
206
208
|
git push origin HEAD
|
|
207
209
|
|
|
208
210
|
# Merge/confirm protected branch CI, then check out that exact clean merge commit.
|
|
209
211
|
test -z "$(git status --porcelain)"
|
|
210
212
|
npm ci
|
|
211
|
-
npm run release:check -- --version 0.0.
|
|
213
|
+
npm run release:check -- --version 0.0.10 --allow-untagged --report /tmp/prism-0.0.10-preflight.json
|
|
212
214
|
|
|
213
|
-
git tag -s v0.0.
|
|
214
|
-
git verify-tag v0.0.
|
|
215
|
-
test "$(git rev-parse HEAD)" = "$(git rev-list -n 1 v0.0.
|
|
216
|
-
npm run release:check -- --version 0.0.
|
|
217
|
-
git push origin v0.0.
|
|
215
|
+
git tag -s v0.0.10 -m "Prism 0.0.10"
|
|
216
|
+
git verify-tag v0.0.10
|
|
217
|
+
test "$(git rev-parse HEAD)" = "$(git rev-list -n 1 v0.0.10)"
|
|
218
|
+
npm run release:check -- --version 0.0.10 --report /tmp/prism-0.0.10-tagged-preflight.json
|
|
219
|
+
git push origin v0.0.10
|
|
218
220
|
```
|
|
219
221
|
|
|
220
|
-
The tag workflow's only publication command is `npm run release:publish -- --version "${GITHUB_REF_NAME#v}" --resume --report release-artifacts/publish-report.json`. Latest registry preflight returned `available` for all
|
|
222
|
+
The tag workflow's only publication command is `npm run release:publish -- --version "${GITHUB_REF_NAME#v}" --resume --report release-artifacts/publish-report.json`. Latest registry preflight returned `available` for all 32 `0.0.10` versions at handoff. Publisher order is stable and dependency-safe:
|
|
221
223
|
|
|
222
224
|
```text
|
|
223
225
|
1 @arnilo/prism
|
|
@@ -241,21 +243,22 @@ The tag workflow's only publication command is `npm run release:publish -- --ver
|
|
|
241
243
|
19 @arnilo/prism-supervisor
|
|
242
244
|
20 @arnilo/prism-tool-validator-json-schema
|
|
243
245
|
21 @arnilo/prism-web-tools
|
|
244
|
-
22 @arnilo/prism-
|
|
245
|
-
23 @arnilo/prism-
|
|
246
|
-
24 @arnilo/prism-
|
|
247
|
-
25 @arnilo/prism-
|
|
248
|
-
26 @arnilo/prism-
|
|
249
|
-
27 @arnilo/prism-
|
|
250
|
-
28 @arnilo/prism-
|
|
251
|
-
29 @arnilo/prism-
|
|
252
|
-
30 @arnilo/prism-
|
|
253
|
-
31 @arnilo/prism-
|
|
246
|
+
22 @arnilo/prism-browser
|
|
247
|
+
23 @arnilo/prism-workflows
|
|
248
|
+
24 @arnilo/prism-coding-security
|
|
249
|
+
25 @arnilo/prism-compaction
|
|
250
|
+
26 @arnilo/prism-providers
|
|
251
|
+
27 @arnilo/prism-rag
|
|
252
|
+
28 @arnilo/prism-server
|
|
253
|
+
29 @arnilo/prism-base
|
|
254
|
+
30 @arnilo/prism-code
|
|
255
|
+
31 @arnilo/prism-sdk
|
|
256
|
+
32 @arnilo/prism-all
|
|
254
257
|
```
|
|
255
258
|
|
|
256
259
|
#### Interruption and resume
|
|
257
260
|
|
|
258
|
-
Do not create another tag or rerun packages manually. Re-run failed jobs for the same tag in GitHub Actions. The workflow invokes `release:publish --resume`: registry versions with matching names, versions, and internal dependency fingerprints are skipped; any mismatch stops the job. Retain `release-artifacts-v0.0.
|
|
261
|
+
Do not create another tag or rerun packages manually. Re-run failed jobs for the same tag in GitHub Actions. The workflow invokes `release:publish --resume`: registry versions with matching names, versions, and internal dependency fingerprints are skipped; any mismatch stops the job. Retain `release-artifacts-v0.0.10` and `publish-report-v0.0.10` for audit.
|
|
259
262
|
|
|
260
263
|
#### Bounded post-publish smoke
|
|
261
264
|
|
|
@@ -263,9 +266,9 @@ Download the workflow artifact and run `sha256sum -c SHA256SUMS`. Then verify al
|
|
|
263
266
|
|
|
264
267
|
```bash
|
|
265
268
|
while read -r package; do
|
|
266
|
-
test "$(npm view "$package@0.0.
|
|
267
|
-
test "$(npm view "$package" dist-tags.latest)" = "0.0.
|
|
268
|
-
npm view "$package@0.0.
|
|
269
|
+
test "$(npm view "$package@0.0.10" version)" = "0.0.10"
|
|
270
|
+
test "$(npm view "$package" dist-tags.latest)" = "0.0.10"
|
|
271
|
+
npm view "$package@0.0.10" dist.integrity >/dev/null
|
|
269
272
|
done <<'PACKAGES'
|
|
270
273
|
@arnilo/prism
|
|
271
274
|
@arnilo/prism-coding-agent
|
|
@@ -279,6 +282,7 @@ done <<'PACKAGES'
|
|
|
279
282
|
@arnilo/prism-server
|
|
280
283
|
@arnilo/prism-supervisor
|
|
281
284
|
@arnilo/prism-observability-opentelemetry
|
|
285
|
+
@arnilo/prism-provider-ai-sdk
|
|
282
286
|
@arnilo/prism-provider-kimi
|
|
283
287
|
@arnilo/prism-provider-neuralwatt
|
|
284
288
|
@arnilo/prism-provider-openai
|
|
@@ -289,6 +293,7 @@ done <<'PACKAGES'
|
|
|
289
293
|
@arnilo/prism-session-store-sqlite
|
|
290
294
|
@arnilo/prism-tool-validator-json-schema
|
|
291
295
|
@arnilo/prism-web-tools
|
|
296
|
+
@arnilo/prism-browser
|
|
292
297
|
@arnilo/prism-workflows
|
|
293
298
|
@arnilo/prism-coding-security
|
|
294
299
|
@arnilo/prism-compaction
|
|
@@ -302,7 +307,7 @@ PACKAGES
|
|
|
302
307
|
consumer="$(mktemp -d)"
|
|
303
308
|
cd "$consumer"
|
|
304
309
|
npm init -y >/dev/null
|
|
305
|
-
npm install --no-audit --no-fund @arnilo/prism-all@0.0.
|
|
310
|
+
npm install --no-audit --no-fund @arnilo/prism-all@0.0.10
|
|
306
311
|
node --input-type=module <<'NODE'
|
|
307
312
|
for (const name of [
|
|
308
313
|
"@arnilo/prism", "@arnilo/prism-coding-agent", "@arnilo/prism-coding-security",
|
|
@@ -314,6 +319,7 @@ for (const name of [
|
|
|
314
319
|
"@arnilo/prism-tool-validator-json-schema", "@arnilo/prism-workflows", "@arnilo/prism-evals",
|
|
315
320
|
"@arnilo/prism-provider-ai-sdk", "@arnilo/prism-memory", "@arnilo/prism-rag",
|
|
316
321
|
"@arnilo/prism-server", "@arnilo/prism-supervisor", "@arnilo/prism-web-tools",
|
|
322
|
+
"@arnilo/prism-browser",
|
|
317
323
|
]) await import(name);
|
|
318
324
|
NODE
|
|
319
325
|
./node_modules/.bin/prism --help >/dev/null
|
|
@@ -324,12 +330,12 @@ This smoke is bounded to registry metadata, imports, CLI startup, checksums, sig
|
|
|
324
330
|
|
|
325
331
|
#### Rollback limitations
|
|
326
332
|
|
|
327
|
-
npm publication is not transactional and published versions are immutable. Partial publication is a resume case, not rollback. For a confirmed systemic defect after completion, deprecate every affected `@0.0.
|
|
333
|
+
npm publication is not transactional and published versions are immutable. Partial publication is a resume case, not rollback. For a confirmed systemic defect after completion, deprecate every affected `@0.0.10`; restore `latest` to the previous good release only where that tag already existed. Exact `0.0.10` installs remain possible, so publish a fixed version promptly. Do not unpublish except for a security/legal emergency under npm policy.
|
|
328
334
|
|
|
329
335
|
## Extension and configuration notes
|
|
330
336
|
|
|
331
|
-
- **Required `@arnilo/prism` peer.** Every first-party package declares
|
|
332
|
-
- **Public access.** All
|
|
337
|
+
- **Required `@arnilo/prism` peer.** Every first-party package declares a non-optional `@arnilo/prism@0.0.10` peer (`peerDependenciesMeta` must not mark `@arnilo/prism` optional; other peers such as `playwright-core` may be optional). The range stays pinned to `0.0.10` for the 0.x series and will widen to `^1.0.0` at the 1.x stable release. Inside the workspace each package also declares `"@arnilo/prism": "file:../.."` in `devDependencies` so `npm install` resolves the peer locally; that devDependency is stripped from consumer installs and is not a runtime dependency.
|
|
338
|
+
- **Public access.** All 32 manifests (26 code packages + 6 family/profile packages) declare `"publishConfig": { "access": "public" }`; the publisher also passes `--access public` explicitly because scoped packages otherwise default to restricted on first publish.
|
|
333
339
|
- **Map retention knob.** Source maps are emitted locally but stripped from tarballs by `!dist/**/*.map`. Removing that `files` negation ships maps in releases (larger tarballs, better consumer stack traces).
|
|
334
340
|
- **Release workflow.** `.github/workflows/release.yml` has six jobs. `verify` runs network-free SDK readiness on Node 24; `node20-compat` builds/imports every public root `exports` default target on Node 20 for declared `engines.node >=20` (docs examples need Node >=22.6 native TypeScript stripping); `postgres-integration` uses `pgvector/pgvector:pg16`; `supply-chain` runs high-severity audit, SPDX/license policy, and tracked-source secret scanning; and tag-only `codeql-release` runs SAST. Tag-only `publish` needs all five gates, preserves clean exact-tag/version/topological publication, and alone receives `NPM_TOKEN`, `id-token: write`, and `attestations: write`. Before npm publish it packs all current tarballs, generates checksums plus SPDX, scans unpacked public artifacts, creates GitHub attestations for tarballs and SBOM, then retains artifacts for 30 days. Registry state remains the resumable journal. Local `npm run release:dry-run` remains network-free SDK readiness; local PostgreSQL coverage is `PRISM_TEST_POSTGRES_URL=... npm run test:postgres`.
|
|
335
341
|
- **Adding a package.** New workspace packages are picked up automatically by `npm run build --workspaces`, `npm test --workspaces`, `npm run pack:dry-run`, the packaging guard (`src/__tests__/packaging.test.ts`), and the install-smoke test (`src/__tests__/install-smoke.test.ts`) via the workspace glob; add the package to both tests' config arrays for explicit per-package assertions.
|
|
@@ -346,6 +352,8 @@ npm publication is not transactional and published versions are immutable. Parti
|
|
|
346
352
|
- `NEURALWATT_API_KEY` for `@arnilo/prism-provider-neuralwatt`
|
|
347
353
|
- `OPENCODE_API_KEY` for `@arnilo/prism-provider-opencode-go`
|
|
348
354
|
- `PRISM_LIVE_WEB=1` — gates `@arnilo/prism-web-tools` restricted live tests; provider calls additionally require `PRISM_BRAVE_SEARCH_TOKEN`, `PRISM_EXA_API_KEY`, or `PRISM_FIRECRAWL_API_KEY`. Run `npm run test:live -w @arnilo/prism-web-tools`; default tests use injected fake fetch only.
|
|
355
|
+
- `PRISM_TEST_PLAYWRIGHT=1` or `PRISM_LIVE_PLAYWRIGHT=1` — gates `@arnilo/prism-browser` protected Playwright adversarial matrix (`npm run test:live -w @arnilo/prism-browser`). Host must supply a pinned Chromium binary via `playwright-core`. Default tests use fake Playwright APIs only; enabled but missing browser fails closed.
|
|
356
|
+
- `PRISM_TEST_DOCKER_SANDBOX=1` — gates `@arnilo/prism-coding-security` protected Docker matrix. Requires host-preloaded digest-pinned `PRISM_TEST_DOCKER_IMAGE` and absolute `PRISM_TEST_DOCKER_BIN` (optional `PRISM_TEST_DOCKER_USER`). Prism never pulls/builds the image during default tests. Missing prerequisites fail closed when the gate is enabled; disabled gate skips safely.
|
|
349
357
|
- `PRISM_LIVE_CANARIES=1` — gates `scripts/live-canary.mjs`, used only by scheduled/manual `.github/workflows/live-canaries.yml` in protected `live-canaries` environment. It requires provider endpoint/key/model, MCP endpoint/token, A2A endpoint/token, and Brave token environment entries; performs four probes plus at most one MCP session DELETE; caps provider output at one token, each response at 64 KiB, each request at 15 seconds (30 seconds hard), and emits only aggregate kind/status/code/duration. Disabled gate skips before network; enabled but incomplete configuration fails closed.
|
|
350
358
|
- `PRISM_LIVE_COMPACTION_TESTS=1` — gates `@arnilo/prism-compaction-llm`'s live summary-provider smoke test (placeholder).
|
|
351
359
|
- `PRISM_LIVE_OBSERVATIONAL_MEMORY_TESTS=1` — gates `@arnilo/prism-compaction-observational-memory`'s live worker/provider checks (placeholder).
|
|
@@ -354,14 +362,50 @@ npm publication is not transactional and published versions are immutable. Parti
|
|
|
354
362
|
- Provider live tests read the API key from the env only when both gates are set; the key is used as a bearer token and never logged. `assertNoSecretLeak` verifies the key value does not appear in any streamed event. The compaction placeholders still carry no real credentials.
|
|
355
363
|
- Enforced by `network-free-guard.test.ts` (default suite stays network-free) and by source-scanning meta-tests that assert each `live.test.ts` keeps its `skip:` guard.
|
|
356
364
|
- **Supply-chain workflows.** `.github/workflows/security.yml` runs CodeQL JavaScript/TypeScript SAST, PR-only dependency review, `npm audit`, SPDX 2.3 generation, exact license allow/deny policy, tracked-source plus unpacked-tarball credential-pattern scans, and seven-day SBOM retention. Dependabot opens bounded weekly npm and GitHub Actions updates. Every third-party action uses a full immutable revision; workflows never use `pull_request_target`. GitHub repository secret scanning/push protection and required-check branch rules remain repository settings because GitHub provides no equivalent checked-in workflow toggle; enable `security / codeql`, `security / supply-chain`, PR dependency review, and release checks on protected branches.
|
|
365
|
+
- **Sandbox/browser protected workflow.** `.github/workflows/sandbox-browser.yml` is scheduled/manual only in protected `sandbox-browser` environment. It runs network-free adversarial eval fixtures by default, optionally enables digest-pinned Docker and Playwright gates via repository variables (`PRISM_TEST_DOCKER_IMAGE`, `PRISM_ENABLE_PLAYWRIGHT_GATE`), receives no provider/npm/OIDC secrets, and uploads only a redacted aggregate status artifact (7-day retention).
|
|
357
366
|
- **Release attestations.** Tag publication uses GitHub OIDC with only `contents: read`, `id-token: write`, and `attestations: write` at the publish job. `actions/attest-build-provenance` attests every `.tgz` and `sbom.spdx.json` before npm publication; npm still receives `--provenance`. Verify downloaded attestations with GitHub CLI and npm signatures on the release host.
|
|
358
367
|
- **Install smoke is offline.** The install-smoke test packs core + every package into a temp dir and installs tarballs with `--offline --no-audit --no-fund` into a fresh project. External dependencies are satisfied from the lockfile-backed npm cache prepared by `npm ci`; any attempted uncached registry fetch fails the gate.
|
|
359
368
|
- **Offline test budget.** The default `npm test` (no `PRISM_LIVE_PROVIDER_TESTS`) is pinned at **< 60s on Node 20** with a measured local baseline of ~45s (build ~18s + network-free tests/workspace tests/packaging smoke ~27s). The full CI `sdk:ready` gate runs on Node 24 because docs tests execute `examples/*.ts` via native TypeScript stripping. `npm run sdk:ready` also runs typecheck and pack dry-run, so it is allowed to exceed the `npm test` budget while remaining network-free. The CI `sdk:ready` step has `timeout-minutes: 5` as a hang backstop; the separate Node 20 compatibility step has `timeout-minutes: 3`. The budget was raised from 30s after the default suite grew to include every first-party package, offline install smoke, packaging guards, docs examples, and workspace tests; optimize before raising it again.
|
|
360
369
|
|
|
370
|
+
### 0.0.10 dependency audit decision (2026-07-21)
|
|
371
|
+
|
|
372
|
+
`npm audit --audit-level=high` reports 0 vulnerabilities and `npm ls --all --depth=0` resolves the exact 32-package `0.0.10` graph (including `@arnilo/prism-browser`). Locked-install SPDX and `scripts/verify-sbom.mjs` pass. Browser keeps `playwright-core@1.61.0` as an optional peer and ships no browser binary/image; no Office package/binary enters the graph. Host mode never claims disposable containment.
|
|
373
|
+
|
|
374
|
+
### 0.0.10 release-candidate verification — 2026-07-21
|
|
375
|
+
|
|
376
|
+
| Gate | Result |
|
|
377
|
+
| --- | --- |
|
|
378
|
+
| Package graph | Root + 31 workspaces = 32 publishable manifests at exact `0.0.10` with exact internal peer/dependency ranges (retargeted from post-ship `0.0.96`); `@arnilo/prism-browser` in `@arnilo/prism-all` only (not `@arnilo/prism-code`). |
|
|
379
|
+
| Deterministic suites | `npm run sdk:ready` passed: 1,963 tests (1,934 pass, 29 explicit live skips, 0 fail), full typecheck/build/examples, docs/export/package/install smoke, and 32 dry-run packs. |
|
|
380
|
+
| Workspace modes | Required `workspaceMode`; sandbox FS auto-wire; fail-closed mixed wiring; host non-containment; tree identity; adversarial consistency + `benchmark-0.0.10` schema green. |
|
|
381
|
+
| Coding/browser | Network-free coding-agent + browser adversarial fixtures retained; `scripts/benchmark-0.0.10.mjs` host/sandbox-fake evidence (10-iter schema run green); protected Docker/Playwright remain operator P0 gates. |
|
|
382
|
+
| Supply chain | `npm audit --audit-level=high` = 0 vulnerabilities; SPDX SBOM 186 packages / 8 approved licenses; working-tree secret scan 2,418 files / 0 findings; `git diff --check` clean. |
|
|
383
|
+
| Artifacts | Packed review: 988,020 bytes compressed / 3,820,326 unpacked / 850 files across 32 tarballs; core 527,333 / 1,848,113 / 248 files; no Playwright binary/image and no Office package/binary. |
|
|
384
|
+
| Registry/order | Public `release:check` found all 32 `@arnilo/*@0.0.10` versions available. Dependency-ordered `release:publish --dry-run --allow-dirty --allow-untagged` completed 32/32 dry-run with explicit public/latest/provenance; no commit, tag, or publication created. |
|
|
385
|
+
| Office exclusion | No Office package, binary, SDK, wrapper, docs page, test, or release gate. |
|
|
386
|
+
| Containment claims | Host mode and mixed-wiring escape hatch never claim disposable containment in docs/release notes. |
|
|
387
|
+
|
|
388
|
+
### 0.0.9 dependency audit decision (2026-07-21)
|
|
389
|
+
|
|
390
|
+
`npm audit --audit-level=high` reports 0 vulnerabilities and `npm ls --all --depth=0` resolves the exact 32-package `0.0.96` graph (including `@arnilo/prism-browser`). Locked-install SPDX contains 185 packages and eight approved license expressions; `scripts/verify-sbom.mjs` passed. Browser keeps `playwright-core@1.61.0` as an optional peer and ships no browser binary/image; no Office package/binary enters the graph.
|
|
391
|
+
|
|
361
392
|
### 0.0.8 dependency audit decision (2026-07-20)
|
|
362
393
|
|
|
363
394
|
`npm audit --audit-level=high` reports 0 vulnerabilities and `npm ls --all --depth=0` resolves the exact 31-package `0.0.8` graph. Locked-install SPDX contains 183 packages and eight approved license expressions; `scripts/verify-sbom.mjs` passed. New runtime dependencies remain isolated to optional packages: MCP stays pinned to SDK 1.29.0 and web tools add no vendor SDK. Native `better-sqlite3` remains the sole install-script dependency and stays in opt-in SQLite.
|
|
364
395
|
|
|
396
|
+
### 0.0.9 release-candidate verification — 2026-07-21
|
|
397
|
+
|
|
398
|
+
| Gate | Result |
|
|
399
|
+
| --- | --- |
|
|
400
|
+
| Package graph | Root + 31 workspaces = 32 publishable manifests at exact `0.0.96` with exact internal peer/dependency ranges; `@arnilo/prism-browser` in `@arnilo/prism-all` only (not `@arnilo/prism-code`). |
|
|
401
|
+
| Deterministic suites | Post–Synapta Task 13 re-verify: `npm run sdk:ready` passed: 1,934 tests across core/workspaces (1,905 pass, 29 explicit live skips, 0 fail), full typecheck/build/examples, docs/export/package/install smoke, and 32 dry-run packs. |
|
|
402
|
+
| Synapta Defects 1a/1b/2 | Malformed streamed tool-call args → failed/`tool_execution_blocked` (`invalid_json_arguments`, never executes); incomplete deltas → typed `incomplete_delta` fail-closed; empty/thinking-only call-free artifacts → `parse_error` revision budget with no `succeeded` without `artifact_finished`. Conformance helper matches recovery/`incomplete_delta` contract. |
|
|
403
|
+
| Coding/browser | Network-free coding-agent + browser adversarial fixtures unchanged; dated `scripts/benchmark-0.0.9.mjs` evidence retained (Node v24.18.0 Linux x64, 100 iterations); protected Docker (`PRISM_TEST_DOCKER_SANDBOX=1`) and Playwright (`PRISM_LIVE_PLAYWRIGHT=1`) remain explicit operator P0 gates when host-provisioned. |
|
|
404
|
+
| Supply chain | `npm audit --audit-level=high` = 0 vulnerabilities; SPDX SBOM 185 packages / 8 approved licenses; working-tree secret scan 2,402 files / 0 findings; unpacked-tarball secret scan 847 files / 0 findings; `git diff --check` clean. |
|
|
405
|
+
| Artifacts | Packed review: 972,339 bytes compressed / 3,755,038 unpacked / 847 files across 32 tarballs; core 519,366 / 1,819,939; browser 29,171 / 132,669 with no Playwright binary/image and no Office package/binary. |
|
|
406
|
+
| Registry/order | Public `release:check` found all 32 `@arnilo/*@0.0.96` versions available. Dependency-ordered `release:publish --dry-run --allow-dirty --allow-untagged` completed 32/32 dry-run with explicit public/latest/provenance; no commit, tag, or publication created. |
|
|
407
|
+
| Office exclusion | No Office package, binary, SDK, wrapper, docs page, test, or release gate. |
|
|
408
|
+
|
|
365
409
|
### 0.0.8 release-candidate verification — 2026-07-20
|
|
366
410
|
|
|
367
411
|
Phase 3 validation ran from this working tree without creating a release commit/tag or publishing. Clean protected-branch/tag, GitHub CodeQL/dependency-review, environment approval, OIDC, and actual canary/publication checks remain mandatory in the handoff above.
|
|
@@ -393,7 +437,7 @@ Every release gate maps to an exact enforcement test or command, so the checklis
|
|
|
393
437
|
| Root SDK export surface freeze | `public-export-contract.test.ts` `root export surface is frozen` snapshots every value and type export of `src/index.ts` (107 value + 69 type) so any add/remove is a deliberate test update; `every frozen value export resolves at runtime` rebuilds `dist/index.js` and asserts each value export is present (catches build drift), and `every frozen type export appears in the built type declarations` asserts each type export is in `dist/index.d.ts`. |
|
|
394
438
|
| Examples compile and are listed; runnable demos execute | `npm run typecheck` runs `tsc -p examples --noEmit`; `docs.test.ts` checks every `examples/*.ts` file is listed in `examples/README.md`, then runs demos offline and scans output for secrets. |
|
|
395
439
|
| Examples run to completion with no secret leakage | `docs.test.ts` `examples_demos_run_to_completion_and_emit_no_secret` runs each demo (Node strips TypeScript types natively) with exit-0 and real-secret scans; `external_app_example_*` pins the DB-backed adapter reference exercising the `RunLedger`, branch-handle checkout, fork, and prior-run resume. |
|
|
396
|
-
| Tarball excludes built tests, source maps, and source | `packaging.test.ts` rejects `dist/__tests__/`, `*.map`, `src/`, `plans/`, and internal files; confirms every package ships README/changelog (and code packages ship LICENSE), core ships docs + CLI, exported targets exist (`dist/index.js` + `dist/index.d.ts` for NeuralWatt), and `prism-all` transitively reaches all
|
|
440
|
+
| Tarball excludes built tests, source maps, and source | `packaging.test.ts` rejects `dist/__tests__/`, `*.map`, `src/`, `plans/`, and internal files; confirms every package ships README/changelog (and code packages ship LICENSE), core ships docs + CLI, exported targets exist (`dist/index.js` + `dist/index.d.ts` for NeuralWatt), and `prism-all` transitively reaches all 32 published first-party manifests. |
|
|
397
441
|
| NeuralWatt package/docs/examples release gate | `packaging.test.ts` pins `@arnilo/prism-provider-neuralwatt` package exports/type declarations and `@arnilo/prism-providers`/`@arnilo/prism-all` membership; `docs.test.ts` asserts `docs/index.md` links `providers/neuralwatt.md` and `provider-caching.md`, and that `examples/cache-aware-prompt-assembly.ts` plus `examples/neuralwatt-agent-run.ts` exist and are listed. |
|
|
398
442
|
| Version graph and resumable publication | `release.test.ts` covers exact package/lock/range validation, topological order, registry collisions, dry-run, interrupted reports/resume, clean tagged git state, provenance/public/tag arguments, and token-safe errors. `release:check` and `release:publish` derive the workspace graph without a manual package list. |
|
|
399
443
|
| Supply-chain and live-canary policy | `supply-chain-security.test.ts` verifies SPDX allow/deny behavior, bounded source/artifact secret detection, credential-free canary reports, timeout/redacted failures, immutable action revisions, no `pull_request_target`, protected live environment, attestation paths, and publish dependency on `supply-chain`; CI adds CodeQL and PR dependency review. |
|