Surface aging brain/raw/ pending notes instead of relying on someone remembering to check #82
Closed
opened 2026-07-15 09:45:35 +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
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#82
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.
Context
Follow-up to #81 (adds the mechanism to promote/reject a pending note —
this issue is about the missing trigger to actually look). Even with
brain_rejectshipped, nothing prompts a review; the queue only gets checkedif someone happens to call
brain_pendingmanually. That's exactly how the4 real items sitting since 2026-04-23 went unnoticed for 3 months — the tool
existed the whole time, nobody had a reason to call it.
Same shape as brain-gardener#121 (surface resolved review issues via comment,
don't auto-close — the human still decides, but the system should be the one
that remembers to ask). Same principle applies one stage earlier here: the
system should prompt "these are aging," not require someone to remember the
queue exists.
Proposal
Options (pick one, don't over-build):
brain/raw/*.mdolder than N days (e.g. 14) fires an ntfy notificationlisting filenames + age, same pattern as brain-audit's existing severity-gated
digest (fires only when something crosses the threshold, not every run —
avoids confirmation-fatigue).
brain_context. If a session'sbrain_contextcall alreadyreturns "prior decisions/corrections" for a project, cheaply also note "N
pending brain/raw/ items, oldest Xd" so it surfaces in-session without a new
scheduled job.
brain_contextfor the in-session one.Whichever: never auto-reject on age. Aging is a trigger to ask a human, not
a verdict — an old note might still be exactly right to promote once someone
looks. Mirrors the exact reasoning
issue-status-derived-surfaced-not-closedalready settled for the tracker (2026-06-30, referenced in brain-gardener#121).
Acceptance
An aging pending note (>threshold days) is surfaced to Mathias without him
having to think to call
brain_pending. No note is ever auto-rejected orauto-promoted by this mechanism.
Related
Shipped option 2 —
3e537bd.task checkgreen.brain_contextnow returns apending_reviewblock when anything inbrain/raw/is older than 14 days:Why option 2 alone, not 1 or 3
The issue said pick one and don't over-build. Option 2 is the only one that adds no new thing to keep running — no scheduled job, no ntfy wiring, no threshold config to drift. It rides on a call sessions already make, which matches the diagnosis: the capability was never missing, the prompt was.
Option 1 stays worth doing if this proves too passive — a nudge only fires when a session calls
brain_context, so a fortnight with no such session is a fortnight of silence. That is a real gap, and it is the one an ntfy digest closes. Worth knowing before adding it: this one costs nothing to keep, and a second channel firing on the same threshold is how notification fatigue starts.Three things I made explicit that the issue implied
Threshold gates whether it speaks, not what it counts. Once something ages past 14 days it reports the whole queue —
pending: 4, aging: 2. Someone opening the queue should see the queue, not a filtered slice of it.Silence below the threshold is the feature. A block on every context call is one people learn to skip, which reproduces this exact failure with extra steps. Tests pin the silent cases first, before the reporting one.
It cannot decide. No promote, no reject, no reorder — and a test asserts the raw dir is byte-for-byte unchanged after a nudge, plus that the payload carries a hint rather than an action. That is
issue-status-derived-surfaced-not-closedapplied one stage earlier, as you noted.Also: an unreadable
raw/degrades to silence rather than failing the call.brain_contextis a hot path, and a broken review queue must not take project context down with it.Verification honesty
Unit-tested end to end through
brainContextitself, so the wiring is proven, not just the summary. What is not verified is the thing that actually matters — that you see it in a real session, since that depends on how each harness renders extra keys in a tool result. The four items from 2026-04-23 are still in the live queue and should trigger it on your nextbrain_contextcall; if they do not surface visibly, the gap is presentation, not detection, and that is worth a follow-up rather than a bigger threshold.Leaving open until you have actually seen it fire. Related: #81 is the reject capability this feeds.
Verified live in this session — the missing piece per the shipping comment (implementation done 2026-08-17,
3e537bd, left open pending confirmation the nudge actually renders in a real session).brain_contextcall from this session returned:The queue has grown from the original 4 items to 11 (7 aging past the 14-day threshold) — the surfacing works exactly as designed, and separately confirms the underlying problem is real and ongoing (the oldest item is now 152 days old). Closing on this evidence; the growing queue itself is a separate concern for whoever reviews
brain_pendingnext, not a gap in this mechanism.Created via git-mcp on behalf of @mathias
Already shipped 2026-08-18 (commit
3e537bd, "feat(brain): surface an aging review queue in brain_context (#82)") — issue just never got closed alongside it.Option 2 from this issue's own proposal was chosen:
ingestion/internal/mcp/pending_nudge.go+ wiring intotools_context.go.brain_contextnow returns apending_reviewblock ({pending, aging, oldest, oldest_days, hint}) whenever anyraw/note exceeds a 14-day threshold — silent below it, reports the whole queue once triggered. No auto-reject/auto-promote, matches this issue's acceptance criterion exactly.Verified live on the corpus today (via #134's triage work): the mechanism correctly surfaced the aging queue (11 pending / 7 aging / oldest 152 days at the time), confirming both that it works and that the underlying problem it targets is real.
🤖 Generated with Claude Code
Created via git-mcp on behalf of @mathias