padqlnqlfss9pii6i7fsk23th5aumolk · 454 rows
| id | issue_id | event_type | actor | old_value | new_value | comment | created_at |
|---|---|---|---|---|---|---|---|
| 019f75fc-fa59-73c0-9b78-8f13c2fb7d69 | ah-25e | updated | Eugene Blikh | {"id":"ah-25e","title":"Yonote publish lane: .task/publish.json → bot-authored docs at finalize","description":"Why: the operator wants agents to publish specs/reports/answers INTO Yonote instead of committing them to the project repo — with the write credential never entering the agent's environment. What: a third finalize-time file channel in the SPEC §14.4 family (tasks.json, question.json): the agent writes markdown under .task/publish/ and declares it in .task/publish.json {documents:[{title, file, collection_id?, parent_url?}]}; on successful finalize the daemon creates the docs via the internal/yonote client under the BOT token (publish:true, target = yonote.publish_collection_id or per-entry override, optional nesting under a referenced doc), comments the resulting URLs on the card, emits a yonote_published event. Publish failures never change the run outcome. wave 2.5 — implement after feat/wave2-archive-links merges. Depends on ah-gxa (client: CreateDocument/DocumentInfo) and ah-2lh (yonote config block + prepareTaskDir channel-clearing site).","design":"# Yonote publish lane: .task/publish.json → bot-authored docs at finalize\n\nAgents publish specs/reports/answers INTO Yonote instead of committing them to the project repo.\nThe agent declares intent via a file channel; the daemon executes with ITS bot token at finalize\nand links results on the card.\n\n## Why file-channel, not direct API access from the agent (DECISION)\n\nThe agent must never hold the Yonote token: worktrees run arbitrary generated code; `.task/` is\narchived to tar.gz at Done (a token in env or files would fossilize into archives); per-run env\nplumbing would put a write-capable credential into every zellij session. The daemon already owns a\nfinalize-time file-channel protocol with exactly the right semantics — `.task/tasks.json`\n(delegation) and `.task/question.json` (ask-user), SPEC §14.4: agent writes declarative intent,\ndaemon acts with its own credentials, results land as card comments. Publishing is the third\nchannel of that family. Attribution lands on the BOT user — uniform and auditable.\n\n## Channel format\n\n`.task/publish.json` (attempt-scoped; cleared in prepareTaskDir alongside summary/tasks/question):\n\n {\"documents\": [\n {\"title\": \"Design: frobnicator\", \"file\": \"publish/design.md\",\n \"collection_id\": \"\", \"parent_url\": \"\"}\n ]}\n\n- title: required, non-empty, ≤255 chars (Yonote bot/user name limits suggest 255 conventions).\n- file: required; RELATIVE path resolved under `.task/` (convention: agents put content in\n `.task/publish/\u003cname\u003e.md`). Guard rigor as repo-slug F8: reject absolute paths, filepath.Clean\n must stay under .task/, and the opened file must not escape via symlink (os.Root / EvalSymlinks\n containment check).\n- collection_id: optional uuid overriding the config default target.\n- parent_url: optional Yonote doc URL → resolve via yonote.ParseDocRefs(single) + DocumentInfo →\n parentDocumentId, so a report can nest under the spec it answers (documents.create\n parentDocumentId is v1-spec'd; child creation itself NOT live-verified — verify in tests against\n httptest only, live during rollout).\n- Caps: maxPublishDocs = 3 per run; maxPublishBytes = 512 KiB per file. No server-side text limit\n was verified — cap defensively; an oversize entry FAILS (listed in the comment), never truncated.\n\nRead at SUCCESSFUL finalize only, same site and semantics as readTasksFile: absent → nil (common\ncase); present-but-unparseable → same bounce treatment as a malformed tasks.json (do not silently\ndrop agent intent).\n\n## Config\n\nThe `yonote` block (introduced by the materialization bead) gains:\n\n publish_collection_id: \"…\" # uuid; the default target collection\n\nValidation: when set, must be a UUID shape; lane is ACTIVE only when the yonote client is\nconfigured AND publish_collection_id is set. When the client is configured but the collection is\nnot, publish.json entries all fail visibly with \"publishing not configured\" in the card comment —\nnever silently ignored. Operational prerequisite (document next to the config): the BOT must have\nread_write on the target collection (collections.add_user — client-bead runbook step 3).\n\n## Daemon flow (finalize, success path, after summary/tasks/question handling)\n\nPer entry (≤3, in file order): resolve target collection (override or default) → resolve\nparent_url if set (its failure fails ONLY that entry) → read + cap content →\nCreateDocument{Title, CollectionID, ParentDocumentID, Text: content, Publish: true} → record\n{Title, absURL = cfg base_url + doc.URL} or {Title, err}.\n\n- Card comment (goes through the existing markdownToHTML comment path):\n published to Yonote:\n - \u003cTitle\u003e → \u003cabs url\u003e\n - \u003cTitle\u003e → FAILED: \u003cmessage\u003e\n- appendEvent \"yonote_published\" {\"ok\": n, \"failed\": m}.\n- Publish failures NEVER change the run outcome — the run already succeeded; publication is a\n side effect. Operator retries by re-running, or publishes manually from the archived tar.gz\n (the content survives there by construction).\n- Idempotency (DECISION): re-running a card re-publishes and creates a NEW doc. Accepted for v1 —\n re-runs are rare, docs are cheap, and dedup would need a doc-id echo channel; revisit only if it\n annoys in practice (then: UpdateDocument by echoed id).\n\n## Agent contract (role-prompt snippet, config-side; document in deploy notes)\n\n To publish a document to Yonote: write markdown to .task/publish/\u003cname\u003e.md and declare it in\n .task/publish.json as {\"documents\":[{\"title\":\"…\",\"file\":\"publish/\u003cname\u003e.md\"}]}. Publication\n happens AFTER your run succeeds; resulting links are posted on the task card.\n\n## Tests\n\n- reader: absent → nil; malformed → tasks.json-parity bounce; \u003e3 entries; empty title; path\n guards (absolute, .., symlink escape); oversize file.\n- finalize with fake yonote writer (interface seam: CreateDocument + DocumentInfo): 2 ok + 1 fail\n → comment body lines, event payload, run outcome unchanged; lane-off (no collection id) →\n \"publishing not configured\" per entry; parent_url resolve failure isolates the entry;\n collection_id override honored.\n- prepareTaskDir clears publish.json + the publish/ dir between attempts.\n\nwave 2.5 — implement after feat/wave2-archive-links merges. Depends on: internal/yonote client\nbead (CreateDocument/DocumentInfo), materialization bead (yonote config block + prepareTaskDir\nchannel-clearing site).\n","notes":"ROLLOUT LIVE-SMOKE CHECKLIST (from wave-2.5 implementer, against bigbes.yonote.ru after deploy): 1) mint bot per ah-gxa runbook (POST /api/v2/bots + token, collections.add_user grant — grant call is spec-only, NOT live-verified), AuthInfo under bot token must show IsBot=true (daemon WARNs at startup otherwise); 2) documents.create with parentDocumentId (child nesting unverified live) + bot WRITE rights on publish_collection_id + publish:true attribution to bot; 3) archived-doc export ((archived) marker path); 4) ExportMarkdown empty-string cases (API-created never-edited draft, database-type doc) fall back to .text; 5) comments.create/list/resolve field names (only Q\u0026A bead ah-ptu uses them). SEMANTICS NOTE: publish fires on ROUTED successful runs too (inside firstFinalize\u0026\u0026success before maybeRoute) — a design stage with publish.json publishes before routing to review; intentional. publish_collection_id (UUID) must be chosen by operator at config staging.","status":"closed","priority":2,"issue_type":"feature","assignee":"Eugene Blikh","owner":"bigbes@gmail.com","created_at":"2026-07-18T15:04:25Z","created_by":"Eugene Blikh","updated_at":"2026-07-18T15:59:08Z","started_at":"2026-07-18T15:06:57Z","closed_at":"2026-07-18T15:59:08Z","close_reason":"Merged to master f9a7b4b (3 commits 6c9e259/a25b692/f9a7b4b): yonote client + claim-time artifact materialization + publish lane. Live smoke at rollout per ah-25e notes."} | {"notes":"\n ROLLOUT LIVE-SMOKE CHECKLIST (from wave-2.5 implementer, against \n bigbes.yonote.ru after deploy): 1) mint bot per ah-gxa runbook (POST \n /api/v2/bots + token, collections.add_user grant — grant call is spec-only, \n NOT live-verified), AuthInfo under bot token must show IsBot=true (daemon \n WARNs at startup otherwise); 2) documents.create with parentDocumentId \n (child nesting unverified live) + bot WRITE rights on publish_collection_id \n + publish:true attribution to bot; 3) archived-doc export ((archived) marker\n path); 4) ExportMarkdown empty-string cases (API-created never-edited draft,\n database-type doc) fall back to .text; 5) comments.create/list/resolve field\n names (only Q\u0026A bead ah-ptu uses them). SEMANTICS NOTE: publish fires on \n ROUTED successful runs too (inside firstFinalize\u0026\u0026success before maybeRoute)\n — a design stage with publish.json publishes before routing to review; \n intentional. publish_collection_id (UUID) must be chosen by operator at \n config staging. \n\n\n\nDEPENDS ON\n → ✓ ah-2lh: Claim-time Yonote artifact materialization into .task/artifacts/ + prompt manifest ● P2\n → ✓ ah-gxa: internal/yonote: light API client (doc resolve/export, create, comments; bot-token auth) ● P2\n\nBLOCKS\n ← ○ ah-ptu: Yonote Q\u0026A bot loop: poll doc comments, answer via board tasks (post-wave-2.5) ● P3\n\nROLLOUT FACTS (2026-07-18, live-verified): bot agenthub id=34fbc9a3-ec75-4722-a01f-805db3f3ff1b (v2 create needs username field — used bigbes@gmail.com); token agent-1-daemon installed as YONOTE_TOKEN in /etc/agent-hub/env; auth.info isBot=true CONFIRMED; collections.add_user CONFIRMED; Agents collection 8656642e-0297-4d69-b6fb-4246517a015b = publish_collection_id, bot read_write. CAVEAT: bot sees ALL team-default-readable collections (not grant-scoped) — operator may tighten per-collection perms in UI. Config staging after CI deploy: yonote{base_url: https://bigbes.yonote.ru, token: ${YONOTE_TOKEN}, publish_collection_id: 8656642e-0297-4d69-b6fb-4246517a015b}."} | NULL | 2026-07-18T19:09:01Z |
| 019f7609-5df3-7e2c-9c47-040780bda56d | ah-ydx.3 | closed | Eugene Blikh | 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. | NULL | 2026-07-18T19:22:33Z | |
| 019f7609-61b6-7e0d-8001-0288bc028518 | ah-ydx.4 | created | Eugene Blikh | NULL | 2026-07-18T19:22:34Z | ||
| 019f7609-8a21-7553-a4f0-84f8ae3a598d | ah-0ge.6 | claimed | Eugene Blikh | {"id":"ah-0ge.6","title":"HTTP tools API: per-task bearer tokens + ahub tool CLI over loopback","description":"SPEC §14.4 transport for MID-RUN agent tools (task-create/ask-user without stopping): daemon loopback HTTP with per-task bearer tokens minted at claim (exposed via .task/ env), 'ahub tool \u003cname\u003e' CLI subcommands, server-side policies (Triage-only, gen\u003c=2, per-session caps, dedup, project allowlist). File channel already covers stop-and-resume — this is the deferrable last item of the approved slate.","status":"open","priority":3,"issue_type":"feature","owner":"bigbes@gmail.com","created_at":"2026-07-18T13:23:55Z","created_by":"Eugene Blikh","updated_at":"2026-07-18T13:23:55Z"} | {"assignee":"Eugene Blikh","status":"in_progress"} | NULL | 2026-07-18T19:22:44Z |
| 019f762f-44ca-7298-9cde-de27ea37fa07 | ah-0ge.6 | closed | Eugene Blikh | Merged 07bd9d4+03f4496: per-task 256-bit bearer tokens (.task/tool-auth.json, constant-time check, invalidated at finalize, in-memory registry), /api/tool/{task-create,ask-user,answer} reusing file-channel policy code, ahub tool CLI. Additive — file channels intact. Live smoke list in agent report; note stall_timeout must exceed ask-user poll deadline. | NULL | 2026-07-18T20:03:57Z | |
| 019f762f-4823-7217-b97b-b10938092085 | ah-2ef | created | Eugene Blikh | NULL | 2026-07-18T20:03:57Z | ||
| 019f762f-49ac-7065-b058-8639a8458aeb | ah-0ge | closed | Eugene Blikh | All 6 children done: file-channel tools (.1-.4), AgentsView pipeline + deep links (.5), HTTP tools API (.6). Stage 4 complete pending live rollout smoke. | NULL | 2026-07-18T20:03:58Z | |
| 019f7635-1d03-7d7d-b43c-da563b57494a | ah-58f | created | Eugene Blikh | NULL | 2026-07-18T20:10:20Z | ||
| 019f7645-975e-7abe-b537-ae710a4e94ca | ah-58f | claimed | Eugene Blikh | {"id":"ah-58f","title":"ahub tool answer without an outstanding question echoes the latest comment as the answer","description":"Live smoke 2026-07-18: on a freshly claimed card (no ask-user issued), 'ahub tool answer' exited 0 and printed the claim comment's raw HTML as the answer. detectAnswer treats any latest-comment-without-sentinel as an answer; it should require that an asked-sentinel comment exists (an outstanding question) before anything counts as an answer, else 204/no-answer. Also consider stripping HTML for CLI output. Low impact (agents call answer after ask-user), found during rollout smoke.","status":"open","priority":3,"issue_type":"bug","owner":"bigbes@gmail.com","created_at":"2026-07-18T17:10:20Z","created_by":"Eugene Blikh","updated_at":"2026-07-18T17:10:20Z"} | {"assignee":"Eugene Blikh","status":"in_progress"} | NULL | 2026-07-18T20:28:20Z |
| 019f7645-98b2-7003-ac34-87a4576b493b | ah-2ef | claimed | Eugene Blikh | {"id":"ah-2ef","title":"e2e suite rare timing flake (1 FAIL in ~5 runs observed 2026-07-18)","description":"During wave-4 verification one 'go test -tags e2e ./e2e' run printed FAIL while 4 adjacent runs passed (12.6-13.3s). Failing subtest name was not captured (output was filtered). The suite has timing-sensitive subtests (500ms-deadline timeout path, stall watchdog). Next occurrence: rerun with -v, capture the failing subtest, then either widen its deadline margins or de-flake the poll. Not tied to wave-4 changes (harness timing predates them).","status":"open","priority":3,"issue_type":"bug","owner":"bigbes@gmail.com","created_at":"2026-07-18T17:03:58Z","created_by":"Eugene Blikh","updated_at":"2026-07-18T17:03:58Z"} | {"assignee":"Eugene Blikh","status":"in_progress"} | NULL | 2026-07-18T20:28:20Z |
| 019f7653-5d83-79c0-98fd-9ffa543e6067 | ah-58f | closed | Eugene Blikh | Merged 75b9a54: detectAnswer now requires an outstanding question (last asked-marker must exist with a comment after it) and returns plain text (dep-free HTML strip). BONUS CATCH: today's ah-bkr markdown→HTML conversion had silently broken raw-sentinel matching against live Vikunja-stored comments (escaped form) — detection now keys on the delimiter-free marker core present in both forms, repairing the live question loop before anyone hit it. | NULL | 2026-07-18T20:43:22Z | |
| 019f7671-2362-7a64-a939-4314ac5b06ed | ah-2ef | closed | Eugene Blikh | Merged (fix/runner, reworded from 5f70d17): Status() read events.jsonl before exit.json confirmed completion; a poll straddling a fast exit froze empty PiSessionID/CostUSD into the immutable run row. Both applyExit sites now re-parse the confirmed-complete stream. Reproduced under stress with instrumentation; 26/26 clean unstressed + 13 race runs clean; e2e x3 green at merge. | NULL | 2026-07-18T21:15:53Z | |
| 019f7674-cd39-7b71-b8aa-6e354dfe3552 | ah-ptu | claimed | Eugene Blikh | {"id":"ah-ptu","title":"Yonote Q\u0026A bot loop: poll doc comments, answer via board tasks (post-wave-2.5)","description":"Why: the operator wants to ask questions as comments on Yonote docs (e.g. on agent-published reports) and have the bot answer in-thread. What: a polling loop (daemon has no public ingress — loopback-only listen — so webhooks are out for now) over events.list filtered to comments.create since a persisted cursor; qualifying comments spawn a question-answer board card whose description carries the doc URL (ah-2lh materialization then feeds the agent the doc as context); the answer is delivered via comments.create (parentCommentId threading) + optional comments.resolve under the bot identity. EXPLICITLY NOT wave 2.5: needs cursor persistence, a second poll loop, trigger-convention + mention-encoding verification, and a reply-channel decision. Depends on ah-gxa (comments methods; extend with ListEvents when picked up) and ah-25e (reply channel + bot write provisioning).","design":"# Yonote Q\u0026A bot loop (post-wave-2.5 — honest scope, NOT part of wave 2.5)\n\nGoal: the operator asks questions IN Yonote (comments on docs — e.g. on agent-published reports\nor on specs); the bot notices, an agent produces the answer, the bot replies in-thread and\nresolves the comment.\n\n## Verified surface this builds on (2026-07-18, bigbes.yonote.ru 1.47.1)\n\n- comments.list {entityId, isResolved filter, threadId, limit ≤100, offset} → {data:{comments:[…]},\n pagination, total} — LIVE-verified (nested envelope; items carry threadId, isResolved,\n threadCommentsCount, attachments).\n- comments.create {entityType:\"document\", entityId, text, parentCommentId} → {data:{comment}} —\n LIVE-verified end-to-end on a probe doc: text stored verbatim (plain string), threading via\n parentCommentId; a reply's threadId points at the root comment.\n- comments.resolve {id, isResolved} → data.comment — spec'd (v2-preview), plus the product MCP\n server exposes yonote_resolve_comment, so the surface is real.\n- events.list POST {name, actorId, documentId, collectionId, limit, offset, sort/direction} —\n LIVE-verified (returned {pagination, data:[{id, name, actorId, actor, documentId, collectionId,\n createdAt, data, modelId}]}); the `name` filter (\"objects.verb\", e.g. \"comments.create\") is\n spec'd — server-side event filtering makes cheap incremental polling possible.\n- webhookSubscriptions.list responds LIVE (empty list) though it is UNDOCUMENTED in both Yonote\n OpenAPI specs (Outline heritage; auth.info policies include create/listWebhookSubscription).\n BUT the daemon binds loopback-only (config validateLoopback) with no public ingress, so v1\n transport = POLLING events.list; webhooks stay a documented future option if ingress appears.\n\n## Sketch (design decisions OPEN — settle when picked up)\n\n- Poll loop: own ticker (~60s), separate from the reconcile tick; cursor persisted in the store\n (new kv row, e.g. yonote_cursor = last seen event id/createdAt). MUST verify then: events.list\n ordering + Sorting params for reliable incremental reads (direction/sort exist in the Pagination\n /Sorting schemas but were not exercised).\n- Trigger filter (pick one): (a) new unresolved comments on docs AUTHORED BY THE BOT\n (createdById == bot user id from AuthInfo) — simplest, covers \"questions about agent output\";\n (b) explicit @mention of the bot — mention ENCODING in comment text is UNVERIFIED (probe stored\n plain text verbatim; the editor may encode mentions as structured nodes invisible to .text);\n (c) any unresolved comment in configured collections.\n- Self-trigger guard: ignore events with actorId == bot user id.\n- Answer path: reuse the whole existing pipeline — create a board card (existing CreateTask port,\n agent_tasks bucket conventions) of a question-answer task type whose description contains the\n doc URL (the materialization bead then auto-exports the doc as context for the agent!) plus the\n question thread text; the agent writes the answer; the daemon replies via comments.create with\n parentCommentId = thread root and optionally comments.resolve. Reply delivery needs either a\n small extension of the publish channel ({\"reply_to_comment\": …}) or a dedicated\n .task/answer.json — decide at design time.\n\n## Why not wave 2.5\n\nNeeds cursor persistence, a second poll loop, trigger-convention and mention-encoding\nverification, and a reply file-channel decision — none of which artifact materialization or the\npublish lane depend on. Client extensions required when picked up: ListEvents (events.list) and\npossibly webhookSubscriptions.* — add to internal/yonote then, not now.\n\nDepends on: internal/yonote client bead (comments methods land there), publish-lane bead (reply\nchannel shape + bot write provisioning).\n","notes":"Live evidence (2026-07-18): events.list POST works — {pagination, data:[{id, name, actorId, actor, documentId, collectionId, createdAt, data, modelId}]}, event names 'objects.verb' (observed documents.permanent_delete from the trash-purge cron); the name/actorId/documentId/collectionId request filters are v1-spec'd. comments.create/list verified end-to-end on the probe doc (threading via parentCommentId; replies carry threadId of the root; text stored verbatim). comments.resolve spec'd + present as yonote_resolve_comment in the product's own MCP server. webhookSubscriptions.list responds live (empty, UNDOCUMENTED in both OpenAPI specs — Outline heritage; auth.info policies include createWebhookSubscription) — future option only, blocked on public ingress. UNVERIFIED for pickup: events.list ordering/Sorting params for reliable incremental cursors; @mention encoding inside comment text (probe stored plain text; the editor may use structured nodes invisible in .text — trigger option (a) 'comments on bot-authored docs' avoids the question entirely).","status":"open","priority":3,"issue_type":"feature","owner":"bigbes@gmail.com","created_at":"2026-07-18T15:04:41Z","created_by":"Eugene Blikh","updated_at":"2026-07-18T15:04:41Z"} | {"assignee":"Eugene Blikh","status":"in_progress"} | NULL | 2026-07-18T21:19:54Z |
| 019f7674-ce91-7e86-bbe2-df5599853c11 | ah-ydx.4 | claimed | Eugene Blikh | {"id":"ah-ydx.4","title":"Full Context Pack: thread comments, parent chain, git log sections in prompt","description":"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.","status":"open","priority":3,"issue_type":"feature","owner":"bigbes@gmail.com","created_at":"2026-07-18T16:22:34Z","created_by":"Eugene Blikh","updated_at":"2026-07-18T16:22:34Z"} | {"assignee":"Eugene Blikh","status":"in_progress"} | NULL | 2026-07-18T21:19:54Z |
| 019f768e-49a0-79b8-ac80-460a1dc39ee0 | ah-eje | created | Eugene Blikh | NULL | 2026-07-18T21:47:44Z | ||
| 019f768e-6c3c-7213-b14d-2bbf0b22157c | ah-ptu | closed | Eugene Blikh | Implemented: events.list poll loop w/ kv cursor + exactly-once spawn, threaded answer delivery via answer.json, config yonote.qa block, store v5, prompts/qa.md. Rollout/live-verify tracked in ah-eje. | NULL | 2026-07-18T21:47:53Z | |
| 019f768e-6e3b-785c-aa92-bf5916c183bc | ah-ydx.4 | closed | Eugene Blikh | 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. | NULL | 2026-07-18T21:47:53Z | |
| 019f76d5-01e0-72bf-b7c2-d2a5a5abb2a6 | ah-eje | claimed | Eugene Blikh | {"id":"ah-eje","title":"Q\u0026A loop rollout: live-verify events.list ordering + comments.resolve, wire qa role/config on agent-1","description":"ah-ptu shipped the Q\u0026A loop code-complete with two surfaces deliberately marked live-UNVERIFIED: (1) events.list Sort/Direction params (the poll tolerates any page order via cursor filtering, but a \u003e100-events-per-poll gap warning fires blind until ordering is confirmed); (2) comments.resolve (spec-only v2-preview; config yonote.qa.resolve defaults off until smoke-tested). Rollout steps: deploy master (CI overlays prompts/qa.md automatically), hand-edit /etc/agent-hub/agenthub.yaml on agent-1 (config is NOT CI-managed): add a qa role (model + prompts/qa.md) and the yonote.qa block (enabled, role, collections default to publish_collection_id), restart agenthubd, then smoke: comment a question on a bot-published doc, watch the card spawn/answer, verify the threaded reply; flip resolve: true and verify comments.resolve works before recommending it.","status":"open","priority":2,"issue_type":"task","owner":"bigbes@gmail.com","created_at":"2026-07-18T18:47:44Z","created_by":"Eugene Blikh","updated_at":"2026-07-18T18:47:44Z"} | {"assignee":"Eugene Blikh","status":"in_progress"} | NULL | 2026-07-18T23:04:58Z |
| 019f78ca-8063-705d-b0ed-995ba077b363 | ah-eje | updated | Eugene Blikh | {"id":"ah-eje","title":"Q\u0026A loop rollout: live-verify events.list ordering + comments.resolve, wire qa role/config on agent-1","description":"ah-ptu shipped the Q\u0026A loop code-complete with two surfaces deliberately marked live-UNVERIFIED: (1) events.list Sort/Direction params (the poll tolerates any page order via cursor filtering, but a \u003e100-events-per-poll gap warning fires blind until ordering is confirmed); (2) comments.resolve (spec-only v2-preview; config yonote.qa.resolve defaults off until smoke-tested). Rollout steps: deploy master (CI overlays prompts/qa.md automatically), hand-edit /etc/agent-hub/agenthub.yaml on agent-1 (config is NOT CI-managed): add a qa role (model + prompts/qa.md) and the yonote.qa block (enabled, role, collections default to publish_collection_id), restart agenthubd, then smoke: comment a question on a bot-published doc, watch the card spawn/answer, verify the threaded reply; flip resolve: true and verify comments.resolve works before recommending it.","status":"in_progress","priority":2,"issue_type":"task","assignee":"Eugene Blikh","owner":"bigbes@gmail.com","created_at":"2026-07-18T18:47:44Z","created_by":"Eugene Blikh","updated_at":"2026-07-18T20:04:59Z","started_at":"2026-07-18T20:04:59Z"} | {"notes":"LIVE FINDINGS (2026-07-19, bigbes.yonote.ru 1.47.1): (1) the instance writes NO audit events for comments — event kinds observed: documents.publish/delete/permanent_delete, revisions.create, collections.create; a fresh comment produced no event at all. (2) events.list 'name' filter is silently IGNORED (requested comments.create, got documents.publish/revisions.create back). (3) Default ordering IS newest-first; offset pages into the past; sort/direction change nothing. =\u003e events transport unusable for comment detection; pivoted to documents.list+comments.list sweep (commit f81830c, deployed build #231). Baseline correctly initialized at 2026-07-19T04:50:04.043Z (the pre-pivot probe comment). Spawn verified live: comment d54ceab2 @05:02:32 -\u003e card task 4 @05:02:54 -\u003e run started 05:03:15. comments.resolve still UNVERIFIED (resolve: false in prod config). Config on agent-1 edited by operator (backup agenthub.yaml.bak.20260719-044552): qa role (litellm/coder + /opt/agent-hub/prompts/qa.md) + yonote.qa block watching the Agents collection 8656642e."} | NULL | 2026-07-19T08:12:44Z |
| 019f78e1-caf4-7c77-932b-5cb2986a4897 | ah-tqc | created | Eugene Blikh | NULL | 2026-07-19T08:38:11Z | ||
| 019f7b93-813d-797d-863e-ed930143a6a8 | ah-ziq | created | Eugene Blikh | NULL | 2026-07-19T21:11:32Z | ||
| 019f7b93-bc19-7693-b893-6f5a94880cba | ah-ziq | claimed | Eugene Blikh | {"id":"ah-ziq","title":"yonote: comments.resolve 400s — live API requires isResolved boolean in body","description":"Live re-smoke of the Q\u0026A 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.","status":"open","priority":2,"issue_type":"bug","owner":"bigbes@gmail.com","created_at":"2026-07-19T18:11:32Z","created_by":"Eugene Blikh","updated_at":"2026-07-19T18:11:32Z"} | {"assignee":"Eugene Blikh","status":"in_progress"} | NULL | 2026-07-19T21:11:47Z |
| 019f7b9c-bd80-789b-a127-b51b189577a8 | ah-ziq | closed | Eugene Blikh | Fixed in 2720611: resolve payload now {id, isResolved:true}. Live-verified (task 6 / comment 732b89b2): resolve succeeded, no WARN, comment isResolved:true. | NULL | 2026-07-19T21:21:37Z | |
| 019f7b9c-bf90-78ca-8153-517e27382927 | ah-eje | closed | Eugene Blikh | Q&A loop live-verified end-to-end three times over. Final smoke (task 6): comment 18:13:59 → card 18:14:32 → 35s real run → threaded bot reply 18:15:27 → source comment resolved → card in_review, exactly-once held throughout. Both rollout defects found and fixed: qa role model litellm/coder→litellm/deepseek/deepseek-v4-flash (config, agent-1), comments.resolve missing isResolved boolean (2720611, ah-ziq). Remaining hardening tracked in ah-tqc. | NULL | 2026-07-19T21:21:38Z | |
| 019f7cbd-b229-7111-a075-aae6e0f87ba4 | ah-1cx | created | Eugene Blikh | NULL | 2026-07-20T02:37:14Z | ||
| 019f7cbd-bf64-70b3-9d6a-2d2616b62526 | ah-efe | created | Eugene Blikh | NULL | 2026-07-20T02:37:17Z | ||
| 019f7cbd-e63e-7d32-84c4-b86cf043f6f2 | ah-1cx.1 | created | Eugene Blikh | NULL | 2026-07-20T02:37:27Z | ||
| 019f7cbd-f533-72d6-8f31-87f8a7699fbb | ah-1cx.2 | created | Eugene Blikh | NULL | 2026-07-20T02:37:31Z | ||
| 019f7cbe-045f-78ba-9327-3f5f5c0d7e58 | ah-1cx.3 | created | Eugene Blikh | NULL | 2026-07-20T02:37:35Z | ||
| 019f7cbe-12dc-77f7-ba0a-4b9a1e0ce934 | ah-1cx.4 | created | Eugene Blikh | NULL | 2026-07-20T02:37:39Z | ||
| 019f7cbe-35a4-7a12-8407-175c75a23c29 | ah-1cx.5 | created | Eugene Blikh | NULL | 2026-07-20T02:37:48Z | ||
| 019f7cbe-405a-747c-99eb-bc77ac70e6d2 | ah-1cx.6 | created | Eugene Blikh | NULL | 2026-07-20T02:37:50Z | ||
| 019f7cbe-4e8c-728c-a415-4f4fae1e4959 | ah-1cx.7 | created | Eugene Blikh | NULL | 2026-07-20T02:37:54Z | ||
| 019f7cbe-8253-753b-aa84-c291eb7768f9 | ah-efe.1 | created | Eugene Blikh | NULL | 2026-07-20T02:38:07Z | ||
| 019f7cbe-91b9-7c2d-8f6c-810e841ebece | ah-efe.2 | created | Eugene Blikh | NULL | 2026-07-20T02:38:11Z | ||
| 019f7cbe-9d66-7cd5-94ab-739eb7335c50 | ah-efe.3 | created | Eugene Blikh | NULL | 2026-07-20T02:38:14Z | ||
| 019f7cbe-a714-7ab6-af8f-790ab9096a6d | ah-efe.4 | created | Eugene Blikh | NULL | 2026-07-20T02:38:17Z | ||
| 019f7cbe-b24e-7a64-a679-9454182edf73 | ah-oeq.1 | created | Eugene Blikh | NULL | 2026-07-20T02:38:20Z | ||
| 019f7cbe-baaa-769f-9fff-c7e58ddde3fc | ah-ydx | updated | Eugene Blikh | {"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"} | {"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."} | NULL | 2026-07-20T02:38:22Z |
| 019f7cda-28ec-7664-b8d0-326cbb7a190e | ah-1cx | label_added | Eugene Blikh | NULL | NULL | Added label: milestone:hardening | 2026-07-20T03:08:19Z |
| 019f7cda-2a1a-7075-b1d9-c6aaeb66af8b | ah-1cx.1 | label_added | Eugene Blikh | NULL | NULL | Added label: milestone:hardening | 2026-07-20T03:08:20Z |
| 019f7cda-2a1a-7e2c-a94c-8b2b6c8d721b | ah-tqc | label_added | Eugene Blikh | NULL | NULL | Added label: milestone:hardening | 2026-07-20T03:08:20Z |
| 019f7cda-2a1b-7829-95c9-cc8f441a7e81 | ah-1cx.4 | label_added | Eugene Blikh | NULL | NULL | Added label: milestone:hardening | 2026-07-20T03:08:20Z |
| 019f7cda-2a1c-721e-b6d3-0fe71f84d374 | ah-1cx.3 | label_added | Eugene Blikh | NULL | NULL | Added label: milestone:hardening | 2026-07-20T03:08:20Z |
| 019f7cda-2a1c-7ad5-b06b-ba03c76c502d | ah-1cx.2 | label_added | Eugene Blikh | NULL | NULL | Added label: milestone:hardening | 2026-07-20T03:08:20Z |
| 019f7cda-2a1d-79e3-82a3-f15553e6e52f | ah-1cx.7 | label_added | Eugene Blikh | NULL | NULL | Added label: milestone:hardening | 2026-07-20T03:08:20Z |
| 019f7cda-2a1e-75ff-9891-444911d1748c | ah-1cx.6 | label_added | Eugene Blikh | NULL | NULL | Added label: milestone:hardening | 2026-07-20T03:08:20Z |
| 019f7cda-2a1f-7ce8-8d6a-43feb177a5ba | ah-1cx.5 | label_added | Eugene Blikh | NULL | NULL | Added label: milestone:hardening | 2026-07-20T03:08:20Z |
| 019f7cda-2b1f-7dd3-b76b-26961ee6d706 | ah-efe | label_added | Eugene Blikh | NULL | NULL | Added label: milestone:spec-refresh | 2026-07-20T03:08:20Z |
| 019f7cda-2c3f-7e5f-99ad-94cb8d1182bb | ah-efe.2 | label_added | Eugene Blikh | NULL | NULL | Added label: milestone:spec-refresh | 2026-07-20T03:08:20Z |