0xray 4.0.24 → 4.0.25

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "0xray",
3
- "version": "4.0.24",
3
+ "version": "4.0.25",
4
4
  "description": "0xRay suit for Grok, Hermes, OpenClaw, OpenCode: mill+inspect, Codex, 7 MCP servers. Costume 45/42 is opt-in foundry, not the default wear.",
5
5
  "author": {
6
6
  "name": "0xRay AI",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "./features.schema.json",
3
- "version": "4.0.24",
3
+ "version": "4.0.25",
4
4
  "description": "0xRay Framework - Unified Feature Configuration",
5
5
  "suit_temperament": {
6
6
  "profile": "auto",
package/dist/CHANGELOG.md CHANGED
@@ -41,8 +41,31 @@ The format is based on [Conventional Commits](https://www.conventionalcommits.or
41
41
  - Archive root `integrations/` costume SKILL dump → `docs/archive/integrations-costume/`. Live wear is `src/integrations`.
42
42
  - Archive root `commands/` stale copy → `docs/archive/commands-copy/`. Live wear is `src/opencode/commands`.
43
43
 
44
+ ## [4.0.25] - 2026-09-24
45
+
46
+ `0xray@4.0.25` ships the plate schematics in the package. `docs-site/docs/plates/` is on the npm `files` list. A worn suit resolves `memory-recall` and `processor` from `dist/integrations/hooks/plates.cjs`.
47
+
48
+ ### 🔄 Changes
49
+
50
+ ### 🐛 Bug Fixes
51
+ - fix: ship plate schematics in the npm package (b1bdd7415)
52
+
53
+ ### 📚 Documentation
54
+ - docs: announce 4.0.24 — hot-swap, memory organ, plates (b04b80a15)
55
+
56
+ ---
57
+
44
58
  ## [4.0.24] - 2026-09-24
45
59
 
60
+ `0xray@4.0.24` is on npm. `npm install 0xray`.
61
+
62
+ Exo, not a catalog. A factory stamps a skeleton (Inference, External Governance, Autonomous Engine) and fastens a mill. Code mill, music mill (`@0xray/blip` sound), agents across TUIs and LLMs wear it and operate.
63
+
64
+ - **Hot-swappable compaction.** Compaction and host change are the same cut. The station card (`.xray/state/STATION.md`) is the handoff. The next turn continues the card.
65
+ - **Memory organ.** Finished speech and reflections become lessons on signals. Kernel and activity logs are heat (`last_seen`) only. Unnamed speech mints a signal. Caps: 20 hot lesson lines, 20 retained ids (insertion order), 24 learned proposed signals. Factory laws stay.
66
+ - **Plates.** One INPUT/PROCESSING/OUTPUT schematic per pipeline in `docs-site/docs/plates/`. Station keeps one pointer line. Recall injects that one schematic. A lesson is an episode. A plate is the machine.
67
+ - **Repertoire 0.2.8** is the organ package, vendored in 4.0.24.
68
+
46
69
  ### 🔄 Changes
47
70
 
48
71
  ### 🐛 Bug Fixes
@@ -22,6 +22,9 @@ export const VALIDATE_PACK_PATHS = [
22
22
  "dist/integrations/cursor/hooks/pre-tool-use.sh",
23
23
  "dist/integrations/cursor/hooks/pre-compact.sh",
24
24
  "dist/integrations/cursor/hooks/after-file-edit.sh",
25
+ "dist/integrations/hooks/plates.cjs",
26
+ "docs-site/docs/plates/memory-recall.md",
27
+ "docs-site/docs/plates/processor.md",
25
28
  ];
26
29
  export const CONSUMER_WEAR_PATHS = [
27
30
  "AGENTS.md",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xray-pre-tool",
3
- "version": "4.0.24",
3
+ "version": "4.0.25",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "0xRay constitution + temperament PreToolUse for OpenClaw",
@@ -0,0 +1,52 @@
1
+ ---
2
+ title: Boot
3
+ sidebar_label: Boot
4
+ ---
5
+
6
+ # Boot
7
+
8
+ `BootOrchestrator.executeBootSequence` brings the framework up. Processor registration here is the legacy boot list. The live tool gate is the suit pipeline, drawn on the processor plate.
9
+
10
+ ```
11
+ ┌────────────────────────────────────────────────────────────┐
12
+ │ INPUT LAYER │
13
+ │ │
14
+ │ ┌─────────────────────┐ ┌────────────────────────┐ │
15
+ │ │ process start │ │ SIGINT / SIGTERM │ │
16
+ │ └──────────┬──────────┘ └───────────┬────────────┘ │
17
+ │ └──────────────┬──────────────┘ │
18
+ └─────────────────────────────┼──────────────────────────────┘
19
+ v
20
+ ┌─────────────────────────────┼──────────────────────────────┐
21
+ │ PROCESSING LAYER v │
22
+ │ ┌────────────────────────────────────────────────────┐ │
23
+ │ │ load .xray config │ │
24
+ │ └──────────────────────────┬─────────────────────────┘ │
25
+ │ v │
26
+ │ ┌────────────────────────────────────────────────────┐ │
27
+ │ │ orchestrator + delegation session │ │
28
+ │ └──────────────────────────┬─────────────────────────┘ │
29
+ │ v │
30
+ │ ┌────────────────────────────────────────────────────┐ │
31
+ │ │ session management · activity log │ │
32
+ │ └──────────────────────────┬─────────────────────────┘ │
33
+ │ v │
34
+ │ ┌────────────────────────────────────────────────────┐ │
35
+ │ │ activateProcessors (PROCESSOR_DEFS) │ │
36
+ │ │ legacy boot list, then agents and plugins │ │
37
+ │ └──────────────────────────┬─────────────────────────┘ │
38
+ │ v │
39
+ │ ┌────────────────────────────────────────────────────┐ │
40
+ │ │ enforcement · codex compliance │ │
41
+ │ │ Dynamo governance integration │ │
42
+ │ └──────────────────────────┬─────────────────────────┘ │
43
+ └──────────────────────────────┼────────────────────────────┘
44
+ v
45
+ ┌──────────────────────────────┼────────────────────────────┐
46
+ │ OUTPUT LAYER v │
47
+ │ ┌────────────────────────────────────────────────────┐ │
48
+ │ │ BootResult │ │
49
+ │ │ success · agents loaded · errors │ │
50
+ │ └────────────────────────────────────────────────────┘ │
51
+ └────────────────────────────────────────────────────────────┘
52
+ ```
@@ -0,0 +1,50 @@
1
+ ---
2
+ title: Governance
3
+ sidebar_label: Governance
4
+ ---
5
+
6
+ # Governance
7
+
8
+ A proposal is deliberated inside the suit, filtered by Dynamo Solar, then merged. The PreToolUse codex gate stands beside the vote.
9
+
10
+ ```
11
+ ┌────────────────────────────────────────────────────────────┐
12
+ │ INPUT LAYER │
13
+ │ │
14
+ │ ┌────────────────────────────────────────────────────┐ │
15
+ │ │ proposal │ │
16
+ │ │ title · description · type │ │
17
+ │ └──────────────────────────┬─────────────────────────┘ │
18
+ └──────────────────────────────┼────────────────────────────┘
19
+ v
20
+ ┌──────────────────────────────┼────────────────────────────┐
21
+ │ PROCESSING LAYER v │
22
+ │ ┌────────────────────────────────────────────────────┐ │
23
+ │ │ internal deliberation │ │
24
+ │ │ code-review · security-audit · researcher │ │
25
+ │ └──────────────────────────┬─────────────────────────┘ │
26
+ │ v │
27
+ │ ┌────────────────────────────────────────────────────┐ │
28
+ │ │ external filter │ │
29
+ │ │ Dynamo Solar SSOT │ │
30
+ │ └──────────────────────────┬─────────────────────────┘ │
31
+ │ v │
32
+ │ ┌────────────────────────────────────────────────────┐ │
33
+ │ │ merge │ │
34
+ │ │ governance-core weighted vote · decision matrix │ │
35
+ │ └──────────────────────────┬─────────────────────────┘ │
36
+ │ │ │
37
+ │ ┌──────────────────────────┼─────────────────────────┐ │
38
+ │ │ PreToolUse gate │ │ │
39
+ │ │ Codex 11 · 29 · 69 │ beside the vote │ │
40
+ │ └──────────────────────────┼─────────────────────────┘ │
41
+ └──────────────────────────────┼────────────────────────────┘
42
+ v
43
+ ┌──────────────────────────────┼────────────────────────────┐
44
+ │ OUTPUT LAYER v │
45
+ │ ┌──────────────────────┐ ┌──────────────────────┐ │
46
+ │ │ vote │ │ codex decision │ │
47
+ │ │ approve / reject │ │ allow / deny │ │
48
+ │ └──────────────────────┘ └──────────────────────┘ │
49
+ └────────────────────────────────────────────────────────────┘
50
+ ```
@@ -0,0 +1,16 @@
1
+ ---
2
+ title: Plates
3
+ sidebar_label: Overview
4
+ ---
5
+
6
+ # Plates
7
+
8
+ A plate is one pipeline, drawn as a stamp. The drawing is the thing a person reads: an input layer, a processing layer, an output layer, and the arrows between them.
9
+
10
+ These files are the canonical stamps. The Docusaurus sidebar publishes them, and the npm package ships this directory. The worn reader walks up from `dist/integrations/hooks/plates.cjs` to `docs-site/docs/plates/`. One plate, one file.
11
+
12
+ The station card stays the short subsystem table. That table is the index still on disk after compaction. When the current intent names one pipeline, the card adds a single stock line, `Plate: <id> — .xray/state/plates/<id>.md`. Recall returns that one plate, and a compact can carry its schematic. Lessons stay episodes on signals. A plate is the machine. A lesson is what happened.
13
+
14
+ The markdown file is the source of truth for that stamp. When the pipeline changes, edit the plate. A worn project may hold a copy at `.xray/state/plates/<id>.md`. The copy is written only when that file is missing, so a local edit stays.
15
+
16
+ [Routing](./routing.md) · [Governance](./governance.md) · [Boot](./boot.md) · [Orchestration](./orchestration.md) · [Processor](./processor.md) · [Reporting](./reporting.md) · [Memory recall](./memory-recall.md)
@@ -0,0 +1,49 @@
1
+ ---
2
+ title: Memory recall
3
+ sidebar_label: Memory recall
4
+ ---
5
+
6
+ # Memory recall
7
+
8
+ Speech becomes a lesson. Intent names one plate. Compact points at the station card. The card names the stamp. The stamp file is the schematic.
9
+
10
+ ```
11
+ ┌──────────────────────────────────────────────────────────────┐
12
+ │ INPUT LAYER │
13
+ │ │
14
+ │ ┌──────────────┐ ┌──────────────┐ ┌────────────────┐ │
15
+ │ │ speech │ │ intent │ │ compact cut │ │
16
+ │ └──────┬───────┘ └──────┬───────┘ └───────┬────────┘ │
17
+ └──────────┼──────────────────┼───────────────────┼───────────┘
18
+ v v v
19
+ ┌──────────┼──────────────────┼───────────────────┼───────────┐
20
+ │ PROCESSING LAYER │ │ │
21
+ │ v v v │
22
+ │ ┌──────────────┐ ┌──────────────┐ ┌────────────────┐ │
23
+ │ │ speech grades│ │ intent │ │ compact says │ │
24
+ │ │ to a lesson │ │ recalls one │ │ Read STATION.md│ │
25
+ │ │ on a signal │ │ plate │ │ │ │
26
+ │ └──────┬───────┘ └──────┬───────┘ └───────┬────────┘ │
27
+ │ │ │ │ │
28
+ │ │ v │ │
29
+ │ │ ┌────────────────────────────┐ │ │
30
+ │ │ │ card keeps the short │ │ │
31
+ │ │ │ subsystem table │ │ │
32
+ │ │ │ card names Plate: <id> │ │ │
33
+ │ │ └─────────────┬──────────────┘ │ │
34
+ └──────────┼───────────────────┼──────────────────┼──────────┘
35
+ v v v
36
+ ┌──────────┴───────────────────┴──────────────────┴──────────┐
37
+ │ OUTPUT LAYER │
38
+ │ │
39
+ │ ┌────────────────────────────┐ ┌─────────────────────┐ │
40
+ │ │ lesson on the signal │ │ stamp file │ │
41
+ │ │ an episode of what happened│ │ the schematic │ │
42
+ │ └────────────────────────────┘ │ docs-site/docs/ │ │
43
+ │ │ plates/<id>.md │ │
44
+ │ │ worn copy only when │ │
45
+ │ │ .xray/state/plates/ │ │
46
+ │ │ <id>.md is missing │ │
47
+ │ └─────────────────────┘ │
48
+ └──────────────────────────────────────────────────────────────┘
49
+ ```
@@ -0,0 +1,55 @@
1
+ ---
2
+ title: Orchestration
3
+ sidebar_label: Orchestration
4
+ ---
5
+
6
+ # Orchestration
7
+
8
+ Multi-step work is planned, run, and closed. Routing picks an agent. This plate is the coordination around that pick.
9
+
10
+ ```
11
+ ┌────────────────────────────────────────────────────────────┐
12
+ │ INPUT LAYER │
13
+ │ │
14
+ │ ┌────────────────────────────────────────────────────┐ │
15
+ │ │ tasks │ │
16
+ │ │ descriptions · dependencies · type │ │
17
+ │ └──────────────────────────┬─────────────────────────┘ │
18
+ └──────────────────────────────┼────────────────────────────┘
19
+ v
20
+ ┌──────────────────────────────┼────────────────────────────┐
21
+ │ PROCESSING LAYER v │
22
+ │ ┌────────────────────────────────────────────────────┐ │
23
+ │ │ analyze-complexity │ │
24
+ │ │ ExecutionPlanner validates and plans │ │
25
+ │ └──────────────────────────┬─────────────────────────┘ │
26
+ │ v │
27
+ │ ┌────────────────────────────────────────────────────┐ │
28
+ │ │ orchestrate-task │ │
29
+ │ │ lead stays on the main thread │ │
30
+ │ └──────────────────────────┬─────────────────────────┘ │
31
+ │ v │
32
+ │ ┌────────────────────────────────────────────────────┐ │
33
+ │ │ spawnAside │ │
34
+ │ │ on orchestrate-task, analyze-complexity, │ │
35
+ │ │ and govern-and-apply │ │
36
+ │ │ observations from the three flows │ │
37
+ │ └──────────────────────────┬─────────────────────────┘ │
38
+ │ v │
39
+ │ ┌────────────────────────────────────────────────────┐ │
40
+ │ │ confidence gate │ │
41
+ │ │ getTaskConfidence when Repertoire is worn │ │
42
+ │ └──────────────────────────┬─────────────────────────┘ │
43
+ │ v │
44
+ │ ┌────────────────────────────────────────────────────┐ │
45
+ │ │ closeAside │ │
46
+ │ └──────────────────────────┬─────────────────────────┘ │
47
+ └──────────────────────────────┼────────────────────────────┘
48
+ v
49
+ ┌──────────────────────────────┼────────────────────────────┐
50
+ │ OUTPUT LAYER v │
51
+ │ ┌─────────────────────┐ ┌─────────────────────────┐ │
52
+ │ │ execution result │ │ aside observations │ │
53
+ │ └─────────────────────┘ └─────────────────────────┘ │
54
+ └────────────────────────────────────────────────────────────┘
55
+ ```
@@ -0,0 +1,46 @@
1
+ ---
2
+ title: Processor
3
+ sidebar_label: Processor
4
+ ---
5
+
6
+ # Processor
7
+
8
+ Three pipelines run in parallel. A is the live suit. B is the legacy processor manager. C is mill, git, and CI. Nothing in A is an input to B or C.
9
+
10
+ ```
11
+ ┌────────────────────────────────────────────────────────────────────────┐
12
+ │ INPUT LAYER │
13
+ │ │
14
+ │ ┌──────────────────┐ ┌──────────────────┐ ┌────────────────────┐ │
15
+ │ │ tool / session │ │ prompt text │ │ commit / release │ │
16
+ │ └────────┬─────────┘ └────────┬─────────┘ └─────────┬──────────┘ │
17
+ └────────────┼─────────────────────┼──────────────────────┼─────────────┘
18
+ v v v
19
+ ┌────────────┼─────────────────────┼──────────────────────┼─────────────┐
20
+ │ PROCESSING LAYER three parallel pipelines │ │
21
+ │ │ │ │ │
22
+ │ ┌─────────┴──────────┐ ┌────────┴─────────┐ ┌──────────┴──────────┐ │
23
+ │ │ A suit (live OS) │ │ B legacy manager │ │ C mill / git / CI │ │
24
+ │ │ │ │ │ │ │ │
25
+ │ │ SessionStart │ │ prompt-security │ │ mint │ │
26
+ │ │ v │ │ v │ │ v │ │
27
+ │ │ PreToolUse │ │ executePre │ │ inspect │ │
28
+ │ │ v │ │ v │ │ v │ │
29
+ │ │ tool runs │ │ work │ │ pre-commit │ │
30
+ │ │ v │ │ v │ │ v │ │
31
+ │ │ PostToolUse │ │ executePost │ │ pre-push │ │
32
+ │ │ v │ │ │ │ v │ │
33
+ │ │ compact heat │ │ │ │ foundry release │ │
34
+ │ │ │ │ │ │ v │ │
35
+ │ │ │ │ │ │ CI quality → docs │ │
36
+ │ └─────────┬──────────┘ └────────┬─────────┘ └──────────┬──────────┘ │
37
+ └────────────┼─────────────────────┼──────────────────────┼────────────┘
38
+ v v v
39
+ ┌────────────┴─────────────────────┴──────────────────────┴────────────┐
40
+ │ OUTPUT LAYER │
41
+ │ │
42
+ │ ┌──────────────────┐ ┌──────────────────┐ ┌────────────────────┐ │
43
+ │ │ allow / deny │ │ processor result │ │ gate / tag │ │
44
+ │ └──────────────────┘ └──────────────────┘ └────────────────────┘ │
45
+ └────────────────────────────────────────────────────────────────────────┘
46
+ ```
@@ -0,0 +1,42 @@
1
+ ---
2
+ title: Reporting
3
+ sidebar_label: Reporting
4
+ ---
5
+
6
+ # Reporting
7
+
8
+ Logs become a report. Session start can also drop a schedule marker. The marker is a side output, not a second chain through the formatter.
9
+
10
+ ```
11
+ ┌────────────────────────────────────────────────────────────┐
12
+ │ INPUT LAYER │
13
+ │ │
14
+ │ ┌──────────────────┐ ┌──────────────┐ ┌─────────────┐ │
15
+ │ │ activity log │ │ schedule │ │ CLI request │ │
16
+ │ └────────┬─────────┘ └──────┬───────┘ └──────┬──────┘ │
17
+ │ └───────────────────┴────────┬────────┘ │
18
+ └─────────────────────────────────────────┼──────────────────┘
19
+ v
20
+ ┌─────────────────────────────────────────┼──────────────────┐
21
+ │ PROCESSING LAYER v │
22
+ │ ┌────────────────────────────────────────────────────┐ │
23
+ │ │ FrameworkReportingSystem │ │
24
+ │ │ collect logs → metrics → formatReport │ │
25
+ │ │ cache a fresh report, then write the file │ │
26
+ │ └──────────────────────────┬─────────────────────────┘ │
27
+ │ │ │
28
+ │ ┌──────────────────────────┼─────────────────────────┐ │
29
+ │ │ SessionStart marker │ │ │
30
+ │ │ autonomous-reporting │ side output │ │
31
+ │ │ scheduled flag │ │ │
32
+ │ └──────────────────────────┼─────────────────────────┘ │
33
+ └──────────────────────────────┼────────────────────────────┘
34
+ v
35
+ ┌──────────────────────────────┼────────────────────────────┐
36
+ │ OUTPUT LAYER v │
37
+ │ ┌──────────────────────────┐ ┌─────────────────────┐ │
38
+ │ │ report file │ │ realtime health │ │
39
+ │ │ markdown or json │ │ score and alerts │ │
40
+ │ └──────────────────────────┘ └─────────────────────┘ │
41
+ └────────────────────────────────────────────────────────────┘
42
+ ```
@@ -0,0 +1,49 @@
1
+ ---
2
+ title: Routing
3
+ sidebar_label: Routing
4
+ ---
5
+
6
+ # Routing
7
+
8
+ Task text becomes an agent. thinDispatch scores the work. Repertoire may adjust the score when the organ is worn.
9
+
10
+ ```
11
+ ┌──────────────────────────────────────────────────────────────┐
12
+ │ INPUT LAYER │
13
+ │ │
14
+ │ ┌──────────────┐ ┌──────────────┐ ┌────────────────┐ │
15
+ │ │ task text │ │ @agent │ │ scoreAndRoute │ │
16
+ │ └──────┬───────┘ └──────┬───────┘ └───────┬────────┘ │
17
+ │ └──────────────────┴─────────┬─────────┘ │
18
+ └────────────────────────────────────────┼─────────────────────┘
19
+ v
20
+ ┌────────────────────────────────────────┼─────────────────────┐
21
+ │ PROCESSING LAYER │ │
22
+ │ v │
23
+ │ ┌──────────────────────────────────────────────────────┐ │
24
+ │ │ TaskSkillRouter │ │
25
+ │ │ keyword facade into the route │ │
26
+ │ └──────────────────────────┬───────────────────────────┘ │
27
+ │ v │
28
+ │ ┌──────────────────────────────────────────────────────┐ │
29
+ │ │ thinDispatch │ │
30
+ │ │ ≤15 single agent │ │
31
+ │ │ ≤25 single agent with tools │ │
32
+ │ │ ≤50 multi-agent │ │
33
+ │ │ >50 orchestrator-led │ │
34
+ │ └──────────────────────────┬───────────────────────────┘ │
35
+ │ v │
36
+ │ ┌──────────────────────────────────────────────────────┐ │
37
+ │ │ Repertoire resolveThinDispatch │ │
38
+ │ │ worn organ may change agent and score │ │
39
+ │ │ null provider leaves the score alone │ │
40
+ │ └──────────────────────────┬───────────────────────────┘ │
41
+ └──────────────────────────────┼──────────────────────────────┘
42
+ v
43
+ ┌──────────────────────────────┼──────────────────────────────┐
44
+ │ OUTPUT LAYER v │
45
+ │ ┌────────────┐ ┌────────────────┐ ┌────────────────┐ │
46
+ │ │ agent │ │ strategy │ │ adjusted score │ │
47
+ │ └────────────┘ └────────────────┘ └────────────────┘ │
48
+ └──────────────────────────────────────────────────────────────┘
49
+ ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "0xray",
3
- "version": "4.0.24",
3
+ "version": "4.0.25",
4
4
  "description": "Multi-agent orchestration and Codex governance for OpenCode, Hermes, Grok Build, and OpenClaw",
5
5
  "readme": "README.md",
6
6
  "license": "MIT",
@@ -179,6 +179,7 @@
179
179
  "src/opencode/workflows/",
180
180
  "src/integrations/grok/plugin/0xray/",
181
181
  "src/integrations/openclaw/plugin/",
182
+ "docs-site/docs/plates/",
182
183
  "src/skills/",
183
184
  "src/mcps/",
184
185
  ".plugin/",
@@ -28,6 +28,9 @@ export const REQUIRED_PACK_PATHS = [
28
28
  "dist/integrations/cursor/hooks/pre-tool-use.sh",
29
29
  "dist/integrations/cursor/hooks/pre-compact.sh",
30
30
  "dist/integrations/cursor/hooks/after-file-edit.sh",
31
+ "dist/integrations/hooks/plates.cjs",
32
+ "docs-site/docs/plates/memory-recall.md",
33
+ "docs-site/docs/plates/processor.md",
31
34
  ];
32
35
 
33
36
  export function packedFilePaths(files) {
@@ -67,6 +67,9 @@ const REQUIRED_TARBALL_DIST = [
67
67
  "package/dist/cli/index.js",
68
68
  "package/dist/mcps/orchestrator.server.js",
69
69
  "package/dist/integrations/grok/hooks/session-start.js",
70
+ "package/dist/integrations/hooks/plates.cjs",
71
+ "package/docs-site/docs/plates/memory-recall.md",
72
+ "package/docs-site/docs/plates/processor.md",
70
73
  ];
71
74
 
72
75
  function assertPackedDistCliInTarball(tarballPath) {
@@ -78,7 +81,7 @@ function assertPackedDistCliInTarball(tarballPath) {
78
81
  `packed tarball missing ${missing.join(", ")} (0xray@4.0.13 shipped 0 dist files)`,
79
82
  );
80
83
  }
81
- process.stdout.write(" ✅ packed tarball includes dist/cli + MCP + Grok hooks\n");
84
+ process.stdout.write(" ✅ packed tarball includes dist/cli + MCP + Grok hooks + plate stamps\n");
82
85
  }
83
86
 
84
87
  function assertOrganRequire(tmpRoot) {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xray-pre-tool",
3
- "version": "4.0.24",
3
+ "version": "4.0.25",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "0xRay constitution + temperament PreToolUse for OpenClaw",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "./features.schema.json",
3
- "version": "4.0.24",
3
+ "version": "4.0.25",
4
4
  "description": "0xRay Framework - Unified Feature Configuration",
5
5
  "suit_temperament": {
6
6
  "profile": "auto",