blun-king-cli 9.1.509 → 9.1.511

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 (37) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/LIESMICH.txt +12 -1
  3. package/README.md +12 -1
  4. package/agent-spine-plugin/.claude-plugin/marketplace.json +1 -1
  5. package/agent-spine-plugin/.claude-plugin/plugin.json +1 -1
  6. package/agent-spine-plugin/.codex-plugin/plugin.json +2 -1
  7. package/agent-spine-plugin/CHANGELOG.md +70 -8
  8. package/agent-spine-plugin/README.md +1 -1
  9. package/agent-spine-plugin/blun.plugin.json +33 -33
  10. package/agent-spine-plugin/docs/acceptance.md +2 -2
  11. package/agent-spine-plugin/docs/gateway-runtime.md +8 -1
  12. package/agent-spine-plugin/docs/host-integration.md +34 -34
  13. package/agent-spine-plugin/docs/preflight-recall.md +69 -0
  14. package/agent-spine-plugin/docs/relationships.md +6 -0
  15. package/agent-spine-plugin/hooks/codex.json +47 -0
  16. package/agent-spine-plugin/hooks/hooks.json +11 -0
  17. package/agent-spine-plugin/hooks/version.json +2 -2
  18. package/agent-spine-plugin/package.json +4 -4
  19. package/agent-spine-plugin/scripts/check-hosts.js +53 -51
  20. package/agent-spine-plugin/scripts/check-install.js +53 -35
  21. package/agent-spine-plugin/scripts/release-check.js +11 -10
  22. package/agent-spine-plugin/skills/agent-spine/SKILL.md +1 -1
  23. package/agent-spine-plugin/src/cli.js +46 -1
  24. package/agent-spine-plugin/src/hook.js +168 -90
  25. package/agent-spine-plugin/src/index.js +6 -0
  26. package/agent-spine-plugin/src/lib/acceptance.js +40 -0
  27. package/agent-spine-plugin/src/lib/audit.js +9 -2
  28. package/agent-spine-plugin/src/lib/graph.js +22 -4
  29. package/agent-spine-plugin/src/lib/persona-runtime.js +103 -31
  30. package/agent-spine-plugin/src/lib/preflight.js +678 -0
  31. package/agent-spine-plugin/src/lib/source-roots.js +32 -32
  32. package/agent-spine-plugin/src/version.js +1 -1
  33. package/agent-spine-plugin/src/worker.js +20 -3
  34. package/bin/read-batch-policy.cjs +32 -0
  35. package/bin/turn-tool-performance-policy.cjs +1 -0
  36. package/blun.mjs +58 -2
  37. package/package.json +3 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 9.1.511 - 2026-08-31
4
+
5
+ - Upgrades the managed core plugin from AgentSpine 0.8.0 to the cache-distinct 0.10.1 bundle with mandatory pre-answer receipts, Must-Remember, self-healing authenticated persona and relationship graph reconciliation, and a five-second local relationship deadline.
6
+ - Race-safely verifies and identity-binds every active host instruction file without duplicating its already host-loaded text into the injected briefing; the real 15,519-byte user `CLAUDE.md` produced a 5,667-byte total injected context with no instruction content field.
7
+ - Preserves the King-specific bounded Telegram-to-Mnemo recall rule, keeps all plugin state external to the package, and adds a package regression for compact BLUN delivery plus descriptor-only Codex delivery.
8
+
9
+ ## 9.1.510 - 2026-08-31
10
+
11
+ - Adds `ReadBatch` for two to twelve independent known UTF-8 files or ranges in one concurrent tool call, reducing repeated model round trips over a large working context.
12
+ - Reuses the exact `Read` path resolution, sensitive-file checks, permissions, UTF-8 validation, paging, and byte limits while preserving request order and reporting partial failures individually.
13
+ - Keeps `ReadBatch` in the bounded core tool catalogue for main, coder, explore, and plan profiles, with focused concurrency, access, partial-failure, registration, and full-package regressions.
14
+
3
15
  ## 9.1.509 - 2026-08-30
4
16
 
5
17
  - Requires every authorized bot-to-bot Telegram work message to mention its intended King explicitly.
package/LIESMICH.txt CHANGED
@@ -9,7 +9,18 @@ Installation
9
9
  ------------
10
10
  Die geprüfte Version exakt global installieren:
11
11
 
12
- npm install -g blun-king-cli@9.1.509
12
+ npm install -g blun-king-cli@9.1.511
13
+
14
+ AgentSpine 0.10.1
15
+ -----------------
16
+ Version 9.1.511 liefert AgentSpine 0.10.1 als neue inhaltsadressierte
17
+ Pluginfassung. Der Preflight prueft weiterhin jede aktive Host-Anweisungsdatei
18
+ race-sicher und bindet SHA-256 sowie Dateiidentitaet an den Zug, dupliziert den
19
+ bereits vom Host geladenen Volltext aber nicht mehr in den Laufzeitkontext.
20
+ Die reale 15.519-Byte-CLAUDE.md-Probe blieb dadurch bei 5.667 injizierten Byte.
21
+ Der Stand enthaelt ausserdem den selbstheilenden Persona- und Beziehungsgraphen,
22
+ die begrenzte Telegram-Mnemo-Abfrage und eine sichtbare Fuenf-Sekunden-Grenze
23
+ fuer lokale Beziehungsabfragen.
13
24
 
14
25
  Start
15
26
  -----
package/README.md CHANGED
@@ -9,9 +9,20 @@ Voraussetzung ist Node.js 24.15 oder neuer. Die geprüfte Version wird exakt
9
9
  installiert:
10
10
 
11
11
  ```powershell
12
- npm install -g blun-king-cli@9.1.509
12
+ npm install -g blun-king-cli@9.1.511
13
13
  ```
14
14
 
