Skip to content

fix(proxy): name a proxy serving from another install instead of reporting it healthy - #107

Open
Kage18 wants to merge 11 commits into
masterfrom
fix/foreign-proxy-build
Open

fix(proxy): name a proxy serving from another install instead of reporting it healthy#107
Kage18 wants to merge 11 commits into
masterfrom
fix/foreign-proxy-build

Conversation

@Kage18

@Kage18 Kage18 commented Jul 28, 2026

Copy link
Copy Markdown
Member

What this fixes

This repo showed receipts: 0 — and I assumed nobody had run traffic through the proxy. The proxy log said otherwise:

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. Bound to the right project, running the wrong code, so its measurement never reached this database.

kage status reported 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

proxyDaemonState compares the live process's script path against the current 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.

Verification

Not tests alone:

  • Restarted the proxy from the current build; it now reports no foreign build
  • Proved the persistence path in a throwaway project — the sink opens, writes, and the row lands
  • Deliberately did not write a synthetic receipt into this repo's real store; that is the fabricated measurement this codebase forbids

mcp: 1575 pass / 0 fail.

🤖 Generated with Claude Code

…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>
@github-actions

Copy link
Copy Markdown

Kage PR Check: Passed

Metric Value
Approved memory 278
Pending memory 0
Stale memory 54
Duplicate candidates 23
Useful memory 72%
Evidence coverage 100%
Path grounding 100%

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
repository's minimal-change suppressions. Advisory findings never block the merge.

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>
@github-actions

Copy link
Copy Markdown

Kage PR Check: Passed

Metric Value
Approved memory 278
Pending memory 0
Stale memory 55
Duplicate candidates 23
Useful memory 72%
Evidence coverage 100%
Path grounding 100%

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
repository's minimal-change suppressions. Advisory findings never block the merge.

…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>
@github-actions

Copy link
Copy Markdown

Kage PR Check: Passed

Metric Value
Approved memory 278
Pending memory 0
Stale memory 55
Duplicate candidates 23
Useful memory 72%
Evidence coverage 100%
Path grounding 100%

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
repository's minimal-change suppressions. Advisory findings never block the merge.

…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>
@github-actions

Copy link
Copy Markdown

Kage PR Check: Passed

Metric Value
Approved memory 278
Pending memory 0
Stale memory 55
Duplicate candidates 23
Useful memory 72%
Evidence coverage 100%
Path grounding 100%

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
repository's minimal-change suppressions. Advisory findings never block the merge.

…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>
@github-actions

Copy link
Copy Markdown

Kage PR Check: Passed

Metric Value
Approved memory 278
Pending memory 0
Stale memory 56
Duplicate candidates 23
Useful memory 72%
Evidence coverage 100%
Path grounding 100%

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
repository's minimal-change suppressions. Advisory findings never block the merge.

"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>
@github-actions

Copy link
Copy Markdown

Kage PR Check: Passed

Metric Value
Approved memory 278
Pending memory 0
Stale memory 58
Duplicate candidates 21
Useful memory 72%
Evidence coverage 100%
Path grounding 100%

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
repository's minimal-change suppressions. Advisory findings never block the merge.

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>
@github-actions

Copy link
Copy Markdown

Kage PR Check: Passed

Metric Value
Approved memory 278
Pending memory 0
Stale memory 58
Duplicate candidates 21
Useful memory 72%
Evidence coverage 100%
Path grounding 100%

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
repository's minimal-change suppressions. Advisory findings never block the merge.

…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>
@github-actions

Copy link
Copy Markdown

Kage PR Check: Passed

Metric Value
Approved memory 278
Pending memory 0
Stale memory 58
Duplicate candidates 21
Useful memory 72%
Evidence coverage 100%
Path grounding 100%

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
repository's minimal-change suppressions. Advisory findings never block the merge.

Kage18 and others added 2 commits July 29, 2026 02:00
…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>
@github-actions

Copy link
Copy Markdown

Kage PR Check: Passed

Metric Value
Approved memory 278
Pending memory 0
Stale memory 58
Duplicate candidates 21
Useful memory 72%
Evidence coverage 100%
Path grounding 100%

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
repository's minimal-change suppressions. Advisory findings never block the merge.

@github-actions

Copy link
Copy Markdown

Kage PR Check: Failed

Metric Value
Approved memory 281
Pending memory 0
Stale memory 60
Duplicate candidates 21
Useful memory 71%
Evidence coverage 100%
Path grounding 100%

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
repository's minimal-change suppressions. Advisory findings never block the merge.

…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>
@github-actions

Copy link
Copy Markdown

Kage PR Check: Failed

Metric Value
Approved memory 281
Pending memory 0
Stale memory 60
Duplicate candidates 21
Useful memory 71%
Evidence coverage 100%
Path grounding 100%

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
repository's minimal-change suppressions. Advisory findings never block the merge.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant