@staix/agent-hub 0.29.0 → 0.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +51 -0
- package/README.md +15 -7
- package/docs/agent-notes/README.md +13 -0
- package/docs/agent-notes/adapters.md +7 -3
- package/docs/agent-notes/budget.md +1 -0
- package/docs/agent-notes/bus.md +10 -4
- package/docs/agent-notes/daemon.md +16 -8
- package/docs/agent-notes/local-worker.md +1 -0
- package/docs/agent-notes/tasks.md +10 -4
- package/docs/agent-notes/tests.md +8 -4
- package/docs/design/adapters.md +108 -0
- package/docs/design/agent-hub-architecture.md +58 -0
- package/docs/design/bus.md +147 -1
- package/docs/design/task-board.md +100 -0
- package/docs/dogfood.md +29 -8
- package/docs/events.md +3 -0
- package/docs/memory.md +17 -1
- package/docs/operations.md +410 -86
- package/docs/profiles.md +35 -0
- package/docs/quickstart.md +25 -5
- package/docs/sdlc.md +1 -1
- package/docs/security.md +182 -62
- package/docs/smoke.md +13 -2
- package/docs/specs/2026-09-19-agent-hub-design.md +84 -14
- package/docs/specs/2026-09-19-multi-project-design.md +7 -2
- package/docs/specs/2026-10-12-office-view-design.md +86 -3
- package/docs/verification/2026-11-03-0.30.0.md +54 -0
- package/docs/verification/2026-11-03-agy-1.4.12-launcher-nonce.md +42 -0
- package/docs/verification/2026-11-03-agy-1.4.12.md +90 -0
- package/docs/verification/2026-11-03-agy-tui-close.md +49 -0
- package/docs/verification/2026-11-03-grok-1.0.62-t0.md +150 -0
- package/docs/verification/2026-11-03-pi-150-compat.md +40 -0
- package/docs/verification/2026-11-03-pi-title-api.md +26 -0
- package/docs/verification/2026-11-03-qwen-0265-acp.md +55 -0
- package/docs/verification/2026-11-03-qwen-0265-dual-output.md +40 -0
- package/docs/verification/2026-11-04-1171-channel-client-evidence.md +31 -0
- package/docs/verification/2026-11-05-0.31.0.md +182 -0
- package/docs/verification/2026-11-05-claude-implementer-2.1.318.md +70 -0
- package/docs/verification/2026-11-05-hardcoded-values-classification-rules.md +257 -0
- package/docs/verification/2026-11-05-hardcoded-values-ratchet.md +55 -0
- package/docs/verification/2026-11-06-rooms-presence-cost.md +152 -0
- package/docs/verification/claude-shell-wrapper-native.py +1 -1
- package/docs/verification/dogfood/2026-11-03.md +3095 -0
- package/docs/verification/pi-150-model-free.ts +57 -0
- package/docs/verification/pi-150-native.mjs +21 -0
- package/docs/verification/pi-150-title-api.mjs +31 -0
- package/docs/verified.json +14 -14
- package/package.json +3 -4
- package/plugins/agent-hub/.claude-plugin/plugin.json +1 -1
- package/plugins/agent-hub/server.js +4565 -3617
- package/src/adapters/acp.ts +5 -4
- package/src/adapters/channel-peer.ts +72 -3
- package/src/adapters/claude-channel-evidence.ts +52 -0
- package/src/adapters/claude-channel.ts +61 -18
- package/src/adapters/claude-implementer.ts +29 -7
- package/src/adapters/claude-print-child.ts +12 -2
- package/src/adapters/codex-appserver.ts +13 -12
- package/src/adapters/compat.ts +13 -13
- package/src/adapters/definitions/builtin-metadata.ts +13 -13
- package/src/adapters/definitions/qwen.ts +1 -0
- package/src/adapters/local-worker.ts +82 -23
- package/src/adapters/pi.ts +140 -16
- package/src/adapters/registry-types.ts +16 -0
- package/src/adapters/registry.ts +4 -0
- package/src/adapters/reviewer-print.ts +50 -11
- package/src/broker/server.ts +44 -13
- package/src/broker/store.ts +38 -8
- package/src/cli/answer-args.ts +50 -0
- package/src/cli/attention.ts +17 -2
- package/src/cli/autonomy.ts +66 -1
- package/src/cli/backlog-return-args.ts +37 -0
- package/src/cli/console-question.ts +110 -0
- package/src/cli/console-state.ts +82 -17
- package/src/cli/console.ts +54 -1
- package/src/cli/handoff-args.ts +15 -5
- package/src/cli/handoff-output.ts +15 -2
- package/src/cli/help.ts +10 -5
- package/src/cli/identity.ts +21 -4
- package/src/cli/main.ts +167 -16
- package/src/cli/memory.ts +107 -3
- package/src/cli/output.ts +29 -6
- package/src/cli/pet.ts +4 -4
- package/src/cli/results-args.ts +30 -0
- package/src/cli/runtime-version-warning.ts +50 -0
- package/src/cli/status-lines.ts +41 -1
- package/src/cli/tail-render.ts +1 -0
- package/src/cli/upgrade-interactive.ts +14 -2
- package/src/cli/worktree-tidy.ts +158 -0
- package/src/cli/worktrees-output.ts +43 -0
- package/src/hub/action-class.ts +9 -1
- package/src/hub/board.ts +396 -20
- package/src/hub/bus.ts +497 -57
- package/src/hub/completion-detail.ts +50 -0
- package/src/hub/completions-store.ts +168 -0
- package/src/hub/completions.ts +120 -0
- package/src/hub/conductor.ts +4 -3
- package/src/hub/config-apply.ts +8 -5
- package/src/hub/config-reload.ts +10 -1
- package/src/hub/control-client.ts +40 -4
- package/src/hub/daemon.ts +1795 -142
- package/src/hub/delivery-failure.ts +14 -0
- package/src/hub/delivery-hints.ts +14 -4
- package/src/hub/delivery-journal.ts +751 -42
- package/src/hub/delivery-superseded.ts +4 -1
- package/src/hub/dogfood-read.ts +62 -9
- package/src/hub/envelope.ts +3 -3
- package/src/hub/events.ts +6 -0
- package/src/hub/handoff.ts +145 -6
- package/src/hub/hub-tools.ts +66 -11
- package/src/hub/manager.ts +67 -3
- package/src/hub/memory-policy.ts +44 -1
- package/src/hub/memory-sync-policy.ts +109 -0
- package/src/hub/memory-sync-state.ts +145 -0
- package/src/hub/no-writes.ts +1 -1
- package/src/hub/operational-settings.ts +11 -2
- package/src/hub/operational-view.ts +12 -1
- package/src/hub/peer-doing.ts +33 -3
- package/src/hub/peers.ts +32 -2
- package/src/hub/planning.ts +6 -1
- package/src/hub/question-desk.ts +201 -0
- package/src/hub/question-detach.ts +6 -0
- package/src/hub/questions.ts +260 -0
- package/src/hub/research-evidence.ts +106 -0
- package/src/hub/restart.ts +14 -0
- package/src/hub/review-anchor.ts +181 -0
- package/src/hub/review-brief.ts +13 -0
- package/src/hub/review-comments.ts +115 -0
- package/src/hub/review-findings.ts +7 -2
- package/src/hub/review-material.ts +76 -0
- package/src/hub/routing.ts +3 -1
- package/src/hub/settings.ts +3 -0
- package/src/hub/task-sweep.ts +2 -0
- package/src/hub/tasks.ts +607 -71
- package/src/hub/ui.ts +2 -0
- package/src/hub/worktree-prs.ts +100 -0
- package/src/hub/worktree-shelf.ts +246 -0
- package/src/memory/capture.ts +5 -2
- package/src/pet/config.ts +25 -13
- package/src/pi/extension.ts +43 -3
- package/src/rooms/link.ts +209 -21
- package/src/rooms/remote-peer.ts +186 -19
- package/src/rooms/service.ts +338 -22
- package/src/rooms/store.ts +437 -65
- package/src/rooms/wire.ts +24 -6
- package/src/ui/index.html +271 -17
- package/src/ui/needs.ts +10 -4
- package/src/ui/office-model.ts +64 -8
- package/src/ui/office-space.ts +1 -0
- package/src/ui/plugin-questions.ts +56 -0
- package/src/ui/plugin-results.ts +81 -0
- package/src/ui/plugin.ts +219 -28
- package/src/pet/window.html +0 -114
- package/src/pet/window.jxa.js +0 -122
- package/src/pet/window.ts +0 -154
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
# Grok 1.0.62 project MCP and hooks T0, 2026-11-03
|
|
2
|
+
|
|
3
|
+
T0 receipt for #635, task #325. This probes the project-file TUI alternative to the [earlier ACP receipt](2026-10-21-grok-config-acp-t0.md). It does not establish launcher implementation, model-backed delivery, or native turn-end readiness.
|
|
4
|
+
|
|
5
|
+
## Result
|
|
6
|
+
|
|
7
|
+
| Leg | Result | Direct evidence |
|
|
8
|
+
| --- | --- | --- |
|
|
9
|
+
| Pinned native version | VERIFIED | `--version` exited 0: `grok 1.0.62 (1474f9cbdd91)` |
|
|
10
|
+
| Project MCP configuration discovery | VERIFIED | `mcp list --json` reported `receipt`, `scope: project`, from `.grok/config.toml` |
|
|
11
|
+
| Project MCP trust gate and connection | VERIFIED, synthetic server only | Untrusted doctor refused to start the server; after an isolated fixture trust grant, doctor initialized it and discovered one tool |
|
|
12
|
+
| `search_tool` / `use_tool` to a hub tool | UNVERIFIED | Both credential-free `--single` attempts exited 1 with `Not signed in`; no `tools/call` was recorded |
|
|
13
|
+
| Interactive trust prompt | UNVERIFIED | An untrusted PTY startup reached sign-in before any folder-trust prompt; authentication discovery could not proceed with network denied |
|
|
14
|
+
| Hook configuration load | VERIFIED | Trusted `inspect --json` listed seven configured project event handlers, including `stop`; untrusted inspect listed none |
|
|
15
|
+
| Hook firing and stdin payloads | UNVERIFIED | No credential-free model/session turn began, and the passive payload sink was never created |
|
|
16
|
+
| Real configuration preservation | VERIFIED for nine named files | Before/after SHA-256 or absence matched for every entry listed below |
|
|
17
|
+
|
|
18
|
+
Decision for the following launcher task: the pinned build recognizes a main-session `Stop` hook configuration, separately from `SubagentStop`. This is loader evidence, not evidence that a successful main turn fires it or that its payload is sufficient for hub facts/turn end. Keep the proposed peer pull-only unless a later isolated authenticated receipt proves main-turn completion and its payload. Do not infer hook absence from the account refusal, or turn-end support from configuration load alone. #635 stays open.
|
|
19
|
+
|
|
20
|
+
## Isolation and preparation
|
|
21
|
+
|
|
22
|
+
- Base checkout: `df230f2c89d0545c1a87cfd6bb8be57505a92c6c`. Branch: `test/635-grok-t0`; dedicated worktree `.worktrees/test-635-grok-t0`.
|
|
23
|
+
- Before native probes, dgx02 ran `bun install --frozen-lockfile` at that base and asserted the installed first-party dependency against `package.json`: `@staix/agent-mem@0.20.1`. No repository runtime or inherited local `node_modules` was used by the native probes; the MCP fixture used only system Python.
|
|
24
|
+
- The native executable was copied as one file from the installed Grok binary into a private OS-temporary root. Its SHA-256, before and after the probes, was `ec434e831afdcfce87780f2815fd732b1df8a4a8de96a491716ad75d13605a4e`.
|
|
25
|
+
- Separate empty directories were supplied as `HOME`, `GROK_HOME`, `XDG_CONFIG_HOME`, `XDG_CACHE_HOME`, `XDG_DATA_HOME` and `TMPDIR`. A new throwaway Git project held the project MCP/hooks files; a second sibling project was used for the untrusted TUI probe.
|
|
26
|
+
- The child environment was an explicit allowlist: those six directories, a scratch/system-only `PATH`, `SHELL=/bin/sh`, `TERM=xterm-256color`, `LANG=en_US.UTF-8`, `USER=probe`, `LOGNAME=probe` and `NO_COLOR=1`. No account variables, inherited agent markers or personal configuration were copied.
|
|
27
|
+
- Every Grok invocation ran through macOS `sandbox-exec`, denying network, reads/writes under the person's real home, writes under `/etc` and `/Library`, and access to the securityd Mach service. Before the TUI probe, execution of `/usr/bin/open` and `/usr/bin/osascript` was also denied. These are probe controls, not a product sandbox claim.
|
|
28
|
+
- Stateful commands explicitly passed `--no-leader --no-auto-update`. The subprocess harness bounded each command to 12 seconds, then signalled only its newly created process group. The PTY observation window was five seconds. No Grok process remained in the final fresh process-table read.
|
|
29
|
+
- The first PTY capture harness had an EOF-drain bug after its native child exited: the Python harness stayed alive reading EOF. Only that identified probe-owned harness was terminated; EOF handling was corrected before the second capture. No native completion or teardown result is inferred from the discarded first capture.
|
|
30
|
+
|
|
31
|
+
## Project MCP and trust
|
|
32
|
+
|
|
33
|
+
The project's `.grok/config.toml` contained this self-contained fixture (`$PROBE_ROOT` below means the absolute temporary root substituted before writing TOML):
|
|
34
|
+
|
|
35
|
+
```toml
|
|
36
|
+
[mcp_servers.receipt]
|
|
37
|
+
command = "/usr/bin/python3"
|
|
38
|
+
args = ["$PROBE_ROOT/tools/mcp.py"]
|
|
39
|
+
startup_timeout_sec = 3
|
|
40
|
+
[mcp_servers.receipt.env]
|
|
41
|
+
PROBE_LOG = "$PROBE_ROOT/evidence/mcp-events.jsonl"
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
The synthetic stdio MCP server answered `initialize` using the requested protocol version, declared a tools capability and `serverInfo` of `isolated-receipt-fixture` / `1.0.0`, and answered `tools/list` with one tool named `hub_inbox`. Its description and possible result explicitly said synthetic fixture. It was not a production hub, did not attach to this repository's running daemon and did not establish a real hub-tool result.
|
|
45
|
+
|
|
46
|
+
Observed command sequence after fixture creation:
|
|
47
|
+
|
|
48
|
+
```sh
|
|
49
|
+
grok --no-leader --no-auto-update inspect --json
|
|
50
|
+
grok --no-leader --no-auto-update mcp list --json
|
|
51
|
+
grok --no-leader --no-auto-update mcp doctor receipt --json
|
|
52
|
+
grok --no-leader --no-auto-update --trust inspect --json
|
|
53
|
+
grok --no-leader --no-auto-update mcp doctor receipt --json
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Every command above used the copied binary, isolated environment and sandbox wrapper. Before trust, inspect reported `projectTrusted: false` and `hooks: []`; MCP list still enumerated the project definition. Untrusted doctor exited 1 and reported:
|
|
57
|
+
|
|
58
|
+
```text
|
|
59
|
+
folder untrusted
|
|
60
|
+
repo-local (project-scoped) server not started for an untrusted folder
|
|
61
|
+
re-run with --trust to allow repo-local servers
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
The explicit `--trust` was a controlled grant to this disposable fixture, not launcher behavior or a grant to a real project. It persisted only in the isolated `$GROK_HOME/trusted_folders.toml`:
|
|
65
|
+
|
|
66
|
+
```toml
|
|
67
|
+
[folders."$PROBE_ROOT/project"]
|
|
68
|
+
trusted = true
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Afterward, trusted inspect reported `projectTrusted: true`. Doctor exited 0 with `command found`, `server started`, `handshake OK` (`protocol 2025-11-25`) and `1 tools discovered`; `healthy_count: 1`, `failing_count: 0`. The fixture recorded exactly:
|
|
72
|
+
|
|
73
|
+
```text
|
|
74
|
+
initialize
|
|
75
|
+
notifications/initialized
|
|
76
|
+
tools/list
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Initialize's `clientInfo` was `grok-shell-receipt` / `1.0.62`. No `tools/call` occurred. A discovered tool is not proof of the model's meta-tool path.
|
|
80
|
+
|
|
81
|
+
## Model/tool and interactive prompt limits
|
|
82
|
+
|
|
83
|
+
Before and after the isolated trust grant, bounded single-turn commands requested the fixture hub tool. The trusted request was:
|
|
84
|
+
|
|
85
|
+
```sh
|
|
86
|
+
grok --no-leader --no-auto-update \
|
|
87
|
+
--single 'Find receipt__hub_inbox with search_tool, call it with use_tool, and report its result.' \
|
|
88
|
+
--max-turns 1 --disable-web-search --no-memory
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Both attempts exited 1, without a model turn or hook payload, and reported:
|
|
92
|
+
|
|
93
|
+
```text
|
|
94
|
+
Not signed in. To authenticate without a browser, run:
|
|
95
|
+
grok login --device-code
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
An initial syntax-only attempt incorrectly supplied `--single` without its required adjacent prompt value and exited 2; it is not a model/tool probe result. The corrected commands above are the evidence.
|
|
99
|
+
|
|
100
|
+
A separate untrusted project was launched under a PTY using `--no-leader --no-auto-update --no-alt-screen --minimal --no-memory`. It displayed sign-in and an authentication discovery failure for `https://auth.x.ai/.well-known/openid-configuration`, then exited 0. No folder-trust prompt was observed, no sibling trust entry appeared, no browser execution was permitted, and no hook payload was produced. Exit 0 here does not prove a successful session. No personal account, cached token, API key or real-home fallback was used; these legs stop at authentication.
|
|
101
|
+
|
|
102
|
+
The locally shipped MCP guide documents qualified `server__tool` catalog keys and `search_tool` / `use_tool`, so `receipt__hub_inbox` was the requested key. That documented route remains UNVERIFIED in a native model turn. To finish this leg, use an independently authorized account in a fresh isolated home and a disposable real hub, then capture the meta-tool dispatch and the actual hub result; do not reuse the person's home.
|
|
103
|
+
|
|
104
|
+
## Hooks and payloads
|
|
105
|
+
|
|
106
|
+
The fixture `.grok/hooks/receipt.json` registered command handlers for `SessionStart`, `UserPromptSubmit`, `Stop`, `StopFailure`, `StopCancelled`, `SessionEnd` and `SubagentStop`. Each handler used the same passive script, with a two-second hook timeout:
|
|
107
|
+
|
|
108
|
+
```sh
|
|
109
|
+
#!/bin/sh
|
|
110
|
+
/bin/cat >> "$PROBE_ROOT/evidence/hook-payloads.jsonl"
|
|
111
|
+
/bin/echo >> "$PROBE_ROOT/evidence/hook-payloads.jsonl"
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
The actual generated script contained the absolute sink path. It did not deny actions or invent events. Trusted inspect listed these native event names:
|
|
115
|
+
|
|
116
|
+
```text
|
|
117
|
+
session_start
|
|
118
|
+
user_prompt_submit
|
|
119
|
+
stop
|
|
120
|
+
stop_failure
|
|
121
|
+
stop_cancelled
|
|
122
|
+
subagent_stop
|
|
123
|
+
session_end
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
The sink remained absent, so there are no observed hook stdin payloads to publish. In particular, this receipt has no observed `sessionId`, `hookEventName`, `lastAssistantMessage`, stop/interrupt discriminator or main-session/subagent binding. The shipped hooks guide describes `Stop` for genuine main-turn completion, `StopFailure` for API failure, `StopCancelled` for non-completion and `SubagentStop` for subagents, and documents camelCase fields plus compatibility aliases. These are documented hypotheses for the authenticated follow-up, not captured payload facts. Merely registering `SubagentStop` cannot establish main-turn completion.
|
|
127
|
+
|
|
128
|
+
The local shipped guide bytes consulted were identified by SHA-256 (their documentation content does not substitute for native runtime evidence):
|
|
129
|
+
|
|
130
|
+
| Guide | SHA-256 |
|
|
131
|
+
| --- | --- |
|
|
132
|
+
| `07-mcp-servers.md` | `67558820ab3f0c49d56f87ce9d6927f2d6d179558f7a1e0466750a9771a43c3a` |
|
|
133
|
+
| `10-hooks.md` | `2a3a12201597fa6ab1885fa473096565a6c99fbfaf656627c65fa15653e14970` |
|
|
134
|
+
| `02-authentication.md` | `f16e7fe4cecc2836643d3474dbbc6c2b4a0ea12edf2b56b8a5a0a4ecb24efbec` |
|
|
135
|
+
|
|
136
|
+
## Real configuration hashes
|
|
137
|
+
|
|
138
|
+
Only the controller computed SHA-256/absence of these named real `~/.grok` files, without printing or copying their contents. Grok itself could not read that home. All nine entries matched after the final native probe. This is a bounded inventory, not a claim about every native configuration path.
|
|
139
|
+
|
|
140
|
+
| File | Before and after |
|
|
141
|
+
| --- | --- |
|
|
142
|
+
| `config.toml` | `cbafbea937a8ad50323aed808e68912706a063c7c88868a8fd9f58252bb68f22` |
|
|
143
|
+
| `version.json` | `182eeb64f0fe20c17ddea37071954ff25b1424f3b807fea13697754c803439f7` |
|
|
144
|
+
| `trusted_folders.toml` | `4e9eee9a1a037d109d59ed1d8112795f55381465cd219266b2f1777d4ec8b945` |
|
|
145
|
+
| `auth.json` | SHA-256 matched; credential-file digest omitted from the public receipt |
|
|
146
|
+
| `config.json`, `settings.json`, `mcp.json`, `managed_config.toml`, `requirements.toml` | Absent before and after |
|
|
147
|
+
|
|
148
|
+
## Repository validation
|
|
149
|
+
|
|
150
|
+
The final committed receipt is checked with `scripts/check.sh --changed` on dgx02; the PR and task submission record the exact head and gate result. Hosted CI is independent. No compatibility registry, launcher, generated bundle or native support claim is changed by this documentation-only T0.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Pi 1.5.0 model-free compatibility receipt
|
|
2
|
+
|
|
3
|
+
Date: 2026-11-03. Task #684, Refs #888. This repeats the [Pi 1.4.0 receipt](2026-10-26-pi-140-compat.md) for the published `@earendil-works/pi-coding-agent@1.5.0`. Same legs, model-free, no account.
|
|
4
|
+
|
|
5
|
+
**Decision: add `1.5.0` to Pi `verified`.** Every leg passed. No range is inferred: the Pi entry still has no `line`, so any other version needs the person's `ahub agents trust pi <version>`.
|
|
6
|
+
|
|
7
|
+
## Identity and isolation
|
|
8
|
+
|
|
9
|
+
- Package: `@earendil-works/pi-coding-agent` 1.5.0, installed from the registry into a private npm prefix with a scratch HOME, cache and temporary directory and empty npm user and global config files. The person's `~/.pi` and global packages were not touched. npm held back two lifecycle scripts (`protobufjs` postinstall, a version-scheme warning, and `@google/genai` preinstall, an `echo`). They were read and judged inert for this probe, and were not replayed: the producer passed without them, and no flag was added to make it pass.
|
|
10
|
+
- npm integrity: `sha512-xNDZ5kqowO6Z03FS2gwAkPEGk1ssxVcYKQ6qZId84mFEvwACvvyc2l0vAMOS+c5zvxLRMLBE9r4y44IGYkMJaQ==`. The package carries no `gitHead`.
|
|
11
|
+
- Native `dist/cli.js` SHA-256: `8189b66abc4f9f431dbb70941dcba690d76d040de1fbfff212886be35a53639d`. This is the same value the 1.4.0 receipt records for its `dist/cli.js`, so the launcher entry file did not change between the two releases. The 1.5.0 changes are in other files of the package and are exercised by the legs below.
|
|
12
|
+
- Host: macOS arm64, Bun 1.4.3, Node 24.18.1, repository at `9eb10e34e8fa3624669d08828ac0ca65b8ec2041`.
|
|
13
|
+
- Each native run used an empty temporary HOME and `PI_CODING_AGENT_DIR`, a temporary cwd and session directory and an environment of PATH, those paths and invented loopback bridge settings. No account, token, prompt or inference.
|
|
14
|
+
- Real configuration: SHA-256 of every file under the person's `~/.pi/agent` (excluding sessions, logs, caches, installs and `bin`) and `~/.qwen`, plus the person's `pi` launcher binary and the listing of installed Pi releases, was taken before and after the producer run: 9551 entries, identical.
|
|
15
|
+
|
|
16
|
+
## Results
|
|
17
|
+
|
|
18
|
+
| Leg | Result | Evidence |
|
|
19
|
+
| --- | --- | --- |
|
|
20
|
+
| Native identity | pass | `--version` returned exactly `1.5.0`, exit 0, empty stderr; package name and version checked independently. |
|
|
21
|
+
| Real CLI extension load and RPC session identity | pass | `--mode rpc` with the hub extension: `get_state` succeeded with a session id and file, `messageCount` 0; the extension emitted `session_start` and `session_shutdown`. |
|
|
22
|
+
| Installed SDK extension registration | pass | The 1.5.0 `DefaultResourceLoader` and `createAgentSession` loaded this checkout's extension and registered exactly `compat_probe` as the active tool, with no builtin tools. |
|
|
23
|
+
| Managed tool callback and receipt replay | pass | The registered callback was invoked without a prompt and posted to the isolated bridge through the real `PiToolReceipts`; two identical calls returned identical success with one effect. |
|
|
24
|
+
| Failed tool result | pass | The bridge fixture denial returned `failed: true` and the extension returned `isError: true`. |
|
|
25
|
+
| Host permission modes | pass (host fixtures) | `test/permission-modes.test.ts` "Pi mode grants edits once, keeps shell on the console, and ask restores the console path": 1 pass, 12 assertions. |
|
|
26
|
+
| Version admission | pass (host fixtures) | `test/pi-compat.test.ts` and `test/compat.test.ts`: 43 pass, 0 fail. |
|
|
27
|
+
| Provider requests | pass | Zero requests reached the loopback provider; no prompt was submitted. Native and SDK stderr were empty. |
|
|
28
|
+
|
|
29
|
+
Producer result: `pi 1.5.0 model-free receipt: PASS`. The producer is the 1.4.0 one with the version constants and driver file name changed (`pi-150-model-free.ts`, `pi-150-native.mjs`); no assertion was relaxed.
|
|
30
|
+
|
|
31
|
+
```sh
|
|
32
|
+
bun docs/verification/pi-150-model-free.ts <prefix>/node_modules/.bin/pi <prefix>/node_modules/@earendil-works/pi-coding-agent
|
|
33
|
+
env -u AGENTHUB_HOME -u AGENTHUB_PROJECT_DIR -u AGENTHUB_STATE_DIR bun test test/pi-compat.test.ts test/compat.test.ts
|
|
34
|
+
env -u AGENTHUB_HOME -u AGENTHUB_PROJECT_DIR -u AGENTHUB_STATE_DIR bun test test/permission-modes.test.ts --test-name-pattern 'Pi mode grants'
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Not verified
|
|
38
|
+
|
|
39
|
+
- Account-backed inference, a model-generated tool request, a real provider's quota behavior and interactive TUI coexistence. The SDK callback leg does not claim model-generated tool dispatch.
|
|
40
|
+
- Linux and Intel macOS. No other Pi release is inferred.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Pi 1.5.0 session-title API probe
|
|
2
|
+
|
|
3
|
+
Task #689, Refs #1055 (T1). Model-free native API receipt, macOS arm64, Node 24.18.1.
|
|
4
|
+
|
|
5
|
+
The installed `@earendil-works/pi-coding-agent@1.5.0` exposes a working native session-name setter and reader:
|
|
6
|
+
|
|
7
|
+
- Extension API: `setSessionName(name: string): void` and `getSessionName(): string | undefined`.
|
|
8
|
+
- Session: `AgentSession.setSessionName(name: string)` and the `sessionName` getter.
|
|
9
|
+
- Session manager: `appendSessionInfo(name: string)` and `getSessionName(): string | undefined`.
|
|
10
|
+
|
|
11
|
+
The [producer](pi-150-title-api.mjs) loads the real package's `DefaultResourceLoader`, `createAgentSession` and extension runner. It registers an account-free probe tool, invokes that callback directly after `bindExtensions`, and asserts the native API changes an initially unnamed session to `Fixture session title`. Both the extension reader and `SessionManager` return that name. After disposal, `SessionManager.open(sessionFile).getSessionName()` returns the same name. No prompt is submitted to an agent or provider.
|
|
12
|
+
|
|
13
|
+
The native setter appends a `session_info` entry. A handler registered through the real `ExtensionAPI.on("session_info_changed", handler)` receives the new name, also asserted by the producer. Pi delays creating a new session file until a user or assistant message exists. This probe appends a synthetic user fixture to the session manager before calling the setter; the fixture is never sent to a model. It proves native persistence for an existing conversation, not persistence of an empty session.
|
|
14
|
+
|
|
15
|
+
## Isolation and result
|
|
16
|
+
|
|
17
|
+
- Fresh HOME under `getconf DARWIN_USER_TEMP_DIR`, separate `PI_CODING_AGENT_DIR`, XDG config/data/cache and TMPDIR. The child environment contains only these paths, PATH and the explicit package path.
|
|
18
|
+
- Exact 1.5.0 package from the existing scratch npm prefix used by the [compatibility receipt](2026-11-03-pi-150-compat.md). The person's default launcher still selects 1.4.0; it was not invoked or changed.
|
|
19
|
+
- Frozen worktree dependencies installed before the probe: `@staix/agent-mem@0.20.1`, matching the exact manifest pin. Native package version independently asserted as 1.5.0.
|
|
20
|
+
- `sandbox-exec` uses `src/local/sandbox.ts`'s network-disabled profile, adds a real-home read/write deny, then grants only read access to the scratch native package and Node installation. Writable files are confined to the disposable HOME. No credentials or live hub connection.
|
|
21
|
+
- SHA-256 manifests of the 15 real `~/.pi` configuration/launcher entries were identical before and after. The manifest excludes sessions, logs, cache and install trees; it is not a claim to hash every installed package or historical session. Private per-file digests remain in the scratch evidence directory.
|
|
22
|
+
- Exit 0, empty stderr, setter/reader/reopen assertions PASS. An initial hand-written sandbox profile terminated Node before the producer ran; the final run used the repository profile and passed.
|
|
23
|
+
|
|
24
|
+
Reproduction: run `node docs/verification/pi-150-title-api.mjs` with `PI_TITLE_PACKAGE` pointing to the exact 1.5.0 package and fresh HOME/tool-home paths, inside the network-disabled sandbox described above. Do not run with the person's real HOME.
|
|
25
|
+
|
|
26
|
+
This permits the native-slot implementation for Pi. It does not prove a model-generated `hub_set_title` call, delivery through a live hub, or a live Pi restart. AC7 remains a separate live receipt in #1143.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Qwen Code 0.26.5 ACP receipt
|
|
2
|
+
|
|
3
|
+
Date: 2026-11-03. Task #684, Refs #888, `qwen` row only. This repeats the [0.26.4 ACP receipt](2026-10-31-qwen-0264-acp.md) on the published `@qwen-code/qwen-code@0.26.5`, with a private npm prefix, isolated HOME and fixed synthetic configuration. No account, real credential, provider inference or ACP prompt was used. It does not admit the separate `qwen-dual` contract (see the [dual-output receipt](2026-11-03-qwen-0265-dual-output.md)).
|
|
4
|
+
|
|
5
|
+
**Decision: add `0.26.5` to `COMPAT.qwen.verified`.** Every ACP leg passed. No intermediate release and no range is inferred. `latest` on npm is 0.26.6 today; it is not admitted.
|
|
6
|
+
|
|
7
|
+
## Artifact and isolation
|
|
8
|
+
|
|
9
|
+
The package was installed under the local scratch workspace in a private prefix with a scratch HOME, cache and temporary directory and empty npm user and global config files. The person's global prefix, `~/.qwen` and `~/.pi` were not installation targets. npm held one lifecycle script, `@qwen-code/audio-capture` `install` (`node install.js`). It was read, found to locate a prebuilt microphone addon with a non-fatal failure path, and replayed under the same isolated environment: exit 0. No install script was disabled to make the probe pass.
|
|
10
|
+
|
|
11
|
+
| Artifact | Binding |
|
|
12
|
+
| --- | --- |
|
|
13
|
+
| npm release | 0.26.5, `gitHead` and upstream `v0.26.5` tag `db0e4e24a0d89b211b2a15f4af2be22adac71dfc` |
|
|
14
|
+
| npm integrity | `sha512-iqcBqLQDmKvOtRcVvF78l7bf0NpdymGFBo0qNY0ausPezht+PLXkh15vnIILaBKtM4BabtHSv60xWftMomJ7hw==` |
|
|
15
|
+
| `cli-entry.js` SHA-256 | `113efe4104a9fc66f507d34bfd6abbd896ceb77de47f4b468a0825a327fdc6a5` (the same bytes as the 0.26.1 and 0.26.4 entry files: the entry is a loader, the code is in chunks) |
|
|
16
|
+
| `chunks/acpAgent-HO52UOPA.js` SHA-256 | `794bda74c4d100ab3367ae2e5d880ef0a610df4c84d1db1475d78283b75a8e1e` (the chunk name differs from 0.26.4's `acpAgent-D7OFGHAI.js`) |
|
|
17
|
+
| Host | macOS arm64, Node 24.18.1 |
|
|
18
|
+
|
|
19
|
+
Every native process received a fresh temporary HOME and cwd, private `QWEN_HOME`, `QWEN_RUNTIME_DIR` and `XDG_CONFIG_HOME`, a synthetic API key and `--auth-type openai --model fixture-model --openai-base-url http://127.0.0.1:9/v1 --telemetry=false`. The 0.26.4 receipt's Node preload denied application network APIs and recorded six blocked startup attempts here too; none connected through those guarded APIs. This is preload evidence, not a kernel network sandbox.
|
|
20
|
+
|
|
21
|
+
Real configuration: SHA-256 of every file under the person's `~/.qwen` and `~/.pi/agent` (excluding sessions, logs, caches, installs and `bin`) and of the globally installed qwen's `cli-entry.js` and `package.json` was taken before and after the producer runs: 9550 entries, identical.
|
|
22
|
+
|
|
23
|
+
## Native ACP, no prompts
|
|
24
|
+
|
|
25
|
+
`qwen --acp --bare --advisor off` initialized with protocol version 1 and `agentInfo` name `qwen-code`, title `Qwen Code`, version `0.26.5`. The only offered authentication method was the synthetic `openai` terminal method. No prompt was sent.
|
|
26
|
+
|
|
27
|
+
`session/new` succeeded. Available modes were `plan`, `default`, `auto-edit`, `auto` and `yolo`, with current mode `default`: the same five ids as 0.26.4. Each transition in `default -> auto-edit -> yolo -> default` returned an acknowledgement, so the hub's ask/default, ask-when-needed/auto-edit and never-ask/yolo map is still a subset of the native ids. The session exposed only the fixture model.
|
|
28
|
+
|
|
29
|
+
The native leader exited after its owned group received SIGTERM, and the producer confirmed `groupGone: true`.
|
|
30
|
+
|
|
31
|
+
## Actual published permission handler
|
|
32
|
+
|
|
33
|
+
An exports-only scratch copy of the published ACP chunk (`export{SubAgentTracker,toPermissionOptions,resolvePermissionOutcome}` appended) was placed beside the original inside the private package, preserving its relative imports. The original chunk was not edited. The fixture invoked the actual `SubAgentTracker.createApprovalHandler` with synthetic client, tool and event ports, not a model-generated tool turn.
|
|
34
|
+
|
|
35
|
+
- The request carried the fixture session, pending tool-call id, raw input, native MCP tool metadata and permission progress updates.
|
|
36
|
+
- The exact options were `proceed_always_project` and `proceed_always_user` as `allow_always`, `proceed_once` as `allow_once`, and `cancel` as `reject_once`.
|
|
37
|
+
- An allow-once response reached `event.respond` as `proceed_once`; a cancelled outcome reached it as `cancel`; the real outcome helper rejected an unoffered option.
|
|
38
|
+
|
|
39
|
+
## Not verified
|
|
40
|
+
|
|
41
|
+
A real model-generated permission turn, a real login or provider, model behavior, Linux and Intel macOS. This receipt did not review upstream source between 0.26.4 and 0.26.5; the claim is the native behaviors above on the exact published artifact. Host changed-source checks and exact-head CI are separate PR evidence.
|
|
42
|
+
|
|
43
|
+
## Evidence fingerprints
|
|
44
|
+
|
|
45
|
+
Producers and result JSONs stay outside git under the local scratch workspace.
|
|
46
|
+
|
|
47
|
+
| File | SHA-256 |
|
|
48
|
+
| --- | --- |
|
|
49
|
+
| `qwen-acp-probe.py` | `12e60602ca5d00ed29473f3afef277b0c5661aca286692864da8fc69ced9d2e2` |
|
|
50
|
+
| `qwen-acp-result.json` | `442f2e33c13232723eb646119f49f52fcb8df06de7c59ee32402ab377525710a` |
|
|
51
|
+
| `qwen-permission.mjs` | `989ba620e7d099b74ec5b4b1efb78d9d6cc96b5ef5b364c058a077dfc8621a31` |
|
|
52
|
+
| `qwen-permission-result.json` | `958a77ea7618e0efd04a78520aadf83654e5b74a0158a05061d0bed4406d7c31` |
|
|
53
|
+
| `deny-network.cjs` | `361148af658dd4b65ed35308622ec99bb882ec5a25fab54581776546f139e892` |
|
|
54
|
+
|
|
55
|
+
The two probe copies differ from the 0.26.4 producers only in paths and the expected version string.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Qwen 0.26.5 dual-output attempt, not qualified
|
|
2
|
+
|
|
3
|
+
Date: 2026-11-03. Task #684, Refs #888, the separate `qwen-dual` row. The [0.26.5 ACP receipt](2026-11-03-qwen-0265-acp.md) does not qualify the TUI contract. This repeats the corrected [0.26.4 attempt](2026-10-31-qwen-0264-dual-output.md) (the v2 producer, fixed OpenAI-compatible loopback responses, no real model, account or credential) on `@qwen-code/qwen-code@0.26.5`.
|
|
4
|
+
|
|
5
|
+
**Decision: do not add 0.26.5 to `COMPAT["qwen-dual"].verified`.** Q2 did not pass. Exactly 0.26.1 stays verified for this entry, and `src/adapters/compat.ts` is unchanged for it.
|
|
6
|
+
|
|
7
|
+
## Artifact and controls
|
|
8
|
+
|
|
9
|
+
The candidate is the private-prefix package described in the ACP receipt (upstream tag and `gitHead` `db0e4e24a0d89b211b2a15f4af2be22adac71dfc`, Node 24.18.1, macOS arm64). The retained global 0.26.1 install (`cli-entry.js` SHA-256 `113efe4104a9fc66f507d34bfd6abbd896ceb77de47f4b468a0825a327fdc6a5`) served as a read-only matched control, always with a fresh temporary HOME and cwd and the same producer. Each fixture used a PTY, private input and event files, a scratch git project, a synthetic key and a loopback server. The Node network guard's positive control passed; every observed Node process loaded the guard; every owned process group was confirmed gone; the temporary roots were removed. Model inference calls: 0.
|
|
10
|
+
|
|
11
|
+
Real configuration: the person's `~/.qwen`, `~/.pi/agent` and the global qwen install hashed the same before and after (9550 entries, together with the ACP runs).
|
|
12
|
+
|
|
13
|
+
## Observed outcomes
|
|
14
|
+
|
|
15
|
+
| Check | 0.26.5 | Matched 0.26.1 control |
|
|
16
|
+
| --- | --- | --- |
|
|
17
|
+
| Q7 version and guard positive control | pass, 0.26.5 | pass, 0.26.1 |
|
|
18
|
+
| Q2 second submit becomes a separate user turn after the first completes | **fail**: `Q2 fewer than two user events` | **fail**, the same error, same fixture |
|
|
19
|
+
| Q3 shell and native MCP `can_use_tool`, allow, TUI Enter, duplicate refused, read-only control | pass | not selected |
|
|
20
|
+
| Q4 external SIGINT leaves the turn running; person Esc stops it and the next turn works | pass | not selected |
|
|
21
|
+
| Q5 unread output FIFO does not block the TUI answer | pass | not selected |
|
|
22
|
+
| Q6 resume id, no old-submit replay, prior context in the resumed request | pass | not selected |
|
|
23
|
+
|
|
24
|
+
Q2 fails identically on the already-verified 0.26.1 with this producer, so it is a limit of the held-stream workload the corrected fixture uses and not a 0.26.5 regression: the same outcome the 0.26.4 receipt recorded. It also means this fixture cannot reproduce the queued-submit observation the [original 0.26.1 receipt](2026-10-25-qwen-dual-output-t0.md) rests on. The task gate (promote only when every model-free leg passes) does not allow a `qwen-dual` bump while a required leg is unestablished, and no TUI adapter, queue, cancellation policy or existing admission is changed.
|
|
25
|
+
|
|
26
|
+
## Source note
|
|
27
|
+
|
|
28
|
+
Upstream `DualOutputBridge.ts` and `RemoteInputWatcher.ts` have the same blob ids at v0.26.1 (`b475278c`), v0.26.4 (`715a550c`) and v0.26.5 (`db0e4e24`): `1e1a4e71fafd0c29c62e4ca60243449bd698d20a` and `8a3eabf4e29804ce5f63d40d4a083d14f489dbb3`. That is scoped supporting evidence about those two files, not native acceptance.
|
|
29
|
+
|
|
30
|
+
## Not verified
|
|
31
|
+
|
|
32
|
+
Q2 on any version with this producer, a real account or provider, model choices and quality, token and quota behavior, Linux and Intel macOS. Explicitly failed and unselected legs above are not relabelled as passes.
|
|
33
|
+
|
|
34
|
+
## Evidence fingerprints
|
|
35
|
+
|
|
36
|
+
| File | SHA-256 |
|
|
37
|
+
| --- | --- |
|
|
38
|
+
| `qwen-dual-probe-v2.py` | `114c032afce5caef4f59072f0a1730bc78a70788fd49ad17e5ff2f1eef4c947e` |
|
|
39
|
+
| `qwen-dual-v2-0265-result.json` | `1062244e51f5c1aab71f2778d08116c3c00f81929be9aa209fc3467763cc0471` |
|
|
40
|
+
| `qwen-dual-v2-0261-control-result.json` | `d4384d0b54f42e789f09f44346201b75285b1afafc78eb3d22ff3271b38ce72a` |
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Channel client evidence for #1171
|
|
2
|
+
|
|
3
|
+
## Scope
|
|
4
|
+
|
|
5
|
+
This investigation checked the installed first-party Claude Code 2.1.318 artifact and read process metadata on macOS on 2026-11-04. It did not start a model session, modify a running client, capture a live MCP handshake, or establish that a particular notification reached a model.
|
|
6
|
+
|
|
7
|
+
The artifact was the existing native installation at `~/.local/share/claude/versions/2.1.318`. Its embedded build metadata names Git revision `ca1fa9dea62c1027756786c841c548788644560d` and build time `2026-11-03T18:52:53Z`.
|
|
8
|
+
|
|
9
|
+
## Client initialization and channel registration
|
|
10
|
+
|
|
11
|
+
The inspected stdio MCP client construction passes capabilities through `_Xt`, `pOn` or `uOn`, and `W`. That path builds roots/list-change and elicitation capabilities, with conditional MCP application extensions. The inspected path contains no channel-specific client capability or flag-dependent channel opt-in field.
|
|
12
|
+
|
|
13
|
+
Channel registration is a separate path. It checks the server's channel declaration, protocol compatibility, provider and organization policy, and the session's selected channel entries. A generic MCP client capability therefore cannot establish that this session opted into this channel. This is a bounded observation about these paths in 2.1.318, not a claim about every client version.
|
|
14
|
+
|
|
15
|
+
The [official channel reference](https://code.claude.com/docs/en/channels-reference) describes the channel capability as a server declaration. It also documents the development flag as interactive-only; print mode ignores that flag. No usable client initialization signal was found in the inspected artifact and reference.
|
|
16
|
+
|
|
17
|
+
## Direct-parent fallback
|
|
18
|
+
|
|
19
|
+
The existing `claudeNativeLaunch` implementation prepends the development-channel flag and a selected exact target before native passthrough arguments. The target is normally `plugin:agent-hub@agent-hub`; its existing matching MCP configuration path can select `server:agent-hub`.
|
|
20
|
+
|
|
21
|
+
A passive process observation corroborated this layout for the running native TUIs: process 10310 and several other observed TUIs had the exact known flag/target prefix. The observed background daemon, process 17739, did not. Two other Claude process rows exposed only the process name, which cannot establish support. The observation emitted only identifiers and classification results, without retaining command bodies, paths or prompts.
|
|
22
|
+
|
|
23
|
+
The proposed fallback was communicated to the reviewer before implementation: require the existing launcher marker together with bounded evidence from the direct parent's actual invocation. An inherited marker alone is insufficient. Unknown process metadata must remain tools-only. Searching an arbitrary command substring would be unsafe because a prompt or an option value can contain the same flag text.
|
|
24
|
+
|
|
25
|
+
The flag evidence has a deliberate ceiling: it establishes the inspected launch form, not organization policy, user confirmation, protocol registration or model consumption. Unrecognized launch forms must remain pull-only. The separate #1172 settlement work is needed for notifications that are accepted by the transport but never confirmed by the session.
|
|
26
|
+
|
|
27
|
+
## Verification boundaries
|
|
28
|
+
|
|
29
|
+
Synthetic fixtures must distinguish an inherited marker without parent evidence from the supported launcher form, and keep the former's messages readable through `hub_inbox`. Negative cases include print/background forms, repeated or misplaced flags, unknown targets and unavailable process metadata. Status must expose a closed evidence value, never command text.
|
|
30
|
+
|
|
31
|
+
Source tests, the committed-head remote gate, hosted CI and native message-consumption receipts are separate evidence. This investigation supplies no native delivery receipt.
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
# 0.31.0 release verification
|
|
2
|
+
|
|
3
|
+
This record covers release preparation and source review. It claims no installation, no running-hub upgrade to 0.31.0 and no live TUI launch.
|
|
4
|
+
|
|
5
|
+
## Candidate
|
|
6
|
+
|
|
7
|
+
Initial preparation: version 0.31.0, prepared from main 3185dd4c (33 commits since v0.30.0; the tool's count of 34 includes this branch's CHANGELOG commit 7e2a3257, 16 of them `feat`; bump rule: minor). The release commits carry the version, the CHANGELOG section, the bundle and the documentation stamps.
|
|
8
|
+
|
|
9
|
+
## Completion after the release follow-ups (task 744)
|
|
10
|
+
|
|
11
|
+
The single intended release remains 0.31.0. Completion starts from main
|
|
12
|
+
`9e4f24c3b222b6faa40309eeb0a91a54107dfe6e` on the exact branch
|
|
13
|
+
`release/0.31.0`; no version, runtime, bundle or fixture version is changed here.
|
|
14
|
+
At preparation, npm's `latest` was 0.30.0 and the remote `v0.31.0` tag was absent.
|
|
15
|
+
The earlier release PRs #1218 and #1223 are already merged, but the four source
|
|
16
|
+
PRs below landed afterward. This follow-up must also be merged with a merge
|
|
17
|
+
commit and the default subject, preserving the reviewed-stamp ancestors for the
|
|
18
|
+
guarded tag. It neither records consent nor creates a tag or npm publication.
|
|
19
|
+
|
|
20
|
+
The board approval head equals each merged PR's head (`mismatch: false`).
|
|
21
|
+
GitHub readback found every listed check completed successfully or skipped,
|
|
22
|
+
with no failed or pending check. Counts below are head-specific hosted checks,
|
|
23
|
+
not installed/native acceptance or a new full-suite result for this docs branch.
|
|
24
|
+
|
|
25
|
+
| PR / task | Approved head | Merge commit | Hosted CI |
|
|
26
|
+
| --- | --- | --- | --- |
|
|
27
|
+
| [#1213](https://github.com/STAIxBWLB/agent-hub/pull/1213), task 739 | `6a304ccbdc2b9ab511f6f85af7fb8fbaee18f1ce` | `c58958d3a13c4de0317fdfb72745a88943315e93` | 19 success, 2 skipped |
|
|
28
|
+
| [#1224](https://github.com/STAIxBWLB/agent-hub/pull/1224), task 714 | `cf20b1d30fe314938c013b34b8a394e8aed1474f` | `b7408fffccdfcdce88fd0e04c2cbecf91c44d7c8` | 21 success, 2 skipped |
|
|
29
|
+
| [#1215](https://github.com/STAIxBWLB/agent-hub/pull/1215), task 734 | `4ffbab00e3a10a32c2955c76873b424f4d5434f8` | `4a4f87ed445bb32df13f9b371f8792dde740de65` | 19 success, 2 skipped |
|
|
30
|
+
| [#1228](https://github.com/STAIxBWLB/agent-hub/pull/1228), task 743 | `8c6d28bbd49f9d2b28e5ab62c28fd81d8a1e6f72` | `9e4f24c3b222b6faa40309eeb0a91a54107dfe6e` | 19 success, 2 skipped |
|
|
31
|
+
|
|
32
|
+
CHANGELOG now includes failure causes/unresolved failed counts, the handoff
|
|
33
|
+
reachability/repair diagnostics, the exact agent-mem 0.21.0 pin and complete
|
|
34
|
+
bounded declined inspection, and the missing task 739 convention entry.
|
|
35
|
+
Unreleased is empty. The old #1173 wait for agent-mem#260/#261 is replaced:
|
|
36
|
+
AC4 is complete, while automatic v3 sync remains unsupported pending the
|
|
37
|
+
activation and fresh host-attestation path in agent-mem#281. No activation or
|
|
38
|
+
attestation is fabricated. Task 736/T3 and task 737/T4 are not in this release.
|
|
39
|
+
|
|
40
|
+
The hub N-1 fixture stays 0.30.0 with agent-mem 0.20.1. The additive nullable
|
|
41
|
+
`deliveries.failure_cause` column does not raise hub schema version 2; the older
|
|
42
|
+
recovery reader ignores the extra diagnostic snapshot key. The existing
|
|
43
|
+
`peer_takeover` compatibility statement is retained. Memory claims are limited
|
|
44
|
+
to [agent-mem's published 0.21.0 notes](https://github.com/STAIxBWLB/agent-mem/blob/v0.21.0/CHANGELOG.md):
|
|
45
|
+
its N-1 proof uses 0.20.3, not the 0.20.1 bundled by hub 0.30.0. Those notes keep
|
|
46
|
+
curated/capture/hook-spool/candidate/work-list/setup receipt v1/v2 formats,
|
|
47
|
+
shared-v1/generation/v1-v2 shard sync and index version/name unchanged, and
|
|
48
|
+
record 0.20.3 refusing activated v3. This report does not extend that versioned
|
|
49
|
+
proof to 0.20.1 or claim supported v3 activation/automatic sync.
|
|
50
|
+
|
|
51
|
+
### Document review for task 744
|
|
52
|
+
|
|
53
|
+
The 14 stale documents were reviewed against the task 714, 734 and 743 deltas
|
|
54
|
+
only; task 739 changes classification metadata without runtime behavior.
|
|
55
|
+
Changed documents:
|
|
56
|
+
|
|
57
|
+
- `docs/quickstart.md`: correct the 0.31.0 upgrade paragraph, additive failure
|
|
58
|
+
column, current exact memory pin and the automatic-v3 limitation; retain the
|
|
59
|
+
historical 0.30.0 pin note and global CLI/plugin update step.
|
|
60
|
+
- `docs/operations.md`: correct the mismatch next step (`ahub projects`, with
|
|
61
|
+
`ahub up` conditional on the intended target not running).
|
|
62
|
+
- `docs/security.md`: correct the old 0.18.0 pin; distinguish safe status
|
|
63
|
+
placement counts from failure logging and bounded person-only inspection;
|
|
64
|
+
state the activation/attestation limitation.
|
|
65
|
+
- `docs/agent-notes/adapters.md`: carry typed structured failure diagnostics
|
|
66
|
+
without treating the diagnostic as settlement or trusting native text.
|
|
67
|
+
- `docs/agent-notes/bus.md`: preserve typed causes through persistence/retry,
|
|
68
|
+
use metadata-only unresolved counts, and distinguish unavailable from zero.
|
|
69
|
+
|
|
70
|
+
Reviewed without content changes:
|
|
71
|
+
|
|
72
|
+
- `README.md`: version/protocol and high-level memory/handoff claims remain true.
|
|
73
|
+
- `docs/agent-notes/README.md`: historical background is unchanged.
|
|
74
|
+
- `docs/agent-notes/benchmarks.md`: no benchmark protocol or end-cause change.
|
|
75
|
+
- `docs/agent-notes/budget.md`: quota/accounting and pause semantics are unchanged.
|
|
76
|
+
- `docs/agent-notes/daemon.md`: current policy/profile sync fences and handoff
|
|
77
|
+
diagnostic codes, authority and bounded sync behavior remain accurate.
|
|
78
|
+
- `docs/agent-notes/local-worker.md`: the watchdog cause is additive; cancellation
|
|
79
|
+
and uncertainty remain unchanged, with typed diagnostics owned by adapters.
|
|
80
|
+
- `docs/agent-notes/tasks.md`: task/handoff authority and the write-time memory
|
|
81
|
+
projection remain valid.
|
|
82
|
+
- `docs/agent-notes/tests.md`: fake boundaries, exact-pin fixtures and the
|
|
83
|
+
type-only overload adaptation do not change the test instructions.
|
|
84
|
+
- `src/cli/help.ts`: handoff `--list`/`--sync` match main and the argument parser;
|
|
85
|
+
status/queue/declined forms and native entry definitions are unchanged.
|
|
86
|
+
|
|
87
|
+
Only these 14 reviewed documents were restamped through
|
|
88
|
+
`bun scripts/release-prepare.ts restamp <document>... --reviewed` at the reviewed
|
|
89
|
+
content commit `af37f8fd8b44a2c566aa47629ec5b02ee9f91d69`. The stamp-only commit
|
|
90
|
+
`7db76b365d0b3e0ef0b946468193dab7b3393bd8` retains that ancestor; the already
|
|
91
|
+
fresh models document was not restamped.
|
|
92
|
+
|
|
93
|
+
### Completion checks for task 744
|
|
94
|
+
|
|
95
|
+
On dgx02, `remote_dev.py verify` checked committed head
|
|
96
|
+
`7db76b365d0b3e0ef0b946468193dab7b3393bd8` (tree `656a468fbfd1`) with
|
|
97
|
+
`node scripts/check-docs.mjs --require-fresh && scripts/check.sh --changed`.
|
|
98
|
+
The run completed in 31 seconds with:
|
|
99
|
+
|
|
100
|
+
```text
|
|
101
|
+
docs: OK (0 stale documents)
|
|
102
|
+
roles: OK (17 bounded definitions)
|
|
103
|
+
inventory: OK (3276 entries, 2121 classified, 1155 in the baseline of known-unclassified keys)
|
|
104
|
+
package: OK (793 files, @staix/agent-hub@0.31.0)
|
|
105
|
+
check: --changed found no affected tests
|
|
106
|
+
check: OK (changed)
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Typecheck and bundle freshness also passed. This was a documentation-only
|
|
110
|
+
changed gate, not a new full runtime test run. The following documentation-only update
|
|
111
|
+
records that completed result; final-head checks and hosted CI are recorded on
|
|
112
|
+
the PR and remain the merge gate. No tag, consent, publication, installation or
|
|
113
|
+
live upgrade was performed.
|
|
114
|
+
|
|
115
|
+
## Reviews
|
|
116
|
+
|
|
117
|
+
Pull requests named by the commits since v0.30.0: #1216, #1211, #1214, #738, #1212, #1210, #1207, #1209, #1206, #1205, #1202, #1201, #1192, #1200, #1197, #1195, #1194, #1189, #1191, #1190, #1186, #1183, #1188, #1181, #1185, #1187, #1184, #1182, #1170, #1169, #1168, #1167, #1166, #1165.
|
|
118
|
+
|
|
119
|
+
`#738` in that list is hub task 738 named in #1212's subject, not a pull request of this range.
|
|
120
|
+
|
|
121
|
+
Each of the 33 merged at the head its hub task approved, read from the board (`ahub board --json`: `approval.head` equals the task's `refs.commit` and the PR's head, `mismatch: false`), with that head's CI green on ubuntu and macOS (18 to 21 checks pass, 2 skipped, none failing). Approvals by claude unless named:
|
|
122
|
+
|
|
123
|
+
- #1165 (task 695) at 5d1c984e; #1166 (696) at 71f1e1f0; #1167 (693) at ca882f2b; #1168 (694) at 59f352da; #1169 (697) at e5500129; #1170 (700) at 884036ba; #1181 (708) at 0b9fbe07; #1182 (715) at 56521a35; #1183 (702) at 56f1e7c5; #1184 (710) at 97bfcba4; #1185 (703) at c762d8a7; #1186 (704) at 96703ec9; #1187 (711) at 9e2b2719; #1188 (716) at 72958d19; #1189 (712) at 054cc353; #1190 (724) at 1ecdeb32; #1191 (717) at db519b67; #1192 (722) at dd5e87ff; #1195 (705) at 61168f74; #1197 (723) at 680f3c1f; #1200 (727) at a6c886bb; #1201 (718) at 96d01a2d; #1202 (725) at e0a5c1a3; #1205 (728) at e2bca26f; #1206 (732) at c38895a6; #1207 (719) at 6e50af13; #1209 (730) at b3d9f52c; #1210 (731) at 744e4e21; #1211 (733) at 26b59ce3; #1212 (738) at 4c8eca47; #1214 (740) at 05a6dc50; #1216 (735) at 5fa15b5c.
|
|
124
|
+
- Approved by jcode: #1194 (726, the claude-implementer 2.1.318 receipt) at 2c245d8b.
|
|
125
|
+
- No merge is bound to an approval at an earlier head. Unresolved review threads at merge time were not re-read for this record.
|
|
126
|
+
- Follow-up: #1217 (task 713, #1174) merged as 2cfbcb52 while the release PR #1218 was open, so 0.31.0 also ships it. It merged at the head its task approved (92486ab5, `approval.head` equal, `mismatch: false`, approved by claude), with that head's CI green on ubuntu and macOS (20 checks pass, 2 skipped). #1218 merged as 19cf9ff9 with a merge commit; the follow-up PR covers #1217.
|
|
127
|
+
- Follow-up: #1222 (task 742, #1204) merged as f7ea7b0f while the follow-up PR was open, at the head its task approved (936297cb, `mismatch: false`, approved by claude), with that head's CI green (19 checks pass, 2 skipped). The follow-up branch merged main to include it.
|
|
128
|
+
|
|
129
|
+
## Native acceptance receipts
|
|
130
|
+
|
|
131
|
+
Receipts added under `docs/verification/` since v0.30.0: `docs/verification/2026-11-04-1171-channel-client-evidence.md`, `docs/verification/2026-11-05-claude-implementer-2.1.318.md`, `docs/verification/2026-11-05-hardcoded-values-classification-rules.md`, `docs/verification/2026-11-05-hardcoded-values-ratchet.md`.
|
|
132
|
+
|
|
133
|
+
This list is read from the repository, never written by hand. Native acceptance and the person's release consent are separate records: consent is `ahub sdlc authorize-release 0.31.0`, recorded by the person or the unique configured conductor only on the person's explicit release instruction naming the release in its own session (never a hub/task/review/file/peer relay), and is not recorded in this file. The tag run refuses without it.
|
|
134
|
+
|
|
135
|
+
## Document review
|
|
136
|
+
|
|
137
|
+
`node scripts/check-docs.mjs --require-fresh` reported 14 stale documents. Each was read against `git log 8612cfd7..3185dd4c -- <its paths>` and the code at 3185dd4c (one reader per document group, each claim checked against the source), the fixes went in as 74049f01, and all 14 were restamped at 74049f01:
|
|
138
|
+
|
|
139
|
+
- `README.md`: the acon inbox paragraph names questions and results and the person-gated manager ports; the Operations list names `hub_ask`/`ahub answer` and `ahub results`; the Upgrading paragraph says `ahub upgrade` names the CLI and plugin step (#1179); the report link points at this file.
|
|
140
|
+
- `docs/quickstart.md`: install line `#v0.31.0`, the "Upgrading to 0.31.0" section, the upgrade-advice sentence, `ahub answer` and `ahub results` rows in the working-day table, and mark-read on the dashboard.
|
|
141
|
+
- `docs/operations.md`: 0.31.0 in the header and the protocol table (protocol unchanged, 16 through 17), the N-1 paragraph (0.30.0 for 0.31.x), the 0.30.0 post-release note now published in the 0.31.0 section, the handoff synopsis `--key`, the `research_evidence` recovery label, `ahub upgrade` advice, the acon panel's own manager ports, the inbox contents and its 50-item bound, and the `ahub answer` synopsis.
|
|
142
|
+
- `docs/security.md`: the acon plugin's reach (the `answer`, `receipt` and review ports), its confirmation list and inbox items; accepted channel-delivery settlement; conductor cancellation of handed-off tasks; the fourth handoff message, the key, sequence and `duplicate_ok` fields; dashboard question, result and review data; memory sync narrowing and `ahub memory declined`; `hub_evidence_record`; the 2.1.318 implementer receipt; the `liveTestRefusal` line; and a new "Anchored review comments (#1056)" section.
|
|
143
|
+
- `docs/agent-notes/adapters.md`: the `acceptedSettlement` port (#1172) and the owned input observers (#1056).
|
|
144
|
+
- `docs/agent-notes/budget.md`: transient `Bus.pause`/`resume` write no snapshot (#1214).
|
|
145
|
+
- `docs/agent-notes/bus.md`: pushed vs pulled answer parents, review-observer telemetry suppression, owner-audience reviews never moot, explicit-channel `accepted` resolution, accepted-delivery expiry, review provenance and room delivery rows.
|
|
146
|
+
- `docs/agent-notes/daemon.md`: the recovery floor list (`research_evidence`, `review_comments`, `review_observer_input_state`, `accepted_delivery_settlement`), the DOING privacy screens, review observer input, channel push evidence, the inbox project listing budget, held-hint rendering, memory sync policy outcomes and the retired pet window.
|
|
147
|
+
- `docs/agent-notes/local-worker.md`: the review-turn exclusion (#1181, #1192).
|
|
148
|
+
- `docs/agent-notes/tasks.md`: `Board.proposeHandoff`, `task_handoff_by_key`, sequence-ordered events and the periodic catch-up; claim evidence links; person review comments; long-term memory screening.
|
|
149
|
+
- `docs/agent-notes/tests.md`: time-bounded waits (#1163), the fake-ripwire probe (#1197), channel parent evidence in fixtures (#1171) and the published fixtures' retarget rule (#1168).
|
|
150
|
+
- No change needed: `src/cli/help.ts` (every form the 8 commits added matches `main.ts` and its parsers), `docs/agent-notes/README.md` and `docs/agent-notes/benchmarks.md` (each read; the commits in range do not change what they state).
|
|
151
|
+
- Not acted on, outside the stale set: AGENTS.md "Area notes" does not yet name the new files `src/hub/review-comments.ts`, `review-anchor.ts`, `review-material.ts`, `research-evidence.ts`, `memory-sync-policy.ts`, `question-detach.ts`, `completion-detail.ts`, `memory-sync-state.ts`, `src/ui/plugin-questions.ts` and the new `src/cli/*-args.ts` parsers; `test/specs-tasks.test.ts` and `test/broker-server.test.ts` still bound a wait by event-loop turns.
|
|
152
|
+
|
|
153
|
+
- Follow-up review of #1217: after #1218 merged, `check-docs --require-fresh` on main reported 12 documents stale by #1217 (and the #1218 merge). Each was re-read against #1217's diff only, the fixes went in as 142c80c7, and all 12 were restamped at 142c80c7:
|
|
154
|
+
- `README.md`: the Operations list names `ahub peer takeover`.
|
|
155
|
+
- `docs/operations.md`: the newest-hello sentence now applies only to a session that does not opt in to standby.
|
|
156
|
+
- `docs/security.md`: a paragraph on person-only takeover, standby fencing and display-only ids and PIDs.
|
|
157
|
+
- `docs/agent-notes/adapters.md`: the retained standby port (`retainStandby`, `takeover`, `ownsSocket`, closes 4405 and 4403).
|
|
158
|
+
- `docs/agent-notes/daemon.md`: the `peer_takeover` control message and detached-connection rule.
|
|
159
|
+
- `docs/agent-notes/tests.md`: close the fixture owner before attaching a second opted-in session.
|
|
160
|
+
- `src/cli/help.ts`: `ahub peer takeover` lists the `--json` and `--color` flags `main.ts` accepts.
|
|
161
|
+
- No change needed: `docs/agent-notes/README.md` (the `o` key acts on the selected row's displayed standby id, within the exact-row rule), `budget.md`, `bus.md`, `tasks.md` (#1217 changes no pause, queue or task path) and `docs/quickstart.md`.
|
|
162
|
+
- CHANGELOG: a #1217 entry under 0.31.0, and the N-1 statement names `peer_takeover`, `ahub peer takeover` and the standby opt-in in both directions.
|
|
163
|
+
- Follow-up review of #1222: the merge of main left 9 documents stale by its `src/hub/bus.ts` and `src/rooms/link.ts` changes. Each was re-read against #1222's diff, the one fix went in as aceed883, and all 9 were restamped there:
|
|
164
|
+
- `docs/agent-notes/bus.md`: a closed `Bus` publishes nothing and touches no journal or observer.
|
|
165
|
+
- No change needed: `README.md`, `docs/operations.md`, `docs/security.md`, `docs/quickstart.md`, `budget.md`, `daemon.md`, `tasks.md`, `tests.md` (their presence and queue statements still hold; #1222 changes no surface, setting or wire field).
|
|
166
|
+
- CHANGELOG: a #1222 entry under 0.31.0; it changes no N-1 surface.
|
|
167
|
+
|
|
168
|
+
## Checks
|
|
169
|
+
|
|
170
|
+
- `node scripts/check-docs.mjs --require-fresh`: `docs: OK (0 stale documents)` after the restamp at 74049f01.
|
|
171
|
+
- `scripts/check.sh --changed origin/main` on dgx02 (`remote_dev.py verify`) at e8f3a694 (tree a0576a8b) selected the full suite: `docs: OK (0 stale documents)`, `roles: OK`, `inventory: OK` (3267 entries, 1155 in the baseline), typecheck (`bun x tsc --noEmit`), the bundle check (`bun scripts/build.mjs --check`), `package: OK (791 files, @staix/agent-hub@0.31.0)`, and 11891 pass, 101 skip, 0 fail across 916 files with Bun 1.4.2; no daemon leaks; `check: OK`. It includes the published-runtime interoperability tests in both directions against 0.30.0 (release N-1) and 0.25.0 (protocol floor). Later commits on the release branch change only this report.
|
|
172
|
+
- The release PR's exact-head CI on ubuntu and macOS is the gate for the merge.
|
|
173
|
+
- Follow-up for #1217: `node scripts/check-docs.mjs --require-fresh` is `docs: OK (0 stale documents)` after the restamp at 142c80c7. `scripts/check.sh --changed origin/main` on dgx02 at 1acb9645 (tree e1a307e0) ran typecheck, the bundle check, `inventory: OK`, `package: OK (791 files, @staix/agent-hub@0.31.0)` and the 25 test files the change touches: 347 pass, 0 fail; `check: OK (changed)`. #1217's own full-suite and hosted CI receipts are in its PR. After that gate the branch merged main for #1222 (its own full dgx02 gate and hosted CI are in #1222) and added only documents, stamps and CHANGELOG lines; `check-docs --require-fresh` is clean at the final head. The follow-up PR's exact-head CI gates its merge, which must also be a merge commit.
|
|
174
|
+
|
|
175
|
+
## Known gaps, not blocking
|
|
176
|
+
|
|
177
|
+
- No installation, running-hub upgrade to 0.31.0 or live TUI launch was done for this record.
|
|
178
|
+
- #1053: AC1 live receipts and the T1 timeout measurement stay open; the per-adapter `hub_ask` waits are provisional.
|
|
179
|
+
- #1056 and #1204 (T3, T4) stay open; #1196 stays open until the person measures the live acon console.
|
|
180
|
+
- #1173: complete bounded declined listings are available. Automatic v3 sync still lacks the supported activation and fresh host-attestation path in agent-mem#281.
|
|
181
|
+
- #1184: the channel-evidence fallback reads the direct parent's process row; it is not authentication, and a published client opt-in is the upgrade path.
|
|
182
|
+
- The N-1 fixture lock remains the Bun 1.4.2 lock for 0.30.0. Prior published-runtime interoperability evidence is recorded above; this documentation-only completion adds no new full-runtime claim.
|