15
+ ## AgentSpine 0.10.1
16
+
17
+ Version 9.1.511 liefert AgentSpine 0.10.1 als neue inhaltsadressierte
18
+ Pluginfassung. Der Preflight prueft weiterhin jede aktive Host-Anweisungsdatei
19
+ race-sicher und bindet SHA-256 sowie Dateiidentitaet an den Zug, dupliziert den
20
+ bereits vom Host geladenen Volltext aber nicht mehr in den Laufzeitkontext.
21
+ Die reale 15.519-Byte-`CLAUDE.md`-Probe blieb dadurch bei 5.667 injizierten Byte.
22
+ Der Stand enthaelt ausserdem den selbstheilenden Persona- und Beziehungsgraphen,
23
+ die begrenzte Telegram-Mnemo-Abfrage und eine sichtbare Fuenf-Sekunden-Grenze
24
+ fuer lokale Beziehungsabfragen.
25
+
15
26
  ## Reproduzierbares Staging und Packen
16
27
 
17
28
  Der Schritt baut nichts, installiert nichts und veröffentlicht nichts. Vorher müssen
@@ -9,7 +9,7 @@
9
9
  "name": "agent-spine",
10
10
  "source": ".",
11
11
  "description": "Map existing rules, soul, and memory without rewriting source files.",
