main · last commit
13 days ago ·
7g0stsfu
ah-ydx Stage 3: mem0 memory lifecycle + Context Pack
epic
Lined Up
bd update ah-ydx --claim
bd close ah-ydx
| Created by | Eugene Blikh |
| Owner | bigbes@gmail.com |
| Created | 2026-07-12T23:36:28Z |
| Updated | 2026-08-05T00:11:18Z |
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.
ah-ydx.1
— internal/mem0: REST client for live mem0.bigb.es
P2
closed
@Eugene Blikh
ah-ydx.2
— internal/ctxpack: Context Pack builder
P2
closed
@Eugene Blikh
ah-ydx.3
— Memory lifecycle: load-on-claim CONTEXT section, save-on-Done
P2
closed
@Eugene Blikh
ah-ydx.4
— Full Context Pack: thread comments, parent chain, git log sections in prompt
P3
closed
@Eugene Blikh
No outgoing dependencies.
ah-ydx.4
— Full Context Pack: thread comments, parent chain, git log sections in prompt
parent-child
ah-ydx.1
— internal/mem0: REST client for live mem0.bigb.es
parent-child
ah-ydx.3
— Memory lifecycle: load-on-claim CONTEXT section, save-on-Done
parent-child
ah-ydx.2
— internal/ctxpack: Context Pack builder
parent-child
ah-ydx.4
— Full Context Pack: thread comments, parent chain, git log sections in prompt
parent-child
closed
ah-ydx.1
— internal/mem0: REST client for live mem0.bigb.es
parent-child
closed
ah-ydx.3
— Memory lifecycle: load-on-claim CONTEXT section, save-on-Done
blocks
closed
ah-ydx.2
— internal/ctxpack: Context Pack builder
parent-child
closed
| id | ah-ydx |
| content_hash | 8735805091c14831debfbdb26c8f324f6832e8b80ebcc313e05201a7bd3c85f8 |
| title | Stage 3: mem0 memory lifecycle + Context Pack |
| description | 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). |
| design | |
| acceptance_criteria | |
| notes | 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. |
| status | open |
| priority | 3 |
| issue_type | epic |
| assignee | NULL |
| estimated_minutes | NULL |
| created_at | 2026-07-12T23:36:28Z |
| created_by | Eugene Blikh |
| owner | bigbes@gmail.com |
| updated_at | 2026-08-05T00:11:18Z |
| closed_at | NULL |
| closed_by_session | |
| external_ref | NULL |
| spec_id | |
| compaction_level | 0 |
| compacted_at | NULL |
| compacted_at_commit | NULL |
| original_size | NULL |
| sender | |
| ephemeral | 0 |
| wisp_type | |
| pinned | 0 |
| is_template | 0 |
| mol_type | |
| work_type | |
| source_system | |
| metadata | �{} |
| source_repo | |
| close_reason | |
| event_kind | |
| actor | |
| target | |
| payload | |
| await_type | |
| await_id | |
| timeout_ns | 0 |
| waiters | |
| hook_bead | |
| role_bead | |
| agent_state | |
| last_activity | NULL |
| role_type | |
| rig | |
| due_at | NULL |
| defer_until | NULL |
| no_history | 0 |
| started_at | NULL |
| is_blocked | 0 |
| issue_id | ah-ydx |
| label | milestone:v0.1.0 |
| id | 009fff20-73db-5b19-ae19-ffc0df92a7a8 |
| issue_id | ah-ydx.4 |
| type | parent-child |
| created_at | 2026-07-18T19:22:34Z |
| created_by | Eugene Blikh |
| metadata | �{} |
| thread_id | |
| depends_on_issue_id | ah-ydx |
| depends_on_wisp_id | NULL |
| depends_on_external | NULL |
| id | 2e39c703-6167-596b-98fb-9af66b96cae8 |
| issue_id | ah-ydx.1 |
| type | parent-child |
| created_at | 2026-07-18T16:23:55Z |
| created_by | Eugene Blikh |
| metadata | �{} |
| thread_id | |
| depends_on_issue_id | ah-ydx |
| depends_on_wisp_id | NULL |
| depends_on_external | NULL |
| id | 3125ac59-cda6-57f7-9a1a-88ec421121e4 |
| issue_id | ah-ydx.3 |
| type | parent-child |
| created_at | 2026-07-18T16:23:57Z |
| created_by | Eugene Blikh |
| metadata | �{} |
| thread_id | |
| depends_on_issue_id | ah-ydx |
| depends_on_wisp_id | NULL |
| depends_on_external | NULL |
| id | bb87d723-c711-5998-98e2-191cec2ed2ec |
| issue_id | ah-ydx.2 |
| type | parent-child |
| created_at | 2026-07-18T16:23:56Z |
| created_by | Eugene Blikh |
| metadata | �{} |
| thread_id | |
| depends_on_issue_id | ah-ydx |
| depends_on_wisp_id | NULL |
| depends_on_external | NULL |
| id | 019f58b0-7a39-74fd-ae5f-365c75d5aab6 |
| issue_id | ah-ydx |
| event_type | created |
| actor | Eugene Blikh |
| old_value | |
| new_value | |
| comment | NULL |
| created_at | 2026-07-13T02:36:28Z |
| id | 019f7cbe-baaa-769f-9fff-c7e58ddde3fc |
| issue_id | ah-ydx |
| event_type | updated |
| actor | Eugene Blikh |
| old_value | {"id":"ah-ydx","title":"Stage 3: mem0 memory lifecycle + Context Pack","description":"Per SPEC SS14.3: mem0 REST client (X-API-Key, scoping user_id=proj:\u003cslug\u003e/global, run_id=task:\u003cid\u003e — agent_id filter is buggy upstream); load cascade on claim -\u003e .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).","status":"open","priority":3,"issue_type":"epic","owner":"bigbes@gmail.com","created_at":"2026-07-12T23:36:28Z","created_by":"Eugene Blikh","updated_at":"2026-07-12T23:36:28Z"} |
| new_value | {"notes":"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 NEEDED: if the substitution is accepted, update the epic body + SPEC 14.3 wording and close this epic; otherwise the summarizer role is the one remaining piece."} |
| comment | NULL |
| created_at | 2026-07-20T02:38:22Z |
| id | 019f7cda-891b-7737-8967-e678cdd61df5 |
| issue_id | ah-ydx |
| event_type | label_added |
| actor | Eugene Blikh |
| old_value | NULL |
| new_value | NULL |
| comment | Added label: milestone:stage-3 |
| created_at | 2026-07-20T03:08:44Z |
| id | 019f7cdc-1843-7591-9c7a-0f4c4e8d64e0 |
| issue_id | ah-ydx |
| event_type | label_removed |
| actor | Eugene Blikh |
| old_value | NULL |
| new_value | NULL |
| comment | Removed label: milestone:stage-3 |
| created_at | 2026-07-20T03:10:26Z |
| id | 019f7cdc-faf0-7877-96dc-95718e698a7f |
| issue_id | ah-ydx |
| event_type | label_added |
| actor | Eugene Blikh |
| old_value | NULL |
| new_value | NULL |
| comment | Added label: milestone:v0.1.0 |
| created_at | 2026-07-20T03:11:24Z |
| id | 019fcf42-9fdc-743d-9ac2-ffa1b4b105ed |
| issue_id | ah-ydx |
| event_type | updated |
| actor | Eugene Blikh |
| old_value | {"id":"ah-ydx","title":"Stage 3: mem0 memory lifecycle + Context Pack","description":"Per SPEC SS14.3: mem0 REST client (X-API-Key, scoping user_id=proj:\u003cslug\u003e/global, run_id=task:\u003cid\u003e — agent_id filter is buggy upstream); load cascade on claim -\u003e .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).","notes":"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 NEEDED: if the substitution is accepted, update the epic body + SPEC 14.3 wording and close this epic; otherwise the summarizer role is the one remaining piece.","status":"open","priority":3,"issue_type":"epic","owner":"bigbes@gmail.com","created_at":"2026-07-12T23:36:28Z","created_by":"Eugene Blikh","updated_at":"2026-07-19T23:38:22Z","labels":["milestone:v0.1.0"]} |
| new_value | {"notes":"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.\n\nDECISION STILL NEEDED — analysis added 2026-08-05 to make it a one-line call.\n\nRECOMMENDATION: ACCEPT the substitution and close the epic.\n\nWhy the substitution is better than the design it replaced, not merely cheaper:\n- 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).\n- 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.\n- mem0's infer=true already does the extraction step a summarizer would have done, on the server, at the point of storage.\n\nWhat 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.\n\nIf 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.\n\nIf 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."} |
| comment | NULL |
| created_at | 2026-08-05T03:11:17Z |
No comments.