rm46395pcuqs4ev129ga30j82tdaq6bo · 106 rows
| id | content_hash | title | description | design | acceptance_criteria | notes | status | priority | issue_type | assignee | estimated_minutes | created_at | created_by | owner | updated_at | closed_at | closed_by_session | external_ref | spec_id | compaction_level | compacted_at | compacted_at_commit | original_size | sender | ephemeral | wisp_type | pinned | is_template | mol_type | work_type | source_system | metadata | source_repo | close_reason | event_kind | actor | target | payload | await_type | await_id | timeout_ns | waiters | hook_bead | role_bead | agent_state | last_activity | role_type | rig | due_at | defer_until | no_history | started_at | is_blocked |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ah-ydx | 8735805091c14831debfbdb26c8f324f6832e8b80ebcc313e05201a7bd3c85f8 | Stage 3: mem0 memory lifecycle + Context Pack | Per SPEC SS14.3: mem0 REST client (X-API-Key, scoping user_id=proj:<slug>/global, run_id=task:<id> — agent_id filter is buggy upstream); load cascade on claim -> .task/CONTEXT.md section; save on Done; post-run summarizer role; Context Pack builder (task+thread+parent-chain+memory+git, ~40k char budget, deterministic order, truncate-from-tail). | Audit note (2026-07-20): the SPEC 14.3 'post-run summarizer role' was never implemented as a role — the shipped design substitutes the agent-authored .task/summary.md + mem0 infer=true LLM extraction at Done-time (memory.go). All four ah-ydx children are closed. DECISION STILL NEEDED — analysis added 2026-08-05 to make it a one-line call. RECOMMENDATION: ACCEPT the substitution and close the epic. Why the substitution is better than the design it replaced, not merely cheaper: - A summarizer ROLE means a SECOND pi run per task whose only output is prose. That is another model call, another timeout to enforce, another attempt that can crash, stall or be killed — all on the finalize path, which is the one path that must not get more failure modes (see ah-1cx.2 for what a failure there already costs). - The agent that did the work is the only party that knows WHY it made its choices. A summarizer reading the diff afterwards is reconstructing intent from artifacts; .task/summary.md is the agent stating it directly. The verdict-routing pipeline (ah-4el) already depends on that file's FIRST LINE, so the file is load-bearing regardless — a summarizer role would duplicate a channel that must exist anyway. - mem0's infer=true already does the extraction step a summarizer would have done, on the server, at the point of storage. What is actually lost: a run that ends WITHOUT writing summary.md contributes nothing to memory. Those are predominantly the failed, crashed and killed runs — exactly the ones a summarizer would have had least to say about, and where the failure comment already carries the diagnosis. If that gap ever matters, the cheap fix is a fallback that stores the diff stat + commit subjects, not a second agent. If ACCEPTED: update this epic's body and SPEC §14.3's wording to describe the delivered design (SPEC §14 was already re-marked delivered in 119b84d and records the substitution as this epic's open decision — that sentence is what needs replacing), then close. That is a ~15 minute docs change and it is the last thing standing between v0.1.0 and its tag, alongside ah-1cx.8. If REJECTED: the summarizer role is the one remaining piece of Stage 3, and it needs its own bead with a prompt, a role entry and a place on the finalize path. | open | 3 | epic | NULL | NULL | 2026-07-12T23:36:28Z | Eugene Blikh | bigbes@gmail.com | 2026-08-05T00:11:18Z | NULL | NULL | 0 | NULL | NULL | NULL | 0 | 0 | 0 | �{} | 0 | NULL | NULL | NULL | 0 | NULL | 0 | |||||||||||||||||||||||
| ah-ydx.1 | 942024e29b162a28d01e0bddbd3bf862f1ff8bf498c45bd03199c5a0dc916489 | internal/mem0: REST client for live mem0.bigb.es | Typed Go client for the self-hosted Mem0 server (LIVE at mem0.bigb.es, phoebe-lab/mem0 stack): X-API-Key auth, add/search/get-all/delete memories. Encode scoping conventions as helpers: user_id='proj:<slug>' | 'global', run_id='task:<id>'; do NOT rely on agent_id filtering (buggy upstream per SPEC §14.3). Stdlib-only, httptest unit tests; live verification (incl. API-key provisioning via dashboard/register) is a follow-up ops step. | closed | 2 | feature | Eugene Blikh | NULL | 2026-07-18T13:23:56Z | Eugene Blikh | bigbes@gmail.com | 2026-07-18T13:41:11Z | 2026-07-18T13:41:11Z | NULL | 0 | NULL | NULL | NULL | 0 | 0 | 0 | �{} | internal/mem0 client merged to master (55b9b43); routes confirmed against mem0 v2.0.11 source; live verification against mem0.bigb.es tracked in ah-ydx.3 | 0 | NULL | NULL | NULL | 0 | 2026-07-18T13:25:07Z | 0 | |||||||||||||||||||||||
| ah-ydx.2 | f548f321fdf44dbfaaa3c420a175ff8b3bea76ab1cf76d097509d87eeb461072 | internal/ctxpack: Context Pack builder | Deterministic prompt-context assembler per SPEC §14.3: ordered sections (task, comment thread, parent chain, memory, git log/diffstat) under a ~40k char budget, per-section truncate-from-tail with stable ordering so identical inputs render identical packs. Pure package + table tests first; wiring into runner PROMPT.md rendering is a separate integration step after wave 1 merges. | closed | 2 | feature | Eugene Blikh | NULL | 2026-07-18T13:23:56Z | Eugene Blikh | bigbes@gmail.com | 2026-07-18T13:41:11Z | 2026-07-18T13:41:11Z | NULL | 0 | NULL | NULL | NULL | 0 | 0 | 0 | �{} | internal/ctxpack merged to master (342410e); format contract pinned by golden tests; runner integration tracked in ah-ydx.3 | 0 | NULL | NULL | NULL | 0 | 2026-07-18T13:25:08Z | 0 | |||||||||||||||||||||||
| ah-ydx.3 | 16681b27f4960105b6ca27beabc1e8219b7b6edab3c59c243830102a1c17bd7a | Memory lifecycle: load-on-claim CONTEXT section, save-on-Done | Wire mem0 into the task loop per SPEC §14.3: on claim, search mem0 (proj scope + global) and render a memory section into the prompt context via ctxpack; on Done/Cancelled terminal scan (shares the ah-07g hook), save run summary/verdict facts back to mem0 (run_id='task:<id>'). Depends on the mem0 client, ctxpack, and the ah-07g terminal-state scan. | MEM0 SERVER HEALTHY (2026-07-18, after user-authorized override delete + restart): /configure now reflects env-of-truth (deepseek/deepseek-v4-flash + nvidia/nemotron-embed-1b-v2). FULL live smoke green: ADD infer=false 200/event=ADD; SEARCH 200 with score (embeddings ok); ADD infer=true 200 (LLM extraction ok); LIST/PURGE/EMPTY clean; bogus key 401. Server-side contract fully verified — lifecycle implementation unblocked once ah-07g lands the terminal-state hook. OPERATIONAL RULE: mem0 config is ENV-ONLY; never POST /configure (GET redacts secrets, round-trip corrupts stored creds — happened + fixed today, backup at phoebe:/root/mem0-settings-backup.sql); if a stored override reappears (dashboard onboarding creates one), delete settings row key=config_overrides + restart. | closed | 2 | feature | Eugene Blikh | NULL | 2026-07-18T13:23:57Z | Eugene Blikh | bigbes@gmail.com | 2026-07-18T16:22:33Z | 2026-07-18T16:22:33Z | NULL | 0 | NULL | NULL | NULL | 0 | 0 | 0 | �{} | Merged b761cbe: recall-on-claim (## Relevant memories via ctxpack, proj+global scopes, 15s budget, feature-off byte-identical) + save-on-Done (save→archive→prune ordering, infer=true, once-only via worktree signal, Cancelled excluded). Rollout: install MEM0_API_KEY in /etc/agent-hub/env, live-smoke recall block + one memory_saved event. | 0 | NULL | NULL | NULL | 0 | 2026-07-18T15:59:39Z | 0 | ||||||||||||||||||||||
| ah-ydx.4 | 082c3365aabe053240cf35195442ee1ca6547ba635899ad10f3319fea286fd7e | Full Context Pack: thread comments, parent chain, git log sections in prompt | ah-ydx.2's ctxpack renders only the memory section today. SPEC §14.3's full pack adds: board comment thread, parent-chain summaries (delegation), git log/diffstat of the branch — assembled with the memory section under the ~40k budget in canonical order. Backlog until the current prompt shape shows its limits in live runs. | closed | 3 | feature | Eugene Blikh | NULL | 2026-07-18T16:22:34Z | Eugene Blikh | bigbes@gmail.com | 2026-07-18T18:47:54Z | 2026-07-18T18:47:54Z | NULL | 0 | NULL | NULL | NULL | 0 | 0 | 0 | �{} | Full Context Pack live: thread + parent-chain + memory + git sections through one 40k-budget ctxpack build on the claim path; context_pack audit event; per-section graceful degradation. | 0 | NULL | NULL | NULL | 0 | 2026-07-18T18:19:54Z | 0 | |||||||||||||||||||||||
| ah-ziq | f6ed15a8569893a586511b86daf9a0cfc59c0fd794875182892371c1c8323d80 | yonote: comments.resolve 400s — live API requires isResolved boolean in body | Live re-smoke of the Q&A loop (ah-eje, task 5) proved comments.resolve is broken: the daemon's POST /api/comments.resolve got HTTP 400 invalid_type 'Invalid input: expected boolean, received undefined (isResolved)'. Yonote 1.47.1 requires an isResolved:true field in the resolve payload; our client sends only {id}. Deterministic — every resolve fails, answer delivery is unaffected (non-fatal WARN path worked as designed). Fix: add IsResolved to the resolve wire payload in internal/yonote/comments.go, adjust tests, re-verify live that a fresh qa question ends isResolved:true. | closed | 2 | bug | Eugene Blikh | NULL | 2026-07-19T18:11:32Z | Eugene Blikh | bigbes@gmail.com | 2026-07-19T18:21:38Z | 2026-07-19T18:21:38Z | NULL | 0 | NULL | NULL | NULL | 0 | 0 | 0 | �{} | Fixed in 2720611: resolve payload now {id, isResolved:true}. Live-verified (task 6 / comment 732b89b2): resolve succeeded, no WARN, comment isResolved:true. | 0 | NULL | NULL | NULL | 0 | 2026-07-19T18:11:47Z | 0 |