@staix/agent-hub 0.19.0 → 0.21.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 +70 -3
- package/README.md +2 -2
- package/docs/agent-notes/README.md +11 -0
- package/docs/agent-notes/adapters.md +10 -5
- package/docs/agent-notes/benchmarks.md +27 -0
- package/docs/agent-notes/budget.md +2 -1
- package/docs/agent-notes/bus.md +3 -3
- package/docs/agent-notes/daemon.md +20 -7
- package/docs/agent-notes/local-worker.md +5 -0
- package/docs/agent-notes/models.md +2 -0
- package/docs/agent-notes/tasks.md +20 -10
- package/docs/agent-notes/tests.md +13 -5
- package/docs/bench.md +1 -1
- package/docs/data-policy.md +2 -0
- package/docs/dogfood.md +41 -5
- package/docs/events.md +2 -1
- package/docs/memory.md +9 -3
- package/docs/operations.md +598 -63
- package/docs/profiles.md +13 -1
- package/docs/quickstart.md +18 -9
- package/docs/research.md +7 -4
- package/docs/sdlc.md +66 -10
- package/docs/security.md +397 -35
- package/docs/smoke.md +127 -0
- package/docs/specs/2026-09-19-agent-hub-design.md +1149 -19
- package/docs/verification/2026-10-27-0.19.0.md +5 -5
- package/docs/verification/2026-10-27-0.20.0.md +75 -0
- package/docs/verification/2026-10-28-claude-2.1.311-2.1.312-bash-permission.json +635 -0
- package/docs/verification/2026-10-28-claude-2.1.311-2.1.312-permission-transport.json +403 -0
- package/docs/verification/2026-10-28-claude-implementer-permission-triage.md +123 -0
- package/docs/verification/2026-10-28-jcode-0.99.1-usage.md +41 -0
- package/docs/verification/2026-10-28-realpath-name-audit.md +222 -0
- package/docs/verification/2026-10-28-routing-f0bb8ad0.md +1000 -0
- package/docs/verification/2026-10-29-0.21.0.md +61 -0
- package/docs/verification/2026-10-29-model-effort-capabilities.md +123 -0
- package/docs/verification/2026-10-29-modelrouting-b152ddb9.md +953 -0
- package/docs/verification/claude-implementer-permission-triage.ts +160 -0
- package/docs/verification/claude-permission-transport-native.py +71 -14
- package/docs/verification/profiles/YYYY-MM-DD-research.md +1 -1
- package/docs/verified.json +26 -18
- package/package.json +2 -2
- package/plugins/agent-hub/.claude-plugin/plugin.json +1 -1
- package/plugins/agent-hub/server.js +1116 -284
- package/src/adapters/acp.ts +87 -3
- package/src/adapters/channel-peer.ts +11 -5
- package/src/adapters/claude-channel.ts +13 -6
- package/src/adapters/claude-implementer.ts +61 -7
- package/src/adapters/codex-appserver.ts +88 -5
- package/src/adapters/conformance/enrollment.ts +4 -4
- package/src/adapters/conformance/factories.ts +2 -1
- package/src/adapters/conformance/fakes/jcode-agent.ts +6 -2
- package/src/adapters/conformance/kit.ts +10 -6
- package/src/adapters/definitions/builtin-metadata.ts +3 -114
- package/src/adapters/definitions/native-config-defaults.ts +1 -1
- package/src/adapters/definitions/native-config-policy.ts +3 -2
- package/src/adapters/definitions/native-context.ts +12 -0
- package/src/adapters/external-metadata.ts +48 -0
- package/src/adapters/external-modules.ts +63 -3
- package/src/adapters/jcode.ts +6 -2
- package/src/adapters/local-worker.ts +42 -25
- package/src/adapters/native-proof-ports.ts +10 -0
- package/src/adapters/pi.ts +7 -0
- package/src/adapters/registry-types.ts +4 -0
- package/src/adapters/reviewer-print.ts +1 -0
- package/src/broker/protocol.ts +203 -0
- package/src/broker/server.ts +314 -0
- package/src/broker/store.ts +548 -0
- package/src/cli/bench.ts +3 -2
- package/src/cli/broker.ts +58 -0
- package/src/cli/conductor-recovery.ts +142 -0
- package/src/cli/configured-acp-entry.ts +26 -6
- package/src/cli/console-state.ts +59 -17
- package/src/cli/console.ts +17 -2
- package/src/cli/facts-hook.ts +3 -1
- package/src/cli/help.ts +28 -16
- package/src/cli/identity.ts +23 -10
- package/src/cli/init.ts +34 -7
- package/src/cli/intake-output.ts +33 -0
- package/src/cli/main.ts +314 -71
- package/src/cli/output.ts +41 -1
- package/src/cli/recovery-package.ts +18 -1
- package/src/cli/role-holders.ts +35 -0
- package/src/cli/room.ts +304 -0
- package/src/cli/say-input.ts +16 -0
- package/src/cli/schedule-output.ts +49 -0
- package/src/cli/sdlc-output.ts +44 -6
- package/src/cli/smoke-pty-bridge.ts +33 -0
- package/src/cli/smoke-pty.ts +145 -0
- package/src/cli/smoke-run.ts +139 -0
- package/src/cli/smoke-target.ts +130 -0
- package/src/cli/source-output.ts +29 -0
- package/src/cli/task-output.ts +3 -2
- package/src/cli/upgrade-runtime.ts +98 -16
- package/src/cli/upgrade.ts +66 -7
- package/src/hub/ask.ts +76 -12
- package/src/hub/board.ts +132 -22
- package/src/hub/bus.ts +399 -56
- package/src/hub/child-process.ts +2 -0
- package/src/hub/ci-watch.ts +162 -0
- package/src/hub/claude-failure-stage.ts +85 -0
- package/src/hub/claude-launch-proof.ts +67 -2
- package/src/hub/claude-shell-wrapper.ts +11 -5
- package/src/hub/conductor.ts +17 -4
- package/src/hub/config-apply.ts +32 -5
- package/src/hub/config-reload.ts +7 -5
- package/src/hub/config-trust.ts +8 -1
- package/src/hub/context-window.ts +33 -3
- package/src/hub/control-client.ts +14 -2
- package/src/hub/corpus-config.ts +34 -0
- package/src/hub/corpus-evidence.ts +184 -0
- package/src/hub/corpus.ts +373 -0
- package/src/hub/cost-governance.ts +26 -0
- package/src/hub/daemon.ts +1228 -242
- package/src/hub/deliverable-files.ts +8 -2
- package/src/hub/delivery-journal.ts +123 -17
- package/src/hub/dogfood-profile.ts +32 -5
- package/src/hub/dogfood-read.ts +6 -2
- package/src/hub/envelope.ts +11 -0
- package/src/hub/eval-gate.ts +131 -0
- package/src/hub/events.ts +1 -1
- package/src/hub/external-instance.ts +69 -0
- package/src/hub/facts.ts +15 -5
- package/src/hub/folder-trigger.ts +223 -0
- package/src/hub/hub-tools.ts +2 -1
- package/src/hub/inference.ts +20 -5
- package/src/hub/instance-config.ts +69 -3
- package/src/hub/instance-execution.ts +6 -2
- package/src/hub/instances.ts +32 -4
- package/src/hub/intake.ts +125 -0
- package/src/hub/learning.ts +85 -0
- package/src/hub/lifecycle.ts +7 -3
- package/src/hub/limits.ts +12 -5
- package/src/hub/native-permission-request.ts +77 -0
- package/src/hub/operational-authority.ts +63 -5
- package/src/hub/operational-settings.ts +76 -0
- package/src/hub/operational-view.ts +1 -1
- package/src/hub/packs.ts +132 -0
- package/src/hub/path-policy.ts +7 -0
- package/src/hub/peer-doing.ts +130 -0
- package/src/hub/peers.ts +46 -0
- package/src/hub/queue-backpressure.ts +58 -0
- package/src/hub/read-tools.ts +2 -0
- package/src/hub/recovery-authority.ts +151 -0
- package/src/hub/recovery-policy.ts +220 -0
- package/src/hub/research.ts +24 -14
- package/src/hub/restart.ts +7 -0
- package/src/hub/routing.ts +54 -11
- package/src/hub/schedules.ts +266 -0
- package/src/hub/sdlc-merge.ts +38 -14
- package/src/hub/sdlc-metrics.ts +32 -10
- package/src/hub/sdlc-queue.ts +7 -1
- package/src/hub/sdlc-release.ts +1 -1
- package/src/hub/sdlc.ts +37 -7
- package/src/hub/security-baseline.ts +38 -0
- package/src/hub/settings.ts +7 -1
- package/src/hub/shipped-packs.ts +8 -0
- package/src/hub/snapshots.ts +72 -6
- package/src/hub/source-read.ts +160 -0
- package/src/hub/sources.ts +311 -0
- package/src/hub/task-shell-default.ts +3 -2
- package/src/hub/tasks.ts +1047 -115
- package/src/hub/workflow.ts +1 -1
- package/src/local/deny.ts +21 -0
- package/src/local/doc-read.ts +69 -0
- package/src/local/proxy.ts +4 -13
- package/src/local/sandbox.ts +3 -1
- package/src/local/tools.ts +37 -3
- package/src/local/web-fetch-config.ts +43 -0
- package/src/local/web-fetch.ts +183 -0
- package/src/memory/brief.ts +85 -13
- package/src/memory/capture.ts +1 -1
- package/src/rooms/application.ts +114 -0
- package/src/rooms/boundary.ts +103 -0
- package/src/rooms/commands.ts +294 -0
- package/src/rooms/crypto.ts +371 -0
- package/src/rooms/link.ts +584 -0
- package/src/rooms/policy.ts +82 -0
- package/src/rooms/remote-peer.ts +80 -0
- package/src/rooms/service.ts +426 -0
- package/src/rooms/status.ts +146 -0
- package/src/rooms/store.ts +1210 -0
- package/src/rooms/wire.ts +465 -0
- package/src/ui/index.html +91 -4
- package/templates/packs/example.pack.json +13 -0
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
# Audit: policy decisions made from a realpath-derived name alone (#552, the #541 class)
|
|
2
|
+
|
|
3
|
+
Date: 2026-10-28. Base: origin/main fa6ef818. Follow-up to #541 (PR #943).
|
|
4
|
+
|
|
5
|
+
## The class
|
|
6
|
+
|
|
7
|
+
On macOS APFS, Bun's `realpathSync` (1.4.3, and `.native`) can return another hardlink of the same file: about 1 call in 100 when a file has a second name in a different directory, and never in the 4000 calls where the system `/bin/realpath` was run on the same layout. A decision that tests a name against a name-based policy (the secrets denylist, `.git` and `.agenthub` names, `pii.paths`, `data.readonly`, the shadow ignore policy) after resolving the path with `realPath` can therefore judge a different name than the one the caller used. Both names name the same bytes, so the decision is only wrong when the policy judges the two names differently. It needs a hardlink to a file inside the project to exist first.
|
|
8
|
+
|
|
9
|
+
## Method
|
|
10
|
+
|
|
11
|
+
1. `bun ~/.jcode/scratch/inventory.ts` (kept in the PR description, not the repository) listed every `realPath(`, `realpathSync(` and `realpathSync.native(` call in a tracked `src/` file with its enclosing function: 170 call sites in 48 files. Comments, imports and declarations are not call sites.
|
|
12
|
+
2. Each call site was read with its source line and, where the line alone did not say what policy follows, the surrounding function. The table has one row per call site. A row is **reachable** when a name-based policy decision is made from the resolved name and the typed name is not also judged.
|
|
13
|
+
3. The reverse search covered every caller of `isDenied`, `isHubWritePath`, `isAgentConfigPath`, `matchesPolicy` and `matchesPolicyLexically` for a resolved name reaching it. Two callers that never call `realPath` themselves were reached this way: `screenRegistration` (`src/hub/sources.ts`) and the shadow ignore check inside `Facts.rel`.
|
|
14
|
+
4. Reachable callers were measured with the hardlink flip on unmodified main, then fixed, then looped at 5000 iterations (`test/realpath-name-audit.test.ts`, five tests of 1000 each so none needs a timeout above the gate's 20 s).
|
|
15
|
+
|
|
16
|
+
## Measured on unmodified main
|
|
17
|
+
|
|
18
|
+
| Caller | Policy | Calls that decided wrongly |
|
|
19
|
+
|---|---|---|
|
|
20
|
+
| `Facts.rel` | secrets denylist | 17 of 3000 |
|
|
21
|
+
| `Facts.rel` in a shadow repository | shadow ignore policy (`.agenthub/ignore`) | 17 of 5000 (found in review of this PR) |
|
|
22
|
+
| `locate` in `deliverable-files.ts` | hub-owned names | 29 of 3000 |
|
|
23
|
+
| `locate` in `deliverable-files.ts` | secrets denylist | 29 of 3000 |
|
|
24
|
+
| `ahub source add` through `screenRegistration` | `pii.paths` | 63 of 4000 |
|
|
25
|
+
|
|
26
|
+
## Behavior change to know about
|
|
27
|
+
|
|
28
|
+
`Facts.rel` in a **shadow repository** (a project without `.git`, `ahub init --shadow`) now also asks `git check-ignore` about the typed name. Git answers "beyond a symbolic link" (exit 128) for any name that passes through a symlinked directory, such as `via/f.txt` where `via` is a link to `real`. An answer that is not a plain "not ignored" is never readable fact evidence, so such a path is no longer named by that spelling; the file is still named by its real path (`real/f.txt`). This fails closed and only affects shadow projects, but it is a change for a project that keeps symlinked directories there. `test/realpath-name-audit.test.ts` pins it. Ordinary Git projects do not run this check and are unchanged.
|
|
29
|
+
|
|
30
|
+
## Containment of the typed name
|
|
31
|
+
|
|
32
|
+
The typed-name checks run only for a typed name inside the project. That test is `insideRoot` in `src/hub/path-policy.ts`, a **segment** test (`..` itself, a path starting `../`, or an absolute path is outside). The first version used a string prefix (`startsWith("..")`), which treats a valid directory named `..ignored` or `..d` as outside the project and skipped its policies when realpath named the public hardlink (found in review of this PR: 5000 of 5000 loops failed against the old predicate, 0 against the fix). The resolved name keeps main's own test for its containment, unchanged. `test/realpath-name-audit.test.ts` loops 5000 per layout on directories called `..ignored` and `..d`.
|
|
33
|
+
|
|
34
|
+
**The flip is rarer than it was.** When this was found it happened about 1 call in 100. Re-measured on a quiet machine later the same day it was 0 of 3000, and under six parallel workers about 1 of 3000 (Bun 1.4.3, the same APFS volume, the same probe). So the loops can pass on a machine where the flip does not occur, and I do not count them alone. Each decision is also pinned **deterministically** with a symlink, whose typed name differs from its resolved name on every call: a link whose own name is denied, hub-owned, ignored or in `local.deny` is refused although its target is innocent, in plain directories and in directories called `..d` or `..ignored`. Before this change such a link was named by its target. Mutants of the typed-name checks die in these deterministic tests, not only in the loops.
|
|
35
|
+
|
|
36
|
+
## Plan adjustment
|
|
37
|
+
|
|
38
|
+
The plan said no new exported API. `screenRegistration`'s input gains an optional `typedPath`, because the only way to judge both names for `pii.paths` is to hand it both; the field is optional and callers without it behave as before. `src/cli/main.ts` and `src/hub/sources.ts` were not in the planned paths and are in this PR for that reason.
|
|
39
|
+
|
|
40
|
+
## Call sites
|
|
41
|
+
|
|
42
|
+
<!-- TABLE -->
|
|
43
|
+
| # | Call site | Function | Call | Reachable | Policy decided from the name | Result |
|
|
44
|
+
|---|---|---|---|---|---|---|
|
|
45
|
+
| 1 | `src/adapters/claude-channel.ts:264` | `connectLoop` | `realPath` | no | binary, credential or state-directory identity | not reachable at this call: resolves executables, credential files and state directories for isolation; compared by identity, not by a content-name policy |
|
|
46
|
+
| 2 | `src/adapters/claude-implementer.ts:55` | `fingerprint` | `realPath` | no | binary, credential or state-directory identity | not reachable at this call: resolves executables, credential files and state directories for isolation; compared by identity, not by a content-name policy |
|
|
47
|
+
| 3 | `src/adapters/claude-implementer.ts:111` | `start` | `realPath` | no | binary, credential or state-directory identity | not reachable at this call: resolves executables, credential files and state directories for isolation; compared by identity, not by a content-name policy |
|
|
48
|
+
| 4 | `src/adapters/codex-review-isolation.ts:107` | `credentialCanonicalPath` | `realPath` | no | credential and private-path deny rules for the sandboxed reviewer | not reachable at this call: builds deny rules from BOTH names: the lexical path and the resolved one (`denyCredentialRoots` takes `new Set([lexical, canonical])`, and the private-path patterns add `absolute` and `realPath(absolute)`), so a flip cannot drop a name from the rule set |
|
|
49
|
+
| 5 | `src/adapters/codex-review-isolation.ts:125` | `resolveCommand` | `realPath` | no | binary, credential or state-directory identity | not reachable at this call: resolves executables, credential files and state directories for isolation; compared by identity, not by a content-name policy |
|
|
50
|
+
| 6 | `src/adapters/codex-review-isolation.ts:133` | `resolveCommand` | `realPath` | no | binary, credential or state-directory identity | not reachable at this call: resolves executables, credential files and state directories for isolation; compared by identity, not by a content-name policy |
|
|
51
|
+
| 7 | `src/adapters/codex-review-isolation.ts:140` | `resolveCommand` | `realPath` | no | binary, credential or state-directory identity | not reachable at this call: resolves executables, credential files and state directories for isolation; compared by identity, not by a content-name policy |
|
|
52
|
+
| 8 | `src/adapters/codex-review-isolation.ts:185` | `prepare` | `realPath` | no | binary, credential or state-directory identity | not reachable at this call: resolves executables, credential files and state directories for isolation; compared by identity, not by a content-name policy |
|
|
53
|
+
| 9 | `src/adapters/codex-review-isolation.ts:243` | `finish` | `realPath` | no | credential and private-path deny rules for the sandboxed reviewer | not reachable at this call: builds deny rules from BOTH names: the lexical path and the resolved one (`denyCredentialRoots` takes `new Set([lexical, canonical])`, and the private-path patterns add `absolute` and `realPath(absolute)`), so a flip cannot drop a name from the rule set |
|
|
54
|
+
| 10 | `src/adapters/codex-review-isolation.ts:267` | `finish` | `realPath` | no | credential and private-path deny rules for the sandboxed reviewer | not reachable at this call: builds deny rules from BOTH names: the lexical path and the resolved one (`denyCredentialRoots` takes `new Set([lexical, canonical])`, and the private-path patterns add `absolute` and `realPath(absolute)`), so a flip cannot drop a name from the rule set |
|
|
55
|
+
| 11 | `src/adapters/definitions/native-cli-claude-setup.ts:31` | `real` | `realPath` | no | binary, credential or state-directory identity | not reachable at this call: resolves executables, credential files and state directories for isolation; compared by identity, not by a content-name policy |
|
|
56
|
+
| 12 | `src/adapters/external-modules.ts:39` | `externalModuleIdentityCurrent` | `realPath` | no | binary, credential or state-directory identity | not reachable at this call: resolves executables, credential files and state directories for isolation; compared by identity, not by a content-name policy |
|
|
57
|
+
| 13 | `src/adapters/external-modules.ts:90` | `captureBundle` | `realPath` | no | binary, credential or state-directory identity | not reachable at this call: resolves executables, credential files and state directories for isolation; compared by identity, not by a content-name policy |
|
|
58
|
+
| 14 | `src/adapters/external-modules.ts:104` | `captureBundle` | `realPath` | no | binary, credential or state-directory identity | not reachable at this call: resolves executables, credential files and state directories for isolation; compared by identity, not by a content-name policy |
|
|
59
|
+
| 15 | `src/adapters/external-modules.ts:276` | `existingKinds` | `realPath` | no | binary, credential or state-directory identity | not reachable at this call: resolves executables, credential files and state directories for isolation; compared by identity, not by a content-name policy |
|
|
60
|
+
| 16 | `src/adapters/external-modules.ts:278` | `existingKinds` | `realPath` | no | binary, credential or state-directory identity | not reachable at this call: resolves executables, credential files and state directories for isolation; compared by identity, not by a content-name policy |
|
|
61
|
+
| 17 | `src/adapters/external-modules.ts:278` | `existingKinds` | `realPath` | no | binary, credential or state-directory identity | not reachable at this call: resolves executables, credential files and state directories for isolation; compared by identity, not by a content-name policy |
|
|
62
|
+
| 18 | `src/adapters/kimi-review.ts:117` | `prepare` | `realPath` | no | binary, credential or state-directory identity | not reachable at this call: resolves executables, credential files and state directories for isolation; compared by identity, not by a content-name policy |
|
|
63
|
+
| 19 | `src/adapters/kimi-review.ts:119` | `sources` | `realPath` | no | binary, credential or state-directory identity | not reachable at this call: resolves executables, credential files and state directories for isolation; compared by identity, not by a content-name policy |
|
|
64
|
+
| 20 | `src/adapters/kimi-review.ts:124` | `sources` | `realPath` | no | binary, credential or state-directory identity | not reachable at this call: resolves executables, credential files and state directories for isolation; compared by identity, not by a content-name policy |
|
|
65
|
+
| 21 | `src/adapters/kimi-review.ts:134` | `sources` | `realPath` | no | binary, credential or state-directory identity | not reachable at this call: resolves executables, credential files and state directories for isolation; compared by identity, not by a content-name policy |
|
|
66
|
+
| 22 | `src/adapters/kimi-review.ts:150` | `cleanup` | `realPath` | no | binary, credential or state-directory identity | not reachable at this call: resolves executables, credential files and state directories for isolation; compared by identity, not by a content-name policy |
|
|
67
|
+
| 23 | `src/adapters/kimi-review.ts:152` | `cleanup` | `realPath` | no | binary, credential or state-directory identity | not reachable at this call: resolves executables, credential files and state directories for isolation; compared by identity, not by a content-name policy |
|
|
68
|
+
| 24 | `src/adapters/kimi-review.ts:152` | `cleanup` | `realPath` | no | binary, credential or state-directory identity | not reachable at this call: resolves executables, credential files and state directories for isolation; compared by identity, not by a content-name policy |
|
|
69
|
+
| 25 | `src/adapters/kimi-wire-usage.ts:130` | `resolve` | `realPath` | no | binary, credential or state-directory identity | not reachable at this call: resolves executables, credential files and state directories for isolation; compared by identity, not by a content-name policy |
|
|
70
|
+
| 26 | `src/adapters/kimi-wire-usage.ts:133` | `resolve` | `realPath` | no | binary, credential or state-directory identity | not reachable at this call: resolves executables, credential files and state directories for isolation; compared by identity, not by a content-name policy |
|
|
71
|
+
| 27 | `src/adapters/kimi-wire-usage.ts:148` | `resolve` | `realPath` | no | binary, credential or state-directory identity | not reachable at this call: resolves executables, credential files and state directories for isolation; compared by identity, not by a content-name policy |
|
|
72
|
+
| 28 | `src/adapters/kimi-wire-usage.ts:185` | `agents` | `realPath` | no | binary, credential or state-directory identity | not reachable at this call: resolves executables, credential files and state directories for isolation; compared by identity, not by a content-name policy |
|
|
73
|
+
| 29 | `src/adapters/qwen-dual.ts:74` | `qwenDualNamesStateDir` | `realpathSync` | no | binary, credential or state-directory identity | not reachable at this call: resolves executables, credential files and state directories for isolation; compared by identity, not by a content-name policy |
|
|
74
|
+
| 30 | `src/broker/store.ts:140` | `expiryIndex` | `realPath` | no | none (root identity) | not reachable at this call: session, broker and room store paths under the state directory |
|
|
75
|
+
| 31 | `src/broker/store.ts:151` | `expiryIndex` | `realPath` | no | none (root identity) | not reachable at this call: session, broker and room store paths under the state directory |
|
|
76
|
+
| 32 | `src/cli/agy-mcp.ts:97` | `verifyPluginDirectory` | `realPath` | no | directory or executable identity | not reachable at this call: plugin, repository, state or temp directories and executables compared by identity |
|
|
77
|
+
| 33 | `src/cli/agy-mcp.ts:97` | `verifyPluginDirectory` | `realPath` | no | directory or executable identity | not reachable at this call: plugin, repository, state or temp directories and executables compared by identity |
|
|
78
|
+
| 34 | `src/cli/agy-mcp.ts:184` | `internalPlan` | `realPath` | no | directory or executable identity | not reachable at this call: plugin, repository, state or temp directories and executables compared by identity |
|
|
79
|
+
| 35 | `src/cli/agy-mcp.ts:195` | `internalPlan` | `realPath` | no | directory or executable identity | not reachable at this call: plugin, repository, state or temp directories and executables compared by identity |
|
|
80
|
+
| 36 | `src/cli/agy-mcp.ts:305` | `ensureAgyMcp` | `realPath` | no | directory or executable identity | not reachable at this call: plugin, repository, state or temp directories and executables compared by identity |
|
|
81
|
+
| 37 | `src/cli/agy-mcp.ts:306` | `ensureAgyMcp` | `realPath` | no | directory or executable identity | not reachable at this call: plugin, repository, state or temp directories and executables compared by identity |
|
|
82
|
+
| 38 | `src/cli/bench.ts:89` | `benchPreflight` | `realPath` | no | directory or executable identity | not reachable at this call: plugin, repository, state or temp directories and executables compared by identity |
|
|
83
|
+
| 39 | `src/cli/bench.ts:89` | `benchPreflight` | `realPath` | no | directory or executable identity | not reachable at this call: plugin, repository, state or temp directories and executables compared by identity |
|
|
84
|
+
| 40 | `src/cli/facts-hook.ts:29` | `projectFileTool` | `realPath` | no | hub-owned and agent-config names, data.readonly | not reachable at this call: checks the lexical name first, then the resolved one, and refuses a hardlinked file (`hardLinked(real)`) |
|
|
85
|
+
| 41 | `src/cli/facts-hook.ts:35` | `safe` | `realPath` | no | hub-owned and agent-config names, data.readonly | not reachable at this call: checks the lexical name first, then the resolved one, and refuses a hardlinked file (`hardLinked(real)`) |
|
|
86
|
+
| 42 | `src/cli/init.ts:77` | `releaseHookPlan` | `realPath` | no | directory or executable identity | not reachable at this call: plugin, repository, state or temp directories and executables compared by identity |
|
|
87
|
+
| 43 | `src/cli/launch.ts:84` | `cleanupClaudeSettings` | `realPath` | no | directory or executable identity | not reachable at this call: plugin, repository, state or temp directories and executables compared by identity |
|
|
88
|
+
| 44 | `src/cli/launch.ts:85` | `cleanupClaudeSettings` | `realPath` | no | directory or executable identity | not reachable at this call: plugin, repository, state or temp directories and executables compared by identity |
|
|
89
|
+
| 45 | `src/cli/launch.ts:88` | `cleanupClaudeSettings` | `realPath` | no | directory or executable identity | not reachable at this call: plugin, repository, state or temp directories and executables compared by identity |
|
|
90
|
+
| 46 | `src/cli/launch.ts:243` | `paths` | `realPath` | no | directory or executable identity | not reachable at this call: plugin, repository, state or temp directories and executables compared by identity |
|
|
91
|
+
| 47 | `src/cli/main.ts:142` | `registered` | `realPath` | no | none (root identity) | not reachable at this call: compares two directories for identity |
|
|
92
|
+
| 48 | `src/cli/main.ts:145` | `registered` | `realPath` | no | none (root identity) | not reachable at this call: compares two directories for identity |
|
|
93
|
+
| 49 | `src/cli/main.ts:147` | `registered` | `realPath` | no | none (root identity) | not reachable at this call: compares two directories for identity |
|
|
94
|
+
| 50 | `src/cli/main.ts:147` | `registered` | `realPath` | no | none (root identity) | not reachable at this call: compares two directories for identity |
|
|
95
|
+
| 51 | `src/cli/main.ts:765` | `commands` | `realPath` | no | none (root identity) | not reachable at this call: compares two directories for identity |
|
|
96
|
+
| 52 | `src/cli/main.ts:765` | `commands` | `realPath` | no | none (root identity) | not reachable at this call: compares two directories for identity |
|
|
97
|
+
| 53 | `src/cli/main.ts:1331` | `operands` | `realPath` | yes | pii.paths | fixed: `ahub source add` resolves the typed path; `screenRegistration` now takes it as `typedPath` and either name under pii.paths makes the source private |
|
|
98
|
+
| 54 | `src/cli/main.ts:2166` | `value` | `realPath` | no | overlap warnings only | not reachable at this call: `ahub check-path` shows advisory text; a wrong name changes a warning, never a refusal |
|
|
99
|
+
| 55 | `src/cli/main.ts:2167` | `value` | `realPath` | no | overlap warnings only | not reachable at this call: `ahub check-path` shows advisory text; a wrong name changes a warning, never a refusal |
|
|
100
|
+
| 56 | `src/cli/main.ts:2215` | `undoWorkspace` | `realPath` | no | none (root identity) | not reachable at this call: compares two directories for identity |
|
|
101
|
+
| 57 | `src/cli/main.ts:2215` | `undoWorkspace` | `realPath` | no | none (root identity) | not reachable at this call: compares two directories for identity |
|
|
102
|
+
| 58 | `src/cli/main.ts:2220` | `requireUndoWorkspace` | `realPath` | no | none (root identity) | not reachable at this call: compares two directories for identity |
|
|
103
|
+
| 59 | `src/cli/main.ts:2220` | `requireUndoWorkspace` | `realPath` | no | none (root identity) | not reachable at this call: compares two directories for identity |
|
|
104
|
+
| 60 | `src/cli/recovery-package.ts:57` | `memoryRuntime` | `realPath` | no | directory or executable identity | not reachable at this call: plugin, repository, state or temp directories and executables compared by identity |
|
|
105
|
+
| 61 | `src/cli/smoke-run.ts:32` | `runSmoke` | `realPath` | no | directory or executable identity | not reachable at this call: plugin, repository, state or temp directories and executables compared by identity |
|
|
106
|
+
| 62 | `src/cli/smoke-target.ts:26` | `realDirectory` | `realPath` | no | directory or executable identity | not reachable at this call: plugin, repository, state or temp directories and executables compared by identity |
|
|
107
|
+
| 63 | `src/cli/smoke-target.ts:59` | `gitPath` | `realPath` | no | directory or executable identity | not reachable at this call: plugin, repository, state or temp directories and executables compared by identity |
|
|
108
|
+
| 64 | `src/cli/smoke-target.ts:75` | `inspect` | `realPath` | no | directory or executable identity | not reachable at this call: plugin, repository, state or temp directories and executables compared by identity |
|
|
109
|
+
| 65 | `src/hub/claude-shell-wrapper.ts:66` | `stamp` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
110
|
+
| 66 | `src/hub/claude-shell-wrapper.ts:125` | `create` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
111
|
+
| 67 | `src/hub/code-facts.ts:63` | `changed` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
112
|
+
| 68 | `src/hub/code-facts.ts:63` | `changed` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
113
|
+
| 69 | `src/hub/code-facts.ts:178` | `result` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
114
|
+
| 70 | `src/hub/code-facts.ts:200` | `job` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
115
|
+
| 71 | `src/hub/code-facts.ts:240` | `relations` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
116
|
+
| 72 | `src/hub/code-facts.ts:240` | `relations` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
117
|
+
| 73 | `src/hub/corpus.ts:66` | `checkCorpusRoot` | `realPath` | no | vault, denylist, pii.paths on a configured folder | not reachable at this call: the object is a configured directory, not a file with several names; the walk joins readdir entries and skips symlinks, so no resolved file name reaches a name check |
|
|
118
|
+
| 74 | `src/hub/corpus.ts:69` | `checkCorpusRoot` | `realPath` | no | vault, denylist, pii.paths on a configured folder | not reachable at this call: the object is a configured directory, not a file with several names; the walk joins readdir entries and skips symlinks, so no resolved file name reaches a name check |
|
|
119
|
+
| 75 | `src/hub/daemon.ts:1706` | `publicCheck` | `realPath` | no | none (root identity) | not reachable at this call: project, state or execution root compared as a directory |
|
|
120
|
+
| 76 | `src/hub/daemon.ts:2134` | `claudeTranscript` | `realPath` | no | transcript containment | not reachable at this call: requires the transcript under the Claude projects directory and named <session>.jsonl; a different hardlink name inside that directory is the same transcript |
|
|
121
|
+
| 77 | `src/hub/daemon.ts:2135` | `claudeTranscript` | `realPath` | no | transcript containment | not reachable at this call: requires the transcript under the Claude projects directory and named <session>.jsonl; a different hardlink name inside that directory is the same transcript |
|
|
122
|
+
| 78 | `src/hub/daemon.ts:2585` | `currentSandbox` | `realPath` | no | none (root identity) | not reachable at this call: project, state or execution root compared as a directory |
|
|
123
|
+
| 79 | `src/hub/daemon.ts:5080` | `classed` | `realPath` | no | none (root identity) | not reachable at this call: project, state or execution root compared as a directory |
|
|
124
|
+
| 80 | `src/hub/daemon.ts:5271` | `classed` | `realPath` | no | none (root identity) | not reachable at this call: project, state or execution root compared as a directory |
|
|
125
|
+
| 81 | `src/hub/daemon.ts:6900` | `reply` | `realPath` | no | none (root identity) | not reachable at this call: project, state or execution root compared as a directory |
|
|
126
|
+
| 82 | `src/hub/daemon.ts:7165` | `admittedEnv` | `realPath` | no | none (root identity) | not reachable at this call: project, state or execution root compared as a directory |
|
|
127
|
+
| 83 | `src/hub/daemon.ts:7165` | `admittedEnv` | `realPath` | no | none (root identity) | not reachable at this call: project, state or execution root compared as a directory |
|
|
128
|
+
| 84 | `src/hub/daemon.ts:7245` | `tally` | `realPath` | no | transcript containment | not reachable at this call: requires the transcript under the Claude projects directory and named <session>.jsonl; a different hardlink name inside that directory is the same transcript |
|
|
129
|
+
| 85 | `src/hub/daemon.ts:7245` | `tally` | `realPath` | no | transcript containment | not reachable at this call: requires the transcript under the Claude projects directory and named <session>.jsonl; a different hardlink name inside that directory is the same transcript |
|
|
130
|
+
| 86 | `src/hub/deliverable-files.ts:52` | `locate` | `realPath` | no | none at this call (the project root); the file name is judged below it | not reachable at this call: this call resolves the project root only. The file-name decision in the same function (hub-owned names, local.deny) was reachable from the resolved name returned by guardPath and is fixed here: it now judges the typed and the resolved name (measured: 29 of 3000 each on unmodified main) |
|
|
131
|
+
| 87 | `src/hub/external-instance.ts:48` | `externalInstanceStateDir` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
132
|
+
| 88 | `src/hub/external-instance.ts:50` | `externalInstanceStateDir` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
133
|
+
| 89 | `src/hub/external-instance.ts:53` | `externalInstanceStateDir` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
134
|
+
| 90 | `src/hub/external-instance.ts:60` | `readExternalInstanceRecord` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
135
|
+
| 91 | `src/hub/external-instance.ts:60` | `readExternalInstanceRecord` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
136
|
+
| 92 | `src/hub/facts.ts:196` | `constructor` | `realPath` | no | none (root identity) | not reachable at this call: the Facts root, resolved once |
|
|
137
|
+
| 93 | `src/hub/facts.ts:215` | `rel` | `realPath` | yes | secrets denylist, .git names, hub-owned names, shadow ignore policy | fixed: decided from the resolved name alone; this PR judges the typed name for every one of them, and the ignore check fails closed on either |
|
|
138
|
+
| 94 | `src/hub/facts.ts:218` | `rel` | `realPath` | yes | secrets denylist, .git names, hub-owned names, shadow ignore policy | fixed: decided from the resolved name alone; this PR judges the typed name for every one of them, and the ignore check fails closed on either |
|
|
139
|
+
| 95 | `src/hub/folder-trigger.ts:51` | `checkTriggerFolder` | `realPath` | no | none (root identity) | not reachable at this call: the trigger folder and declared data folders, directories |
|
|
140
|
+
| 96 | `src/hub/folder-trigger.ts:53` | `checkTriggerFolder` | `realPath` | no | none (root identity) | not reachable at this call: the trigger folder and declared data folders, directories |
|
|
141
|
+
| 97 | `src/hub/folder-trigger.ts:84` | `scanFolder` | `realpathSync` | no | none (link classification) | not reachable at this call: decides whether a link stays inside the folder; the file name it later tests comes from readdir, never from this call |
|
|
142
|
+
| 98 | `src/hub/host-executable.ts:10` | `hostExecutable` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
143
|
+
| 99 | `src/hub/host-executable.ts:10` | `hostExecutable` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
144
|
+
| 100 | `src/hub/host-executable.ts:19` | `hostShellPath` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
145
|
+
| 101 | `src/hub/host-executable.ts:19` | `hostShellPath` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
146
|
+
| 102 | `src/hub/host-executable.ts:25` | `inside` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
147
|
+
| 103 | `src/hub/instance-execution.ts:26` | `commonDirectory` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
148
|
+
| 104 | `src/hub/instance-execution.ts:45` | `moduleInstance` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
149
|
+
| 105 | `src/hub/instance-execution.ts:46` | `moduleInstance` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
150
|
+
| 106 | `src/hub/instance-execution.ts:57` | `path` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
151
|
+
| 107 | `src/hub/instance-execution.ts:62` | `path` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
152
|
+
| 108 | `src/hub/instances.ts:83` | `canonicalHome` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
153
|
+
| 109 | `src/hub/memory-code-head.ts:24` | `readMemoryCodeHead` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
154
|
+
| 110 | `src/hub/memory-code-head.ts:24` | `readMemoryCodeHead` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
155
|
+
| 111 | `src/hub/memory-profile-check.ts:119` | `readProfileCheckProjects` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
156
|
+
| 112 | `src/hub/memory-profile.ts:75` | `canonicalHome` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
157
|
+
| 113 | `src/hub/path-policy.ts:17` | `policyRealPath` | `realPath` | no | pii.paths, data.readonly, deny | not reachable at this call: this is the policy comparator: it judges the declared spelling, the real target and aliases, which is the pattern the fixes follow |
|
|
158
|
+
| 114 | `src/hub/path-policy.ts:25` | `policyTargets` | `realPath` | no | pii.paths, data.readonly, deny | not reachable at this call: this is the policy comparator: it judges the declared spelling, the real target and aliases, which is the pattern the fixes follow |
|
|
159
|
+
| 115 | `src/hub/path-policy.ts:163` | `matchesPolicy` | `realPath` | no | pii.paths, data.readonly, deny | not reachable at this call: this is the policy comparator: it judges the declared spelling, the real target and aliases, which is the pattern the fixes follow |
|
|
160
|
+
| 116 | `src/hub/read-only-shell-proof.ts:49` | `proveReadOnlyShell` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
161
|
+
| 117 | `src/hub/read-only-shell-proof.ts:49` | `proveReadOnlyShell` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
162
|
+
| 118 | `src/hub/read-only-shell-proof.ts:54` | `proveReadOnlyShell` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
163
|
+
| 119 | `src/hub/recovery-continuity.ts:36` | `canonicalRoot` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
164
|
+
| 120 | `src/hub/registry.ts:43` | `legacyRoot` | `realpathSync` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
165
|
+
| 121 | `src/hub/snapshots.ts:88` | `repoOf` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
166
|
+
| 122 | `src/hub/snapshots.ts:99` | `repoOf` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
167
|
+
| 123 | `src/hub/snapshots.ts:101` | `repoOf` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
168
|
+
| 124 | `src/hub/snapshots.ts:105` | `initShadow` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
169
|
+
| 125 | `src/hub/task-repository.ts:13` | `canonical` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
170
|
+
| 126 | `src/hub/task-repository.ts:42` | `githubOriginRepository` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
171
|
+
| 127 | `src/hub/task-shell-default.ts:31` | `readTaskShellDefaultBranch` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
172
|
+
| 128 | `src/hub/task-shell-default.ts:32` | `readTaskShellDefaultBranch` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
173
|
+
| 129 | `src/hub/task-shell-default.ts:34` | `readTaskShellDefaultBranch` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
174
|
+
| 130 | `src/hub/task-shell-default.ts:34` | `readTaskShellDefaultBranch` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
175
|
+
| 131 | `src/hub/task-shell-default.ts:38` | `remove` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
176
|
+
| 132 | `src/hub/task-shell-proof.ts:20` | `gitReader` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
177
|
+
| 133 | `src/hub/task-shell-proof.ts:38` | `readTaskShellBinding` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
178
|
+
| 134 | `src/hub/task-shell-proof.ts:39` | `readTaskShellBinding` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
179
|
+
| 135 | `src/hub/task-shell-proof.ts:39` | `readTaskShellBinding` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
180
|
+
| 136 | `src/hub/task-shell-proof.ts:98` | `proveTaskShell` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
181
|
+
| 137 | `src/hub/task-shell-proof.ts:98` | `proveTaskShell` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
182
|
+
| 138 | `src/hub/task-shell-sandbox.ts:23` | `taskShellSandboxRestrictions` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
183
|
+
| 139 | `src/hub/task-shell-sandbox.ts:24` | `taskShellSandboxRestrictions` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
184
|
+
| 140 | `src/hub/task-shell-sandbox.ts:36` | `git` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
185
|
+
| 141 | `src/hub/task-shell-sandbox.ts:37` | `git` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
186
|
+
| 142 | `src/hub/task-shell-sandbox.ts:38` | `git` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
187
|
+
| 143 | `src/hub/task-shell-sandbox.ts:44` | `directory` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
188
|
+
| 144 | `src/hub/tasks.ts:1136` | `wip` | `realPath` | no | none (root identity) | not reachable at this call: worktree and project root identity; projectPath compares to the project roots |
|
|
189
|
+
| 145 | `src/hub/tasks.ts:1136` | `wip` | `realPath` | no | none (root identity) | not reachable at this call: worktree and project root identity; projectPath compares to the project roots |
|
|
190
|
+
| 146 | `src/hub/tasks.ts:1136` | `wip` | `realPath` | no | none (root identity) | not reachable at this call: worktree and project root identity; projectPath compares to the project roots |
|
|
191
|
+
| 147 | `src/hub/tasks.ts:1136` | `wip` | `realPath` | no | none (root identity) | not reachable at this call: worktree and project root identity; projectPath compares to the project roots |
|
|
192
|
+
| 148 | `src/hub/tasks.ts:1137` | `wip` | `realPath` | no | none (root identity) | not reachable at this call: worktree and project root identity; projectPath compares to the project roots |
|
|
193
|
+
| 149 | `src/hub/tasks.ts:2384` | `projectPath` | `realPath` | no | none (root identity) | not reachable at this call: worktree and project root identity; projectPath compares to the project roots |
|
|
194
|
+
| 150 | `src/hub/tasks.ts:3324` | `currentNoWrites` | `realPath` | no | none (root identity) | not reachable at this call: worktree and project root identity; projectPath compares to the project roots |
|
|
195
|
+
| 151 | `src/hub/text-projection.ts:75` | `project` | `realPath` | no | containment only | not reachable at this call: containment under the project root and O_NOFOLLOW; privacy is decided by the callers (Facts.rel, registerScanned, doc_read) before this runs |
|
|
196
|
+
| 152 | `src/hub/text-projection.ts:75` | `project` | `realPath` | no | containment only | not reachable at this call: containment under the project root and O_NOFOLLOW; privacy is decided by the callers (Facts.rel, registerScanned, doc_read) before this runs |
|
|
197
|
+
| 153 | `src/hub/text-projection.ts:96` | `projectBytes` | `realPath` | no | containment only | not reachable at this call: containment under the project root and O_NOFOLLOW; privacy is decided by the callers (Facts.rel, registerScanned, doc_read) before this runs |
|
|
198
|
+
| 154 | `src/hub/text-projection.ts:109` | `projectBytes` | `realPath` | no | containment only | not reachable at this call: containment under the project root and O_NOFOLLOW; privacy is decided by the callers (Facts.rel, registerScanned, doc_read) before this runs |
|
|
199
|
+
| 155 | `src/hub/text-projection.ts:121` | `projectBytes` | `realPath` | no | containment only | not reachable at this call: containment under the project root and O_NOFOLLOW; privacy is decided by the callers (Facts.rel, registerScanned, doc_read) before this runs |
|
|
200
|
+
| 156 | `src/hub/text-projection.ts:126` | `projectBytes` | `realPath` | no | containment only | not reachable at this call: containment under the project root and O_NOFOLLOW; privacy is decided by the callers (Facts.rel, registerScanned, doc_read) before this runs |
|
|
201
|
+
| 157 | `src/hub/text-projection.ts:126` | `projectBytes` | `realPath` | no | containment only | not reachable at this call: containment under the project root and O_NOFOLLOW; privacy is decided by the callers (Facts.rel, registerScanned, doc_read) before this runs |
|
|
202
|
+
| 158 | `src/hub/text-projection.ts:132` | `projectBytes` | `realPath` | no | containment only | not reachable at this call: containment under the project root and O_NOFOLLOW; privacy is decided by the callers (Facts.rel, registerScanned, doc_read) before this runs |
|
|
203
|
+
| 159 | `src/hub/text-projection.ts:133` | `programs` | `realPath` | no | containment only | not reachable at this call: containment under the project root and O_NOFOLLOW; privacy is decided by the callers (Facts.rel, registerScanned, doc_read) before this runs |
|
|
204
|
+
| 160 | `src/hub/tooling.ts:35` | `real` | `realPath` | no | executable and directory containment | not reachable at this call: decides on executables and directories by identity or containment against a root, never by a file-name policy |
|
|
205
|
+
| 161 | `src/local/sandbox.ts:38` | `developerDir` | `realPath` | no | none (root identity) | not reachable at this call: sandbox roots and own temp directory |
|
|
206
|
+
| 162 | `src/local/sandbox.ts:149` | `inHome` | `realPath` | no | none (root identity) | not reachable at this call: sandbox roots and own temp directory |
|
|
207
|
+
| 163 | `src/local/sandbox.ts:210` | `sandboxedExec` | `realPath` | no | none (root identity) | not reachable at this call: sandbox roots and own temp directory |
|
|
208
|
+
| 164 | `src/local/tools.ts:60` | `guardPath` | `realPath` | yes | secrets denylist, hub-owned names, data.readonly | fixed: fixed in #541 (PR #943), not in this PR: guardPath now judges the typed name as well as the resolved one |
|
|
209
|
+
| 165 | `src/local/tools.ts:68` | `guardPath` | `realPath` | yes | secrets denylist, hub-owned names, data.readonly | fixed: fixed in #541 (PR #943), not in this PR: guardPath now judges the typed name as well as the resolved one |
|
|
210
|
+
| 166 | `src/pi/session.ts:23` | `validatePiSession` | `realPath` | no | none (root identity) | not reachable at this call: session, broker and room store paths under the state directory |
|
|
211
|
+
| 167 | `src/pi/session.ts:23` | `validatePiSession` | `realPath` | no | none (root identity) | not reachable at this call: session, broker and room store paths under the state directory |
|
|
212
|
+
| 168 | `src/pi/session.ts:31` | `validatePiSession` | `realPath` | no | none (root identity) | not reachable at this call: session, broker and room store paths under the state directory |
|
|
213
|
+
| 169 | `src/pi/session.ts:31` | `validatePiSession` | `realPath` | no | none (root identity) | not reachable at this call: session, broker and room store paths under the state directory |
|
|
214
|
+
| 170 | `src/rooms/store.ts:80` | `validSelection` | `realPath` | no | none (root identity) | not reachable at this call: session, broker and room store paths under the state directory |
|
|
215
|
+
<!-- /TABLE -->
|
|
216
|
+
|
|
217
|
+
## Not covered
|
|
218
|
+
|
|
219
|
+
- Callers outside `src/` (scripts, tests) were not audited.
|
|
220
|
+
- The measurement is on APFS with Bun 1.4.3. On other filesystems the behavior was not measured; the fixes only add refusals, so they are safe there.
|
|
221
|
+
- Whether an actor the policies protect against can create the hardlink in the first place was not examined; each reachable row is reachable as a function call, not shown to be reachable by an agent.
|
|
222
|
+
- The "not reachable" verdicts are a reading of the code at this commit. A later change that feeds a resolved name into a name-based policy would need the same treatment; `docs/agent-notes/local-worker.md` and the AGENTS.md Real paths rule say so.
|