~bigbes/agents-dev · issues

g4hbdtqn1tu7bflo5gbgqvml37o68kc6 · 108 rows

idcontent_hashtitledescriptiondesignacceptance_criterianotesstatuspriorityissue_typeassigneeestimated_minutescreated_atcreated_byownerupdated_atclosed_atclosed_by_sessionexternal_refspec_idcompaction_levelcompacted_atcompacted_at_commitoriginal_sizesenderephemeralwisp_typepinnedis_templatemol_typework_typesource_systemmetadatasource_repoclose_reasonevent_kindactortargetpayloadawait_typeawait_idtimeout_nswaitershook_beadrole_beadagent_statelast_activityrole_typerigdue_atdefer_untilno_historystarted_atis_blocked
ah-xuc.8d48513a80bea7b4ebcfc74514ea6d2a7079500b44f1b1eebca7b445db6e316b7reconcile: spec-driven claim, Triage bounce, parked buckets, per-run timeoutClaim-path integration of Stage 2. Same-package constraint: this bead owns the internal/reconcile edits for the claim path; the finalize-path bead must not start until this one is committed. iterate(): canonical buckets triage/blocked/question become parked buckets — superviseRuntime only (detached supervision persists runtime truth; no claim, no kill, no card moves, no comments). They are never claim sources and never terminal targets. Blocked and Question get real semantics in Stage 4; Stage 2 only reserves and parks them. claim(): resolve the Task Spec via internal/spec from BoardTask.Labels plus Description. A validation failure bounces: MoveToBucket(triage) first, then one diagnostic comment listing the problems verbatim plus a hint to fix the spec and drag back to Ready, then event spec_rejected — move-then-comment discipline so a persistent move failure cannot spam comments; appendEvent dedup applies. No record is persisted and the card never goes to Failed for spec problems. Warnings (unknown fields) never block: append them to the claim comment. Success path: the spec role name resolves through cfg.Roles; model override applies; the prompt renders over the frontmatter-stripped Body; resolved SkillPaths go into StartSpec.Skills; the effective timeout (spec override or config default) goes into StartSpec.Timeout and is persisted as Run.Timeout. check(): deadline enforcement uses run.Timeout when positive, else cfg.Timeout — in both the running arm and the degraded neither-state arm. Extend fakes_test.go (fake runner captures Skills and Timeout; board tasks carry Labels) and cover: each bounce class end to end, merge precedence reaching StartSpec, parked buckets neither claim nor kill while detached supervision still finalizes a finished runtime, per-run timeout enforced at the right boundary with the fake clock — both shorter and longer than the config default.go test ./internal/reconcile/... green, go vet clean; bounce tests assert move-before-comment ordering and zero Failed transitions; parked-bucket tests assert no board writes; timeout tests cover run.Timeout smaller and larger than the config default Additional: pre-existing gofmt drift in internal/reconcile/reconcile_test.go (comment alignment around lines 983-984 and 1345, present since before Stage 2) — run gofmt -w on the files you touch and fold the fix into this bead's commit.closed2featureEugene BlikhNULL2026-07-13T05:16:00ZEugene Blikhbigbes@gmail.com2026-07-13T06:57:17Z2026-07-13T06:57:17ZNULL0NULLNULLNULL000�{}9823250 + 06_pin commit; review merge-ready (all SPEC section-10 invariants traced clean); validator 10/10 incl. e2e byte-identical for spec-less tasks; adopt-over-bounce coverage gap closed0NULLNULLNULL02026-07-13T06:23:38Z0
ah-xuc.95c6568a5b55170ea70ba05fb8c0af96dcfaf33b977424934bdb124f8c46e5c10reconcile: publish review branch, watchdog on stale events, Telegram notificationsFinalize-path integration of Stage 2. Starts only after the claim-path bead is committed (same package). Publish: in finalize, on the success path with moveCard set, call runner.Publish before posting the In Review comment. Zero PublishInfo = not configured, plain comment. Success adds a review link line (WebURL, falling back to RemoteURL plus branch) and appends event published. Failure degrades: the comment still posts with a push-failed line carrying the error, event publish_failed (deduped). A refinalize repeats the push — pushing an up-to-date branch is idempotent and fine. Watchdog: in the check() running arm, when cfg.StallTimeout > 0 and now minus max(st.LastEvent, run.StartedAt) exceeds StallTimeout, the run is stalled: kill and finalize with OutcomeStalled, exit -1 (share the timeoutKill shape). The neither-state arm stays deadline-only — no events are observable there. failureComment renders the stalled outcome distinctly (agent went silent, not merely slow). Notifications: Notify best-effort — log on error, never gate the flow, guard the nil notifier — after a successful move plus comment: finalize with moveCard (success and failure including timeout and stalled) and the spec bounce. Text: outcome emoji, task id and title, outcome word, cost when known, and the human task link built from vikunja web_url. Tests with fakes: the In Review comment contains the review link; publish failure still posts the comment; the stall kill fires just past the boundary and not before; a run with events flowing but past run.Timeout still dies by deadline; notify recorded after move and comment in that order; nil notifier safe; a notify failure does not fail finalize.go test ./internal/reconcile/... green, go vet clean; ordering asserted move then comment then notify; stalled and timeout outcomes distinguishable in comments, events, and notificationsCoordinator refinement: publishing arrives via a new optional reconcile Deps field of type ports.Publisher (nil-guarded like Notifier); finalize publishes only when the field is non-nil. cmd wires the runner into it in ah-xuc.10.closed2featureEugene BlikhNULL2026-07-13T05:16:07ZEugene Blikhbigbes@gmail.com2026-07-13T07:35:20Z2026-07-13T07:35:20ZNULL0NULLNULLNULL000�{}d5d1efc + 64a7216 (review fix: bounded publish ctx via publish_timeout knob, zero-delta recorder covers publish/notify); reviewer merge-ready after fix, validator 10/10 with all 24 subtests by name0NULLNULLNULL02026-07-13T06:57:43Z0
ah-ydx8735805091c14831debfbdb26c8f324f6832e8b80ebcc313e05201a7bd3c85f8Stage 3: mem0 memory lifecycle + Context PackPer 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.open3epicNULLNULL2026-07-12T23:36:28ZEugene Blikhbigbes@gmail.com2026-08-05T00:11:18ZNULLNULL0NULLNULLNULL000�{}0NULLNULLNULL0NULL0
ah-ydx.1942024e29b162a28d01e0bddbd3bf862f1ff8bf498c45bd03199c5a0dc916489internal/mem0: REST client for live mem0.bigb.esTyped 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.closed2featureEugene BlikhNULL2026-07-18T13:23:56ZEugene Blikhbigbes@gmail.com2026-07-18T13:41:11Z2026-07-18T13:41:11ZNULL0NULLNULLNULL000�{}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.30NULLNULLNULL02026-07-18T13:25:07Z0
ah-ydx.2f548f321fdf44dbfaaa3c420a175ff8b3bea76ab1cf76d097509d87eeb461072internal/ctxpack: Context Pack builderDeterministic 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.closed2featureEugene BlikhNULL2026-07-18T13:23:56ZEugene Blikhbigbes@gmail.com2026-07-18T13:41:11Z2026-07-18T13:41:11ZNULL0NULLNULLNULL000�{}internal/ctxpack merged to master (342410e); format contract pinned by golden tests; runner integration tracked in ah-ydx.30NULLNULLNULL02026-07-18T13:25:08Z0
ah-ydx.316681b27f4960105b6ca27beabc1e8219b7b6edab3c59c243830102a1c17bd7aMemory lifecycle: load-on-claim CONTEXT section, save-on-DoneWire 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.closed2featureEugene BlikhNULL2026-07-18T13:23:57ZEugene Blikhbigbes@gmail.com2026-07-18T16:22:33Z2026-07-18T16:22:33ZNULL0NULLNULLNULL000�{}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.0NULLNULLNULL02026-07-18T15:59:39Z0
ah-ydx.4082c3365aabe053240cf35195442ee1ca6547ba635899ad10f3319fea286fd7eFull Context Pack: thread comments, parent chain, git log sections in promptah-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.closed3featureEugene BlikhNULL2026-07-18T16:22:34ZEugene Blikhbigbes@gmail.com2026-07-18T18:47:54Z2026-07-18T18:47:54ZNULL0NULLNULLNULL000�{}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.0NULLNULLNULL02026-07-18T18:19:54Z0
ah-ziqf6ed15a8569893a586511b86daf9a0cfc59c0fd794875182892371c1c8323d80yonote: comments.resolve 400s — live API requires isResolved boolean in bodyLive 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.closed2bugEugene BlikhNULL2026-07-19T18:11:32ZEugene Blikhbigbes@gmail.com2026-07-19T18:21:38Z2026-07-19T18:21:38ZNULL0NULLNULLNULL000�{}Fixed in 2720611: resolve payload now {id, isResolved:true}. Live-verified (task 6 / comment 732b89b2): resolve succeeded, no WARN, comment isResolved:true.0NULLNULLNULL02026-07-19T18:11:47Z0