fix(proxy): name a proxy serving from another install instead of reporting it healthy - #107
fix(proxy): name a proxy serving from another install instead of reporting it healthy#107Kage18 wants to merge 11 commits into
Conversation
…ed as healthy Found while investigating why this repo had zero receipts. It was not, as I assumed, that nobody had run traffic. The proxy log showed the opposite: 17 req · 64 memories injected · 15 captured · 15 receipts · 1,303,982 in / 8,085 out tokens Fifteen receipts computed, 1.3M input tokens measured — and `transformation_receipts` held ZERO rows. The cause: the running proxy was executing /Users/kushaljain/code/Kage/.worktrees/kage-vnext-implementation/mcp/dist/cli.js a six-day-old build from a stale worktree, started July 22 and still serving every request. It was bound to the right project but ran that checkout's code, so its measurement never reached this database. `kage status` reported it as simply "running in the background". That is the exact failure class this product exists to prevent: a number that reads as a measured zero when the truth is "we measured plenty and threw it away". And every symptom it causes points somewhere else — receipts that never land, fixes that appear not to work, a status line that looks fine. `proxyDaemonState` now compares the live process's script path against this install and returns `foreign_build` when they differ; `kage status` prints it loudly with the fix (`kage down` then `kage up`). Best-effort by design: an unreadable command line reports nothing rather than making a healthy proxy look broken. Verified end to end rather than in tests alone: restarted the proxy from the current build, confirmed it now reports no foreign build, and proved the persistence path in a throwaway project — the sink opens, writes, and the row lands. Deliberately NOT written into this repo's real store, because a synthetic receipt is exactly the fabricated measurement this codebase forbids. mcp: 1575 pass / 0 fail. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Kage PR Check: Passed
Required actions PR memory and graph checks passed. Errors None. Warnings .agent_memory/packets/bug_fix-bug-fix-github-pages-viewer-must-publish-split-memory-graph-refs-e4e4eb10.md: possible duplicate of Bug fix: GitHub Pages viewer must publish structural code graph references (0.67)%0A.agent_memory/packets/bug_fix-bug-fix-github-pages-viewer-must-publish-structural-code-graph-references-4c7d131f.md: possible duplicate of Bug fix: GitHub Pages viewer must publish split memory graph refs (0.67)%0A.agent_memory/packets/bug_fix-release-1-1-16-retries-npm-registry-verification-3c120e23.md: possible duplicate of Release 1.1.15 adds guarded npm release flow (0.69)%0A.agent_memory/packets/code_explanation-phase-d-task-5-transform-pipeline-wired-into-proxy-protect-is-a-third-proxymode-c6ccee39.md: body is empty%0A.agent_memory/packets/code_explanation-phase-d-task-5-transform-pipeline-wired-into-proxy-protect-is-a-third-proxymode-c6ccee39.md: low memory quality score 46%0A.agent_memory/packets/code_explanation-vnext-v2-context-bounds-its-inputs-and-charges-capsule-sections-exact-serialized-eca3b221.md: body is empty%0A.agent_memory/packets/decision-agent-setup-verification-checks-claude-ambient-hooks-08e91af5.md: possible duplicate of Setup doctor surfaces Claude ambient hook readiness (0.69)%0A.agent_memory/packets/decision-background-proxy-lifecycle-parent-writes-after-confirm-state-verified-on-every-r-fe3b99b6.md: low memory quality score 54%0A.agent_memory/packets/decision-background-proxy-lifecycle-parent-writes-after-confirm-state-verified-on-every-r-fe3b99b6.md: possible duplicate of kage up / kage run / kage down: the background-proxy onramp and its safety split (0.73)%0A.agent_memory/packets/decision-graph-freshness-is-content-based-646b2446.md: possible duplicate of Release 1.1.17 content-based graph freshness (0.68)%0A.agent_memory/packets/decision-kage-1-1-8-adds-stale-memory-gc-bdf41feb.md: possible duplicate of Release 1.1.3 memory lifecycle (0.61)%0A.agent_memory/packets/decision-kage-up-kage-run-kage-down-the-background-proxy-onramp-and-its-safety-split-f3dec391.md: low memory quality score 54%0A.agent_memory/packets/decision-kage-up-kage-run-kage-down-the-background-proxy-onramp-and-its-safety-split-f3dec391.md: possible duplicate of Background proxy lifecycle: parent-writes-after-confirm state, verified on every read (0.73)%0A.agent_memory/packets/decision-mixed-language-framework-routes-in-code-graph-f80a59d6.md: possible duplicate of Python framework routes in code graph (0.58)%0A.agent_memory/packets/decision-python-framework-routes-in-code-graph-d95e4d76.md: possible duplicate of Mixed-language framework routes in code graph (0.58)%0A.agent_memory/packets/decision-refresh-full-mode-bypasses-unchanged-graph-reuse-2515f229.md: possible duplicate of Refresh reuses unchanged code graph by stat fingerprint (0.63)%0A.agent_memory/packets/decision-refresh-reuses-unchanged-code-graph-by-stat-fingerprint-4047c167.md: possible duplicate of Refresh full mode bypasses unchanged graph reuse (0.63)%0A.agent_memory/packets/decision-release-1-1-15-adds-guarded-npm-release-flow-316458ad.md: possible duplicate of Release 1.1.16 retries npm registry verification (0.69)%0A.agent_memory/packets/decision-release-1-1-17-content-based-graph-freshness-b3b879ac.md: possible duplicate of Graph freshness is content based (0.68)%0A.agent_memory/packets/decision-release-1-1-3-memory-lifecycle-dff31776.md: possible duplicate of Kage 1.1.8 adds stale memory GC (0.61)%0A.agent_memory/packets/decision-release-helper-stays-maintainer-only-e9d03ae8.md: possible duplicate of Release 1.1.16 retries npm registry verification (0.61)%0A.agent_memory/packets/decision-session-capture-report-makes-observation-distillation-visible-b9ba759c.md: possible duplicate of Session replay digest proves observed agent learning without raw transcripts (0.59)%0A.agent_memory/packets/decision-session-replay-digest-proves-observed-agent-learning-without-raw-transcripts-485c0b38.md: possible duplicate of Session capture report makes observation distillation visible (0.59)%0A.agent_memory/packets/decision-setup-doctor-surfaces-claude-ambient-hook-readiness-355c5e14.md: possible duplicate of Agent setup verification checks Claude ambient hooks (0.69)%0A.agent_memory/packets/gotcha-assist-mode-live-verified-on-subscription-oauth-mutated-bodies-are-accepted-firs-f472e5a3.md: possible duplicate of Proxy on subscription OAuth WORKS in audit mode — live-verified; 429s were rate limits, not a block (0.6)%0A.agent_memory/packets/gotcha-npm-test-globs-must-be-quoted-or-a-new-dist-vnext-test-file-silently-shrinks-the-1aa584aa.md: possible duplicate of Run Kage MCP tests (0.59)%0A.agent_memory/packets/gotcha-proxy-on-subscription-oauth-works-in-audit-mode-live-verified-429s-were-rate-lim-e7f6f119.md: low memory quality score 54%0A.agent_memory/packets/gotcha-proxy-on-subscription-oauth-works-in-audit-mode-live-verified-429s-were-rate-lim-e7f6f119.md: possible duplicate of ASSIST mode live-verified on subscription OAuth: mutated bodies are accepted, first delivered deliveries recorded (0.6)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-benchmarks-381b351e.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — benchmarks (1)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-benchmarks-c54ba97d.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — benchmarks (1)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-docs-40e65ed3.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — benchmarks (0.95)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-mcp-a43735f2.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — mcp (0.98)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-mcp-a56a8220.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — mcp (0.98)%0A.agent_memory/packets/runbook-run-kage-mcp-tests-9b98df67.md: possible duplicate of npm test globs must be quoted or a new dist/vnext test file silently shrinks the suite (0.59)%0A54 memory packet(s) reference code that changed since capture — review with kage verify (not blocking).%0A25 memory reconciliation item(s) may need update after recent code changes (review on handoff; not blocking). Minimal Change Guard (off) The Minimal Change Guard is not enabled for this repository. To dismiss an advisory finding, record a justification (actor, reason, commit, expiry) in the |
Fair criticism: what I did before was repair. `.entity-card` had no rules, so I gave it a border and called it design. That is not a point of view. THE THESIS. Kage's entire claim is honesty about what is known — measured vs unmeasured, verified vs stale, derived vs asserted. So certainty becomes the primary VISUAL dimension rather than decoration. Four rungs, one vocabulary, used on every page: measured a figure the system observed accent, display step, tabular derived inferred, and can cite its evidence normal text + an evidence chip attention a human has to decide amber/critical rail unknown never measured muted, dashed, never bold, never coloured The invariant that makes it worth having: `unknown` can never be styled in a way that could pass for `measured`. On Proof, a real metric is a 2.5rem accent figure behind a green rail; an unmeasured one is body-size grey behind a dashed edge. You cannot confuse them at a glance, which is the entire product promise expressed as layout. TWO TYPEFACES WITH JOBS, not two styles. Sans is prose a human interprets. Mono is something the MACHINE OBSERVED — a commit hash, a branch, a path, a count, an agent id. Rendering a commit hash in the same face as a sentence hides which of the two you are reading, and that distinction is what this product sells. THE EVIDENCE CHIP is now a real component, because evidence is Kage's currency: `38d27594 · fix/foreign-proxy-build`, `severity 85`, `2 correlated commits`. Mono, bordered, accent-tinted, so a row of them reads as one class of fact. Also killed the most generic-admin thing in the app: the solid green pill nav. It shouted, it competed with the accent that means MEASURED, and it made navigation look more important than the data. Now a left rail plus a raised surface plus weight — three signals, so the active section never depends on colour alone. Type scale rebuilt on a 1.2 ratio with a display step reserved exclusively for measured figures, a tighter data line-height so a column of numbers reads as a table rather than a list of unrelated facts, and structural labels at 11px with real tracking. Applied across Proof, Attention, Work, work-item detail and Agents. The bespoke `.proof-*` and `.agent-card` visuals are deleted — an agent's health is now drawn by exactly the same rule as a metric's, which is the point of having a system. mcp: 1575 pass / 0 fail. portal: 123 pass. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Kage PR Check: Passed
Required actions PR memory and graph checks passed. Errors None. Warnings .agent_memory/packets/bug_fix-bug-fix-github-pages-viewer-must-publish-split-memory-graph-refs-e4e4eb10.md: possible duplicate of Bug fix: GitHub Pages viewer must publish structural code graph references (0.67)%0A.agent_memory/packets/bug_fix-bug-fix-github-pages-viewer-must-publish-structural-code-graph-references-4c7d131f.md: possible duplicate of Bug fix: GitHub Pages viewer must publish split memory graph refs (0.67)%0A.agent_memory/packets/bug_fix-release-1-1-16-retries-npm-registry-verification-3c120e23.md: possible duplicate of Release 1.1.15 adds guarded npm release flow (0.69)%0A.agent_memory/packets/code_explanation-phase-d-task-5-transform-pipeline-wired-into-proxy-protect-is-a-third-proxymode-c6ccee39.md: body is empty%0A.agent_memory/packets/code_explanation-phase-d-task-5-transform-pipeline-wired-into-proxy-protect-is-a-third-proxymode-c6ccee39.md: low memory quality score 46%0A.agent_memory/packets/code_explanation-vnext-v2-context-bounds-its-inputs-and-charges-capsule-sections-exact-serialized-eca3b221.md: body is empty%0A.agent_memory/packets/decision-agent-setup-verification-checks-claude-ambient-hooks-08e91af5.md: possible duplicate of Setup doctor surfaces Claude ambient hook readiness (0.69)%0A.agent_memory/packets/decision-background-proxy-lifecycle-parent-writes-after-confirm-state-verified-on-every-r-fe3b99b6.md: low memory quality score 54%0A.agent_memory/packets/decision-background-proxy-lifecycle-parent-writes-after-confirm-state-verified-on-every-r-fe3b99b6.md: possible duplicate of kage up / kage run / kage down: the background-proxy onramp and its safety split (0.73)%0A.agent_memory/packets/decision-graph-freshness-is-content-based-646b2446.md: possible duplicate of Release 1.1.17 content-based graph freshness (0.68)%0A.agent_memory/packets/decision-kage-1-1-8-adds-stale-memory-gc-bdf41feb.md: possible duplicate of Release 1.1.3 memory lifecycle (0.61)%0A.agent_memory/packets/decision-kage-up-kage-run-kage-down-the-background-proxy-onramp-and-its-safety-split-f3dec391.md: low memory quality score 54%0A.agent_memory/packets/decision-kage-up-kage-run-kage-down-the-background-proxy-onramp-and-its-safety-split-f3dec391.md: possible duplicate of Background proxy lifecycle: parent-writes-after-confirm state, verified on every read (0.73)%0A.agent_memory/packets/decision-mixed-language-framework-routes-in-code-graph-f80a59d6.md: possible duplicate of Python framework routes in code graph (0.58)%0A.agent_memory/packets/decision-python-framework-routes-in-code-graph-d95e4d76.md: possible duplicate of Mixed-language framework routes in code graph (0.58)%0A.agent_memory/packets/decision-refresh-full-mode-bypasses-unchanged-graph-reuse-2515f229.md: possible duplicate of Refresh reuses unchanged code graph by stat fingerprint (0.63)%0A.agent_memory/packets/decision-refresh-reuses-unchanged-code-graph-by-stat-fingerprint-4047c167.md: possible duplicate of Refresh full mode bypasses unchanged graph reuse (0.63)%0A.agent_memory/packets/decision-release-1-1-15-adds-guarded-npm-release-flow-316458ad.md: possible duplicate of Release 1.1.16 retries npm registry verification (0.69)%0A.agent_memory/packets/decision-release-1-1-17-content-based-graph-freshness-b3b879ac.md: possible duplicate of Graph freshness is content based (0.68)%0A.agent_memory/packets/decision-release-1-1-3-memory-lifecycle-dff31776.md: possible duplicate of Kage 1.1.8 adds stale memory GC (0.61)%0A.agent_memory/packets/decision-release-helper-stays-maintainer-only-e9d03ae8.md: possible duplicate of Release 1.1.16 retries npm registry verification (0.61)%0A.agent_memory/packets/decision-session-capture-report-makes-observation-distillation-visible-b9ba759c.md: possible duplicate of Session replay digest proves observed agent learning without raw transcripts (0.59)%0A.agent_memory/packets/decision-session-replay-digest-proves-observed-agent-learning-without-raw-transcripts-485c0b38.md: possible duplicate of Session capture report makes observation distillation visible (0.59)%0A.agent_memory/packets/decision-setup-doctor-surfaces-claude-ambient-hook-readiness-355c5e14.md: possible duplicate of Agent setup verification checks Claude ambient hooks (0.69)%0A.agent_memory/packets/gotcha-assist-mode-live-verified-on-subscription-oauth-mutated-bodies-are-accepted-firs-f472e5a3.md: possible duplicate of Proxy on subscription OAuth WORKS in audit mode — live-verified; 429s were rate limits, not a block (0.6)%0A.agent_memory/packets/gotcha-npm-test-globs-must-be-quoted-or-a-new-dist-vnext-test-file-silently-shrinks-the-1aa584aa.md: possible duplicate of Run Kage MCP tests (0.59)%0A.agent_memory/packets/gotcha-proxy-on-subscription-oauth-works-in-audit-mode-live-verified-429s-were-rate-lim-e7f6f119.md: low memory quality score 54%0A.agent_memory/packets/gotcha-proxy-on-subscription-oauth-works-in-audit-mode-live-verified-429s-were-rate-lim-e7f6f119.md: possible duplicate of ASSIST mode live-verified on subscription OAuth: mutated bodies are accepted, first delivered deliveries recorded (0.6)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-benchmarks-381b351e.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — benchmarks (1)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-benchmarks-c54ba97d.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — benchmarks (1)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-docs-40e65ed3.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — benchmarks (0.95)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-mcp-a43735f2.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — mcp (0.98)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-mcp-a56a8220.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — mcp (0.98)%0A.agent_memory/packets/runbook-run-kage-mcp-tests-9b98df67.md: possible duplicate of npm test globs must be quoted or a new dist/vnext test file silently shrinks the suite (0.59)%0A55 memory packet(s) reference code that changed since capture — review with kage verify (not blocking).%0A25 memory reconciliation item(s) may need update after recent code changes (review on handoff; not blocking). Minimal Change Guard (off) The Minimal Change Guard is not enabled for this repository. To dismiss an advisory finding, record a justification (actor, reason, commit, expiry) in the |
…a bad guard
I went looking for the GitHub webhook wiring, searched `mcp/vnext/workspace/server.ts`
repeatedly, and got ZERO hits for terms I could see with my own eyes in the editor. The file
was not missing the code. The file was BINARY.
One literal NUL byte anywhere in a file makes grep, ripgrep, git diff and every code-review
tool treat the whole thing as binary and silently return nothing for any search over it. No
error, no warning — just empty results that read exactly like "this code does not exist".
Eight files carried raw control bytes. Sixteen occurrences. The largest is server.ts at 1,550
lines, which means the entire workspace HTTP boundary has been unsearchable.
WHAT THEY WERE. Almost all of them are NUL used as a FIELD SEPARATOR in composite keys and
hash inputs — `${kind}<NUL>${value}`, `${repositoryId}<NUL>${kind}<NUL>${slug}`. That is good
practice: NUL cannot occur in the values, so the separator is unambiguous. The bug is purely
that it was written as a RAW BYTE instead of the escape.
The escape is byte-identical — the escaped form has codepoint 0 — so nothing about behaviour
changes, and I verified that explicitly rather than assuming it: these strings feed sha256, so
a non-identical replacement would silently re-key every entity id, review id and actor id in
the store. Same input, same digest, confirmed before trusting the codemod.
THE ONE THAT WAS NOT A SEPARATOR. In server.ts the NUL was the fallback in the workspace
DELETION confirmation gate: `slug.rows[0]?.slug ?? <raw NUL>`. I initially read that as a
bypass — send that constant, satisfy "type your slug to confirm" on the most destructive route
in the product. It is not: I tried to write the exploit and could not. `workspace_sessions`
references `workspace_principals` references `workspaces`, so removing the row invalidates the
session first and an authenticated caller can never reach that line with no row. Dead
defensive code, not an open door. It is now a plain 404 — you cannot confirm the deletion of
something that does not exist — and the test asserts the provable claim rather than the
dramatic one.
The guard is a repo-wide test over every tracked text source. One byte, one test, class closed.
mcp: 1577 pass / 0 fail.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Kage PR Check: Passed
Required actions PR memory and graph checks passed. Errors None. Warnings .agent_memory/packets/bug_fix-bug-fix-github-pages-viewer-must-publish-split-memory-graph-refs-e4e4eb10.md: possible duplicate of Bug fix: GitHub Pages viewer must publish structural code graph references (0.67)%0A.agent_memory/packets/bug_fix-bug-fix-github-pages-viewer-must-publish-structural-code-graph-references-4c7d131f.md: possible duplicate of Bug fix: GitHub Pages viewer must publish split memory graph refs (0.67)%0A.agent_memory/packets/bug_fix-release-1-1-16-retries-npm-registry-verification-3c120e23.md: possible duplicate of Release 1.1.15 adds guarded npm release flow (0.69)%0A.agent_memory/packets/code_explanation-phase-d-task-5-transform-pipeline-wired-into-proxy-protect-is-a-third-proxymode-c6ccee39.md: body is empty%0A.agent_memory/packets/code_explanation-phase-d-task-5-transform-pipeline-wired-into-proxy-protect-is-a-third-proxymode-c6ccee39.md: low memory quality score 46%0A.agent_memory/packets/code_explanation-vnext-v2-context-bounds-its-inputs-and-charges-capsule-sections-exact-serialized-eca3b221.md: body is empty%0A.agent_memory/packets/decision-agent-setup-verification-checks-claude-ambient-hooks-08e91af5.md: possible duplicate of Setup doctor surfaces Claude ambient hook readiness (0.69)%0A.agent_memory/packets/decision-background-proxy-lifecycle-parent-writes-after-confirm-state-verified-on-every-r-fe3b99b6.md: low memory quality score 54%0A.agent_memory/packets/decision-background-proxy-lifecycle-parent-writes-after-confirm-state-verified-on-every-r-fe3b99b6.md: possible duplicate of kage up / kage run / kage down: the background-proxy onramp and its safety split (0.73)%0A.agent_memory/packets/decision-graph-freshness-is-content-based-646b2446.md: possible duplicate of Release 1.1.17 content-based graph freshness (0.68)%0A.agent_memory/packets/decision-kage-1-1-8-adds-stale-memory-gc-bdf41feb.md: possible duplicate of Release 1.1.3 memory lifecycle (0.61)%0A.agent_memory/packets/decision-kage-up-kage-run-kage-down-the-background-proxy-onramp-and-its-safety-split-f3dec391.md: low memory quality score 54%0A.agent_memory/packets/decision-kage-up-kage-run-kage-down-the-background-proxy-onramp-and-its-safety-split-f3dec391.md: possible duplicate of Background proxy lifecycle: parent-writes-after-confirm state, verified on every read (0.73)%0A.agent_memory/packets/decision-mixed-language-framework-routes-in-code-graph-f80a59d6.md: possible duplicate of Python framework routes in code graph (0.58)%0A.agent_memory/packets/decision-python-framework-routes-in-code-graph-d95e4d76.md: possible duplicate of Mixed-language framework routes in code graph (0.58)%0A.agent_memory/packets/decision-refresh-full-mode-bypasses-unchanged-graph-reuse-2515f229.md: possible duplicate of Refresh reuses unchanged code graph by stat fingerprint (0.63)%0A.agent_memory/packets/decision-refresh-reuses-unchanged-code-graph-by-stat-fingerprint-4047c167.md: possible duplicate of Refresh full mode bypasses unchanged graph reuse (0.63)%0A.agent_memory/packets/decision-release-1-1-15-adds-guarded-npm-release-flow-316458ad.md: possible duplicate of Release 1.1.16 retries npm registry verification (0.69)%0A.agent_memory/packets/decision-release-1-1-17-content-based-graph-freshness-b3b879ac.md: possible duplicate of Graph freshness is content based (0.68)%0A.agent_memory/packets/decision-release-1-1-3-memory-lifecycle-dff31776.md: possible duplicate of Kage 1.1.8 adds stale memory GC (0.61)%0A.agent_memory/packets/decision-release-helper-stays-maintainer-only-e9d03ae8.md: possible duplicate of Release 1.1.16 retries npm registry verification (0.61)%0A.agent_memory/packets/decision-session-capture-report-makes-observation-distillation-visible-b9ba759c.md: possible duplicate of Session replay digest proves observed agent learning without raw transcripts (0.59)%0A.agent_memory/packets/decision-session-replay-digest-proves-observed-agent-learning-without-raw-transcripts-485c0b38.md: possible duplicate of Session capture report makes observation distillation visible (0.59)%0A.agent_memory/packets/decision-setup-doctor-surfaces-claude-ambient-hook-readiness-355c5e14.md: possible duplicate of Agent setup verification checks Claude ambient hooks (0.69)%0A.agent_memory/packets/gotcha-assist-mode-live-verified-on-subscription-oauth-mutated-bodies-are-accepted-firs-f472e5a3.md: possible duplicate of Proxy on subscription OAuth WORKS in audit mode — live-verified; 429s were rate limits, not a block (0.6)%0A.agent_memory/packets/gotcha-npm-test-globs-must-be-quoted-or-a-new-dist-vnext-test-file-silently-shrinks-the-1aa584aa.md: possible duplicate of Run Kage MCP tests (0.59)%0A.agent_memory/packets/gotcha-proxy-on-subscription-oauth-works-in-audit-mode-live-verified-429s-were-rate-lim-e7f6f119.md: low memory quality score 54%0A.agent_memory/packets/gotcha-proxy-on-subscription-oauth-works-in-audit-mode-live-verified-429s-were-rate-lim-e7f6f119.md: possible duplicate of ASSIST mode live-verified on subscription OAuth: mutated bodies are accepted, first delivered deliveries recorded (0.6)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-benchmarks-381b351e.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — benchmarks (1)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-benchmarks-c54ba97d.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — benchmarks (1)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-docs-40e65ed3.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — benchmarks (0.95)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-mcp-a43735f2.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — mcp (0.98)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-mcp-a56a8220.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — mcp (0.98)%0A.agent_memory/packets/runbook-run-kage-mcp-tests-9b98df67.md: possible duplicate of npm test globs must be quoted or a new dist/vnext test file silently shrinks the suite (0.59)%0A55 memory packet(s) reference code that changed since capture — review with kage verify (not blocking).%0A25 memory reconciliation item(s) may need update after recent code changes (review on handoff; not blocking). Minimal Change Guard (off) The Minimal Change Guard is not enabled for this repository. To dismiss an advisory finding, record a justification (actor, reason, commit, expiry) in the |
…vent
`process: async () => {}`. The intake was genuinely good — signature verified over the RAW
bytes before any parse, delivery id claimed before any side effect — and then every verified
event was recorded in the ledger and thrown away.
The consequence was specific. `verifying` is the one work stage local git cannot see, because
git has no concept of a pull request. A solo developer gets it from the `gh` CLI. Any team on
the GitHub App had a stage that could never be reached, no matter how many PRs they opened.
WHAT LANDS NOW. Migration 013 adds `github_pull_requests` as a STATE table, not an event log:
the orchestrator asks one question ("is there an open PR on this branch, and did it merge?")
and a state row answers it in one indexed read, where an event log would make every board
render replay history. The branch is the join key, because the orchestrator already correlates
commits to work items by branch — that is what makes a PR mean "that item is in review"
rather than merely "a PR exists".
Two rules the tests hold hardest:
A signed payload proves the SENDER, not the SHAPE. Every field is read defensively and a
malformed event returns `pull_request_malformed` rather than throwing — a throw here would
make GitHub retry a delivery that can never succeed, forever.
`merged` comes from GitHub's own boolean, never inferred from `closed`. A closed-unmerged PR
is ABANDONED work, and flattening the two would report abandoned work as shipped — on the
board, to a lead, as a fact.
CONTRACT CHECKER. Deliberately not a second rule engine: `buildMinimalChangeReport` already
evaluates a diff against the repository model with severities, evidence and a blocking/warning
split. What was missing was the last mile — it only ever ran from a local `kage pr check`, so
it never reached where a reviewer looks. `verdictFromReport` is pure, so the mapping that
decides whether a PR is blocked is testable with no network, database or GitHub App.
Three rules there. Only a DETERMINISTIC finding can fail a check, re-checked here rather than
trusted from the caller — a check that fails on a model-authored opinion teaches people to
ignore checks, which is worse than having none. Advisories are neutral, not failure, because
an advisory that blocks the merge is one nobody leaves enabled. And a check that could not run
reports NEUTRAL and says "this is NOT a pass — nothing was checked", because a green tick
meaning "we did not look" is the exact dishonesty this product exists to remove.
Bumping the schema also tripped two guards this repo already had, which is them working:
LATEST_MIGRATION, and a deploy test asserting compose and env.example track it — a stale
default there would pass a pod running against an un-migrated database.
mcp: 1593 pass / 0 fail.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Kage PR Check: Passed
Required actions PR memory and graph checks passed. Errors None. Warnings .agent_memory/packets/bug_fix-bug-fix-github-pages-viewer-must-publish-split-memory-graph-refs-e4e4eb10.md: possible duplicate of Bug fix: GitHub Pages viewer must publish structural code graph references (0.67)%0A.agent_memory/packets/bug_fix-bug-fix-github-pages-viewer-must-publish-structural-code-graph-references-4c7d131f.md: possible duplicate of Bug fix: GitHub Pages viewer must publish split memory graph refs (0.67)%0A.agent_memory/packets/bug_fix-release-1-1-16-retries-npm-registry-verification-3c120e23.md: possible duplicate of Release 1.1.15 adds guarded npm release flow (0.69)%0A.agent_memory/packets/code_explanation-phase-d-task-5-transform-pipeline-wired-into-proxy-protect-is-a-third-proxymode-c6ccee39.md: body is empty%0A.agent_memory/packets/code_explanation-phase-d-task-5-transform-pipeline-wired-into-proxy-protect-is-a-third-proxymode-c6ccee39.md: low memory quality score 46%0A.agent_memory/packets/code_explanation-vnext-v2-context-bounds-its-inputs-and-charges-capsule-sections-exact-serialized-eca3b221.md: body is empty%0A.agent_memory/packets/decision-agent-setup-verification-checks-claude-ambient-hooks-08e91af5.md: possible duplicate of Setup doctor surfaces Claude ambient hook readiness (0.69)%0A.agent_memory/packets/decision-background-proxy-lifecycle-parent-writes-after-confirm-state-verified-on-every-r-fe3b99b6.md: low memory quality score 54%0A.agent_memory/packets/decision-background-proxy-lifecycle-parent-writes-after-confirm-state-verified-on-every-r-fe3b99b6.md: possible duplicate of kage up / kage run / kage down: the background-proxy onramp and its safety split (0.73)%0A.agent_memory/packets/decision-graph-freshness-is-content-based-646b2446.md: possible duplicate of Release 1.1.17 content-based graph freshness (0.68)%0A.agent_memory/packets/decision-kage-1-1-8-adds-stale-memory-gc-bdf41feb.md: possible duplicate of Release 1.1.3 memory lifecycle (0.61)%0A.agent_memory/packets/decision-kage-up-kage-run-kage-down-the-background-proxy-onramp-and-its-safety-split-f3dec391.md: low memory quality score 54%0A.agent_memory/packets/decision-kage-up-kage-run-kage-down-the-background-proxy-onramp-and-its-safety-split-f3dec391.md: possible duplicate of Background proxy lifecycle: parent-writes-after-confirm state, verified on every read (0.73)%0A.agent_memory/packets/decision-mixed-language-framework-routes-in-code-graph-f80a59d6.md: possible duplicate of Python framework routes in code graph (0.58)%0A.agent_memory/packets/decision-python-framework-routes-in-code-graph-d95e4d76.md: possible duplicate of Mixed-language framework routes in code graph (0.58)%0A.agent_memory/packets/decision-refresh-full-mode-bypasses-unchanged-graph-reuse-2515f229.md: possible duplicate of Refresh reuses unchanged code graph by stat fingerprint (0.63)%0A.agent_memory/packets/decision-refresh-reuses-unchanged-code-graph-by-stat-fingerprint-4047c167.md: possible duplicate of Refresh full mode bypasses unchanged graph reuse (0.63)%0A.agent_memory/packets/decision-release-1-1-15-adds-guarded-npm-release-flow-316458ad.md: possible duplicate of Release 1.1.16 retries npm registry verification (0.69)%0A.agent_memory/packets/decision-release-1-1-17-content-based-graph-freshness-b3b879ac.md: possible duplicate of Graph freshness is content based (0.68)%0A.agent_memory/packets/decision-release-1-1-3-memory-lifecycle-dff31776.md: possible duplicate of Kage 1.1.8 adds stale memory GC (0.61)%0A.agent_memory/packets/decision-release-helper-stays-maintainer-only-e9d03ae8.md: possible duplicate of Release 1.1.16 retries npm registry verification (0.61)%0A.agent_memory/packets/decision-session-capture-report-makes-observation-distillation-visible-b9ba759c.md: possible duplicate of Session replay digest proves observed agent learning without raw transcripts (0.59)%0A.agent_memory/packets/decision-session-replay-digest-proves-observed-agent-learning-without-raw-transcripts-485c0b38.md: possible duplicate of Session capture report makes observation distillation visible (0.59)%0A.agent_memory/packets/decision-setup-doctor-surfaces-claude-ambient-hook-readiness-355c5e14.md: possible duplicate of Agent setup verification checks Claude ambient hooks (0.69)%0A.agent_memory/packets/gotcha-assist-mode-live-verified-on-subscription-oauth-mutated-bodies-are-accepted-firs-f472e5a3.md: possible duplicate of Proxy on subscription OAuth WORKS in audit mode — live-verified; 429s were rate limits, not a block (0.6)%0A.agent_memory/packets/gotcha-npm-test-globs-must-be-quoted-or-a-new-dist-vnext-test-file-silently-shrinks-the-1aa584aa.md: possible duplicate of Run Kage MCP tests (0.59)%0A.agent_memory/packets/gotcha-proxy-on-subscription-oauth-works-in-audit-mode-live-verified-429s-were-rate-lim-e7f6f119.md: low memory quality score 54%0A.agent_memory/packets/gotcha-proxy-on-subscription-oauth-works-in-audit-mode-live-verified-429s-were-rate-lim-e7f6f119.md: possible duplicate of ASSIST mode live-verified on subscription OAuth: mutated bodies are accepted, first delivered deliveries recorded (0.6)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-benchmarks-381b351e.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — benchmarks (1)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-benchmarks-c54ba97d.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — benchmarks (1)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-docs-40e65ed3.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — benchmarks (0.95)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-mcp-a43735f2.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — mcp (0.98)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-mcp-a56a8220.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — mcp (0.98)%0A.agent_memory/packets/runbook-run-kage-mcp-tests-9b98df67.md: possible duplicate of npm test globs must be quoted or a new dist/vnext test file silently shrinks the suite (0.59)%0A55 memory packet(s) reference code that changed since capture — review with kage verify (not blocking).%0A25 memory reconciliation item(s) may need update after recent code changes (review on handoff; not blocking). Minimal Change Guard (off) The Minimal Change Guard is not enabled for this repository. To dismiss an advisory finding, record a justification (actor, reason, commit, expiry) in the |
…ying "none" Two audit items that turn out to be one: the missing entity was the missing JOIN KEY. WHY EVERY ESTIMATE SAID "none". Not laziness — `receiptHistory()` hard-returned `[]` because receipts are measured per agent SESSION, work is tracked per ITEM, and nothing joined the two. No join, no actual; no actual, nothing to score an estimate against. Reporting `none` for months was the honest answer. Inventing a number would have been the alternative. `WorkItemRecord` is that join, as a SIDECAR rather than more fields on the proposal packet. A packet is MEMORY — a title, a body, the paths it grounds to. Bolting `assignee` and `depends_on` onto it would make the memory store the work tracker, and every consumer of memory would then have to skip the fields that are not knowledge. WHAT IS DELIBERATELY ABSENT: the stage log. The design listed it as a persisted field and persisting it now would be a REGRESSION — stages are derived from commands plus git, and a stored copy becomes a second source of truth that can disagree with the derivation. That disagreement is the exact bug the single-writer work fixed earlier on this branch. It stays computed on read, from evidence. `assignee` is kept separate from `claimed_by` because they answer different questions — who SHOULD do it versus who currently HOLDS it — and collapsing them makes an unclaimed assignment indistinguishable from an unassigned item. A dependency cycle is REPORTED, never quietly broken. Silently choosing an order for work that depends on itself hands a lead a plan that cannot be executed and looks perfectly fine. THREE RULES KEEP THE ACTUALS HONEST, each with a test: A receipt with no work item is SESSION cost, not the cost of a unit of work. Averaging the two turns "how big is this change" into "how much did this agent burn today". An item whose linked receipts were all unmeasured yields NO sample — recording a zero would drag the median toward "free". One item is one data point however many requests it took, because the thing being estimated is a unit of work, not a request. `node:sqlite` is required lazily, never at module top level: it does not exist before Node 22.5 and a top-level import would take down every `kage` command on an older runtime. No database, no table, unsupported Node — all return `[]`, and an empty history still reports `confidence: "none"`, which remains the truthful answer. PROVED END TO END, not just in units: a throwaway repo, three finished items with REAL receipts written through the real sink into real sqlite, then a fourth item of the same shape. The board returns `confidence: "matched"`, p50 20,000 / p90 30,000, citing 3 actuals. Deliberately run in a temp project so no synthetic measurement ever touches a real store. mcp: 1604 pass / 0 fail. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Kage PR Check: Passed
Required actions PR memory and graph checks passed. Errors None. Warnings .agent_memory/packets/bug_fix-bug-fix-github-pages-viewer-must-publish-split-memory-graph-refs-e4e4eb10.md: possible duplicate of Bug fix: GitHub Pages viewer must publish structural code graph references (0.67)%0A.agent_memory/packets/bug_fix-bug-fix-github-pages-viewer-must-publish-structural-code-graph-references-4c7d131f.md: possible duplicate of Bug fix: GitHub Pages viewer must publish split memory graph refs (0.67)%0A.agent_memory/packets/bug_fix-release-1-1-16-retries-npm-registry-verification-3c120e23.md: possible duplicate of Release 1.1.15 adds guarded npm release flow (0.69)%0A.agent_memory/packets/code_explanation-phase-d-task-5-transform-pipeline-wired-into-proxy-protect-is-a-third-proxymode-c6ccee39.md: body is empty%0A.agent_memory/packets/code_explanation-phase-d-task-5-transform-pipeline-wired-into-proxy-protect-is-a-third-proxymode-c6ccee39.md: low memory quality score 46%0A.agent_memory/packets/code_explanation-vnext-v2-context-bounds-its-inputs-and-charges-capsule-sections-exact-serialized-eca3b221.md: body is empty%0A.agent_memory/packets/decision-agent-setup-verification-checks-claude-ambient-hooks-08e91af5.md: possible duplicate of Setup doctor surfaces Claude ambient hook readiness (0.69)%0A.agent_memory/packets/decision-background-proxy-lifecycle-parent-writes-after-confirm-state-verified-on-every-r-fe3b99b6.md: low memory quality score 54%0A.agent_memory/packets/decision-background-proxy-lifecycle-parent-writes-after-confirm-state-verified-on-every-r-fe3b99b6.md: possible duplicate of kage up / kage run / kage down: the background-proxy onramp and its safety split (0.73)%0A.agent_memory/packets/decision-graph-freshness-is-content-based-646b2446.md: possible duplicate of Release 1.1.17 content-based graph freshness (0.68)%0A.agent_memory/packets/decision-kage-1-1-8-adds-stale-memory-gc-bdf41feb.md: possible duplicate of Release 1.1.3 memory lifecycle (0.61)%0A.agent_memory/packets/decision-kage-up-kage-run-kage-down-the-background-proxy-onramp-and-its-safety-split-f3dec391.md: low memory quality score 54%0A.agent_memory/packets/decision-kage-up-kage-run-kage-down-the-background-proxy-onramp-and-its-safety-split-f3dec391.md: possible duplicate of Background proxy lifecycle: parent-writes-after-confirm state, verified on every read (0.73)%0A.agent_memory/packets/decision-mixed-language-framework-routes-in-code-graph-f80a59d6.md: possible duplicate of Python framework routes in code graph (0.58)%0A.agent_memory/packets/decision-python-framework-routes-in-code-graph-d95e4d76.md: possible duplicate of Mixed-language framework routes in code graph (0.58)%0A.agent_memory/packets/decision-refresh-full-mode-bypasses-unchanged-graph-reuse-2515f229.md: possible duplicate of Refresh reuses unchanged code graph by stat fingerprint (0.63)%0A.agent_memory/packets/decision-refresh-reuses-unchanged-code-graph-by-stat-fingerprint-4047c167.md: possible duplicate of Refresh full mode bypasses unchanged graph reuse (0.63)%0A.agent_memory/packets/decision-release-1-1-15-adds-guarded-npm-release-flow-316458ad.md: possible duplicate of Release 1.1.16 retries npm registry verification (0.69)%0A.agent_memory/packets/decision-release-1-1-17-content-based-graph-freshness-b3b879ac.md: possible duplicate of Graph freshness is content based (0.68)%0A.agent_memory/packets/decision-release-1-1-3-memory-lifecycle-dff31776.md: possible duplicate of Kage 1.1.8 adds stale memory GC (0.61)%0A.agent_memory/packets/decision-release-helper-stays-maintainer-only-e9d03ae8.md: possible duplicate of Release 1.1.16 retries npm registry verification (0.61)%0A.agent_memory/packets/decision-session-capture-report-makes-observation-distillation-visible-b9ba759c.md: possible duplicate of Session replay digest proves observed agent learning without raw transcripts (0.59)%0A.agent_memory/packets/decision-session-replay-digest-proves-observed-agent-learning-without-raw-transcripts-485c0b38.md: possible duplicate of Session capture report makes observation distillation visible (0.59)%0A.agent_memory/packets/decision-setup-doctor-surfaces-claude-ambient-hook-readiness-355c5e14.md: possible duplicate of Agent setup verification checks Claude ambient hooks (0.69)%0A.agent_memory/packets/gotcha-assist-mode-live-verified-on-subscription-oauth-mutated-bodies-are-accepted-firs-f472e5a3.md: possible duplicate of Proxy on subscription OAuth WORKS in audit mode — live-verified; 429s were rate limits, not a block (0.6)%0A.agent_memory/packets/gotcha-npm-test-globs-must-be-quoted-or-a-new-dist-vnext-test-file-silently-shrinks-the-1aa584aa.md: possible duplicate of Run Kage MCP tests (0.59)%0A.agent_memory/packets/gotcha-proxy-on-subscription-oauth-works-in-audit-mode-live-verified-429s-were-rate-lim-e7f6f119.md: low memory quality score 54%0A.agent_memory/packets/gotcha-proxy-on-subscription-oauth-works-in-audit-mode-live-verified-429s-were-rate-lim-e7f6f119.md: possible duplicate of ASSIST mode live-verified on subscription OAuth: mutated bodies are accepted, first delivered deliveries recorded (0.6)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-benchmarks-381b351e.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — benchmarks (1)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-benchmarks-c54ba97d.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — benchmarks (1)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-docs-40e65ed3.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — benchmarks (0.95)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-mcp-a43735f2.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — mcp (0.98)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-mcp-a56a8220.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — mcp (0.98)%0A.agent_memory/packets/runbook-run-kage-mcp-tests-9b98df67.md: possible duplicate of npm test globs must be quoted or a new dist/vnext test file silently shrinks the suite (0.59)%0A56 memory packet(s) reference code that changed since capture — review with kage verify (not blocking).%0A25 memory reconciliation item(s) may need update after recent code changes (review on handoff; not blocking). Minimal Change Guard (off) The Minimal Change Guard is not enabled for this repository. To dismiss an advisory finding, record a justification (actor, reason, commit, expiry) in the |
"Our graph is better than Graphify's" has been asserted repeatedly in this project across many
sessions and measured exactly zero times. This is the harness, and Kage's side of it is now
real numbers on this repository rather than a claim.
The metrics are deliberately chosen so they CAN make Kage look bad:
parse_coverage fraction of source files parsed by a real parser rather than the metadata
fallback. A metadata-only file is a filename in a list, not a node in a
graph, and counting it is exactly how an index gets to call itself a graph.
edge_resolution fraction of call edges whose BOTH ends resolve to a known symbol. This is
the one that separates a graph from a pile of strings: an edge with a
dangling end cannot be traversed, so it cannot answer "what calls this".
Reported separately from raw edge count precisely because raw counts reward
emitting junk, and a tool optimising for a big number would emit junk.
Measured on Kage itself: 751 source files, 99.7% parse coverage, 28,138 symbols (37.6 per
parsed file), 28,993 call edges at 97.1% resolution, 3,921 import edges, ~2-4s cold build,
across typescript-ast and tree-sitter.
GRAPHIFY IS NOT MEASURED, and the report says so in those words rather than leaving a blank or
implying a win. It is not installed on this machine, and a competitor's numbers will never be
estimated here or read off its landing page — the column names the exact command that would
produce them. That is the same rule the product's own Proof page follows, and it would be
incoherent to hold our own metrics to it and not a rival's.
Running the competitor side requires cloning and executing third-party software, and
`graphify install` registers skills into agent configs — a change to the developer's own setup
that is theirs to authorise, not mine to make while they are not looking.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Kage PR Check: Passed
Required actions PR memory and graph checks passed. Errors None. Warnings .agent_memory/packets/bug_fix-bug-fix-github-pages-viewer-must-publish-split-memory-graph-refs-e4e4eb10.md: possible duplicate of Bug fix: GitHub Pages viewer must publish structural code graph references (0.67)%0A.agent_memory/packets/bug_fix-bug-fix-github-pages-viewer-must-publish-structural-code-graph-references-4c7d131f.md: possible duplicate of Bug fix: GitHub Pages viewer must publish split memory graph refs (0.67)%0A.agent_memory/packets/bug_fix-release-1-1-16-retries-npm-registry-verification-3c120e23.md: possible duplicate of Release 1.1.15 adds guarded npm release flow (0.69)%0A.agent_memory/packets/code_explanation-phase-d-task-5-transform-pipeline-wired-into-proxy-protect-is-a-third-proxymode-c6ccee39.md: body is empty%0A.agent_memory/packets/code_explanation-phase-d-task-5-transform-pipeline-wired-into-proxy-protect-is-a-third-proxymode-c6ccee39.md: low memory quality score 46%0A.agent_memory/packets/code_explanation-vnext-v2-context-bounds-its-inputs-and-charges-capsule-sections-exact-serialized-eca3b221.md: body is empty%0A.agent_memory/packets/decision-agent-setup-verification-checks-claude-ambient-hooks-08e91af5.md: possible duplicate of Setup doctor surfaces Claude ambient hook readiness (0.69)%0A.agent_memory/packets/decision-background-proxy-lifecycle-parent-writes-after-confirm-state-verified-on-every-r-fe3b99b6.md: low memory quality score 54%0A.agent_memory/packets/decision-background-proxy-lifecycle-parent-writes-after-confirm-state-verified-on-every-r-fe3b99b6.md: possible duplicate of kage up / kage run / kage down: the background-proxy onramp and its safety split (0.73)%0A.agent_memory/packets/decision-graph-freshness-is-content-based-646b2446.md: possible duplicate of Release 1.1.17 content-based graph freshness (0.68)%0A.agent_memory/packets/decision-kage-1-1-8-adds-stale-memory-gc-bdf41feb.md: possible duplicate of Release 1.1.3 memory lifecycle (0.61)%0A.agent_memory/packets/decision-kage-up-kage-run-kage-down-the-background-proxy-onramp-and-its-safety-split-f3dec391.md: low memory quality score 54%0A.agent_memory/packets/decision-kage-up-kage-run-kage-down-the-background-proxy-onramp-and-its-safety-split-f3dec391.md: possible duplicate of Background proxy lifecycle: parent-writes-after-confirm state, verified on every read (0.73)%0A.agent_memory/packets/decision-mixed-language-framework-routes-in-code-graph-f80a59d6.md: possible duplicate of Python framework routes in code graph (0.58)%0A.agent_memory/packets/decision-python-framework-routes-in-code-graph-d95e4d76.md: possible duplicate of Mixed-language framework routes in code graph (0.58)%0A.agent_memory/packets/decision-refresh-full-mode-bypasses-unchanged-graph-reuse-2515f229.md: possible duplicate of Refresh reuses unchanged code graph by stat fingerprint (0.63)%0A.agent_memory/packets/decision-refresh-reuses-unchanged-code-graph-by-stat-fingerprint-4047c167.md: possible duplicate of Refresh full mode bypasses unchanged graph reuse (0.63)%0A.agent_memory/packets/decision-release-1-1-15-adds-guarded-npm-release-flow-316458ad.md: possible duplicate of Release 1.1.16 retries npm registry verification (0.69)%0A.agent_memory/packets/decision-release-1-1-17-content-based-graph-freshness-b3b879ac.md: possible duplicate of Graph freshness is content based (0.68)%0A.agent_memory/packets/decision-release-1-1-3-memory-lifecycle-dff31776.md: possible duplicate of Kage 1.1.8 adds stale memory GC (0.61)%0A.agent_memory/packets/decision-release-helper-stays-maintainer-only-e9d03ae8.md: possible duplicate of Release 1.1.16 retries npm registry verification (0.61)%0A.agent_memory/packets/decision-session-capture-report-makes-observation-distillation-visible-b9ba759c.md: possible duplicate of Session replay digest proves observed agent learning without raw transcripts (0.59)%0A.agent_memory/packets/decision-session-replay-digest-proves-observed-agent-learning-without-raw-transcripts-485c0b38.md: possible duplicate of Session capture report makes observation distillation visible (0.59)%0A.agent_memory/packets/decision-setup-doctor-surfaces-claude-ambient-hook-readiness-355c5e14.md: possible duplicate of Agent setup verification checks Claude ambient hooks (0.69)%0A.agent_memory/packets/gotcha-assist-mode-live-verified-on-subscription-oauth-mutated-bodies-are-accepted-firs-f472e5a3.md: possible duplicate of Proxy on subscription OAuth WORKS in audit mode — live-verified; 429s were rate limits, not a block (0.6)%0A.agent_memory/packets/gotcha-npm-test-globs-must-be-quoted-or-a-new-dist-vnext-test-file-silently-shrinks-the-1aa584aa.md: possible duplicate of Run Kage MCP tests (0.59)%0A.agent_memory/packets/gotcha-proxy-on-subscription-oauth-works-in-audit-mode-live-verified-429s-were-rate-lim-e7f6f119.md: low memory quality score 54%0A.agent_memory/packets/gotcha-proxy-on-subscription-oauth-works-in-audit-mode-live-verified-429s-were-rate-lim-e7f6f119.md: possible duplicate of ASSIST mode live-verified on subscription OAuth: mutated bodies are accepted, first delivered deliveries recorded (0.6)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-benchmarks-381b351e.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — benchmarks (1)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-benchmarks-c54ba97d.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — benchmarks (1)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-docs-40e65ed3.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — benchmarks (0.95)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-mcp-a43735f2.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — mcp (0.98)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-mcp-a56a8220.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — mcp (0.98)%0A.agent_memory/packets/runbook-run-kage-mcp-tests-9b98df67.md: possible duplicate of npm test globs must be quoted or a new dist/vnext test file silently shrinks the suite (0.59)%0A58 memory packet(s) reference code that changed since capture — review with kage verify (not blocking).%0A25 memory reconciliation item(s) may need update after recent code changes (review on handoff; not blocking). Minimal Change Guard (off) The Minimal Change Guard is not enabled for this repository. To dismiss an advisory finding, record a justification (actor, reason, commit, expiry) in the |
Kage has kept two disconnected records of what happened, and nothing read both:
.agent_memory/work/commands.jsonl the DECISIONS — claims and gates. Read only by derive.
evidence_events (sqlite) the OBSERVATIONS — prompts, tool results, file changes.
Read only by the vNext compiler.
So "what happened to this work item" had no answer. The decisions were in a file, the evidence
in a database, and no id joined them.
This unifies the READ, not the storage, and that is a deliberate call rather than a shortcut.
A physical merge means migrating a live sqlite table into a JSONL file or the reverse — real
risk of losing evidence — for a benefit (one query path) that a read model delivers without
touching either store. Both writers stay exactly as they are, each still the single writer of
its own kind of fact, which is the property the earlier single-writer work established and
which a merge would put back in play.
The envelope the design specified is applied at the JOIN: every entry carries `source`, so a
reader can always tell a decision someone MADE from something the machine OBSERVED. Flattening
those two would destroy the distinction exactly when a reader most needs it — while working out
why an item is in the state it is.
The rule the tests hold hardest: a session observation is NEVER attributed to a work item by
timing. Wire events are session-scoped, work is item-scoped, and claiming a tool result for an
item because it happened during that item's window is a guess. The correlation ladder already
refuses to move a stage on weak evidence; smuggling a timing-based link in here would break the
same rule from a different direction.
`timelineCoverage` answers "is either half of this dark?" — the count each store contributed,
so a repo where the wire is silent says so rather than looking complete.
mcp: 1610 pass / 0 fail.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Kage PR Check: Passed
Required actions PR memory and graph checks passed. Errors None. Warnings .agent_memory/packets/bug_fix-bug-fix-github-pages-viewer-must-publish-split-memory-graph-refs-e4e4eb10.md: possible duplicate of Bug fix: GitHub Pages viewer must publish structural code graph references (0.67)%0A.agent_memory/packets/bug_fix-bug-fix-github-pages-viewer-must-publish-structural-code-graph-references-4c7d131f.md: possible duplicate of Bug fix: GitHub Pages viewer must publish split memory graph refs (0.67)%0A.agent_memory/packets/bug_fix-release-1-1-16-retries-npm-registry-verification-3c120e23.md: possible duplicate of Release 1.1.15 adds guarded npm release flow (0.69)%0A.agent_memory/packets/code_explanation-phase-d-task-5-transform-pipeline-wired-into-proxy-protect-is-a-third-proxymode-c6ccee39.md: body is empty%0A.agent_memory/packets/code_explanation-phase-d-task-5-transform-pipeline-wired-into-proxy-protect-is-a-third-proxymode-c6ccee39.md: low memory quality score 46%0A.agent_memory/packets/code_explanation-vnext-v2-context-bounds-its-inputs-and-charges-capsule-sections-exact-serialized-eca3b221.md: body is empty%0A.agent_memory/packets/decision-agent-setup-verification-checks-claude-ambient-hooks-08e91af5.md: possible duplicate of Setup doctor surfaces Claude ambient hook readiness (0.69)%0A.agent_memory/packets/decision-background-proxy-lifecycle-parent-writes-after-confirm-state-verified-on-every-r-fe3b99b6.md: low memory quality score 54%0A.agent_memory/packets/decision-background-proxy-lifecycle-parent-writes-after-confirm-state-verified-on-every-r-fe3b99b6.md: possible duplicate of kage up / kage run / kage down: the background-proxy onramp and its safety split (0.73)%0A.agent_memory/packets/decision-graph-freshness-is-content-based-646b2446.md: possible duplicate of Release 1.1.17 content-based graph freshness (0.68)%0A.agent_memory/packets/decision-kage-1-1-8-adds-stale-memory-gc-bdf41feb.md: possible duplicate of Release 1.1.3 memory lifecycle (0.61)%0A.agent_memory/packets/decision-kage-up-kage-run-kage-down-the-background-proxy-onramp-and-its-safety-split-f3dec391.md: low memory quality score 54%0A.agent_memory/packets/decision-kage-up-kage-run-kage-down-the-background-proxy-onramp-and-its-safety-split-f3dec391.md: possible duplicate of Background proxy lifecycle: parent-writes-after-confirm state, verified on every read (0.73)%0A.agent_memory/packets/decision-mixed-language-framework-routes-in-code-graph-f80a59d6.md: possible duplicate of Python framework routes in code graph (0.58)%0A.agent_memory/packets/decision-python-framework-routes-in-code-graph-d95e4d76.md: possible duplicate of Mixed-language framework routes in code graph (0.58)%0A.agent_memory/packets/decision-refresh-full-mode-bypasses-unchanged-graph-reuse-2515f229.md: possible duplicate of Refresh reuses unchanged code graph by stat fingerprint (0.63)%0A.agent_memory/packets/decision-refresh-reuses-unchanged-code-graph-by-stat-fingerprint-4047c167.md: possible duplicate of Refresh full mode bypasses unchanged graph reuse (0.63)%0A.agent_memory/packets/decision-release-1-1-15-adds-guarded-npm-release-flow-316458ad.md: possible duplicate of Release 1.1.16 retries npm registry verification (0.69)%0A.agent_memory/packets/decision-release-1-1-17-content-based-graph-freshness-b3b879ac.md: possible duplicate of Graph freshness is content based (0.68)%0A.agent_memory/packets/decision-release-1-1-3-memory-lifecycle-dff31776.md: possible duplicate of Kage 1.1.8 adds stale memory GC (0.61)%0A.agent_memory/packets/decision-release-helper-stays-maintainer-only-e9d03ae8.md: possible duplicate of Release 1.1.16 retries npm registry verification (0.61)%0A.agent_memory/packets/decision-session-capture-report-makes-observation-distillation-visible-b9ba759c.md: possible duplicate of Session replay digest proves observed agent learning without raw transcripts (0.59)%0A.agent_memory/packets/decision-session-replay-digest-proves-observed-agent-learning-without-raw-transcripts-485c0b38.md: possible duplicate of Session capture report makes observation distillation visible (0.59)%0A.agent_memory/packets/decision-setup-doctor-surfaces-claude-ambient-hook-readiness-355c5e14.md: possible duplicate of Agent setup verification checks Claude ambient hooks (0.69)%0A.agent_memory/packets/gotcha-assist-mode-live-verified-on-subscription-oauth-mutated-bodies-are-accepted-firs-f472e5a3.md: possible duplicate of Proxy on subscription OAuth WORKS in audit mode — live-verified; 429s were rate limits, not a block (0.6)%0A.agent_memory/packets/gotcha-npm-test-globs-must-be-quoted-or-a-new-dist-vnext-test-file-silently-shrinks-the-1aa584aa.md: possible duplicate of Run Kage MCP tests (0.59)%0A.agent_memory/packets/gotcha-proxy-on-subscription-oauth-works-in-audit-mode-live-verified-429s-were-rate-lim-e7f6f119.md: low memory quality score 54%0A.agent_memory/packets/gotcha-proxy-on-subscription-oauth-works-in-audit-mode-live-verified-429s-were-rate-lim-e7f6f119.md: possible duplicate of ASSIST mode live-verified on subscription OAuth: mutated bodies are accepted, first delivered deliveries recorded (0.6)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-benchmarks-381b351e.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — benchmarks (1)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-benchmarks-c54ba97d.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — benchmarks (1)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-docs-40e65ed3.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — benchmarks (0.95)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-mcp-a43735f2.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — mcp (0.98)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-mcp-a56a8220.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — mcp (0.98)%0A.agent_memory/packets/runbook-run-kage-mcp-tests-9b98df67.md: possible duplicate of npm test globs must be quoted or a new dist/vnext test file silently shrinks the suite (0.59)%0A58 memory packet(s) reference code that changed since capture — review with kage verify (not blocking).%0A25 memory reconciliation item(s) may need update after recent code changes (review on handoff; not blocking). Minimal Change Guard (off) The Minimal Change Guard is not enabled for this repository. To dismiss an advisory finding, record a justification (actor, reason, commit, expiry) in the |
…g already established The last audit item. The deterministic core already does the part that must never be guessed — recall what the team knows, cluster by repository structure, size by blast radius — and produces items that are correct and terse. This adds what a model is genuinely better at: acceptance criteria and a statement of what "done" means, in prose. The ORDERING is the whole design. Grounding first, prose second, and prose may only ever describe what grounding already established. THE GATE. Every path in a draft must already be in the item's blast set. A model that invents a file has invented work, and a plan citing a file nobody chose is exactly how an agent ends up editing something no one agreed to touch. Rejected paths are dropped AND REPORTED rather than silently trimmed — a caller has to be able to see that the model reached outside its grounding, because a quiet trim makes an overreaching model look well-behaved. A REFUSAL IS A RESULT. No provider, no credentials, an ungrounded item, a malformed reply, a provider that throws — every one returns `ok: false` with the cause named, and the deterministic item stands exactly as it was. A plan is useful without prose; a plan with invented prose is worse than useless. `draftPrd` never throws, so the optional pass can never take the plan down with it. An UNGROUNDED item is refused outright rather than drafted: with no blast set there is nothing to constrain the draft to, so every path it proposed would be invented by definition. The prompt carries titles and paths, never file CONTENTS — a planning draft does not need the source, and sending it would push repository code through the loopback for a paragraph of prose. A test asserts no source leaks into it. Model replies are untrusted text: the parser finds the JSON body rather than assuming the whole reply is JSON, because a preamble is common and is not a failure. mcp: 1618 pass / 0 fail. portal: 123 pass. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Kage PR Check: Passed
Required actions PR memory and graph checks passed. Errors None. Warnings .agent_memory/packets/bug_fix-bug-fix-github-pages-viewer-must-publish-split-memory-graph-refs-e4e4eb10.md: possible duplicate of Bug fix: GitHub Pages viewer must publish structural code graph references (0.67)%0A.agent_memory/packets/bug_fix-bug-fix-github-pages-viewer-must-publish-structural-code-graph-references-4c7d131f.md: possible duplicate of Bug fix: GitHub Pages viewer must publish split memory graph refs (0.67)%0A.agent_memory/packets/bug_fix-release-1-1-16-retries-npm-registry-verification-3c120e23.md: possible duplicate of Release 1.1.15 adds guarded npm release flow (0.69)%0A.agent_memory/packets/code_explanation-phase-d-task-5-transform-pipeline-wired-into-proxy-protect-is-a-third-proxymode-c6ccee39.md: body is empty%0A.agent_memory/packets/code_explanation-phase-d-task-5-transform-pipeline-wired-into-proxy-protect-is-a-third-proxymode-c6ccee39.md: low memory quality score 46%0A.agent_memory/packets/code_explanation-vnext-v2-context-bounds-its-inputs-and-charges-capsule-sections-exact-serialized-eca3b221.md: body is empty%0A.agent_memory/packets/decision-agent-setup-verification-checks-claude-ambient-hooks-08e91af5.md: possible duplicate of Setup doctor surfaces Claude ambient hook readiness (0.69)%0A.agent_memory/packets/decision-background-proxy-lifecycle-parent-writes-after-confirm-state-verified-on-every-r-fe3b99b6.md: low memory quality score 54%0A.agent_memory/packets/decision-background-proxy-lifecycle-parent-writes-after-confirm-state-verified-on-every-r-fe3b99b6.md: possible duplicate of kage up / kage run / kage down: the background-proxy onramp and its safety split (0.73)%0A.agent_memory/packets/decision-graph-freshness-is-content-based-646b2446.md: possible duplicate of Release 1.1.17 content-based graph freshness (0.68)%0A.agent_memory/packets/decision-kage-1-1-8-adds-stale-memory-gc-bdf41feb.md: possible duplicate of Release 1.1.3 memory lifecycle (0.61)%0A.agent_memory/packets/decision-kage-up-kage-run-kage-down-the-background-proxy-onramp-and-its-safety-split-f3dec391.md: low memory quality score 54%0A.agent_memory/packets/decision-kage-up-kage-run-kage-down-the-background-proxy-onramp-and-its-safety-split-f3dec391.md: possible duplicate of Background proxy lifecycle: parent-writes-after-confirm state, verified on every read (0.73)%0A.agent_memory/packets/decision-mixed-language-framework-routes-in-code-graph-f80a59d6.md: possible duplicate of Python framework routes in code graph (0.58)%0A.agent_memory/packets/decision-python-framework-routes-in-code-graph-d95e4d76.md: possible duplicate of Mixed-language framework routes in code graph (0.58)%0A.agent_memory/packets/decision-refresh-full-mode-bypasses-unchanged-graph-reuse-2515f229.md: possible duplicate of Refresh reuses unchanged code graph by stat fingerprint (0.63)%0A.agent_memory/packets/decision-refresh-reuses-unchanged-code-graph-by-stat-fingerprint-4047c167.md: possible duplicate of Refresh full mode bypasses unchanged graph reuse (0.63)%0A.agent_memory/packets/decision-release-1-1-15-adds-guarded-npm-release-flow-316458ad.md: possible duplicate of Release 1.1.16 retries npm registry verification (0.69)%0A.agent_memory/packets/decision-release-1-1-17-content-based-graph-freshness-b3b879ac.md: possible duplicate of Graph freshness is content based (0.68)%0A.agent_memory/packets/decision-release-1-1-3-memory-lifecycle-dff31776.md: possible duplicate of Kage 1.1.8 adds stale memory GC (0.61)%0A.agent_memory/packets/decision-release-helper-stays-maintainer-only-e9d03ae8.md: possible duplicate of Release 1.1.16 retries npm registry verification (0.61)%0A.agent_memory/packets/decision-session-capture-report-makes-observation-distillation-visible-b9ba759c.md: possible duplicate of Session replay digest proves observed agent learning without raw transcripts (0.59)%0A.agent_memory/packets/decision-session-replay-digest-proves-observed-agent-learning-without-raw-transcripts-485c0b38.md: possible duplicate of Session capture report makes observation distillation visible (0.59)%0A.agent_memory/packets/decision-setup-doctor-surfaces-claude-ambient-hook-readiness-355c5e14.md: possible duplicate of Agent setup verification checks Claude ambient hooks (0.69)%0A.agent_memory/packets/gotcha-assist-mode-live-verified-on-subscription-oauth-mutated-bodies-are-accepted-firs-f472e5a3.md: possible duplicate of Proxy on subscription OAuth WORKS in audit mode — live-verified; 429s were rate limits, not a block (0.6)%0A.agent_memory/packets/gotcha-npm-test-globs-must-be-quoted-or-a-new-dist-vnext-test-file-silently-shrinks-the-1aa584aa.md: possible duplicate of Run Kage MCP tests (0.59)%0A.agent_memory/packets/gotcha-proxy-on-subscription-oauth-works-in-audit-mode-live-verified-429s-were-rate-lim-e7f6f119.md: low memory quality score 54%0A.agent_memory/packets/gotcha-proxy-on-subscription-oauth-works-in-audit-mode-live-verified-429s-were-rate-lim-e7f6f119.md: possible duplicate of ASSIST mode live-verified on subscription OAuth: mutated bodies are accepted, first delivered deliveries recorded (0.6)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-benchmarks-381b351e.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — benchmarks (1)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-benchmarks-c54ba97d.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — benchmarks (1)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-docs-40e65ed3.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — benchmarks (0.95)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-mcp-a43735f2.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — mcp (0.98)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-mcp-a56a8220.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — mcp (0.98)%0A.agent_memory/packets/runbook-run-kage-mcp-tests-9b98df67.md: possible duplicate of npm test globs must be quoted or a new dist/vnext test file silently shrinks the suite (0.59)%0A58 memory packet(s) reference code that changed since capture — review with kage verify (not blocking).%0A25 memory reconciliation item(s) may need update after recent code changes (review on handoff; not blocking). Minimal Change Guard (off) The Minimal Change Guard is not enabled for this repository. To dismiss an advisory finding, record a justification (actor, reason, commit, expiry) in the |
…on two of seven
Installed Graphify 0.9.29 in an isolated venv and ran both tools cold over an identical copy of
this repo. No `graphify install` — that registers skills into agent configs, and an isolated
venv measures the same indexer without touching anyone's setup.
KAGE GRAPHIFY
build (cold) 1.3s 9.0s
symbols / nodes 14,176 6,079
files covered 386 400
coverage 96.5% 100.0%
all edges 14,706 16,012
edge resolution 97.2% 93.9%
relation kinds 2 14
WHERE WE WIN: 7x faster cold, 2.3x the symbols, and a higher share of edges that can actually
be traversed.
WHERE THEY WIN, GENUINELY: full file coverage where we miss 14, and a far richer relation
vocabulary — contains, imports_from, method, indirect_call, re_exports and more against our
two. A graph that only knows "calls" and "imports" cannot answer the questions those other
edges answer, and that is a real capability gap, not a framing difference.
AND A CAVEAT THAT CUTS AGAINST US: Graphify's resolution moves with which relation kinds you
count — 93.9% over all edges, but 97.7% over a narrow calls/imports/references subset, slightly
ABOVE our 97.2%. The all-edges figure is the headline precisely because it is definition-free
and cannot be tuned by picking a flattering subset. Choosing the subset that made us win would
have been trivial and is exactly what this benchmark exists to prevent.
TWO MEASUREMENT BUGS, BOTH FLATTERING US, FOUND AND FIXED BEFORE REPORTING:
The first run timed Kage WARM (0.4s) against Graphify cold (9.0s) — Graphify logged "542
uncached files" while Kage reused a cached graph. Comparing a warm build to a cold one is not
a comparison. Kage's cache is now cleared before the run.
The first parser assumed `edges`/`from`/`to` for Graphify's schema. It is
`links`/`source`/`target`, so it reported ZERO edges for a tool that had just printed 6,079
nodes and 16,012 edges. A zero from a wrong key name looks exactly like a zero from a bad
tool, which is how a benchmark quietly lies in its author's favour.
Also fixed a real bug in the harness: it loaded the kernel from the TARGET project, so it could
only ever measure Kage itself. It now loads from this repo and indexes whatever project it is
pointed at.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…scarded Two findings worth keeping. The Graphify comparison is recorded WITH the two places we lose, because a benchmark that only records wins is marketing. And the stale-worktree proxy is the kind of failure that reads as 'the feature does not work' for days — check a running daemon's executable path before believing any zero it reports. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Kage PR Check: Passed
Required actions PR memory and graph checks passed. Errors None. Warnings .agent_memory/packets/bug_fix-bug-fix-github-pages-viewer-must-publish-split-memory-graph-refs-e4e4eb10.md: possible duplicate of Bug fix: GitHub Pages viewer must publish structural code graph references (0.67)%0A.agent_memory/packets/bug_fix-bug-fix-github-pages-viewer-must-publish-structural-code-graph-references-4c7d131f.md: possible duplicate of Bug fix: GitHub Pages viewer must publish split memory graph refs (0.67)%0A.agent_memory/packets/bug_fix-release-1-1-16-retries-npm-registry-verification-3c120e23.md: possible duplicate of Release 1.1.15 adds guarded npm release flow (0.69)%0A.agent_memory/packets/code_explanation-phase-d-task-5-transform-pipeline-wired-into-proxy-protect-is-a-third-proxymode-c6ccee39.md: body is empty%0A.agent_memory/packets/code_explanation-phase-d-task-5-transform-pipeline-wired-into-proxy-protect-is-a-third-proxymode-c6ccee39.md: low memory quality score 46%0A.agent_memory/packets/code_explanation-vnext-v2-context-bounds-its-inputs-and-charges-capsule-sections-exact-serialized-eca3b221.md: body is empty%0A.agent_memory/packets/decision-agent-setup-verification-checks-claude-ambient-hooks-08e91af5.md: possible duplicate of Setup doctor surfaces Claude ambient hook readiness (0.69)%0A.agent_memory/packets/decision-background-proxy-lifecycle-parent-writes-after-confirm-state-verified-on-every-r-fe3b99b6.md: low memory quality score 54%0A.agent_memory/packets/decision-background-proxy-lifecycle-parent-writes-after-confirm-state-verified-on-every-r-fe3b99b6.md: possible duplicate of kage up / kage run / kage down: the background-proxy onramp and its safety split (0.73)%0A.agent_memory/packets/decision-graph-freshness-is-content-based-646b2446.md: possible duplicate of Release 1.1.17 content-based graph freshness (0.68)%0A.agent_memory/packets/decision-kage-1-1-8-adds-stale-memory-gc-bdf41feb.md: possible duplicate of Release 1.1.3 memory lifecycle (0.61)%0A.agent_memory/packets/decision-kage-up-kage-run-kage-down-the-background-proxy-onramp-and-its-safety-split-f3dec391.md: low memory quality score 54%0A.agent_memory/packets/decision-kage-up-kage-run-kage-down-the-background-proxy-onramp-and-its-safety-split-f3dec391.md: possible duplicate of Background proxy lifecycle: parent-writes-after-confirm state, verified on every read (0.73)%0A.agent_memory/packets/decision-mixed-language-framework-routes-in-code-graph-f80a59d6.md: possible duplicate of Python framework routes in code graph (0.58)%0A.agent_memory/packets/decision-python-framework-routes-in-code-graph-d95e4d76.md: possible duplicate of Mixed-language framework routes in code graph (0.58)%0A.agent_memory/packets/decision-refresh-full-mode-bypasses-unchanged-graph-reuse-2515f229.md: possible duplicate of Refresh reuses unchanged code graph by stat fingerprint (0.63)%0A.agent_memory/packets/decision-refresh-reuses-unchanged-code-graph-by-stat-fingerprint-4047c167.md: possible duplicate of Refresh full mode bypasses unchanged graph reuse (0.63)%0A.agent_memory/packets/decision-release-1-1-15-adds-guarded-npm-release-flow-316458ad.md: possible duplicate of Release 1.1.16 retries npm registry verification (0.69)%0A.agent_memory/packets/decision-release-1-1-17-content-based-graph-freshness-b3b879ac.md: possible duplicate of Graph freshness is content based (0.68)%0A.agent_memory/packets/decision-release-1-1-3-memory-lifecycle-dff31776.md: possible duplicate of Kage 1.1.8 adds stale memory GC (0.61)%0A.agent_memory/packets/decision-release-helper-stays-maintainer-only-e9d03ae8.md: possible duplicate of Release 1.1.16 retries npm registry verification (0.61)%0A.agent_memory/packets/decision-session-capture-report-makes-observation-distillation-visible-b9ba759c.md: possible duplicate of Session replay digest proves observed agent learning without raw transcripts (0.59)%0A.agent_memory/packets/decision-session-replay-digest-proves-observed-agent-learning-without-raw-transcripts-485c0b38.md: possible duplicate of Session capture report makes observation distillation visible (0.59)%0A.agent_memory/packets/decision-setup-doctor-surfaces-claude-ambient-hook-readiness-355c5e14.md: possible duplicate of Agent setup verification checks Claude ambient hooks (0.69)%0A.agent_memory/packets/gotcha-assist-mode-live-verified-on-subscription-oauth-mutated-bodies-are-accepted-firs-f472e5a3.md: possible duplicate of Proxy on subscription OAuth WORKS in audit mode — live-verified; 429s were rate limits, not a block (0.6)%0A.agent_memory/packets/gotcha-npm-test-globs-must-be-quoted-or-a-new-dist-vnext-test-file-silently-shrinks-the-1aa584aa.md: possible duplicate of Run Kage MCP tests (0.59)%0A.agent_memory/packets/gotcha-proxy-on-subscription-oauth-works-in-audit-mode-live-verified-429s-were-rate-lim-e7f6f119.md: low memory quality score 54%0A.agent_memory/packets/gotcha-proxy-on-subscription-oauth-works-in-audit-mode-live-verified-429s-were-rate-lim-e7f6f119.md: possible duplicate of ASSIST mode live-verified on subscription OAuth: mutated bodies are accepted, first delivered deliveries recorded (0.6)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-benchmarks-381b351e.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — benchmarks (1)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-benchmarks-c54ba97d.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — benchmarks (1)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-docs-40e65ed3.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — benchmarks (0.95)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-mcp-a43735f2.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — mcp (0.98)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-mcp-a56a8220.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — mcp (0.98)%0A.agent_memory/packets/runbook-run-kage-mcp-tests-9b98df67.md: possible duplicate of npm test globs must be quoted or a new dist/vnext test file silently shrinks the suite (0.59)%0A58 memory packet(s) reference code that changed since capture — review with kage verify (not blocking).%0A25 memory reconciliation item(s) may need update after recent code changes (review on handoff; not blocking). Minimal Change Guard (off) The Minimal Change Guard is not enabled for this repository. To dismiss an advisory finding, record a justification (actor, reason, commit, expiry) in the |
Kage PR Check: Failed
Required actions Run kage compact (or kage gc), then update or supersede the affected packets. Errors 2 memory packet(s) are hard-stale (deleted citations, expired ttl, or reported) and must be updated or superseded. Warnings .agent_memory/packets/bug_fix-bug-fix-github-pages-viewer-must-publish-split-memory-graph-refs-e4e4eb10.md: possible duplicate of Bug fix: GitHub Pages viewer must publish structural code graph references (0.67)%0A.agent_memory/packets/bug_fix-bug-fix-github-pages-viewer-must-publish-structural-code-graph-references-4c7d131f.md: possible duplicate of Bug fix: GitHub Pages viewer must publish split memory graph refs (0.67)%0A.agent_memory/packets/bug_fix-release-1-1-16-retries-npm-registry-verification-3c120e23.md: possible duplicate of Release 1.1.15 adds guarded npm release flow (0.69)%0A.agent_memory/packets/code_explanation-phase-d-task-5-transform-pipeline-wired-into-proxy-protect-is-a-third-proxymode-c6ccee39.md: body is empty%0A.agent_memory/packets/code_explanation-phase-d-task-5-transform-pipeline-wired-into-proxy-protect-is-a-third-proxymode-c6ccee39.md: low memory quality score 46%0A.agent_memory/packets/code_explanation-vnext-v2-context-bounds-its-inputs-and-charges-capsule-sections-exact-serialized-eca3b221.md: body is empty%0A.agent_memory/packets/decision-agent-setup-verification-checks-claude-ambient-hooks-08e91af5.md: possible duplicate of Setup doctor surfaces Claude ambient hook readiness (0.69)%0A.agent_memory/packets/decision-background-proxy-lifecycle-parent-writes-after-confirm-state-verified-on-every-r-fe3b99b6.md: low memory quality score 54%0A.agent_memory/packets/decision-background-proxy-lifecycle-parent-writes-after-confirm-state-verified-on-every-r-fe3b99b6.md: possible duplicate of kage up / kage run / kage down: the background-proxy onramp and its safety split (0.73)%0A.agent_memory/packets/decision-graph-freshness-is-content-based-646b2446.md: possible duplicate of Release 1.1.17 content-based graph freshness (0.68)%0A.agent_memory/packets/decision-kage-1-1-8-adds-stale-memory-gc-bdf41feb.md: possible duplicate of Release 1.1.3 memory lifecycle (0.61)%0A.agent_memory/packets/decision-kage-up-kage-run-kage-down-the-background-proxy-onramp-and-its-safety-split-f3dec391.md: low memory quality score 54%0A.agent_memory/packets/decision-kage-up-kage-run-kage-down-the-background-proxy-onramp-and-its-safety-split-f3dec391.md: possible duplicate of Background proxy lifecycle: parent-writes-after-confirm state, verified on every read (0.73)%0A.agent_memory/packets/decision-mixed-language-framework-routes-in-code-graph-f80a59d6.md: possible duplicate of Python framework routes in code graph (0.58)%0A.agent_memory/packets/decision-python-framework-routes-in-code-graph-d95e4d76.md: possible duplicate of Mixed-language framework routes in code graph (0.58)%0A.agent_memory/packets/decision-refresh-full-mode-bypasses-unchanged-graph-reuse-2515f229.md: possible duplicate of Refresh reuses unchanged code graph by stat fingerprint (0.63)%0A.agent_memory/packets/decision-refresh-reuses-unchanged-code-graph-by-stat-fingerprint-4047c167.md: possible duplicate of Refresh full mode bypasses unchanged graph reuse (0.63)%0A.agent_memory/packets/decision-release-1-1-15-adds-guarded-npm-release-flow-316458ad.md: possible duplicate of Release 1.1.16 retries npm registry verification (0.69)%0A.agent_memory/packets/decision-release-1-1-17-content-based-graph-freshness-b3b879ac.md: possible duplicate of Graph freshness is content based (0.68)%0A.agent_memory/packets/decision-release-1-1-3-memory-lifecycle-dff31776.md: possible duplicate of Kage 1.1.8 adds stale memory GC (0.61)%0A.agent_memory/packets/decision-release-helper-stays-maintainer-only-e9d03ae8.md: possible duplicate of Release 1.1.16 retries npm registry verification (0.61)%0A.agent_memory/packets/decision-session-capture-report-makes-observation-distillation-visible-b9ba759c.md: possible duplicate of Session replay digest proves observed agent learning without raw transcripts (0.59)%0A.agent_memory/packets/decision-session-replay-digest-proves-observed-agent-learning-without-raw-transcripts-485c0b38.md: possible duplicate of Session capture report makes observation distillation visible (0.59)%0A.agent_memory/packets/decision-setup-doctor-surfaces-claude-ambient-hook-readiness-355c5e14.md: possible duplicate of Agent setup verification checks Claude ambient hooks (0.69)%0A.agent_memory/packets/gotcha-assist-mode-live-verified-on-subscription-oauth-mutated-bodies-are-accepted-firs-f472e5a3.md: possible duplicate of Proxy on subscription OAuth WORKS in audit mode — live-verified; 429s were rate limits, not a block (0.6)%0A.agent_memory/packets/gotcha-npm-test-globs-must-be-quoted-or-a-new-dist-vnext-test-file-silently-shrinks-the-1aa584aa.md: possible duplicate of Run Kage MCP tests (0.59)%0A.agent_memory/packets/gotcha-proxy-on-subscription-oauth-works-in-audit-mode-live-verified-429s-were-rate-lim-e7f6f119.md: low memory quality score 54%0A.agent_memory/packets/gotcha-proxy-on-subscription-oauth-works-in-audit-mode-live-verified-429s-were-rate-lim-e7f6f119.md: possible duplicate of ASSIST mode live-verified on subscription OAuth: mutated bodies are accepted, first delivered deliveries recorded (0.6)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-benchmarks-381b351e.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — benchmarks (1)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-benchmarks-c54ba97d.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — benchmarks (1)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-docs-40e65ed3.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — benchmarks (0.95)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-mcp-a43735f2.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — mcp (0.98)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-mcp-a56a8220.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — mcp (0.98)%0A.agent_memory/packets/runbook-run-kage-mcp-tests-9b98df67.md: possible duplicate of npm test globs must be quoted or a new dist/vnext test file silently shrinks the suite (0.59)%0A.agent_memory/packets/workflow-change-memory-fix-foreign-proxy-build-876fa99c.md: none of the referenced paths exist in this repo: .agents/skills/auto-distill-fallback-and-kage-resume-continuity-verified-v2/SKILL.md, .agents/skills/claude-code-mcp-setup-claude-json-alwaysload-sessionstart-ho/SKILL.md, .agents/skills/doc-truth-audit-method-re-verified-after-dark-first-site-fli/SKILL.md, .agents/skills/github-actions-kage-pr-yml-and-kage-sync-yml-automation/SKILL.md, .agents/skills/kage-context-is-the-single-session-start-tool-replacing-4-se/SKILL.md, .agents/skills/longmemeval-harness-can-measure-dense-local-embeddings/SKILL.md, .agents/skills/releasing-kage-release-js-flow-current-as-of-v2-2-0/SKILL.md, .agents/skills/run-kage-mcp-tests/SKILL.md, .agents/skills/viewer-live-feed-sse-kage-events-from-fs-watch-on-agent-memo/SKILL.md, .superpowers/brainstorm/12017-1783924098/state/server.pid, .superpowers/brainstorm/12409-1783924124/content/product-strategies.html, .superpowers/brainstorm/12409-1783924124/content/product-thesis-approval-v3.html, .superpowers/brainstorm/12409-1783924124/content/product-thesis-v2.html, .superpowers/brainstorm/12409-1783924124/content/waiting-product-thesis.html, .superpowers/brainstorm/12409-1783924124/state/server-stopped%0A.agent_memory/packets/workflow-change-memory-reform-p0-truth-c3af5096.md: none of the referenced paths exist in this repo: .agents/skills/auto-distill-fallback-and-kage-resume-continuity-verified-v2/SKILL.md, .agents/skills/claude-code-mcp-setup-claude-json-alwaysload-sessionstart-ho/SKILL.md, .agents/skills/doc-truth-audit-method-re-verified-after-dark-first-site-fli/SKILL.md, .agents/skills/github-actions-kage-pr-yml-and-kage-sync-yml-automation/SKILL.md, .agents/skills/kage-context-is-the-single-session-start-tool-replacing-4-se/SKILL.md, .agents/skills/longmemeval-harness-can-measure-dense-local-embeddings/SKILL.md, .agents/skills/releasing-kage-release-js-flow-current-as-of-v2-2-0/SKILL.md, .agents/skills/run-kage-mcp-tests/SKILL.md, .agents/skills/viewer-live-feed-sse-kage-events-from-fs-watch-on-agent-memo/SKILL.md, .superpowers/brainstorm/12017-1783924098/state/server.pid, .superpowers/brainstorm/12409-1783924124/content/product-strategies.html, .superpowers/brainstorm/12409-1783924124/content/product-thesis-approval-v3.html, .superpowers/brainstorm/12409-1783924124/content/product-thesis-v2.html, .superpowers/brainstorm/12409-1783924124/content/waiting-product-thesis.html, .superpowers/brainstorm/12409-1783924124/state/server-stopped%0A.agent_memory/packets/workflow-change-memory-reform-p0-truth-c3af5096.md: no repo-grounded source reference found%0A58 memory packet(s) reference code that changed since capture — review with kage verify (not blocking).%0A25 memory reconciliation item(s) may need update after recent code changes (review on handoff; not blocking). Minimal Change Guard (off) The Minimal Change Guard is not enabled for this repository. To dismiss an advisory finding, record a justification (actor, reason, commit, expiry) in the |
…d by colour alone
Used the dataviz skill's method rather than taste, and it found a real accessibility defect I
had shipped plus an IA problem I had been styling around.
WHAT GOES WHERE — the question I had never actually answered.
Ten of eighteen sidebar entries — Features, Components, Flows, Runbooks, Decisions, Contracts,
Data Models, Invariants, Incidents, Documents — all rendered the IDENTICAL component with a
different filter. Navigation ten items wide to express one page and one parameter. Two things
that cost: you could not learn that this repo holds 164 decisions and ZERO features without
visiting ten pages (four of them empty), and a search only ever covered the kind you happened
to be standing in.
A kind is a FILTER, not a destination. One Knowledge page, kind chips carrying counts, search
across everything. 18 nav items -> 9. Every old URL still resolves and preselects its kind, so
nothing anyone bookmarked breaks. An empty kind stays visible-and-disabled rather than hidden,
because "we have no runbooks" is information and hiding it makes the absence invisible.
Verified live: the chips read 259 across 164 decisions / 44 components / 38 incidents / 9
runbooks, and searching "proxy" returns "22 of 259 shown" spanning four kinds at once.
STATUS WAS COLOUR-ALONE, AND I MEASURED IT INSTEAD OF ASSUMING.
`validate_palette.js` on this product's own palette:
light success #1f7a45 vs critical #b3261e ΔE 2.1 deutan (26.2 normal)
light critical vs warning ΔE 0.7 deutan
dark neutral vs critical ΔE 3.6 deutan (14.2 normal — below the
hard floor of 15)
Green-vs-red is THE colour-vision collision and no palette tuning fixes it; I tried four
re-stepped candidates and the best still sat in the 6–8 band. The dark neutral/critical pair
fails even for full colour vision. So on the Agents page I built, a deuteranopic lead could not
tell a working agent from a broken one — the status was a coloured pill and nothing else.
The skill's rule is the fix: status ships with an icon AND a label, never colour alone. Every
status now carries a glyph whose SILHOUETTE differs (filled disc / hollow ring / triangle), the
label is the fact, and the card rail differs in border STYLE (solid / dashed / double) so even
the rail survives with the colour channel switched off. Glyphs are aria-hidden — a screen
reader announcing "black circle Active" is worse than "Active".
Five tests pin this, because it is exactly the kind of thing that regresses silently.
portal: 128 pass. mcp: 1618 pass / 0 fail.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Kage PR Check: Failed
Required actions Run kage compact (or kage gc), then update or supersede the affected packets. Errors 2 memory packet(s) are hard-stale (deleted citations, expired ttl, or reported) and must be updated or superseded. Warnings .agent_memory/packets/bug_fix-bug-fix-github-pages-viewer-must-publish-split-memory-graph-refs-e4e4eb10.md: possible duplicate of Bug fix: GitHub Pages viewer must publish structural code graph references (0.67)%0A.agent_memory/packets/bug_fix-bug-fix-github-pages-viewer-must-publish-structural-code-graph-references-4c7d131f.md: possible duplicate of Bug fix: GitHub Pages viewer must publish split memory graph refs (0.67)%0A.agent_memory/packets/bug_fix-release-1-1-16-retries-npm-registry-verification-3c120e23.md: possible duplicate of Release 1.1.15 adds guarded npm release flow (0.69)%0A.agent_memory/packets/code_explanation-phase-d-task-5-transform-pipeline-wired-into-proxy-protect-is-a-third-proxymode-c6ccee39.md: body is empty%0A.agent_memory/packets/code_explanation-phase-d-task-5-transform-pipeline-wired-into-proxy-protect-is-a-third-proxymode-c6ccee39.md: low memory quality score 46%0A.agent_memory/packets/code_explanation-vnext-v2-context-bounds-its-inputs-and-charges-capsule-sections-exact-serialized-eca3b221.md: body is empty%0A.agent_memory/packets/decision-agent-setup-verification-checks-claude-ambient-hooks-08e91af5.md: possible duplicate of Setup doctor surfaces Claude ambient hook readiness (0.69)%0A.agent_memory/packets/decision-background-proxy-lifecycle-parent-writes-after-confirm-state-verified-on-every-r-fe3b99b6.md: low memory quality score 54%0A.agent_memory/packets/decision-background-proxy-lifecycle-parent-writes-after-confirm-state-verified-on-every-r-fe3b99b6.md: possible duplicate of kage up / kage run / kage down: the background-proxy onramp and its safety split (0.73)%0A.agent_memory/packets/decision-graph-freshness-is-content-based-646b2446.md: possible duplicate of Release 1.1.17 content-based graph freshness (0.68)%0A.agent_memory/packets/decision-kage-1-1-8-adds-stale-memory-gc-bdf41feb.md: possible duplicate of Release 1.1.3 memory lifecycle (0.61)%0A.agent_memory/packets/decision-kage-up-kage-run-kage-down-the-background-proxy-onramp-and-its-safety-split-f3dec391.md: low memory quality score 54%0A.agent_memory/packets/decision-kage-up-kage-run-kage-down-the-background-proxy-onramp-and-its-safety-split-f3dec391.md: possible duplicate of Background proxy lifecycle: parent-writes-after-confirm state, verified on every read (0.73)%0A.agent_memory/packets/decision-mixed-language-framework-routes-in-code-graph-f80a59d6.md: possible duplicate of Python framework routes in code graph (0.58)%0A.agent_memory/packets/decision-python-framework-routes-in-code-graph-d95e4d76.md: possible duplicate of Mixed-language framework routes in code graph (0.58)%0A.agent_memory/packets/decision-refresh-full-mode-bypasses-unchanged-graph-reuse-2515f229.md: possible duplicate of Refresh reuses unchanged code graph by stat fingerprint (0.63)%0A.agent_memory/packets/decision-refresh-reuses-unchanged-code-graph-by-stat-fingerprint-4047c167.md: possible duplicate of Refresh full mode bypasses unchanged graph reuse (0.63)%0A.agent_memory/packets/decision-release-1-1-15-adds-guarded-npm-release-flow-316458ad.md: possible duplicate of Release 1.1.16 retries npm registry verification (0.69)%0A.agent_memory/packets/decision-release-1-1-17-content-based-graph-freshness-b3b879ac.md: possible duplicate of Graph freshness is content based (0.68)%0A.agent_memory/packets/decision-release-1-1-3-memory-lifecycle-dff31776.md: possible duplicate of Kage 1.1.8 adds stale memory GC (0.61)%0A.agent_memory/packets/decision-release-helper-stays-maintainer-only-e9d03ae8.md: possible duplicate of Release 1.1.16 retries npm registry verification (0.61)%0A.agent_memory/packets/decision-session-capture-report-makes-observation-distillation-visible-b9ba759c.md: possible duplicate of Session replay digest proves observed agent learning without raw transcripts (0.59)%0A.agent_memory/packets/decision-session-replay-digest-proves-observed-agent-learning-without-raw-transcripts-485c0b38.md: possible duplicate of Session capture report makes observation distillation visible (0.59)%0A.agent_memory/packets/decision-setup-doctor-surfaces-claude-ambient-hook-readiness-355c5e14.md: possible duplicate of Agent setup verification checks Claude ambient hooks (0.69)%0A.agent_memory/packets/gotcha-assist-mode-live-verified-on-subscription-oauth-mutated-bodies-are-accepted-firs-f472e5a3.md: possible duplicate of Proxy on subscription OAuth WORKS in audit mode — live-verified; 429s were rate limits, not a block (0.6)%0A.agent_memory/packets/gotcha-npm-test-globs-must-be-quoted-or-a-new-dist-vnext-test-file-silently-shrinks-the-1aa584aa.md: possible duplicate of Run Kage MCP tests (0.59)%0A.agent_memory/packets/gotcha-proxy-on-subscription-oauth-works-in-audit-mode-live-verified-429s-were-rate-lim-e7f6f119.md: low memory quality score 54%0A.agent_memory/packets/gotcha-proxy-on-subscription-oauth-works-in-audit-mode-live-verified-429s-were-rate-lim-e7f6f119.md: possible duplicate of ASSIST mode live-verified on subscription OAuth: mutated bodies are accepted, first delivered deliveries recorded (0.6)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-benchmarks-381b351e.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — benchmarks (1)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-benchmarks-c54ba97d.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — benchmarks (1)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-docs-40e65ed3.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — benchmarks (0.95)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-mcp-a43735f2.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — mcp (0.98)%0A.agent_memory/packets/proposal-close-the-orchestrator-p0-truth-loop-one-writer-for-stage-d-mcp-a56a8220.md: possible duplicate of Close the orchestrator P0 truth loop: one writer for stage d — mcp (0.98)%0A.agent_memory/packets/runbook-run-kage-mcp-tests-9b98df67.md: possible duplicate of npm test globs must be quoted or a new dist/vnext test file silently shrinks the suite (0.59)%0A.agent_memory/packets/workflow-change-memory-fix-foreign-proxy-build-876fa99c.md: none of the referenced paths exist in this repo: .agents/skills/auto-distill-fallback-and-kage-resume-continuity-verified-v2/SKILL.md, .agents/skills/claude-code-mcp-setup-claude-json-alwaysload-sessionstart-ho/SKILL.md, .agents/skills/doc-truth-audit-method-re-verified-after-dark-first-site-fli/SKILL.md, .agents/skills/github-actions-kage-pr-yml-and-kage-sync-yml-automation/SKILL.md, .agents/skills/kage-context-is-the-single-session-start-tool-replacing-4-se/SKILL.md, .agents/skills/longmemeval-harness-can-measure-dense-local-embeddings/SKILL.md, .agents/skills/releasing-kage-release-js-flow-current-as-of-v2-2-0/SKILL.md, .agents/skills/run-kage-mcp-tests/SKILL.md, .agents/skills/viewer-live-feed-sse-kage-events-from-fs-watch-on-agent-memo/SKILL.md, .superpowers/brainstorm/12017-1783924098/state/server.pid, .superpowers/brainstorm/12409-1783924124/content/product-strategies.html, .superpowers/brainstorm/12409-1783924124/content/product-thesis-approval-v3.html, .superpowers/brainstorm/12409-1783924124/content/product-thesis-v2.html, .superpowers/brainstorm/12409-1783924124/content/waiting-product-thesis.html, .superpowers/brainstorm/12409-1783924124/state/server-stopped%0A.agent_memory/packets/workflow-change-memory-reform-p0-truth-c3af5096.md: none of the referenced paths exist in this repo: .agents/skills/auto-distill-fallback-and-kage-resume-continuity-verified-v2/SKILL.md, .agents/skills/claude-code-mcp-setup-claude-json-alwaysload-sessionstart-ho/SKILL.md, .agents/skills/doc-truth-audit-method-re-verified-after-dark-first-site-fli/SKILL.md, .agents/skills/github-actions-kage-pr-yml-and-kage-sync-yml-automation/SKILL.md, .agents/skills/kage-context-is-the-single-session-start-tool-replacing-4-se/SKILL.md, .agents/skills/longmemeval-harness-can-measure-dense-local-embeddings/SKILL.md, .agents/skills/releasing-kage-release-js-flow-current-as-of-v2-2-0/SKILL.md, .agents/skills/run-kage-mcp-tests/SKILL.md, .agents/skills/viewer-live-feed-sse-kage-events-from-fs-watch-on-agent-memo/SKILL.md, .superpowers/brainstorm/12017-1783924098/state/server.pid, .superpowers/brainstorm/12409-1783924124/content/product-strategies.html, .superpowers/brainstorm/12409-1783924124/content/product-thesis-approval-v3.html, .superpowers/brainstorm/12409-1783924124/content/product-thesis-v2.html, .superpowers/brainstorm/12409-1783924124/content/waiting-product-thesis.html, .superpowers/brainstorm/12409-1783924124/state/server-stopped%0A.agent_memory/packets/workflow-change-memory-reform-p0-truth-c3af5096.md: no repo-grounded source reference found%0A58 memory packet(s) reference code that changed since capture — review with kage verify (not blocking).%0A25 memory reconciliation item(s) may need update after recent code changes (review on handoff; not blocking). Minimal Change Guard (off) The Minimal Change Guard is not enabled for this repository. To dismiss an advisory finding, record a justification (actor, reason, commit, expiry) in the |
What this fixes
This repo showed
receipts: 0— and I assumed nobody had run traffic through the proxy. The proxy log said otherwise:Fifteen receipts computed, 1.3M input tokens measured, and
transformation_receiptsheld zero rows.The cause: the running proxy was executing
/Users/kushaljain/code/Kage/.worktrees/kage-vnext-implementation/mcp/dist/cli.js— a six-day-old build from a stale worktree, started July 22 and still serving every request. Bound to the right project, running the wrong code, so its measurement never reached this database.kage statusreported it as simply "running in the background".Why it matters
This is the failure class the product exists to prevent: a number that reads as a measured zero when the truth is "we measured plenty and discarded it". Every symptom it produces points somewhere else — receipts that never land, fixes that appear not to work, a status line that looks healthy.
Four surfaces were degraded by this one thing: work-card estimates, Proof's estimate accuracy, Agent Tasks, and Overview's cost metrics.
The change
proxyDaemonStatecompares the live process's script path against the current install and returnsforeign_buildwhen they differ.kage statusprints it loudly with the fix (kage downthenkage up).Best-effort by design: an unreadable command line reports nothing rather than making a healthy proxy look broken.
Verification
Not tests alone:
mcp: 1575 pass / 0 fail.🤖 Generated with Claude Code