@staix/agent-hub 0.34.0 → 0.35.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 +35 -6
- package/docs/adding-an-ai-tool.md +2 -2
- package/docs/addons/claude-mem.md +4 -4
- package/docs/addons/open-code-review.md +1 -1
- package/docs/agent-notes/README.md +6 -0
- package/docs/agent-notes/adapters.md +9 -5
- package/docs/agent-notes/budget.md +1 -1
- package/docs/agent-notes/bus.md +1 -1
- package/docs/agent-notes/daemon.md +4 -3
- package/docs/agent-notes/local-worker.md +1 -1
- package/docs/agent-notes/models.md +2 -0
- package/docs/agent-notes/tasks.md +1 -1
- package/docs/agent-notes/tests.md +5 -0
- package/docs/design/adapters.md +110 -2
- package/docs/design/agent-hub-architecture.md +63 -1
- package/docs/design/agent-hub.md +6 -0
- package/docs/design/bus.md +18 -0
- package/docs/design/execution-reference.md +146 -0
- package/docs/design/task-board.md +10 -0
- package/docs/dogfood.md +33 -12
- package/docs/events.md +38 -20
- package/docs/memory.md +21 -7
- package/docs/operations.md +539 -24
- package/docs/quickstart.md +18 -4
- package/docs/research.md +71 -13
- package/docs/roles.md +1 -1
- package/docs/sdlc.md +9 -7
- package/docs/security.md +87 -11
- package/docs/smoke.md +14 -0
- package/docs/specs/2026-09-19-agent-hub-design.md +8 -3
- package/docs/verification/2026-11-07-0.34.1.md +54 -0
- package/docs/verification/2026-11-07-compat-python-startup-1248.md +51 -0
- package/docs/verification/2026-11-07-compat-receipt-harness-1248.md +105 -0
- package/docs/verification/2026-11-07-compat-receipt-producers-1248.md +96 -0
- package/docs/verification/2026-11-07-compat-workflow-1248.md +94 -0
- package/docs/verification/2026-11-07-daemon-startup-1232.md +169 -0
- package/docs/verification/2026-11-07-jcode-receipt-reconstruction-1248.md +118 -0
- package/docs/verification/2026-11-07-kimi-delayed-usage.md +34 -0
- package/docs/verification/2026-11-07-kimi-review-watch-1284.md +115 -0
- package/docs/verification/2026-11-08-agy-1.5.3.md +96 -0
- package/docs/verification/2026-11-08-agy-acp-t0.md +56 -0
- package/docs/verification/2026-11-08-hub-visual-1058.md +161 -0
- package/docs/verification/2026-11-08-jcode-0991-model-setter-1317.md +143 -0
- package/docs/verification/2026-11-08-kimi-252-model-setter-1317.md +137 -0
- package/docs/verification/2026-11-08-kimi-tui-completion-1282.md +45 -0
- package/docs/verification/2026-11-08-kimi-wire-yield-1283.md +31 -0
- package/docs/verification/2026-11-08-live-model-override-1317.md +250 -0
- package/docs/verification/2026-11-08-qwen-0269-acp.md +138 -0
- package/docs/verification/2026-11-08-qwen-0269-model-setter-1317.md +91 -0
- package/docs/verification/2026-11-09-0.35.0.md +129 -0
- package/docs/verification/2026-11-09-headless-records-1320.md +157 -0
- package/docs/verification/claude-permission-transport-native.py +10 -3
- package/docs/verification/claude-shell-wrapper-native.py +8 -8
- package/docs/verified.json +245 -15
- package/package.json +3 -3
- package/plugins/agent-hub/.claude-plugin/plugin.json +1 -1
- package/plugins/agent-hub/kimi-hook.js +20397 -0
- package/plugins/agent-hub/kimi-review-policy-worker.js +217 -0
- package/plugins/agent-hub/server.js +2701 -664
- package/scripts/check-docs.mjs +12 -1
- package/src/adapters/acp-model-policy.ts +56 -0
- package/src/adapters/acp.ts +175 -5
- package/src/adapters/agy/entry.ts +8 -5
- package/src/adapters/agy/hooks.ts +65 -15
- package/src/adapters/channel-peer.ts +33 -1
- package/src/adapters/claude-implementer.ts +16 -3
- package/src/adapters/codex-appserver.ts +118 -8
- package/src/adapters/codex-review-isolation.ts +3 -1
- package/src/adapters/compat.ts +11 -6
- package/src/adapters/definitions/builtin-metadata.ts +8 -1
- package/src/adapters/definitions/native-cli-entry-kimi.ts +76 -7
- package/src/adapters/definitions/native-cli-preview-common.ts +2 -2
- package/src/adapters/definitions/native-cli-preview-kimi.ts +9 -2
- package/src/adapters/definitions/reviewer-variants.ts +3 -1
- package/src/adapters/kimi-review-policy-worker.js +2 -0
- package/src/adapters/kimi-review-policy-worker.ts +85 -0
- package/src/adapters/kimi-review-policy.ts +68 -0
- package/src/adapters/kimi-review.ts +41 -41
- package/src/adapters/kimi-tui-facts.ts +153 -0
- package/src/adapters/kimi-wire-usage.ts +33 -8
- package/src/adapters/local-worker.ts +59 -20
- package/src/adapters/model-token.ts +3 -0
- package/src/adapters/pi.ts +27 -5
- package/src/adapters/registry-types.ts +34 -3
- package/src/adapters/registry.ts +1 -0
- package/src/adapters/reviewer-policy-watch.ts +86 -0
- package/src/adapters/reviewer-print.ts +80 -18
- package/src/cli/agents.ts +1 -1
- package/src/cli/facts-hook.ts +4 -2
- package/src/cli/help.ts +3 -2
- package/src/cli/identity.ts +3 -0
- package/src/cli/kimi-facts-hook.ts +11 -0
- package/src/cli/kimi-plugin.ts +157 -0
- package/src/cli/main.ts +48 -9
- package/src/cli/model.ts +52 -0
- package/src/cli/output.ts +23 -1
- package/src/cli/recovery-package.ts +15 -7
- package/src/cli/reset.ts +1 -1
- package/src/cli/status-lines.ts +8 -4
- package/src/hub/budget.ts +1 -1
- package/src/hub/bus.ts +40 -2
- package/src/hub/code-facts.ts +10 -3
- package/src/hub/completions.ts +3 -1
- package/src/hub/config-apply.ts +2 -1
- package/src/hub/control-client.ts +1 -1
- package/src/hub/daemon.ts +1050 -106
- package/src/hub/deliverable-files.ts +38 -5
- package/src/hub/dogfood-profile.ts +1 -1
- package/src/hub/envelope.ts +1 -1
- package/src/hub/events.ts +28 -18
- package/src/hub/execution-lineage.ts +120 -0
- package/src/hub/execution-reference.ts +36 -0
- package/src/hub/hub-tools.ts +21 -2
- package/src/hub/instances.ts +4 -3
- package/src/hub/kimi-events.ts +46 -0
- package/src/hub/kimi-usage.ts +132 -29
- package/src/hub/lifecycle.ts +31 -15
- package/src/hub/limits.ts +13 -4
- package/src/hub/manager.ts +15 -2
- package/src/hub/memory-policy.ts +2 -1
- package/src/hub/memory-sync-attestation.ts +54 -0
- package/src/hub/memory-sync-state.ts +20 -5
- package/src/hub/model-overrides.ts +115 -0
- package/src/hub/native-hook-launch.ts +12 -3
- package/src/hub/operational-view.ts +2 -2
- package/src/hub/peers.ts +27 -0
- package/src/hub/permission-mode.ts +1 -1
- package/src/hub/person-figures.ts +88 -0
- package/src/hub/report.ts +38 -4
- package/src/hub/research-dataset.ts +158 -0
- package/src/hub/research-memory.ts +68 -0
- package/src/hub/research-quality.ts +118 -0
- package/src/hub/research-record.ts +279 -0
- package/src/hub/research.ts +126 -27
- package/src/hub/restart.ts +14 -0
- package/src/hub/settings.ts +3 -0
- package/src/hub/startup-event-seeds.ts +51 -0
- package/src/hub/startup-readiness.ts +65 -0
- package/src/hub/startup-timing.ts +38 -0
- package/src/hub/tasks.ts +29 -9
- package/src/hub/ui.ts +9 -5
- package/src/hub/visual-assets.ts +50 -0
- package/src/hub/visual.ts +257 -0
- package/src/memory/brief.ts +169 -14
- package/src/memory/capture.ts +2 -1
- package/src/memory/recall.ts +46 -5
- package/src/memory/record-provenance.ts +82 -0
- package/src/memory/records.ts +116 -0
- package/src/models/route/adec.ts +190 -0
- package/src/models/route/config.ts +37 -3
- package/src/models/route/decision-evidence.ts +83 -0
- package/src/models/route/decision.ts +143 -0
- package/src/models/route/runtime.ts +13 -6
- package/src/ui/index.html +134 -6
- package/src/ui/plugin.ts +65 -4
- package/templates/AGENTS.block.md +1 -1
- package/templates/config.json +1 -1
- package/templates/profiles/general.json +1 -1
- package/templates/profiles/research.json +1 -1
- package/templates/profiles/writing.json +1 -1
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# Jcode receipt reconstruction: partial control, not qualified (#1248)
|
|
2
|
+
|
|
3
|
+
Date: 2026-11-07. Task #767. This is new proof code, not promotion of the missing
|
|
4
|
+
producer behind [the historical Mac receipt](2026-10-26-jcode-0.99.1.md).
|
|
5
|
+
|
|
6
|
+
The isolated Linux x64 control executed the verified 0.99.1 release. Isolation,
|
|
7
|
+
serve cleanup, ACP and MCP passed. Telemetry and the strict persisted-context
|
|
8
|
+
binding failed. Source comparison remains not-run. These failures are retained;
|
|
9
|
+
this report makes no COMPAT, trust or macOS qualification change.
|
|
10
|
+
|
|
11
|
+
## Artifact and runner binding
|
|
12
|
+
|
|
13
|
+
The public [v0.99.1 release](https://github.com/1jehuang/jcode/releases/tag/v0.99.1)
|
|
14
|
+
provides `jcode-linux-x86_64.tar.gz`, 56203997 bytes, with SHA-256
|
|
15
|
+
`0b2a612de97c6e01ae6de1c0cff555b3460cf8364d1a11d2f8649fc0c9d7a1e6`.
|
|
16
|
+
The installer verified its tagged asset digest and `SHA256SUMS` before extraction.
|
|
17
|
+
The archive has a 505-byte regular wrapper `jcode-linux-x86_64` and its regular
|
|
18
|
+
adjacent `.bin`; their names and bytes are preserved.
|
|
19
|
+
|
|
20
|
+
At `350a3d042fc9d9680fa84b90c82f5c77bd3941b7`, dgx02 ran Bun 1.4.2 in a
|
|
21
|
+
disposable Linux x64 container. Typecheck and 79 fixture tests passed. The actual
|
|
22
|
+
native control's installation passed with the digest above; its overall outcome
|
|
23
|
+
was failure, with owned stop confirmed and lifetime process cleanup unproven.
|
|
24
|
+
The container's lifetime supplies containment. The control sets `autoAdmit:false`
|
|
25
|
+
in a temporary in-memory Linux projection and never spoofs its OS or architecture.
|
|
26
|
+
The checked-in manifest still requires macOS arm64.
|
|
27
|
+
|
|
28
|
+
The Mac archive's acquisition was checked separately on Linux without executing
|
|
29
|
+
its binary: SHA-256
|
|
30
|
+
`3623164d518b0c9d443ab07052084244b379e8a3377037db67d2382220f4ed14`,
|
|
31
|
+
wrapper `jcode-macos-aarch64`. That is packaging evidence, not native Mac evidence.
|
|
32
|
+
|
|
33
|
+
## Reconstructed procedure and observed legs
|
|
34
|
+
|
|
35
|
+
The single imported module owns private HOME/JCODE_HOME, the loopback provider,
|
|
36
|
+
serve/ACP children and their cleanup. Serve and ACP argv reuse production
|
|
37
|
+
`jcodeCommand`; version and private-provider configuration use parameterized
|
|
38
|
+
commands. The MCP entry carries no peer environment; the observer checks the
|
|
39
|
+
two synthetic owned-launch markers inherited by its native child. No real native
|
|
40
|
+
home, account, API key or model is supplied. The four real-home hashes from the
|
|
41
|
+
historical receipt were not reproduced: only the private HOME decoys are fenced.
|
|
42
|
+
|
|
43
|
+
| Leg | 0.99.1 Linux observation |
|
|
44
|
+
| --- | --- |
|
|
45
|
+
| isolation | pass: private environment and unchanged private decoy files |
|
|
46
|
+
| serve-cleanup | pass: ready FD/socket/sidecar metadata and stopped owned groups |
|
|
47
|
+
| acp-initialize-new-load-mode-ceilings | pass: protocol/identity/new/load and both unsupported-method checks |
|
|
48
|
+
| mcp-owned-environment | pass: actual eager child inherits the two expected markers |
|
|
49
|
+
| active-turn-soft-interrupt | fail: strict private persisted System-carrier binding was not established |
|
|
50
|
+
| telemetry | fail: `telemetry_id` appeared in the private native home |
|
|
51
|
+
| source-comparison | not-run: scoped source investigation is not the historical full compare review |
|
|
52
|
+
|
|
53
|
+
`session/load` still omits `sessionId`. The existing withheld recovery guarantee
|
|
54
|
+
and `requireLoadSessionEcho` policy are unchanged.
|
|
55
|
+
|
|
56
|
+
The fixed-stream loopback turn reached ping capability, same-session subscribe,
|
|
57
|
+
idle/active state, non-urgent interrupt acknowledgement, `end_turn` and two
|
|
58
|
+
completion bodies. Closed observations classified the first request as native
|
|
59
|
+
context plus original prompt, and the second as context, original, streamed head
|
|
60
|
+
and steer. Those observations do not substitute for the failed persisted-role
|
|
61
|
+
assertion. The final code also counts every completion POST attempt, rejecting a
|
|
62
|
+
third attempt even when its body is refused by the two-body storage cap.
|
|
63
|
+
|
|
64
|
+
## Narrow context and lock rules
|
|
65
|
+
|
|
66
|
+
Pinned source
|
|
67
|
+
[session.rs](https://github.com/1jehuang/jcode/blob/7206efd0c1dbf49ef38d06b63f3a96a3a7cee611/crates/jcode-base/src/session.rs#L989)
|
|
68
|
+
and [prompt.rs](https://github.com/1jehuang/jcode/blob/7206efd0c1dbf49ef38d06b63f3a96a3a7cee611/crates/jcode-base/src/prompt.rs#L656)
|
|
69
|
+
define the hidden user/System-display session-context carrier. The allowed
|
|
70
|
+
exception requires the new private session's matching ID and working directory,
|
|
71
|
+
a first stored `role:user`/`display_role:system` text carrier, the exact reminder
|
|
72
|
+
frame and seven field names, and identical bytes once at the same position in
|
|
73
|
+
both provider requests. Only that carrier may be excluded. Duplicate, forged,
|
|
74
|
+
changed-field, extra-field, moved or app-sentinel carriers fail. Application
|
|
75
|
+
original/head/steer bytes, order and all generic extra-user negatives remain
|
|
76
|
+
strict.
|
|
77
|
+
|
|
78
|
+
The Linux control failed that binding. The source also permits optional hardware
|
|
79
|
+
and Git context, which the seven-field rule does not admit. That is a possible
|
|
80
|
+
platform-dependent limitation, not a diagnosis proved by the closed failure
|
|
81
|
+
checkpoint. Snapshot/journal coverage is not inferred when the role binding is
|
|
82
|
+
unavailable.
|
|
83
|
+
|
|
84
|
+
Today's 0.99.1 control creates an empty `telemetry_id.lock`. The proof treats only
|
|
85
|
+
that exact zero-byte, regular, single-link, run-owned file in the private native
|
|
86
|
+
home, with `JCODE_NO_TELEMETRY=1`, as coordination rather than telemetry data.
|
|
87
|
+
Non-empty, symlink, hardlink and wrong-location locks fail; identity, event and
|
|
88
|
+
milestone artifacts still fail. The same control subsequently detected
|
|
89
|
+
`telemetry_id`, so the telemetry leg remains failed. File presence does not prove
|
|
90
|
+
that telemetry was transmitted.
|
|
91
|
+
|
|
92
|
+
We cannot tell whether the original 2026-10-26 producer saw the empty lock,
|
|
93
|
+
ignored it, or whether it did not appear then. The historical receipt is unchanged
|
|
94
|
+
and is not claimed to cover this allowance.
|
|
95
|
+
|
|
96
|
+
## Acquisition and runner corrections
|
|
97
|
+
|
|
98
|
+
The real control exposed three shared harness defects:
|
|
99
|
+
|
|
100
|
+
- GitHub release metadata rejected `Accept:application/octet-stream` with HTTP
|
|
101
|
+
415. Metadata now requests JSON; archive/checksum requests retain binary content
|
|
102
|
+
negotiation and every redirect, checksum and pre-effect integrity check.
|
|
103
|
+
- The archive wrapper is platform-qualified rather than named `jcode`. An
|
|
104
|
+
optional trusted recipe executable basename selects its unique existing file;
|
|
105
|
+
traversal, links and paths outside the verified prefix remain refused.
|
|
106
|
+
- A nested command runner counted its own proof worker's private request path as
|
|
107
|
+
a survivor. Only that current PID is excluded from the path heuristic. Known
|
|
108
|
+
descendants and other private-root processes remain detected, and lifetime
|
|
109
|
+
cleanup remains unproven. A separately owned helper negative verifies that the
|
|
110
|
+
observation never grants authority to signal it.
|
|
111
|
+
|
|
112
|
+
The metadata regression failed on dgx02 before its correction. Header-sensitive
|
|
113
|
+
and executable-selector fixtures retain all archive, timeout and integrity
|
|
114
|
+
negatives. Protocol fakes exercise the application/role/context/telemetry and
|
|
115
|
+
third-request refusals; they are not native-version qualification evidence.
|
|
116
|
+
Diagnostics contain bounded closed labels, booleans and counts only, and are
|
|
117
|
+
never admission data or native content. Final committed-head gate and review
|
|
118
|
+
evidence are recorded in the PR/task.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Kimi delayed usage and attribution receipt (#1281)
|
|
2
|
+
|
|
3
|
+
## Scope and isolation
|
|
4
|
+
|
|
5
|
+
Measured on 2026-11-07 with agent-hub source `a3de35e41ca26614108593b61de5674a960b2b95` plus the #1281 working change, and Kimi Code CLI 2.5.2. ACP initialization served protocol version 1 and agent version 2.5.2. The wire log declared protocol version 1.5.
|
|
6
|
+
|
|
7
|
+
The measured process had a new disposable cwd, `HOME`, `KIMI_CODE_HOME`, `TMPDIR` and `XDG_CONFIG_HOME`. Its generated native config retained only the installed managed provider and model settings, with hooks and telemetry disabled. The installed account's credential/oauth directories and device identity were symlinked into the disposable native home without printing their contents. No personal project or prior session was read. No credential or plan-quota probe was made.
|
|
8
|
+
|
|
9
|
+
Each turn was one ordinary no-tool prompt. Raw prompts, answers, session identifiers and transcript paths are not reproduced here and the disposable directories were removed. The measurements below contain field names, counts, timing relationships and attribution only.
|
|
10
|
+
|
|
11
|
+
## Native row timing and attribution
|
|
12
|
+
|
|
13
|
+
`counted` means `inputOther + inputCacheCreation + output`, the hub ceiling rule. `row within turn` compares the native row time with the captured hub turn interval. `usage after turn_end` compares the hub's `usage` event time with its immutable `turn_end` event.
|
|
14
|
+
|
|
15
|
+
| Attempt | Counted | Cache reads | Row within turn | Usage after turn_end | Attribution |
|
|
16
|
+
| --- | ---: | ---: | --- | --- | --- |
|
|
17
|
+
| 1 | 5,518 | 23,552 | yes | no | `delivery`, task 1281 |
|
|
18
|
+
| 2 | 237 | 28,928 | yes | no | `delivery`, task 1281 |
|
|
19
|
+
| 3 | 322 | 28,928 | yes | no | `delivery`, task 1281 |
|
|
20
|
+
| 4 | 153 | 28,928 | yes | no | `delivery`, task 1281 |
|
|
21
|
+
| 5 | 240 | 28,928 | yes | no | `delivery`, task 1281 |
|
|
22
|
+
| 6 | 325 | 28,928 | yes | no | `delivery`, task 1281 |
|
|
23
|
+
| 7 | 152 | 28,928 | yes | no | `delivery`, task 1281 |
|
|
24
|
+
| 8 | 240 | 28,928 | yes | no | `delivery`, task 1281 |
|
|
25
|
+
|
|
26
|
+
Every native row time fell inside its captured turn interval. Every row was collected before `turn_end`, and the `tokens` event carried the same `delivery`, task 1281 attribution and counted value as the `usage` event. This verifies current native row-time semantics and immediate attribution on Kimi 2.5.2.
|
|
27
|
+
|
|
28
|
+
## AC8 verdict
|
|
29
|
+
|
|
30
|
+
**AC8 is VERIFIED as amended on 2026-11-08.** The amended criterion accepts current native row-time and attribution evidence plus the production-timer delayed fixture when no delayed native row occurs. Zero of the eight ordinary turns produced a row after `turn_end`, so the immediate rows above are not presented as delayed evidence. The original delayed-native-only leg remains unobserved on Kimi 2.5.2.
|
|
31
|
+
|
|
32
|
+
The production delayed path is covered separately by `test/daemon-kimi-delayed-usage.test.ts`: its real unreferenced 250 ms timer collects a post-result row without another turn, updates `usage`, `tokens`, the budget and roll-up, and leaves `turn_end` unchanged. The A/B test fires the injected scheduler while task B is open and proves that A's delayed row keeps A's attribution, increments no turn total, and that an ambiguous timestamp is `unattributed`. These fixtures establish the #1281 behavior, not a current native delay.
|
|
33
|
+
|
|
34
|
+
The earlier native delay observed on Kimi 2.3.1 remains recorded in [2026-10-25-kimi-usage-ac11.md](2026-10-25-kimi-usage-ac11.md). A future version that again produces a post-result row should repeat this receipt's ordinary-turn leg.
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# Kimi review policy watching (#1284)
|
|
2
|
+
|
|
3
|
+
Date: 2026-11-07. Task #785. These are model-free private fixtures on dgx02,
|
|
4
|
+
Linux x64, Bun 1.4.2. The production Kimi preparation and reviewer peer are used
|
|
5
|
+
with an owned fake print/version command and synthetic OAuth files. No real Kimi
|
|
6
|
+
CLI, provider, account, credential or model interaction is claimed. COMPAT and
|
|
7
|
+
machine trust are unchanged.
|
|
8
|
+
|
|
9
|
+
The historical baseline was measured before production optimization, at
|
|
10
|
+
`4daaa842db4035c5504caff6867445b47b7c1be5`. It drives the actual old
|
|
11
|
+
`ReviewerPrintPeer` interval and complete `current()` fence. Input is exactly
|
|
12
|
+
1048576 framed bytes; the generated agent file is 1048868 bytes.
|
|
13
|
+
|
|
14
|
+
The post-change samples below are bound to
|
|
15
|
+
`dedbf4974d2a91ebd96623f4bd4a1ca04c06ac47`. The worker mode uses the real
|
|
16
|
+
policy worker and new controller. Inline-reference mode uses the same full fence
|
|
17
|
+
on the main thread under the new controller; it is a comparator, not another
|
|
18
|
+
measurement of the historical interval.
|
|
19
|
+
|
|
20
|
+
## Measurements
|
|
21
|
+
|
|
22
|
+
Values are milliseconds. Authority samples are eight synchronous `reviewToken()`
|
|
23
|
+
calls. Periodic samples are three checks per mode, after preparation has already
|
|
24
|
+
read the private files. These are small warm-fixture samples, not a cold-start,
|
|
25
|
+
production latency regression, p99 estimate or general speedup claim.
|
|
26
|
+
|
|
27
|
+
| Mode | Authority mean / max | Ordinary check mean / max | Ordinary start-to-start |
|
|
28
|
+
| --- | ---: | ---: | --- |
|
|
29
|
+
| Historical inline interval | 1.631 / 3.011 | 1.657 / 1.776 | 100.259, 100.214 |
|
|
30
|
+
| Worker | 1.709 / 3.937 | 2.748 / 2.998 | 100.362, 99.739 |
|
|
31
|
+
| New-controller inline reference | 1.613 / 3.095 | 1.725 / 1.877 | 99.857, 100.511 |
|
|
32
|
+
|
|
33
|
+
The worker check includes IPC and completion overhead. Work is moved off the main
|
|
34
|
+
event loop; the filesystem/hash work is not eliminated. Synchronous authority
|
|
35
|
+
checks remain synchronous and retain their separate measured cost.
|
|
36
|
+
|
|
37
|
+
A second phase adds a synthetic 150 ms hold, separately recorded from the actual
|
|
38
|
+
full-check cost. The worker is held inside its real request path until an
|
|
39
|
+
independent requester receives a real loopback control response. The fixture
|
|
40
|
+
checks that the underlying check has not completed prematurely. Inline modes
|
|
41
|
+
block the main thread; the independent requester confirms its request was sent.
|
|
42
|
+
The control server shares the actual reviewer's process/event loop. This is a
|
|
43
|
+
causal control fixture, not an installed daemon's response-time trace.
|
|
44
|
+
|
|
45
|
+
| Mode | Slow start-to-start | Causal shared-counter order |
|
|
46
|
+
| --- | --- | --- |
|
|
47
|
+
| Historical interval | 160.648, 152.533 | check start 1, check end 2, control dispatch 3, response 5 |
|
|
48
|
+
| Worker | 165.924, 154.460 | check start 1, control dispatch 2, response 3, check end 4 |
|
|
49
|
+
| New-controller inline reference | 162.538, 153.221 | check start 1, check end 2, control dispatch 3, response 5 |
|
|
50
|
+
|
|
51
|
+
Every sample's maximum concurrent checks is one. The first synthetic sample can
|
|
52
|
+
include requester coordination in addition to the nominal hold; it is not
|
|
53
|
+
reported as production hash cost. Assertions use ordering, not a host-specific
|
|
54
|
+
latency threshold. A fake monotonic clock separately proves that a check started
|
|
55
|
+
at 100 and completed at 350 schedules an immediate overdue check at 350, then a
|
|
56
|
+
fast completion schedules 400, without replaying every missed tick.
|
|
57
|
+
|
|
58
|
+
The full numeric baseline output is retained in the workspace's
|
|
59
|
+
`scratchpad/temp/task785-baseline-4daaa842.log`; the benchmark command emits the
|
|
60
|
+
raw arrays, ordering counters and cleanup flags. The post-change command is
|
|
61
|
+
`bun scripts/benchmarks/kimi-review-watch-1284.ts`, with `--inline-reference`
|
|
62
|
+
selecting its comparator. Each observed run confirmed peer stop, requester join,
|
|
63
|
+
profile removal and unchanged synthetic source files; post-change runs also
|
|
64
|
+
confirmed policy-worker join.
|
|
65
|
+
|
|
66
|
+
## Validation and ownership
|
|
67
|
+
|
|
68
|
+
Both synchronous authority checks and the worker call the same complete
|
|
69
|
+
filesystem checker: lexical and physical cwd ancestors, native source identity,
|
|
70
|
+
executable metadata, source configuration hash, all three private-file hashes and
|
|
71
|
+
all native/private auth targets. The parent adds abort/cleanup guards before and
|
|
72
|
+
after an asynchronous check. No successful asynchronous result is cached as
|
|
73
|
+
verdict or task-MCP authority. Version probing, fresh private homes, the two-tool
|
|
74
|
+
allowlist and OAuth-lock teardown are unchanged.
|
|
75
|
+
|
|
76
|
+
The worker receives a closed immutable projection of expected paths, metadata
|
|
77
|
+
and fingerprints, not serialized task facts, configuration contents or inherited
|
|
78
|
+
environment. It still reads the bounded files to hash them. Requests are
|
|
79
|
+
serialized and replies carry only a monotonic request ID and boolean. Error,
|
|
80
|
+
output, protocol and early boot failures poison the probe, including before the
|
|
81
|
+
first periodic tick; error text is not forwarded.
|
|
82
|
+
|
|
83
|
+
Each child/review sequence owns its watcher. Stop cancels scheduling before
|
|
84
|
+
joining a blocked check, initiates worker termination even if native stop fails,
|
|
85
|
+
and joins before profile deletion or confirmed input cleanup. Failed joins keep
|
|
86
|
+
the owner/profile and busy state until an explicit stop retry. A late result
|
|
87
|
+
cannot settle or revive a subsequent review, even for the same task and batch.
|
|
88
|
+
Worker progress never touches the native inactivity watchdog.
|
|
89
|
+
|
|
90
|
+
The source worker has a JS wrapper. The plugin has a separately generated,
|
|
91
|
+
self-contained sidecar with the same basename. A fixture copies that sidecar
|
|
92
|
+
alone into a directory containing a space and executes it without a source tree
|
|
93
|
+
beside it. Both generated assets use the pinned Bun after a worktree-local frozen
|
|
94
|
+
install; neither is hand edited.
|
|
95
|
+
|
|
96
|
+
At `dedbf4974d2a91ebd96623f4bd4a1ca04c06ac47`, dgx02 typecheck and 75 tests
|
|
97
|
+
across six files passed (514 assertions), followed by both numeric benchmark
|
|
98
|
+
modes. Coverage includes actual workers, empty environment, closed projection,
|
|
99
|
+
cwd/binary/config/auth changes, equal-size restored-mtime content tampering,
|
|
100
|
+
atomic OAuth refresh, stop while blocked, cleanup retries, early failure,
|
|
101
|
+
same-task late results, watchdog and output-limit cleanup. Existing Kimi isolation,
|
|
102
|
+
privacy, two-tool and lifecycle assertions were retained. The one old fake launch
|
|
103
|
+
with `watchCurrent` gained the asynchronous probe required by the new contract.
|
|
104
|
+
|
|
105
|
+
Two earlier fixture failures are not passing evidence: `28b7a07c` stopped at a
|
|
106
|
+
missing MCP-schema `additionalProperties:false`; `f5b5e8e2` passed typecheck and
|
|
107
|
+
56 tests but four new mtime cases used sub-ms timestamps that `Date` could not
|
|
108
|
+
restore exactly. The corrected fixture initializes exact whole-second timestamps
|
|
109
|
+
before binding; its size, precision and refusal assertions are unchanged.
|
|
110
|
+
|
|
111
|
+
Final canonical/seed/hosted-CI results are recorded at their exact tested heads
|
|
112
|
+
in the PR/task. Inventory discovery was deferred once with exit 75 because three
|
|
113
|
+
remote slots were occupied; no retry loop or local test/index fallback ran. No
|
|
114
|
+
documentation stamp, native version receipt, model-quality claim, merge or tag
|
|
115
|
+
is part of this change.
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Antigravity 1.5.3 account-free compatibility receipt
|
|
2
|
+
|
|
3
|
+
Date: 2026-11-08. Task #801, Refs #843. Repeats the [1.4.12 account-free procedure](2026-11-03-agy-1.4.12.md) and its [actual-launcher nonce leg](2026-11-03-agy-1.4.12-launcher-nonce.md).
|
|
4
|
+
|
|
5
|
+
**Decision: add exact 1.5.3 to verified.** All four required account-free legs passed on the same installed executable. The accepted 1.4.x line is unchanged; 1.5.2, 1.5.4 and other 1.5.x versions remain refused without person trust. This is compatibility evidence, not an account/model, permission-mode or headless ACP qualification.
|
|
6
|
+
|
|
7
|
+
## Exact executable and isolation
|
|
8
|
+
|
|
9
|
+
- Host macOS 27.0.1 arm64, pinned Bun 1.4.2. Native `--version`: 1.5.3. Installed executable SHA-256 `5e4b545bff4a83a93354fc50c54631cf3e8cd02e1a469087af00929f3fdc4d51`, 208,900,592 bytes. No CLI install, update or downgrade was performed.
|
|
10
|
+
- CLI surface used source `4b0d36639d9417b7a810175ed3c9a13d49f429c6`; hooks and actual launcher used `01b87a7cafb35e69403d9500c4136909c3741089` (a receipt-only commit; runtime and committed bundle unchanged). The native evidence precedes the mechanical verified-set change. Frozen dependencies matched agent-mem 0.22.1 and SDK 1.30.0.
|
|
11
|
+
- Fresh 0700 controller roots were outside the actual home. HOME, XDG config/cache/data/state, AGENTHUB_HOME, AMEM_HOME, project, state and TMPDIR were set before hub imports. No real credentials/settings or parent agent/session/Orca markers were copied. Later controllers also started Bun from that fresh root with --no-install; the earlier worktree had no dotenv files.
|
|
12
|
+
- Every agy invocation, including help/version/mcp probes and launcher preflight, used `AGY_CLI_DISABLE_AUTO_UPDATE=1` and Seatbelt. The profile reuses `src/local/sandbox.ts`, then denies typed and canonical actual-home reads/writes. Only exact agy/Bun executables, required code and private fixture paths are allowed; native egress is only the fixture provider and, for the launcher, its own control port. Port 4600 is never used.
|
|
13
|
+
- Positive controls: `/usr/bin/true` and the pinned Bun helper succeed. Opening a named real Gemini config for reading and opening the installed binary with O_WRONLY, without truncation or writes, both fail with Operation not permitted. The provider connection succeeds; a second owned loopback port is denied. These are probe controls, not a claim of ordinary agy confinement.
|
|
14
|
+
- The controller compares the five named real config entries, the binary hash and its directory inventory before and after. Every completed native run matched. It joins owned teardown and checks captured process identities plus private-path survivors; it never signals unknown processes. Observed cleanup is not proof against arbitrary detached helpers.
|
|
15
|
+
|
|
16
|
+
## CLI surface: passed
|
|
17
|
+
|
|
18
|
+
| Probe | Result |
|
|
19
|
+
| --- | --- |
|
|
20
|
+
| --version | 1.5.3, exit 0 |
|
|
21
|
+
| --help and help | Exit 0; --continue, --conversation, --disable-slash-commands, --input-format, --output-format, --print, --prompt-interactive, --project, --remote-control and --sandbox remain present |
|
|
22
|
+
| --acp and --new | Exit 2 with the expected unknown-flag diagnostic |
|
|
23
|
+
| Subcommands | All twelve historical subcommands remain; acp is also present |
|
|
24
|
+
| mcp list in the empty isolated project | Exit 0, No MCP servers configured |
|
|
25
|
+
|
|
26
|
+
Help is on stderr (3,319 bytes), so the final collector checks both streams. An earlier collector measured stdout alone and did not prove flag presence. CLI log: private scratch `temp/task801-cli-153-streams.log`.
|
|
27
|
+
|
|
28
|
+
## Synthetic plugin MCP and hooks: passed
|
|
29
|
+
|
|
30
|
+
The installed native print transport used -p, --output-format stream-json and --disable-slash-commands against a loopback Gemini fixture. Synthetic hub_task_show and hub_review responses are stand-ins, never actual board reads or approvals.
|
|
31
|
+
|
|
32
|
+
- Four authenticated provider requests; all fifteen declaration names match the previous receipt. Native init has 60 tools and permission_mode request-review.
|
|
33
|
+
- MCP discovery, initialize, initialized and tools/list occur in order. Exactly two calls carry the expected object arguments: hub_task_show id 1; hub_review id 1, verdict approved, fixture-only note. Native call_mcp_tool retains ServerName, ToolName and Arguments, without toolSummary/toolAction.
|
|
34
|
+
- Native read_file has Path, StartLine and EndLine and reads only the canary. Its result appears in the next fixture request.
|
|
35
|
+
- Six phases: SessionStart, PreInvocation, PreToolUse, PostToolUse, PostInvocation, Stop; sixteen hook rows. Shared fields, invocation counters and toolCall fields match the previous procedure. Both injectSteps markers reach the later fixture request.
|
|
36
|
+
- Stop is NO_TOOL_CALL, executionNum 0, fullyIdle true, empty error. Print exits 0, no stderr or signal fallback. Profile, loopback and helper controls pass.
|
|
37
|
+
|
|
38
|
+
Two initial producer checks failed, and remain recorded as failed attempts. The diagnostic kept their assertions unchanged: the fixture itself sent Arguments as a JSON string, and the collector looked for system/subtype init instead of the native top-level init object. The corrected fixture sends an object, as the historical actual-hub nonce producer already did, and reads the unique init object. Exact raw arguments and request-review remain asserted. This does not claim a historical native transport difference.
|
|
39
|
+
|
|
40
|
+
Final hooks log: `temp/task801-hooks-153-object.log`; producer SHA-256 `8e60b161f01e1ec06063c56a5ab710135624f0deb2cf65297baa54c4c418c2e2`; runtime SHA-256 `6a31b50060e38e5f9bc8176f086a7ad743ec9e8b0e3d58f0182ad51116ed5cc4`.
|
|
41
|
+
|
|
42
|
+
## Actual launcher nonce and normal TUI close: passed
|
|
43
|
+
|
|
44
|
+
One actual `ahub --live-test --project <private project> agy` session proves both legs. Native UI used a private foreground tmux 3.8 server with an explicit fresh socket and -f /dev/null; no existing tmux session, Orca window or personal profile was used. A fixed Bun-only stdin/EOF helper passed before any agent launch.
|
|
45
|
+
|
|
46
|
+
The stock gate still refused 1.5.3 during the probe. The controller used typed writeTrust only at an explicit fresh AGENTHUB_HOME/agent-compat.json, verified as a 0600 owned regular file with one exact 1.5.3 entry. Actual version assessment was trusted, not verified. This fixture waiver enabled a candidate test; it did not qualify the version or modify machine trust.
|
|
47
|
+
|
|
48
|
+
The scratch Registry claim used its own PID/signature, project and instance. Daemon memory/native capture/sync, inference, triage, research, specs, snapshots, schedules, gateway URLs, MLX and Pi auto-start were off. Parent fetch was limited to the two owned loopback ports; native had the Seatbelt fence above. Provider requests require the synthetic fixture-key, refuse Origin and are body/count bounded. No real account or cloud model was used.
|
|
49
|
+
|
|
50
|
+
| Observation | Final result |
|
|
51
|
+
| --- | --- |
|
|
52
|
+
| Managed plugin during TUI | hooks.json, mcp_config.json, plugin.json, bound to this instance/launch by actual agyMcpReady |
|
|
53
|
+
| Fixture privacy checkbox | unchecked observed before continuing; folder trust applies only to the private fixture |
|
|
54
|
+
| Provider requests and declarations | 4; declaration counts 0, 12, 15, 15 |
|
|
55
|
+
| Actual MCP read | one call_mcp_tool for agent-hub_agent-hub/hub_inbox |
|
|
56
|
+
| Nonce provenance | RAM-only producer value placed only in the scratch bus preface, never argv, env, prompts or receipt; nonceAfterInbox: true in a later provider request |
|
|
57
|
+
| Peer identity | canonical agy only, no agy shadow session |
|
|
58
|
+
| Normal close | /exit and Enter; normalExit: true, native/launcher exit 0, resume command observed, no native signal fallback |
|
|
59
|
+
| Cleanup | all three managed files removed, bystander plugin/rule hashes unchanged, peer offline; a new begin/end control pair proves slot release, not a second TUI launch |
|
|
60
|
+
| Processes and handles | interactive tree, daemon, provider, Registry claim and Registry closed; controller removed its private root; final owned-process inventory clear |
|
|
61
|
+
| Real config/binary | five named entries and binary/directory inventory unchanged |
|
|
62
|
+
|
|
63
|
+
The parent-JS external/unrelated fetch-attempt counters were zero. This is not a count of every native network attempt; native egress is constrained by Seatbelt. CLI/print command bound is 25 seconds; TUI total is 80 seconds with one 45-second normal-close window.
|
|
64
|
+
|
|
65
|
+
Prototype launcher attempts stopped at setup barriers, used owned fallback cleanup and are not normal-close passes. An ANSI byte-window collector could not reconstruct checkbox partial repaints; the final collector reads tmux's current screen. The first tmux run also waited for daemon idle before MCP lazy attachment, preventing the second prompt; the corrected producer uses the actual TUI input screen there. It still requires actual nonce readback, canonical identity, normal close and cleanup. No native/product permission or timeout was relaxed. An initial lexical /var versus canonical /private/var fixture mismatch was fixed in the controller; its unconfirmed first failure stage is not native evidence.
|
|
66
|
+
|
|
67
|
+
Final launcher log: `temp/task801-launcher-153-lazy.log`. Its source/bundle/private producer fingerprints follow; original historical producers were rehashed unchanged.
|
|
68
|
+
|
|
69
|
+
- Bundle SHA-256: `333975a6aeec1413cf5ae30d6bb292c7318362f795230db8e0d5133b7d144d1e`.
|
|
70
|
+
- interactive-bridge.ts SHA-256: `d87cb1db044cf1c036f7a41b06bf3023ab8d0b81e957e0302b154d54656d8348`.
|
|
71
|
+
- interactive-session.ts SHA-256: `f8a06759abead1629998593d57c0cfac69f5d488e44a0d88b549fe0d9a92febc`.
|
|
72
|
+
- tmux-session.ts SHA-256: `6b2f6f9216a3e2f2c3a6d4c5950b7bfe24a7162d0a331356b855ce04287253e0`.
|
|
73
|
+
- tmux-helper-control.ts SHA-256: `a13c7a4b1702be7f667857eee0fd9f805c16441fd0f0b9e44ce1b7d962c76373`.
|
|
74
|
+
- launcher-nonce.ts SHA-256: `55ff4db3462ad185dde17cc31ef971422e022f5ec8ce2940e4045501964c1ac1`.
|
|
75
|
+
- runtime.ts SHA-256: `6a31b50060e38e5f9bc8176f086a7ad743ec9e8b0e3d58f0182ad51116ed5cc4`.
|
|
76
|
+
- run-probe.py SHA-256: `16c6f4b1026250685097089f31c4b2d450d91589fa78dfa6c5f9b5c260efb5e5`.
|
|
77
|
+
|
|
78
|
+
## Named real Gemini config inventory
|
|
79
|
+
|
|
80
|
+
Only these five entries were hashed; contents are not published.
|
|
81
|
+
|
|
82
|
+
| Relative entry | Before and after SHA-256 or absence |
|
|
83
|
+
| --- | --- |
|
|
84
|
+
| `antigravity-cli/settings.json` | `ad07119c21cf14ea153eb4200d6468add57d4e26783808f384f4bf7d4df31682` |
|
|
85
|
+
| `config/config.json` | `b8c51361bf83a00ae5e38b3108b48ffa3b4cfc7c4e9d9b7d16e04f74725f3c14` |
|
|
86
|
+
| `config/mcp_config.json` | `d8e397af03b5b032f21d0aa967086f0c78b33c87b76f2e9898ae0a144df7de02` |
|
|
87
|
+
| `config/import_manifest.json` | Absent |
|
|
88
|
+
| `settings.json` | `66c879018049d90632634790fe0b0eae54616a144e594c5db1b40b7c8be8c7b9` |
|
|
89
|
+
|
|
90
|
+
## Reused evidence and limits
|
|
91
|
+
|
|
92
|
+
The [exact reviewed 1.5.3 ACP T0 record](https://github.com/STAIxBWLB/agent-hub/blob/1e6da1ee221acd601fa28201c8cd0081d8214566/docs/verification/2026-11-08-agy-acp-t0.md) covers account-free initialize. Its isolated session/new returned Authentication required. Its other run used an existing personal login and is not reused as account-free qualification. Neither run substitutes for the native legs above.
|
|
93
|
+
|
|
94
|
+
No real account, real model tool choice, native permission-mode mapping, headless ACP prompt/cancel, IDE or Linux behavior is qualified. The native probe's Seatbelt does not add a hub sandbox to ordinary agy. Fresh reviewer MCP and agy's implementer/verifier role ceiling are unchanged. The harness manifest keeps its historical procedure and autoAdmit false; no workflow, global trust or verified stamp is changed.
|
|
95
|
+
|
|
96
|
+
The source PR adds only exact 1.5.3, updates receipt/trustNote and keeps the 1.4.x line. Canonical DGX and hosted CI results belong to their exact committed heads and are reported separately in the PR/task submission. No release or live upgrade is claimed.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# agy acp T0 capability probe (agy 1.5.3)
|
|
2
|
+
|
|
3
|
+
Refs #1280 (P2), #485. Model-free: `initialize` and `session/new` only, no prompt, no credential read. Run with `AGY_CLI_DISABLE_AUTO_UPDATE=1`.
|
|
4
|
+
|
|
5
|
+
Two runs: run 1 under the person's real home (a mistake against the planner ruling, cleaned up below) and run 2 under a disposable HOME (the isolated run of record).
|
|
6
|
+
|
|
7
|
+
## Run 1 (person's home, cleaned up)
|
|
8
|
+
|
|
9
|
+
The person's existing login was in scope, so `session/new` succeeded and created session state. Exactly these files were created by the probe and removed; nothing else in that home was touched:
|
|
10
|
+
|
|
11
|
+
- `~/.gemini/antigravity-cli/conversations/<sessionId>.db`
|
|
12
|
+
- `~/.gemini/antigravity-cli/brain/<sessionId>/` (empty `scratch/` and `.user_uploaded/`)
|
|
13
|
+
- `~/.gemini/antigravity-cli/log/acp-server-20261108_000903-24787.log` and `acp-server-20261108_000951-32157.log`
|
|
14
|
+
|
|
15
|
+
An `implicit/*.pb` file with a nearby mtime is not referenced by the probe's log and was left alone.
|
|
16
|
+
|
|
17
|
+
## Method
|
|
18
|
+
|
|
19
|
+
- `agy --version` prints `1.5.3`.
|
|
20
|
+
- `agy acp` on stdio, newline-delimited JSON-RPC 2.0.
|
|
21
|
+
- Request 1: `initialize` with `protocolVersion: 1` and empty `clientCapabilities`.
|
|
22
|
+
- Request 2: `session/new` with `cwd` set to a scratch directory and `mcpServers: []`.
|
|
23
|
+
|
|
24
|
+
## Run 2 (isolated HOME, the run of record)
|
|
25
|
+
|
|
26
|
+
`HOME` and `XDG_CONFIG_HOME` pointed at a fresh temp directory, no account. `initialize` answered exactly as in run 1 (same capabilities and `authMethods`). `session/new` was refused: `{"code":-32000,"message":"Authentication required"}`. The process wrote only under the temp home (`.gemini/config`, `.gemini/antigravity-cli`: state, installation id, one `acp-server` log, builtin plugins); the directory was removed afterwards.
|
|
27
|
+
|
|
28
|
+
Finding: `initialize` needs no login; `session/new` and everything after it need one of the four `authMethods`, so a hub-owned headless `agy acp` needs a person-provided login or API key and cannot be probed beyond `initialize` without one.
|
|
29
|
+
|
|
30
|
+
## Observed in run 1 (person's home)
|
|
31
|
+
|
|
32
|
+
- `initialize` result: `protocolVersion: 1`, `agentInfo` `Antigravity ACP Server` `1.5.3`.
|
|
33
|
+
- `agentCapabilities.loadSession: true`.
|
|
34
|
+
- `promptCapabilities`: image true, audio false, embeddedContext true.
|
|
35
|
+
- `sessionCapabilities`: `resume`, `close`, `load`, `list`, `additionalDirectories`.
|
|
36
|
+
- `_meta.antigravity`: `tier`, `systemPrompt.append`.
|
|
37
|
+
- `authMethods`: `oauth-personal`, `oauth-business`, `gemini-api-key`, `agent-platform`.
|
|
38
|
+
- `session/new` result with the person's existing login: a `sessionId`, `models` (13 ids, `currentModelId` `gemini-4-argon-medium`), `modes` (`default`, `accept-edits`, `plan`; current `default`), and `configOptions` `model`, `thought_level`, `mode`.
|
|
39
|
+
|
|
40
|
+
## Maps onto the hub's ACP surface
|
|
41
|
+
|
|
42
|
+
- Native modes `default`, `accept-edits`, `plan` map one to one to the hub's `ask`, `accept-edits` and `plan` permission modes.
|
|
43
|
+
- `session/resume`, `session/load` and `session/close` exist, so the hub's restore path (`restoreArgs`) can resume an agy session by id.
|
|
44
|
+
- `additionalDirectories` gives the hub a way to scope extra roots without a TUI flag.
|
|
45
|
+
- `models` and `thought_level` are selectable through `configOptions`, so `launch.model` can be passed through.
|
|
46
|
+
|
|
47
|
+
## Not proven here (blockers for wiring `AcpPeer`)
|
|
48
|
+
|
|
49
|
+
- No prompt was sent, so these are unverified: `session/prompt` streaming shape and `stopReason` values, `session/cancel`, mid-turn steering, `session/request_permission` payloads and their option ids, and `usage_update` or token fields.
|
|
50
|
+
- Whether `agy acp` honours the managed hooks (`hooks.json`) or a separate approval path; the TUI hook floor (#1280 P1) may not apply to ACP turns.
|
|
51
|
+
- Whether `mcpServers` passed to `session/new` load the hub MCP server for a headless peer.
|
|
52
|
+
- Authentication of a hub-owned process: run 2 shows it is required; how the hub would supply it without reading a credential is open.
|
|
53
|
+
|
|
54
|
+
## Decision
|
|
55
|
+
|
|
56
|
+
Probe receipt recorded; `AcpPeer` wiring for `agy` stays out of this change. Wiring needs one authorized model-backed turn to prove the prompt, permission and cancel legs, which the person must approve (it spends quota). Follow-up: a task for the model-backed receipt, then the `ahub agy --mode headless` and `ahub watch agy` wiring.
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
# Hub visuals evidence, #1058
|
|
2
|
+
|
|
3
|
+
This records task #709 evidence by exact head. The published 0.1.7 fixture and isolated browser legs passed below; the final canonical gate and hosted CI are recorded separately. Live observations were recorded by Codex and do not turn synthetic guard coverage into native all-peer qualification.
|
|
4
|
+
|
|
5
|
+
## Checks by head
|
|
6
|
+
|
|
7
|
+
- `cc7b89c3f664dc08b5f9c2563ea258de22a68bc5`: DGX typecheck and focused tests passed, 177 tests, 0 failures, 2,601 assertions across 11 files. Evidence: scratchpad `temp/task709-focused-cc7b89c3f664dc08b5f9c2563ea258de22a68bc5.log`. This is focused evidence, not the canonical changed gate at the final head.
|
|
8
|
+
- `2bbd9b67b3b70b6f67cfed2f4476d288ab73af33`: bundle built using pinned Bun 1.4.2 and a frozen install. Generated bundle SHA256: `64e96449215a395efa8c9b99bcf525ce7eced256764705223c065aaba5d017c3`. Source provider SHA256: `ea41d5aeb7f871e3fe856d5bfabfb4c869966e6dfa75006baad40f047e171989`.
|
|
9
|
+
- `cfeb1d2913bb`: the first canonical DGX changed gate selected the full suite: 12,709 pass, 101 skip, 5 fail across 986 files (12,815 tests; 318,515 assertions), exit 1 in 2,205 seconds. Typecheck, inventory, bundle freshness and package checks passed. Failures were the read-only MCP tool inventory, two registry guard assertions on a config object literal, task detail section expectations and an extracted role-visibility fixture missing its new UI dependency. Corrections preserve existing assertions; this is not a green gate. No current-invocation daemon leaks were found.
|
|
10
|
+
- `f823646789b5e6f3022cfb38b6c617c9a89862e7`: correction-focused DGX typecheck plus 84 pass, 0 fail, 652 assertions in six files. Its subsequent full run was intentionally interrupted via the owned remote_dev SIGINT cleanup after the independent recovery finding made that head obsolete (exit 130 after 1,568 s). It is not a green full gate or a resource deferral.
|
|
11
|
+
- `d4b52acb59a2f8f6922bf2ed47778cbf21ba00f2`: held-recovery retention correction, DGX typecheck and 20 pass, 0 fail, 182 assertions in two files. The new fixture retains an expired-on-target row unchanged while held, releases with matching digest, then confirms normal pruning after release.
|
|
12
|
+
- An inventory-only DGX command at `2bbd9b67` stopped before checking classifications because its disposable tree had no frozen dependency install (`ts.ScriptTarget` unavailable). The canonical gate performs that install first. Final inventory and canonical committed-head validation are pending; no canonical pass is claimed here.
|
|
13
|
+
|
|
14
|
+
## Actual acon observation
|
|
15
|
+
|
|
16
|
+
Two isolated runs used real acon 0.1.3, the source provider and production daemon with a synthetic peer, six visuals per run. The final run is bound to `2bbd9b67b3b70b6f67cfed2f4476d288ab73af33`; its body-free counts, hashes and cleanup are in scratchpad `temp/task709-live-2bbd9b67-e.log`. Codex viewed `temp/task709-acon-render-e.png`.
|
|
17
|
+
|
|
18
|
+
- Comparison `<b>` and table `<i>` text remained inert.
|
|
19
|
+
- Two valid 74-byte, 2 by 2 PNG assets returned HTTP 200 and matched their expected hashes. Before SHA256: `1fe7e0db6305cd87580a13d22dde4e6fa6efea01abab2de43f0d23fdde4e9e26`; after SHA256: `500f9b69351abec04ae9956400cc6406f640b596a4ada1e2e1a58e15d6ae4845`.
|
|
20
|
+
- Replacing the after PNG caused HTTP 502 with a safe System cause and next step; changed bytes were not served.
|
|
21
|
+
- Malformed Mermaid showed a notice and source fallback. Valid Mermaid reached the five-second fallback. Successful SVG rendering was unverified in these historical 0.1.3 runs.
|
|
22
|
+
- The final log records six posted visuals, two fixture PNGs, one mutation and zero external fetch attempts. Its `sharedCases: 4` counter counts the four candidate cases exercised; it is not evidence of a published shared fixture. Codex operated the browser, checked the actual DOM and viewed the screenshot; `browserAssertions: 0` is the temporary harness counter, which does not count those separate browser checks.
|
|
23
|
+
- Own provider, console server, tools, console, synthetic peer, daemon, registry, handles and external browser were closed; the process exited without forced stop and its scratch root was removed. Owned sockets were closed.
|
|
24
|
+
|
|
25
|
+
No account, native agent or model was used. No standalone hub UI browser was used. Initial a/b/c preflights failed at the scratch routing MLX guard before listeners were opened; no production guard or bound was changed to make them pass.
|
|
26
|
+
|
|
27
|
+
## Boundaries and remaining evidence
|
|
28
|
+
|
|
29
|
+
- Validation rejects malformed or oversized payloads, screens text and preserves cleared extra table row keys. Tool paths and stored asset references have distinct shapes. Fake source-guard coverage is not a live privacy or native-role receipt.
|
|
30
|
+
- Assets remain bound to guarded file identity, hashes and current privacy authority on reads. The changed-PNG observation covers one actual asset mutation path.
|
|
31
|
+
- Unbound visuals expire after the configured retention period (default 30 days); task-bound records remain unless task existence proves them orphaned. Recovery inventory hashes stored metadata and payload/file-reference JSON, not image bytes. Focused fixtures cover corruption refusal, cursor cleanup, retention and archived reset separation.
|
|
32
|
+
- Historical 0.1.3 observations did not qualify WebP: that host and 0.1.4 refused its MIME type. The published 0.1.7 follow-up is recorded separately below.
|
|
33
|
+
- Historical fixtures were hub-owned candidates with source provenance. They did not fill the shared-fixture gap; the 0.1.7 follow-up imports the published cases directly.
|
|
34
|
+
- The ordinary peer transports were covered by source/fake checks, not native all-peer journeys. Such native journeys are not an additional acceptance requirement in the issue. Fresh-reviewer MCP intentionally remains exactly hub_review and hub_task_show under D2. Mermaid SVG success was unverified in the historical 0.1.3 run; the 0.1.7 observation below records successful rendering. D4 still explicitly permits a five-second source fallback.
|
|
35
|
+
|
|
36
|
+
The earlier planner ruling recorded AC1 unmet after the agent-console#78 handoff refusal, and AC4 unmet while agent-console#81 had no published support. Those were not waived. Published support and the 0.1.7 follow-up results are recorded below. Successful Mermaid SVG was unverified in the historical 0.1.3 evidence and is verified by the isolated 0.1.7 observation; standalone browser rendering remains unverified. D4 permits source fallback.
|
|
37
|
+
|
|
38
|
+
Completed overlap work was checked: main contains Kimi delayed usage (#783), AGY count-only hints and person attribution. Their imports, immutable turn attribution and shutdown cancellation are preserved; none replaces visual authority or generation checks. Open #800 ownerAttachment stays display-only, and #802 rememberOutcome remains separate from visual capture. The current main merge includes only already-merged work; no peer branch is imported. Final committed-head canonical validation is separate and remains pending until its result is recorded.
|
|
39
|
+
|
|
40
|
+
## Published dependency follow-up
|
|
41
|
+
|
|
42
|
+
Primary recheck on 2026-11-08 found agent-console#78 and #81 completed and npm 0.1.7 published. The exact devDependency and lock now adopt 0.1.7. The upstream VISUAL_CASES module is imported directly, never copied: 42 cases, with six fixed, documented valid-acon/stricter-hub cap differences. Missing alt still refuses and now names the precise alt field. Old candidate provenance remains historical 0.1.3 with a separate 0.1.7 recheck; it is not labelled canonical. Type-only production imports preserve the dependency boundary.
|
|
43
|
+
|
|
44
|
+
Earlier AC1/WebP unmet observations above describe the 0.1.3 evidence. They are superseded by the following direct fixture and browser observations, not solely by an upstream issue state or package version.
|
|
45
|
+
|
|
46
|
+
- Frozen source head `afc1e459447a779a2418457640b80fda5c0eafb3`: DGX frozen install, typecheck and focused checks passed, 142 tests, 0 failures, 630 assertions across seven files, exit 0 in 37 s. Log: scratchpad `temp/task709-017-focused.log`. The canonical test imports all 42 published cases and checks six explicitly named stricter hub-cap differences.
|
|
47
|
+
- Real acon 0.1.7 loaded the actual source provider and production daemon in an isolated HOME/project, with a synthetic ordinary peer and no account, native agent, gateway, memory sync or model. It posted seven visuals, including four normal cases selected from the actual published module, two software PNGs and one software WebP. Published case module SHA256: `68455a97595664d88fc62567a301ef5e5e06abf78b75145f528a38b5c5bf39b6`.
|
|
48
|
+
- Both PNGs returned HTTP 200, `image/png`, inline disposition and the same 74-byte hashes recorded above. The 38-byte WebP returned HTTP 200, `image/webp`, inline disposition and SHA256 `ea6a0dfbc1103e231f69d8a08182ac8168f9aa06242f1d1606a9e82894a45e40`. All six displayed image elements decoded to 2 by 2 pixels after scrolling into view. The browser's lazy loading was respected, not disabled.
|
|
49
|
+
- The normal flow rendered A -> B in the sandboxed frame. The malformed flow showed "The diagram could not be drawn, so it is shown as text" with its original source. Codex viewed screenshots `temp/task709-acon-017-flow.png`, `temp/task709-acon-017-webp.png` and `temp/task709-acon-017-fallback.png`. The 2-pixel fixtures establish decoding, not useful image-layout quality.
|
|
50
|
+
- Replacing the after PNG returned HTTP 502 and the safe System cause/next step "visual asset changed since posted or no longer allowed; post the visual again using a current public file". No changed bytes were served.
|
|
51
|
+
- One scratch HTTP URL builder encoded the plugin reference's @ and therefore received 404; the actual console-generated route was correct. Direct HTTP readback used that route spelling. No production URL or provider code was changed to make the check pass. An initial generic CSS scroll matched an earlier figure; selecting the actual last figure exposed the expected deferred renderer and fallback. Neither observation is counted as a product failure or silently omitted.
|
|
52
|
+
- Body-free log `temp/task709-live-017-f.log` records seven posts, four published cases, two PNG fixtures, one WebP, one mutation and zero external fetch attempts. `browserAssertions: 0` remains the harness's counter; separate browser DOM/readback and viewed screenshots supply the browser evidence. It records provider/server/control clients/synthetic peer/daemon/registry/handles closed, owned process exited without forced stop, browser closed and scratch root removed. The separate owned browser socket directory had no open handles and was removed.
|
|
53
|
+
|
|
54
|
+
These observations complete the previously missing shared-fixture and WebP legs. The standalone dashboard remains covered by extracted UI/fake-host checks rather than a browser run, and native all-peer journeys remain unrun. The final canonical committed-head result and exact-head hosted CI are still pending here; no full green gate is inferred from the focused or browser checks.
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
## Final review corrections and pending gate
|
|
58
|
+
|
|
59
|
+
Independent preflight found and verified fixes for held-recovery retention, the old host WebP refusal, and the advertised path-side alt schema. At `47b291c696d1461fa38a9d3682389879b0af783e`, alt remains required and bounded but may be empty, matching the published case and runtime. The regression checks both accepted empty alt and refused missing alt. DGX frozen install, typecheck, inventory and 143 focused tests passed (0 failures, 633 assertions across seven files; exit 0 in 37 s). Inventory was OK: 3,534 entries, 2,529 classified, unchanged 1,005-entry baseline. Log: scratchpad `temp/task709-alt-focused.log`. The pinned Bun bundle was regenerated.
|
|
60
|
+
|
|
61
|
+
The canonical run at `1ee364c3dc9c473cb3e8fa12c974e72740dc13a6` was stopped via the verified owned remote_dev helper's normal SIGINT cleanup after that schema finding made its source obsolete (exit 130 in 62 s). No pass or resource deferral is claimed. The final report head starts one fresh canonical `scripts/check.sh --changed` run; its result is not yet available here. Exact-head hosted CI remains a merge gate.
|
|
62
|
+
|
|
63
|
+
A separate O3 full gate at `45b5dca1` exposed a pre-existing main fixture assumption in `test/herdr-companion-platforms.test.ts:85`: it expects `/home/dev` not to exist, but that is the DGX container HOME. That fixture is unchanged in this branch. It is reported to the conductor rather than edited in this visual feature. A failure from that assertion must not be presented as a green canonical gate.
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
## Review correction: metadata snapshots and refusal classes
|
|
67
|
+
|
|
68
|
+
The review at `687d579f` found two Important defects: operational refusal causes
|
|
69
|
+
were collapsed into a privacy message, and periodic snapshots re-read and
|
|
70
|
+
re-screened up to twenty full payloads. This revision separates operational
|
|
71
|
+
recovery, role, membership, observer, shutdown, authority, storage, concurrent
|
|
72
|
+
change, screen-unavailable and policy-unavailable diagnostics. Sensitive privacy
|
|
73
|
+
hits retain uniform wording. An unknown or throwing screen still fails closed;
|
|
74
|
+
its error body is never returned.
|
|
75
|
+
|
|
76
|
+
Snapshots use the store's metadata projection plus bounded file-path metadata,
|
|
77
|
+
never `get` or `payload_json`. Relevant raw policy bytes and accepted path arrays
|
|
78
|
+
key a narrow policy projection; no full `loadConfig` runs on this path. Current
|
|
79
|
+
accepted restrictions remain unioned with the normally merged candidate path
|
|
80
|
+
rules, and each read still checks exposed title/from/task/path metadata. Explicit
|
|
81
|
+
show rechecks the complete payload. Missing files keep their public explanation;
|
|
82
|
+
the guarded asset read alone decides current existence and hash.
|
|
83
|
+
|
|
84
|
+
The same revision makes all three prune sites wait for both recovery holds,
|
|
85
|
+
uses a nonmutating `Limiter.peek` before expensive validation/screening/reads and
|
|
86
|
+
retains one final consuming admission, admits explicit `to: "user"`, and removes
|
|
87
|
+
visual-only calls from task-progress evidence. Three moved limiter inventory
|
|
88
|
+
keys keep their original labels; the baseline is unchanged.
|
|
89
|
+
|
|
90
|
+
Structural tests cover twenty tiny and maximal-table rows, forbid full payload
|
|
91
|
+
reads, use corrupt/oversize body canaries, preserve metadata privacy, and assert
|
|
92
|
+
peek's bucket/repeat/group state never changes. Cause tests use real daemon
|
|
93
|
+
operations for reachable states and a real tools request under prepared recovery.
|
|
94
|
+
Stopping and stale child-authority branches execute the actual extracted closure
|
|
95
|
+
with all later ports forbidden; these are unit evidence, not native-child
|
|
96
|
+
qualification. New exact-head test results follow when available.
|
|
97
|
+
|
|
98
|
+
The obsolete canonical run at `687d579f` was stopped through its verified owned
|
|
99
|
+
remote_dev helper's normal SIGINT cleanup after this review (exit 130 in 701 s),
|
|
100
|
+
not counted as a pass or deferral. No duplicate run was started.
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
The first review-correction run at `0df8749a61accff31bdbce806f9c95d73d68f37e`
|
|
104
|
+
passed typecheck and inventory, then had 247 pass and 3 fail (1,351 assertions,
|
|
105
|
+
ten files; exit 1 in 45 s). New fixture assumptions caused the three failures:
|
|
106
|
+
an initially off-roster peer is refused at hello before its tool call; closing
|
|
107
|
+
the journal also activates a recovery hold; and `settings_reload` returning
|
|
108
|
+
`ok: true` can be an unconfirmed preview, not adoption. The corrections preserve
|
|
109
|
+
cause/next-step and zero-effect assertions, and confirm configuration adoption
|
|
110
|
+
before releasing the held call. This run is not a green gate. The independent
|
|
111
|
+
read-only preflight found no new Important code issue in that delta; the generated
|
|
112
|
+
bundle was excluded from its 14-file source/test/doc coverage.
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
Subsequent focused runs preserved those assertions while correcting the roster
|
|
116
|
+
fixture: `0bef303c` had 249 pass, 1 setup failure (1,367 assertions, ten files;
|
|
117
|
+
46 s), `3b6dcf19` had 33 pass, 1 setup failure (291 assertions, one file; 35 s),
|
|
118
|
+
and the single-case `bb93351f` run failed on the fixture's status lookup (4 s).
|
|
119
|
+
The real roster API saves membership even when the passive fake cannot prove a
|
|
120
|
+
native stop; its explicit unconfirmed-stop result is asserted rather than
|
|
121
|
+
replaced with fabricated stop evidence. Effective settings rows, rather than a
|
|
122
|
+
removed peer's status entry, confirm the saved membership.
|
|
123
|
+
|
|
124
|
+
Once that setup reached the actual call, `39a75723` exposed a further product
|
|
125
|
+
path: the outer WebSocket membership guard returned only "codex is off roster"
|
|
126
|
+
before the visual handler, so the next-step assertion correctly failed (one
|
|
127
|
+
case, 4 s). The outer stopping and prepared-recovery guards were also traced.
|
|
128
|
+
Visual requests now receive the same operational guidance at those boundaries,
|
|
129
|
+
without changing any admission condition or non-visual response. Assertions were
|
|
130
|
+
not weakened to accept the incomplete message. Full native-child stop/identity
|
|
131
|
+
qualification remains outside these passive and extracted-unit fixtures.
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
At `1388cbaa06f0682124b3e8f6a3824259985a5c42`, DGX frozen install,
|
|
135
|
+
typecheck, inventory and all 253 affected tests passed: 0 failures, 1,395
|
|
136
|
+
assertions across ten files, exit 0 in 45 s. Log: scratchpad
|
|
137
|
+
`temp/task709-revision-check.log`. This includes the actual off-roster request,
|
|
138
|
+
prepared recovery requests, outer stopping branches, metadata-only large-table
|
|
139
|
+
checks, missing-image behavior, limiter nonmutation and existing configured MCP
|
|
140
|
+
read-only tests. Earlier failing fixture/setup runs are retained above rather
|
|
141
|
+
than represented as passing.
|
|
142
|
+
|
|
143
|
+
The rewritten outer roster message is also an exact seeded anchor. Its
|
|
144
|
+
`roster-request-fence` search/replacement now matches the new line while retaining
|
|
145
|
+
the same false-membership mutant and original named test. The affected seed is
|
|
146
|
+
in shard 29/64; that shard and all-anchor readback are checked separately before
|
|
147
|
+
submission. No claim about the entire 559-seed gate is made by a focused shard.
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
At `7893068fa88e4ae536311141e48c7fa38c782439`, all 559 anchors matched
|
|
151
|
+
exactly once. The affected shard 29/64 passed all nine original-green /
|
|
152
|
+
named-mutant-detected pairs, including `roster-request-fence`, in 24 s.
|
|
153
|
+
Log: scratchpad `temp/task709-seeds-29.log`. The mutant still replaces only the
|
|
154
|
+
membership predicate with false; its original named test is unchanged. This is
|
|
155
|
+
a focused seeded shard, not a claim that all 559 mutants ran.
|
|
156
|
+
|
|
157
|
+
The final report-only head has the same runtime and test bytes as these passing
|
|
158
|
+
heads. A fresh canonical `scripts/check.sh --changed` run starts at that final
|
|
159
|
+
head; its result and hosted full CI are not yet observed. AC6 remains a merge
|
|
160
|
+
gate. No timeout, retry, assertion, privacy fence or baseline was relaxed, and
|
|
161
|
+
no real profile, release or deployed hub was changed.
|