12
- "version": "0.8.0",
12
+ "version": "0.10.1",
13
13
  "author": {
14
14
  "name": "Mayk Biletti"
15
15
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-spine",
3
- "version": "0.8.0",
3
+ "version": "0.10.1",
4
4
  "description": "A non-destructive identity and memory spine for Claude Code agents.",
5
5
  "author": {
6
6
  "name": "Mayk Biletti",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-spine",
3
- "version": "0.8.0",
3
+ "version": "0.10.1",
4
4
  "description": "A non-destructive identity and memory spine for Codex agents.",
5
5
  "author": {
6
6
  "name": "Mayk Biletti",
@@ -11,6 +11,7 @@
11
11
  "license": "Apache-2.0",
12
12
  "keywords": ["identity", "memory", "mcp", "agents"],
13
13
  "skills": "./skills/",
14
+ "hooks": "./hooks/codex.json",
14
15
  "mcpServers": {
15
16
  "agent-spine": {
16
17
  "command": "node",
@@ -4,19 +4,78 @@ All notable changes to AgentSpine will be documented here. The project follows [
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
- ### Added
8
-
9
- - BLUN King can now install AgentSpine as a native plugin with the same lifecycle hooks, MCP server, isolated app-home source resolution, and explicit plugin-install trust step as the existing Claude Code and Codex hosts
7
+ ## [0.10.1] - 2026-08-31
10
8
 
11
9
  ### Fixed
12
10
 
13
- - Routine BLUN hook results now render as one short human-readable status line instead of exposing compact internal JSON in the TUI, while actionable attention, self-starter, channel, and failure details remain available immediately
14
- - BLUN hooks now inject a compact runtime status instead of the complete session briefing on every prompt; detailed continuity remains available on demand while active attention, self-starter, and authenticated channel signals remain immediate
15
- - BLUN lifecycle hooks now index large real workspaces without absorbing embedded test profiles or failing at the smaller host-rule limit
16
- - Windows Node 24 state writes now treat transient lock access errors as contention across every lock-backed store, retry atomic replacements with a bounded backoff, and tolerate briefly retained handles during hermetic cleanup
11
+ - Mandatory host-instruction files are still race-safely reread, hashed, identity-bound, and verified for each exact turn, but their already host-loaded bytes are no longer duplicated into the injected preflight briefing.
12
+ - Large native `CLAUDE.md` and `AGENTS.md` hierarchies no longer fail merely because their instruction text exceeds the runtime context budget; only bounded descriptors enter the hook context.
13
+
14
+ ### Security
15
+
16
+ - Unreadable, changed, replaced, symlinked, out-of-scope, individually oversized, or descriptor-overflowing mandatory instruction files continue to fail closed.
17
+
18
+ ## [0.10.0] - 2026-08-30
19
+
20
+ ### Added
21
+
22
+ - Self-healing authenticated persona-to-graph reconciliation on every roster sync, including unchanged replays after partial graph failure
23
+ - Automatic context-only group materialization for exact locally approved roster group IDs
24
+ - Exact group-scoped team neighborhoods so a persona briefing can include current visible co-members without explicit pairwise edges
25
+ - Separate roster-change and graph-repair diagnostics with deterministic counts for created groups, updated entities, and added or removed memberships
26
+
27
+ ### Changed
28
+
29
+ - Active `person`, `agent`, and `bot` bindings now retain user-authored non-authority graph attributes while authenticated display name, status, source binding, privacy, and membership are reconciled
30
+ - Package, lockfile, Claude Code, Codex, marketplace, BLUN and hook-bundle versions advance together to `0.10.0`
31
+
32
+ ### Fixed
33
+
34
+ - An unchanged roster now repairs missing persona entities, groups, and membership edges instead of remaining permanently classified as a duplicate
35
+ - Left and deactivated personas retain append-only identity history but no longer appear in current relationship neighborhoods
36
+ - Missing roster groups no longer cause membership edges to be silently skipped
37
+ - Relationship reads now fail visibly after a five-second local state deadline instead of waiting indefinitely
38
+
39
+ ### Security
40
+
41
+ - Group peer expansion requires one exact group audience and filters inactive, private, and other-group entities before returning context
42
+ - Conflicting non-group IDs and private groups fail visibly instead of weakening group-scope isolation
43
+ - Persona, group, and relationship context remains incapable of granting rights, delegation, tools, execution, access, or policy changes
44
+
45
+ ## [0.9.0] - 2026-08-30
46
+
47
+ ### Added
48
+
49
+ - Mandatory `agentspine.preflight/v2` before-answer receipts bound to the exact prompt, hook delivery, host, agent, user, tenant, profile, session, project, working directory, task, group, instruction identities, retrieval queries, and briefing
50
+ - Provider-neutral `agentspine.retrieval-query/v1` and `agentspine.retrieval-result/v1` contracts with a bounded shell-free `mnemo-command/v1` reference adapter and environment-only credential names
51
+ - Explicitly confirmed, scoped Must-Remember candidates with append-only activation, supersession, rollback, permanent local-user purge, checksums, retention, and reserved briefing priority
52
+ - Local preflight policy, status, Must-Remember CLI and Doctor/Audit diagnostics; none of these administration surfaces are exposed through MCP
53
+ - Claude Code `InstructionsLoaded` observability alongside the blocking `UserPromptSubmit` gate
54
+ - BLUN King can now install AgentSpine as a native plugin with the same lifecycle hooks, MCP server, isolated app-home source resolution, and explicit plugin-install trust step as the existing Claude Code and Codex hosts
55
+
56
+ ### Changed
57
+
58
+ - Prompt turns now carry a compact ordinary briefing plus a separately budgeted mandatory instruction and recall section, avoiding silent source truncation
59
+ - Package, lockfile, Claude Code, Codex, marketplace, BLUN, hook-bundle, worker and preflight versions advance together to `0.9.0`
60
+
61
+ ### Fixed
62
+
63
+ - Routine BLUN hook results now render as one short human-readable status line instead of exposing compact internal JSON in the TUI, while actionable attention, self-starter, channel, and failure details remain available immediately
64
+ - BLUN hooks now inject a compact runtime status instead of the complete session briefing on every prompt; detailed continuity remains available on demand while active attention, self-starter, and authenticated channel signals remain immediate
65
+ - BLUN lifecycle hooks now index large real workspaces without absorbing embedded test profiles or failing at the smaller host-rule limit
66
+ - Windows Node 24 state writes now treat transient lock access errors as contention across every lock-backed store, retry atomic replacements with a bounded backoff, and tolerate briefly retained handles during hermetic cleanup
17
67
  - The gateway worker now canonicalizes its state directory before opening the native file watcher, avoiding the Windows libuv path assertion on differently cased or short paths
18
68
  - CI now identifies the failing check phase and annotates the exact hermetic test file or runner error, so public Windows failures can be diagnosed without access to private job logs
19
69
 
70
+ ### Security
71
+
72
+ - Controlled preflight failures return the host's blocking decision and exit code 2 instead of the previous fail-open informational packet
73
+ - Mandatory instructions are reopened without following symlinks, checked through one filehandle before and after reading, SHA-256 bound, fully injected, and rejected on replacement, deletion, scope escape, size overflow, stale identity or second receipt consumption
74
+ - Required recall distinguishes a verified empty result from no invocation or failure; provider output is scope-bound, content-filtered and incapable of changing policy or authority
75
+ - Receipts are short-lived, HMAC-authenticated in private external state, one-time consumable, and contain no prompt text, rule content, memory claims, credentials or transcripts
76
+ - Receipt consumption revalidates the current instruction set, local policy revision, active critical-memory checksums and exact turn scope; aborted prepared turns are invalidated for safe retry while consumed deliveries remain replay-blocked
77
+ - Claude-only `InstructionsLoaded` registration is physically separated from Codex's documented lifecycle event set
78
+
20
79
  ## [0.8.0] - 2026-08-29
21
80
 
22
81
  ### Added
@@ -266,7 +325,10 @@ All notable changes to AgentSpine will be documented here. The project follows [
266
325
  - Dual Claude Code and Codex plugin manifests
267
326
  - Cross-platform preservation, hook, graph, and MCP tests
268
327
 
269
- [Unreleased]: https://github.com/Maykbiletti/AgentSpine/compare/v0.8.0...HEAD
328
+ [Unreleased]: https://github.com/Maykbiletti/AgentSpine/compare/v0.10.1...HEAD
329
+ [0.10.1]: https://github.com/Maykbiletti/AgentSpine/compare/v0.10.0...v0.10.1
330
+ [0.10.0]: https://github.com/Maykbiletti/AgentSpine/compare/v0.9.0...v0.10.0
331
+ [0.9.0]: https://github.com/Maykbiletti/AgentSpine/compare/v0.8.0...v0.9.0
270
332
  [0.8.0]: https://github.com/Maykbiletti/AgentSpine/compare/v0.7.0...v0.8.0
271
333
  [0.7.0]: https://github.com/Maykbiletti/AgentSpine/compare/v0.6.0...v0.7.0
272
334
  [0.6.0]: https://github.com/Maykbiletti/AgentSpine/compare/v0.5.0...v0.6.0
@@ -91,7 +91,7 @@ claude --plugin-dir .
91
91
  ```
92
92
 
93
93
  Claude Code discovers the bundled skill, hooks, and MCP server. Review and trust executable components when the host asks.
94
- Version `0.8.0` explicitly registers `.mcp.json`, ships one native `hooks/hooks.json`, and invalidates Claude Code's earlier `0.7.0` plugin cache. The unreleased BLUN adapter adds `blun.plugin.json` with native MCP and lifecycle registrations. Fresh-install and upgrade checks prove package containment and entrypoint behavior; actual hook discovery and trust remain host-controlled and must be inspected in the live host. Claude project memory is `MEMORY.md`-indexed, lazy, race-safe, persistently cached outside the project, and independent of unrelated file count; the live path performs no memory-directory enumeration.
94
+ Version `0.10.1` retains the `agentspine.preflight/v2` pre-answer contract, removes duplicate host-instruction injection, and includes self-healing authenticated persona-to-graph reconciliation. Exact roster groups are materialized as context-only entities, stale membership edges are repaired, inactive personas disappear from current relationship reads, and an exact group-scoped briefing includes visible team peers without exposing another group. Claude uses `hooks/hooks.json`; Codex selects `hooks/codex.json` so Claude-only events never enter Codex configuration. Fresh-install and upgrade checks prove package containment and entrypoint behavior; actual hook discovery and trust remain host-controlled and must be inspected in the live host. Claude project memory remains `MEMORY.md`-indexed, lazy, race-safe, persistently cached outside the project, and independent of unrelated file count. See [pre-answer recall gate](docs/preflight-recall.md) and [durable gateway worker](docs/gateway-runtime.md).
95
95
 
96
96
  Verify the installed registration from a checkout with:
97
97
 
@@ -1,33 +1,33 @@
1
- {
2
- "name": "agent-spine",
3
- "version": "0.8.0",
4
- "description": "A non-destructive identity and memory spine for BLUN King agents.",
5
- "license": "Apache-2.0",
6
- "author": {
7
- "name": "Mayk Biletti"
8
- },
9
- "skills": "./skills/",
10
- "mcpServers": {
11
- "agent-spine": {
12
- "transport": "stdio",
13
- "command": "node",
14
- "args": ["./src/mcp.js"]
15
- }
16
- },
17
- "hooks": [
18
- { "event": "SessionStart", "command": "node \"./src/hook.js\"", "timeout": 15 },
19
- { "event": "UserPromptSubmit", "command": "node \"./src/hook.js\"", "timeout": 15 },
20
- { "event": "PreToolUse", "matcher": "Edit|Write|apply_patch|Bash|exec_command", "command": "node \"./src/hook.js\"", "timeout": 15 },
21
- { "event": "PostToolUse", "command": "node \"./src/hook.js\"", "timeout": 15 },
22
- { "event": "PreCompact", "command": "node \"./src/hook.js\"", "timeout": 15 },
23
- { "event": "PostCompact", "command": "node \"./src/hook.js\"", "timeout": 15 },
24
- { "event": "Stop", "command": "node \"./src/hook.js\"", "timeout": 15 },
25
- { "event": "SubagentStop", "command": "node \"./src/hook.js\"", "timeout": 15 }
26
- ],
27
- "interface": {
28
- "displayName": "AgentSpine",
29
- "shortDescription": "Identity, memory, attention, and resumable context without rewriting source files.",
30
- "developerName": "Mayk Biletti",
31
- "websiteURL": "https://github.com/Maykbiletti/AgentSpine"
32
- }
33
- }
1
+ {
2
+ "name": "agent-spine",
3
+ "version": "0.10.1",
4
+ "description": "A non-destructive identity and memory spine for BLUN King agents.",
5
+ "license": "Apache-2.0",
6
+ "author": {
7
+ "name": "Mayk Biletti"
8
+ },
9
+ "skills": "./skills/",
10
+ "mcpServers": {
11
+ "agent-spine": {
12
+ "transport": "stdio",
13
+ "command": "node",
14
+ "args": ["./src/mcp.js"]
15
+ }
16
+ },
17
+ "hooks": [
18
+ { "event": "SessionStart", "command": "node \"./src/hook.js\"", "timeout": 15 },
19
+ { "event": "UserPromptSubmit", "command": "node \"./src/hook.js\"", "timeout": 15 },
20
+ { "event": "PreToolUse", "matcher": "Edit|Write|apply_patch|Bash|exec_command", "command": "node \"./src/hook.js\"", "timeout": 15 },
21
+ { "event": "PostToolUse", "command": "node \"./src/hook.js\"", "timeout": 15 },
22
+ { "event": "PreCompact", "command": "node \"./src/hook.js\"", "timeout": 15 },
23
+ { "event": "PostCompact", "command": "node \"./src/hook.js\"", "timeout": 15 },
24
+ { "event": "Stop", "command": "node \"./src/hook.js\"", "timeout": 15 },
25
+ { "event": "SubagentStop", "command": "node \"./src/hook.js\"", "timeout": 15 }
26
+ ],
27
+ "interface": {
28
+ "displayName": "AgentSpine",
29
+ "shortDescription": "Identity, memory, attention, and resumable context without rewriting source files.",
30
+ "developerName": "Mayk Biletti",
31
+ "websiteURL": "https://github.com/Maykbiletti/AgentSpine"
32
+ }
33
+ }
@@ -1,6 +1,6 @@
1
1
  # Visible cross-host acceptance
2
2
 
3
- AgentSpine `0.8.0` retains the visible, reproducible 14-gate acceptance scenario for the lifecycle adapter and adds staged installed-entrypoint source-root and indexed-memory scaling smoke tests. They execute the same bundled adapter used by Claude Code and Codex and never select an MCP tool, but they do not substitute for the hosts' own plugin discovery and hook-trust UI.
3
+ AgentSpine `0.10.1` runs a visible, reproducible 15-gate acceptance scenario for the lifecycle adapter, including exact host-instruction identity verification without duplicate context injection, required provider recall and a fail-closed missing-provider probe. Staged installed-entrypoint source-root and indexed-memory scaling smoke tests execute the same bundled adapter used by Claude Code and Codex and never select an MCP tool, but they do not substitute for the hosts' own plugin discovery and hook-trust UI.
4
4
 
5
5
  ```bash
6
6
  agentspine acceptance
@@ -52,7 +52,7 @@ Every line includes a SHA-256 receipt derived from the acceptance schema, gate I
52
52
 
53
53
  ## Installation proof
54
54
 
55
- `npm run host:install-check` stages both a fresh installation and an upgrade from `0.7.0`. Each installed `0.8.0` bundle must contain exactly one MCP server, one hook set, and one worker entrypoint, then pass the complete visible acceptance run with `mcpCalls: 0`. It directly invokes the packaged hook entrypoint from an AgentSpine checkout and a foreign `cwd` with sources only in a custom Claude profile, and repeats the Codex-shaped event path with a custom home, two Git projects, a fallback name, and a nested override. Uninstall removes only staged plugin and generated state; all synthetic source hashes remain unchanged. A real Codex session must separately show the plugin source in `/hooks`, record trust for the current definition hash, and inject the briefing after a new session starts.
55
+ `npm run host:install-check` stages both a fresh installation and an upgrade from `0.7.0`. Each installed `0.10.1` bundle must contain exactly one MCP server, one hook set, and one worker entrypoint, then pass the complete visible acceptance run with `mcpCalls: 0`. It directly invokes the packaged hook entrypoint from an AgentSpine checkout and a foreign `cwd` with sources only in a custom Claude profile, and repeats the Codex-shaped event path with a custom home, two Git projects, a fallback name, and a nested override. Uninstall removes only staged plugin and generated state; all synthetic source hashes remain unchanged. A real Codex session must separately show the plugin source in `/hooks`, record trust for the current definition hash, and inject the briefing after a new session starts.
56
56
 
57
57
  ## Deliberate trust boundaries
58
58
 
@@ -31,7 +31,11 @@ Set `AGENTSPINE_PERSONA_ROSTER_FILE` or pass `--persona-roster` to the worker. T
31
31
  }
32
32
  ```
33
33
 
34
- Every tick synchronizes authenticated identities before any work is reconciled. New bindings append `join` events; renames retain the stable persona ID; omitted members in the same explicit roster scope become `left`; `"deactivated": true` records a distinct deactivation; reappearance appends `rejoin`. Names, Markdown, memory, and chat text cannot create identity or rights. Existing source files are never changed.
34
+ Every tick synchronizes authenticated identities before any work is reconciled. New bindings append `join` events; renames retain the stable persona ID; omitted members in the same explicit roster scope become `left`; `"deactivated": true` records a distinct deactivation; reappearance appends `rejoin`. A binding may describe a `person`, `agent`, or `bot`; equal display names never merge identities. Names, Markdown, memory, and chat text cannot create identity or rights. Existing source files are never changed.
35
+
36
+ Version `0.10.0` reconciles the authenticated roster into the relationship graph on every sync, including an otherwise unchanged replay. An exact `groupId` creates a missing group-scoped, context-only group entity; a conflicting non-group or private group fails visibly. Missing persona entities and membership edges are recreated, stale memberships are removed, and left or deactivated personas remain in append-only identity history but disappear from current relationship context. Reconciliation reports whether the roster changed separately from graph repair, so a previously partial installation can self-heal instead of remaining a permanent duplicate.
37
+
38
+ When a hook supplies the same exact `groupId`, `relationship_context` and `session_briefing` include current visible co-members reached through authenticated `member-of` edges. They do not infer friendships, merge names, cross tenants, expose another group, or turn membership into delegation. A direct session without an exact group scope does not receive group-private peers. Relationship reads have a five-second local state deadline and return a clear error instead of waiting indefinitely on a stalled read.
35
39
 
36
40
  The same approved envelope may contain `nativeDiscovery` scopes. AgentSpine then checks only the officially documented direct agent-manifest directories: Claude Code `~/.claude/agents/` or `<project>/.claude/agents/`, and Codex `~/.codex/agents/` or `<project>/.codex/agents/`. `CLAUDE_CONFIG_DIR` and `CODEX_HOME` replace only their matching user scope. Each scope fixes issuer, tenant, profile, agent/bot kind, and optional group; those authenticated scope fields plus the exact source binding form the stable identity. The manifest contributes only its declared display name and an exact source descriptor; its instructions remain host-native context. Direct regular `.md` or `.toml` files are bounded to 128 entries and 256 KiB each; symlinks and files exchanged during a read fail closed. No other home or project directory is enumerated. See the official [Claude Code custom subagent locations](https://code.claude.com/docs/en/sub-agents) and [Codex custom agent locations](https://developers.openai.com/codex/agent-configuration/subagents).
37
41
 
@@ -58,6 +62,9 @@ A one-shot manual validation is available through:
58
62
  agentspine persona-sync /path/to/project \
59
63
  --roster /absolute/path/to/roster.json \
60
64
  --confirm-local-persona
65
+
66
+ agentspine personas /path/to/project --json
67
+ agentspine relationships group:engineering --group group:engineering --json
61
68
  ```
62
69
 
63
70
  ## Telegram and host runner
@@ -21,7 +21,7 @@ claude plugin install agent-spine@agent-spine
21
21
 
22
22
  Use `claude plugin validate .` in a checkout to validate the manifest and marketplace. Claude Code asks the user to approve executable plugin components according to its trust model.
23
23
 
24
- The Claude manifest explicitly references `./.mcp.json`. The hook bundle remains at Claude Code's native auto-discovery path `hooks/hooks.json`; it is deliberately not registered a second time through the manifest. Version `0.8.0` replaces the `0.7.0` plugin cache identity. The hook definition contains only portable documented hook fields; `hooks/version.json` carries the separately validated bundle release and lifecycle contract. The repository checks resolve installed-root variables, perform a real MCP `initialize` handshake, validate exactly one native hook command per event, and exercise staged clean install, previous-version cache rejection, upgrade, host-native source resolution, indexed and lazy Claude memory, automatic multilingual briefing, attention, exact job start, tool checkpoint, new-session resume, purge, and uninstall preservation:
24
+ The Claude manifest explicitly references `./.mcp.json`. The hook bundle remains at Claude Code's native auto-discovery path `hooks/hooks.json`; it is deliberately not registered a second time through the manifest. Version `0.10.1` replaces the `0.10.0` plugin cache identity. The hook definition contains only portable documented hook fields; `hooks/version.json` carries the separately validated bundle release and preflight contract. The repository checks resolve installed-root variables, perform a real MCP `initialize` handshake, validate exactly one native hook command per event, and exercise staged clean install, previous-version cache rejection, upgrade, host-native source resolution, indexed and lazy Claude memory, automatic multilingual briefing, pre-answer recall, authenticated persona graph reconciliation, attention, exact job start, tool checkpoint, new-session resume, purge, and uninstall preservation:
25
25
 
26
26
  ```bash
27
27
  npm run host:check
@@ -43,44 +43,44 @@ claude mcp list
43
43
 
44
44
  Open `/mcp` in the new interactive session and approve or reconnect `agent-spine`. `Pending approval` means discovery succeeded but Claude Code still needs the user's trust decision. A missing entry after reinstall should be diagnosed from `claude plugin validate .`, `npm run host:check`, and Claude Code's plugin diagnostics; AgentSpine does not write to Claude's user configuration or silently approve itself.
45
45
 
46
- ## Codex
46
+ ## Codex
47
47
 
48
48
  | Component | Path | Purpose |
49
49
  |---|---|---|
50
50
  | Manifest | `.codex-plugin/plugin.json` | Package identity plus explicit skill and MCP registration |
51
51
  | Skill | `skills/agent-spine/SKILL.md` | Context rules and preservation invariants |
52
52
  | MCP | Manifest `mcpServers` | Read-only source tools plus external overlay workflows |
53
- | Hooks | `hooks/hooks.json` | Auto-discovered lifecycle guardrails |
54
-
55
- Open `/plugins` in Codex CLI after configuring a marketplace that contains AgentSpine, then start a new session. Codex presents a startup review when a new or changed hook definition needs trust; there is no `/hooks` slash command. Codex records trust against the exact hook-definition hash, so an installed, updated, or previously untrusted bundle is skipped until that current definition is reviewed and trusted. This follows the official [Codex hooks trust and plugin discovery contract](https://developers.openai.com/codex/hooks).
56
-
57
- Codex discovers the hook at the standard `hooks/hooks.json` path. The file deliberately contains only the documented top-level `description` and `hooks` fields; earlier AgentSpine builds added private `version` and `contract` metadata there, which a strict Codex parser could reject before presenting a trust decision. Cache identity remains in `.codex-plugin/plugin.json`, while Codex records hook trust against the current definition hash. Codex sets `CLAUDE_PLUGIN_ROOT` for hook compatibility, so the same hook bundle can execute in both hosts. The MCP registration uses Codex's `PLUGIN_ROOT` expansion.
58
-
59
- Verify the live host in a newly started Codex CLI session:
60
-
61
- ```text
62
- /plugins
63
- Trust all and continue
64
- ```
65
-
66
- `npm run host:check` proves manifest shape, package containment, and a real MCP handshake. `npm run host:install-check` stages the installed bundle and executes its hook entrypoint with native event JSON. Neither command can manufacture Codex's user-controlled trust receipt; only the startup review in the actual host proves that final boundary.
67
-
68
- ## BLUN King
69
-
70
- | Component | Path | Purpose |
71
- |---|---|---|
72
- | Manifest | `blun.plugin.json` | Native BLUN plugin identity plus skill, MCP, and lifecycle-hook registration |
73
- | Skill | `skills/agent-spine/SKILL.md` | Context rules and preservation invariants |
74
- | MCP | Manifest `mcpServers` | Read-only source tools plus external overlay workflows |
75
- | Hooks | Manifest `hooks` | Automatic briefing, attention, protected-source guard, and checkpoints |
76
-
77
- Install the local checkout from Fredrik's TUI:
78
-
79
- ```text
80
- /plugins install C:\path\to\AgentSpine
81
- ```
82
-
83
- BLUN asks the user to trust a third-party plugin before installation because its MCP server and hooks execute local code. Accept that visible install decision, then use `/reload` or `/new`; BLUN has no separate `/hooks` command. The BLUN adapter maps its isolated `BLUN_HOME` to AgentSpine's Codex-compatible `AGENTS.md` source hierarchy, so user state remains under the BLUN app home instead of leaking into `.codex` or a scanned project.
53
+ | Hooks | `hooks/codex.json` | Manifest-selected lifecycle guardrails |
54
+
55
+ Open `/plugins` in Codex CLI after configuring a marketplace that contains AgentSpine, then start a new session. Codex presents a startup review when a new or changed hook definition needs trust; there is no `/hooks` slash command. Codex records trust against the exact hook-definition hash, so an installed, updated, or previously untrusted bundle is skipped until that current definition is reviewed and trusted. This follows the official [Codex hooks trust and plugin discovery contract](https://developers.openai.com/codex/hooks).
56
+
57
+ Codex loads `hooks/codex.json` through the explicit plugin-manifest entry. It contains only Codex-documented lifecycle events; Claude Code's additional `InstructionsLoaded` event remains confined to `hooks/hooks.json`. Both files deliberately contain only the documented top-level `description` and `hooks` fields. Cache identity remains in `.codex-plugin/plugin.json`, while Codex records hook trust against the current definition hash. The Codex hook and MCP registrations use the host-native `PLUGIN_ROOT` expansion.
58
+
59
+ Verify the live host in a newly started Codex CLI session:
60
+
61
+ ```text
62
+ /plugins
63
+ Trust all and continue
64
+ ```
65
+
66
+ `npm run host:check` proves manifest shape, package containment, and a real MCP handshake. `npm run host:install-check` stages the installed bundle and executes its hook entrypoint with native event JSON. Neither command can manufacture Codex's user-controlled trust receipt; only the startup review in the actual host proves that final boundary.
67
+
68
+ ## BLUN King
69
+
70
+ | Component | Path | Purpose |
71
+ |---|---|---|
72
+ | Manifest | `blun.plugin.json` | Native BLUN plugin identity plus skill, MCP, and lifecycle-hook registration |
73
+ | Skill | `skills/agent-spine/SKILL.md` | Context rules and preservation invariants |
74
+ | MCP | Manifest `mcpServers` | Read-only source tools plus external overlay workflows |
75
+ | Hooks | Manifest `hooks` | Automatic briefing, attention, protected-source guard, and checkpoints |
76
+
77
+ Install the local checkout from Fredrik's TUI:
78
+
79
+ ```text
80
+ /plugins install C:\path\to\AgentSpine
81
+ ```
82
+
83
+ BLUN asks the user to trust a third-party plugin before installation because its MCP server and hooks execute local code. Accept that visible install decision, then use `/reload` or `/new`; BLUN has no separate `/hooks` command. The BLUN adapter maps its isolated `BLUN_HOME` to AgentSpine's Codex-compatible `AGENTS.md` source hierarchy, so user state remains under the BLUN app home instead of leaking into `.codex` or a scanned project.
84
84
 
85
85
  ## Direct MCP use
86
86
 
@@ -110,7 +110,7 @@ The audit exits non-zero when a required gate fails, making it suitable for inst
110
110
 
111
111
  Use `agentspine doctor --host claude|codex --cwd /active/project --json` or `agentspine source-status --host claude|codex --cwd /active/project --json` to see the checked scope counts and a concrete empty/fail-closed reason. The lifecycle adapter never substitutes the installation directory for the active host hierarchy. Details and official host references are in [host-native source roots](source-roots.md).
112
112
 
113
- The provider-neutral lifecycle adapter covers `SessionStart` (including resume and compact starts), `UserPromptSubmit`, `PreToolUse`, `PostToolUse`, `PreCompact`, `PostCompact`, `Stop`, and `SubagentStop`. Start, prompt, and compaction boundaries scan and inject the actual byte-budgeted `session_briefing`; no model-side MCP selection is required. Prompt submission can additionally capture minimal safe learning and direct promise/blocker signals after the separate local continuity opt-in. `PostToolUse` writes an idempotent task heartbeat; `Stop` and `SubagentStop` close that heartbeat without emitting repeated chat text.
113
+ The provider-neutral lifecycle adapter covers `SessionStart` (including resume and compact starts), `UserPromptSubmit`, `PreToolUse`, `PostToolUse`, `PreCompact`, `PostCompact`, `Stop`, and `SubagentStop`. Claude Code additionally registers its documented `InstructionsLoaded` observability event; Codex does not. `UserPromptSubmit` is the blocking boundary. Before a prompt can proceed, `agentspine.preflight/v2` verifies the complete mandatory host-instruction hierarchy without reinjecting its bytes, loads confirmed Must-Remember entries and every locally required retrieval provider, then consumes one exact-turn receipt. Start and compaction boundaries retain the scoped `session_briefing`; no model-side MCP selection is required. Full behavior and the documented command-hook timeout limitation are in [pre-answer recall gate](preflight-recall.md).
114
114
 
115
115
  When an exact locally registered job is waiting, `SessionStart` acquires its lease and injects its real checkpoint automatically. Subsequent tool and stop hooks resolve that job from the native host session; the model does not need to repeat a job envelope. `PreToolUse` first retains the protected-source guard, then rechecks the current execution grant, assignment, scope, capability, lease, and workspace. `PostToolUse` checkpoints exactly one matching result. A new session resumes only after the same checks. Grant and job administration remain local CLI operations and are absent from MCP. No hook creates permissions.
116
116
 
@@ -0,0 +1,69 @@
1
+ # Pre-answer recall gate
2
+
3
+ AgentSpine 0.9 adds `agentspine.preflight/v2`, a provider-neutral pre-answer contract. On `UserPromptSubmit`, the lifecycle adapter resolves and race-safely rereads the active host instruction hierarchy, loads confirmed Must-Remember context, runs every locally required retrieval provider, creates a short-lived HMAC receipt bound to the exact turn, consumes it once, and only then injects the resulting context. The model does not call MCP for any part of this path.
4
+
5
+ The receipt binds agent and optional persona, user, tenant, host, instruction host, profile, session, project, task, group, working-directory digest, hook delivery, prompt digest, every mandatory instruction file and file identity, the current local policy revision and profile digest, active Must-Remember checksums, provider query status, loaded item IDs and revisions, rejection count, briefing digest, creation time, and expiry. A different prompt, session, scope, working directory, source set, policy, critical-memory revision, hook delivery, or second consumption is rejected. Receipts contain no prompt text, source content, retrieval claims, credentials, or full transcripts.
6
+
7
+ ## Host instructions
8
+
9
+ Claude Code uses its resolved user and project `CLAUDE.md` hierarchy. Codex uses the corresponding `AGENTS.override.md`/`AGENTS.md` hierarchy. A generic host must explicitly bind `instruction_host` to `claude` or `codex`; AgentSpine does not guess. The preflight race-safely rereads and hashes every active host instruction document, binds its exact file identity into the receipt, and emits only bounded `host-native` descriptors. It never duplicates the already host-loaded instruction bytes into hook context. An unreadable, replaced, deleted, oversized, out-of-scope, or symlinked mandatory file still blocks the turn.
10
+
11
+ Claude Code's `InstructionsLoaded` lifecycle event is registered as an additional observability signal, while `UserPromptSubmit` remains the blocking and injection boundary. Codex uses its own manifest-selected hook set without that unsupported Claude-only event. The preflight does not rely on the model remembering to read a file or call a tool.
12
+
13
+ ## Required retrieval providers
14
+
15
+ Retrieval policy is a separate local policy file outside every project. Configure it only through the local CLI:
16
+
17
+ ```bash
18
+ agentspine preflight-policy ./dieter-preflight.json --confirm-local-policy
19
+ agentspine preflight-status --json
20
+ ```
21
+
22
+ The initial reference adapter is `mnemo-command/v1`: an absolute, regular executable receives one `agentspine.retrieval-query/v1` JSON object on stdin and must return one `agentspine.retrieval-result/v1` object on stdout. It may talk to a local or remote Mnemo deployment. Credentials are passed only through environment-variable names explicitly listed in local policy; values never enter repository files, state, context, receipts, logs, or MCP. Required providers must be fail-closed. A successful query with no matches produces status `empty`; a missing invocation, timeout, invalid scope, malformed response, or adapter failure blocks the turn.
23
+
24
+ Example local policy profile:
25
+
26
+ ```json
27
+ {
28
+ "id": "preflight-policy:dieter:claude",
29
+ "agentId": "agent:dieter",
30
+ "host": "claude",
31
+ "profileId": "profile:dieter",
32
+ "tenantId": "tenant:company",
33
+ "enabled": true,
34
+ "providers": [
35
+ {
36
+ "schema": "agentspine.retrieval-provider/v1",
37
+ "id": "mnemo:primary",
38
+ "adapter": "mnemo-command/v1",
39
+ "required": true,
40
+ "failClosed": true,
41
+ "timeoutMs": 5000,
42
+ "command": "/absolute/path/to/mnemo-adapter",
43
+ "args": [],
44
+ "credentialEnv": ["MNEMO_TOKEN"]
45
+ }
46
+ ]
47
+ }
48
+ ```
49
+
50
+ Policy, identity and authorization remain independent. Prompt, Markdown, memory, persona, team metadata and provider output cannot configure a provider, relax fail-closed behavior, grant a capability, or authorize an action.
51
+
52
+ ## Must-Remember
53
+
54
+ Conversation wording such as “Merk dir das” may create only a pending candidate. Activation requires a separate explicit local user confirmation:
55
+
56
+ ```bash
57
+ agentspine remember-propose --claim "Keine halbfertigen Commits veröffentlichen." --user person:papa --tenant tenant:company --project project:agent-spine
58
+ agentspine remember-confirm remember-candidate:… --confirm-local-user
59
+ ```
60
+
61
+ Confirmed entries are scoped, checksummed, append-only and versioned. A new version supersedes rather than overwrites; rollback is explicit. Permanent deletion requires `remember-purge … --confirm-local-purge`. Secret-shaped and authority-shaped claims are rejected. Must-Remember remains context-only.
62
+
63
+ ## Enforcement modes and host limits
64
+
65
+ `preflight-status` and Doctor distinguish `instructions-only-no-required-provider`, `wrapper-hard-required`, the last provider result (`loaded`, verified `empty`, or failure), a consumed receipt, and a blocked turn with a privacy-safe failure code. Host inventory reports hook trust as unverified until the real host confirms it. The bundled command hook returns the documented blocking status and exit code 2 for controlled failures. Host trust remains a one-time user decision. A prepared turn that aborts before model injection is invalidated and may retry; a consumed delivery remains replay-blocked.
66
+
67
+ Claude Code documents that a command hook killed by the host timeout is fail-open, even though an explicit exit code 2 blocks. Therefore an absolute guarantee against process termination requires the host or TUI to invoke the same preflight contract as a wrapper-hard gate immediately before its model API call. AgentSpine does not mislabel a merely installed command hook as proof against host-enforced timeout. A release is only live-proven after the target host shows fresh consumed receipts across consecutive turns, restart, and compaction.
68
+
69
+ Host hierarchy and lifecycle behavior were checked on 2026-08-30 against the official [Claude Code hook reference](https://code.claude.com/docs/en/hooks) and [Codex AGENTS.md reference](https://developers.openai.com/codex/agent-configuration/agents-md).
@@ -18,6 +18,8 @@ flowchart TB
18
18
 
19
19
  Entities have stable IDs, a kind, optional display name and aliases, attributes, provenance, confidence, and privacy. Relationships connect two known IDs with a typed relation. Name similarity never merges identities.
20
20
 
21
+ Authenticated persona roster synchronization reconciles active `person`, `agent`, and `bot` identities into this graph. An exact roster `groupId` creates a missing group-scoped entity and an authenticated `member-of` edge. Replaying an unchanged roster repairs missing graph records without rewriting source Markdown or appending duplicate persona events.
22
+
21
23
  Supported privacy scopes are:
22
24
 
23
25
  | Scope | Default visibility |
@@ -59,9 +61,13 @@ agentspine relationships agent:builder --json
59
61
 
60
62
  The MCP tools expose additional attributes, aliases, source-document provenance, confidence, and explicit private reads.
61
63
 
64
+ With an exact `groupId`, a relationship read returns the requested entity's direct visible edges plus current visible co-members of that group. This is a bounded team neighborhood, not an inferred friendship graph. Another group's members, inactive roster personas and private records remain excluded. Without an exact group audience, group-private peers are not returned.
65
+
62
66
  ## Limits
63
67
 
64
68
  - The graph is local user state and is not synchronized automatically.
69
+ - Authenticated roster state is synchronized only when an owner-configured roster or native manifest scope is active; chat names never create entities.
70
+ - Relationship reads stop with a visible error after a five-second local state deadline.
65
71
  - A 5 MiB graph ceiling stops unbounded growth instead of discarding history.
66
72
  - Attribute-key rejection cannot determine whether innocent-looking prose contains a secret.
67
73
  - Group-specific recipient policy and notification delivery are not implemented.
@@ -0,0 +1,47 @@
1
+ {
2
+ "description": "Resolves host-native user and project instructions before injecting scoped context, persisting attention and checkpoints, rechecking rights, and protecting sources.",
3
+ "hooks": {
4
+ "SessionStart": [
5
+ {
6
+ "matcher": "startup|resume|clear|compact",
7
+ "hooks": [{ "type": "command", "command": "node \"${PLUGIN_ROOT}/src/hook.js\"", "timeout": 15 }]
8
+ }
9
+ ],
10
+ "UserPromptSubmit": [
11
+ {
12
+ "hooks": [{ "type": "command", "command": "node \"${PLUGIN_ROOT}/src/hook.js\"", "timeout": 15 }]
13
+ }
14
+ ],
15
+ "PreToolUse": [
16
+ {
17
+ "matcher": "Edit|Write|apply_patch|Bash",
18
+ "hooks": [{ "type": "command", "command": "node \"${PLUGIN_ROOT}/src/hook.js\"", "timeout": 15 }]
19
+ }
20
+ ],
21
+ "PostToolUse": [
22
+ {
23
+ "hooks": [{ "type": "command", "command": "node \"${PLUGIN_ROOT}/src/hook.js\"", "timeout": 15 }]
24
+ }
25
+ ],
26
+ "PreCompact": [
27
+ {
28
+ "hooks": [{ "type": "command", "command": "node \"${PLUGIN_ROOT}/src/hook.js\"", "timeout": 15 }]
29
+ }
30
+ ],
31
+ "PostCompact": [
32
+ {
33
+ "hooks": [{ "type": "command", "command": "node \"${PLUGIN_ROOT}/src/hook.js\"", "timeout": 15 }]
34
+ }
35
+ ],
36
+ "Stop": [
37
+ {
38
+ "hooks": [{ "type": "command", "command": "node \"${PLUGIN_ROOT}/src/hook.js\"", "timeout": 15 }]
39
+ }
40
+ ],
41
+ "SubagentStop": [
42
+ {
43
+ "hooks": [{ "type": "command", "command": "node \"${PLUGIN_ROOT}/src/hook.js\"", "timeout": 15 }]
44
+ }
45
+ ]
46
+ }
47
+ }
@@ -24,6 +24,17 @@
24
24
  ]
25
25
  }
26
26
  ],
27
+ "InstructionsLoaded": [
28
+ {
29
+ "hooks": [
30
+ {
31
+ "type": "command",
32
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/src/hook.js\"",
33
+ "timeout": 15
34
+ }
35
+ ]
36
+ }
37
+ ],
27
38
  "PreToolUse": [
28
39
  {
29
40
  "matcher": "Edit|Write|apply_patch|Bash",
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "schema": "agentspine.hook-bundle/v1",
3
- "version": "0.8.0",
4
- "contract": "agentspine.lifecycle/v1"
3
+ "version": "0.10.1",
4
+ "contract": "agentspine.preflight/v2"
5
5
  }