bug: capture relay has no SummaryWriter wired — summary silently fails (ai-sessions path) #66
Closed
opened 2026-06-23 08:36:50 +00:00 by mathias
·
3 comments
No Branch/Tag Specified
main
fix/pipeline-writes-158
fix/edit-path-io-192
fix/create-regular-188
fix/guard-special-179
fix/linkcheck-keeps-write-178
fix/write-dir-redirect-173
fix/tunnel-detect-174
fix/pipeline-root-157
w3/154-mcp-auth-wiring
fix/tunnel-traversal
test/in-brain-targets-171
fix/brain-scan-root-157
fix/graph-wiki-root-157
fix/vectorstore-root-157
fix/notes-root-157
fix/search-root-157
fix/brainwide-root-157
fix/raw-symlinks-153
feat/symlink-tripwire-157
fix/rest-auth-149
fix/123-brain-edit-envelope-check
feat/106-page-aware-extraction
fix/105-source-drift-on-main
fix/104-surface-merge-conflicts-on-main
agent/b1-compile-on-ingest
agent/104-surface-merge-conflicts
agent/105-source-drift
agent/107-loud-unconfigured-alerting
feat/brain-read-edit
fix/capture-i1-refusal-names-target
renovate/configure
feat/consolidate-single-harness
icebox/cmd-routing
feat/brain-pending-promote
fix/close-session-classification-refresh
fix/capture-summarywriter
v0.24.0
v0.23.1
v0.23.0
v0.22.0
v0.21.1
v0.21.0
v0.20.1
v0.20.0
v0.19.1
v0.19.0
v0.18.4
v0.18.3
v0.18.2
v0.18.1
v0.18.0
v0.17.0
v0.16.1
v0.16.0
v0.15.0
v0.14.0
v0.13.2
v0.13.1
v0.13.0
v0.12.1
v0.12.0
v0.11.2
icebox/cmd-routing-2026-07-01
v0.11.1
v0.11.0
v0.10.0
v0.9.0
v0.8.0
v0.7.0
v0.6.0
v0.5.0
v0.4.1
v0.4.0
v0.3.0
v0.2.0
v0.1.0
Labels
Clear labels
agent/ready
blocked/client
blocked/supplier
blocked/upstream
risk/high
risk/low
risk/medium
size/l
size/m
size/s
size/xs
status:dispatch
status:dispatched
status:review
status:reviewing
type/chore
type/decision
type/docs
type/feat
type/fix
type/ops
type/research
type/test
Meets the agent-ready contract; authorizes unattended execution
Waiting on the client
Waiting on a supplier
Waiting on an upstream project or vendor
Irreversible, security-relevant, or control plane
Reversible, local, test-covered
Touches shared state, deploys or data
Too big - split it
Under two days
Under half a day
Under an hour
Maintenance, no behaviour change
Human decision required; never agent/ready
Documentation only
New capability
Corrects broken behaviour
Infrastructure, deploy, runtime
Investigate; output is a finding, not code
Test coverage only
No labels
Milestone
No items
No Milestone
Projects
Clear projects
No projects
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: mathias/hyperguild#66
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Symptom
First live dogfood of
brain:capturefrom claude.ai (2026-06-23 closeout) returned a partial success: insights + ticket landed, but the summary failed with:The
SummaryWriterport has no concrete implementation wired in the deployed relay — sosummary.{title,body,repos_touched}is accepted, validated, and then silently no-ops with an error in the receipt. Insights (BrainStore) and tickets (IssueTracker) work; the ai-sessions summary path does not.What worked (so this is a wiring gap, not a design fault)
wiki/hyperguild/{decisions,failures}/...)internal; I1 gate passedLikely cause
The
SummaryWriterimpl (writes tomathias/ai-sessionsatsummaries/<harness>/<YYYY-MM>/...) is either not constructed or not injected into the deployedCaptureServicewiring. Capture sub-issue #54/#49d-e built the port + adapter; the deploy (infra #152) may not have provided the ai-sessions Gitea target/token to the relay, or the constructor leavesSummaryWriternil and the service treats nil as "not configured."Acceptance
SummaryWriterconcretely wired in the deployed relay (ai-sessions repo + token/credential present)summaryblock writes the file toai-sessionsand returnssummary.ok=truewith the pathSummaryWriteris intentionally optional, the receipt should distinguish "not configured" (operator gap) from a write error — and a capture that supplies a summary to a relay without a writer should surface as a louder warning, not a quiet per-item errork3s/apps/**) provides the ai-sessions target + credentialok=trueRepro
Run any
brain:capturefrom the claude.ai connector with a populatedsummaryblock. Insights/tickets succeed; summary returnsok:false, "no summary writer configured".Related
wiki/hyperguild/decisions/the-capture-capability-shipped-v0-11-0-hyperguild-49.mdet al.Koala dispatch — "make capture fully work from claude.ai" (pairs #66 + #67)
Goal: after this session, a
brain:capturecall from the claude.ai connector with insights + tickets + summary touching the normal homelab repos succeeds fully (allok=true, no I1 refusal). Two sibling fixes get there; do both, in this order.Order matters
internal, any capture touchingai-sessionsfail-safes to confidential and the I1 gate refuses it — which would make a #66 fix untestable from claude.ai. So tag first, then you can actually verify the summary path end-to-end.SummaryWriterinto the deployed relay so the summary block stops returningno summary writer configured.Autonomy boundaries — STOP and ask Mathias, do not invent:
mathias/ai-sessionswith a token. If no ai-sessions-capable credential is already in the relay's env/secret, stop — do not mint or hardcode one. Secret provisioning (1Password vault + external-secrets) is Mathias's call, and any new secret + manifest change is a GitOps/I3 change ininfra/k3s/apps/**, not a code-only fix.internallist, but have Mathias confirm it before merge. When unsure, leave a repo untagged (fail-safe confidential) rather than tag it permissively.Verify before claiming done
effective_classification: internal, every itemok=true, a realsummary.path.task checkgreen; secret-handling respected (no token in argv/logs).Context koala should read first
specs/capture-bdd-spec.md(the binding design — esp. §4.1 classification model C, §4.4 audit posture)ingestion/internal/classification/) for theclassification.yamlschema +defaultFor()behaviorwiki/hyperguild/failures/first-live-dogfood-of-braincapture-surfaced-two-real-operat.md(why both gaps exist)Both are bounded and testable. The only non-autonomous parts are the two STOP points above — flag them and wait, don't work around them.
Fixed — PR #68 (code-only, no manifest change)
gitea.Client.WriteFile(contents API, upsert) → the client now implementscapture.SummaryWriter; injected into the deployedCaptureService. Summaries write tomathias/ai-sessionsatsummaries/<harness>/<YYYY-MM>/….STOP point handled, not worked around: the relay already carries
BRAIN_GITEA_TOKEN(owner mathias, used for tracker issue writes). I reused it — did not mint/hardcode a credential, so no new secret + no infra change. The issue's "likely cause" (deploy didn't provide an ai-sessions target/token) turned out not to need one.⚠️ One thing for you to confirm: the token must have contents/
write:repositoryscope onmathias/ai-sessions, not issue-only. If it's issue-scoped, the live write 422s → widen the token in 1P (your secret call, not a code fix). Tests cover create / update-with-sha / error-no-token-leak.Re-dogfood is gated on #67 — until ai-sessions is tagged
internal, the I1 gate refuses a claude.ai capture before the summary path runs. Merge order: brain #12 (#67) → restart → #68 → re-dogfood.task checkgreen.✅ Live re-dogfood passed (2026-07-07) — loop closed
Full
brain:capturefrom the claude.ai connector,dry_run: false, all itemsok=true,errors: []:wiki/hyperguild/facts/capture-re-dogfood-verification-2026-07-07-confirming-the.mdsummaries/claudeai-chat/2026-07/2026-07-07-capture-re-dogfood-...-8360f6dd.md← the path type that returnedno summary writer configuredon 2026-06-23, now writing.effective_classification: internal, I1 gate passed.This confirms the two things a dry-run couldn't:
BRAIN_GITEA_TOKENhas contents/write onai-sessions(the live write didn't 422; the issue-scope caveat from PR #68 is moot).Capture epic #49 is now verified end-to-end from claude.ai. No open capture items remain.