sk0ud265ve2na43tn228otkbrearqajk · 64 rows
| id | issue_id | event_type | actor | old_value | new_value | comment | created_at |
|---|---|---|---|---|---|---|---|
| 019f595b-cdd0-786c-b6a6-c176256d528a | ah-nyl.15 | status_changed | Eugene Blikh | {"id":"ah-nyl.15","title":"fix: adopt-guard livelock + neither-state timeout arm (final verification findings)","description":"Final composed-semantics verification (@ 825238d) returned FIX-FIRST with two findings, both pre-analyzed with exact fixes. Scope: internal/reconcile/ ONLY.\n\nV1 HIGH (reconcile.go:524): adoptOrFail's finished-row branch guard `run.State == RunStateFinished \u0026\u0026 !st.Running` fires on ANY non-Running status including hard Completed for the NEXT attempt (exit.json{K+1} present but the K+1 row was never persisted — crash before CreateRun or persist failure whose compensating kill raced a fast-exiting pi). Result (empirically proven by the verifier): terminal record -\u003e alignCardToRecord silently bounces ready-\u003efailed on every human re-drag, K+1's real result never persisted/commented, Start never issued, stale exit.json never cleaned — livelock against the human. FIX (verifier-tested in scratch against the full suite): change the guard to `!runtimeEvidence(st)` so hard Completed evidence falls through to the adopt branch (which persists the K+1 row from the evidence and finalizes with its true outcome). Add regression test: finished row K + probe returns hard Completed{attempt K+1, exit 0} -\u003e adopts+finalizes K+1 (row created, in_review, one comment), then K+2 claimable; also the terminal-record variant (card in ready, terminal rec, completed evidence -\u003e adopt path, NOT silent bounce).\n\nV2 MEDIUM (reconcile.go:409-421): check() switch has no arm for the neither-state (st.Running==false \u0026\u0026 st.Completed==false — live session, meta gone/mismatched; reachable when the worktree is rm -rf'd mid-run, MetaAttempt=0). Today: no finalize, no timeout, forever — run wedged in in_progress past any deadline (verifier proved 31min past a 30m timeout, zero kills). FIX: add a third arm — when neither-state persists and now \u003e run.StartedAt + cfg.Timeout: runner.Kill + finalize with OutcomeTimeout (same path as the Running-timeout arm); before the deadline, log at warn (observation degraded) and do nothing. Regression test: running row, status neither (MetaAttempt 0), fake clock past deadline -\u003e Kill called, finalized timeout, card failed; before deadline -\u003e no action.\n\nV3 INFO (reconcile_test.go:36): statusCrashed fixture sets MetaAttempt 0, but the real runner reports the surviving meta's attempt on crash inference (0 only when the worktree is gone). Update the fixture/helpers so crashed statuses carry a realistic MetaAttempt (parameterize; keep a worktree-gone variant with 0) — hygiene so future MetaAttempt consumers are tested against real shapes.\n\nConstraints: internal/reconcile/ only; testify+culpa; go build/vet/test -race -count=1 ./internal/reconcile/... (never ./...); commit 'reconcile: adopt completed evidence, timeout the neither-state' staging only internal/reconcile; hooks bypassed (git -c core.hooksPath=/tmp/nohooks commit); no push; no .beads/.\n","status":"open","priority":0,"issue_type":"bug","owner":"bigbes@gmail.com","created_at":"2026-07-13T02:43:36Z","created_by":"Eugene Blikh","updated_at":"2026-07-13T02:43:36Z"} | {"status":"in_progress"} | NULL | 2026-07-13T05:43:36Z |
| 019f596b-c8c6-7c73-9212-282cd251efc3 | ah-nyl.15 | closed | Eugene Blikh | landed 30292cb: adopt-guard via runtimeEvidence + same-tick finalize of hard completed evidence, neither-state timeout arm w/ shared timeoutKill, fixture hygiene; negative controls confirmed | NULL | 2026-07-13T06:01:03Z | |
| 019f596c-9a51-7952-a9d8-aba6b099642c | ah-nyl.6 | status_changed | Eugene Blikh | {"id":"ah-nyl.6","title":"wiring: httpapi + agenthubd + ahub CLIs","description":"Wire the daemon together per docs/SPEC.md SS3, SS11 (read SPEC fully). All sibling packages now exist — full-tree builds are allowed and expected in THIS task.\n\nDeliverables:\n- internal/httpapi: loopback server per SS11 — GET /healthz; POST /internal/v1/run-exit {task_id,attempt,exit_code} validated -\u003e calls a RunExitHook (func injected by main; it pokes the reconciler); GET /api/v1/status -\u003e JSON {tasks:[TaskRecord+latest Run], generated_at}. stdlib net/http + 1.22 mux patterns; graceful shutdown; tests via httptest.\n- cmd/agenthubd: flags --config (default ./agenthub.yaml) --log-level; load config, open store, construct vikunja client, runner, no-op notifier (slog), reconciler; start httpapi + reconciler.Run; SIGINT/SIGTERM -\u003e graceful stop (context cancel, http shutdown, store close). slog JSON to stderr.\n- cmd/ahub: subcommands (stdlib flag, no cobra): `status` (GET /api/v1/status from --addr default 127.0.0.1:9100, human-readable table + --json raw), `validate-config` (load config, print OK or the collected errors, exit code accordingly), `version` (var set via -ldflags, default \"dev\").\n- justfile: verify `just build` produces bin/agenthubd bin/ahub bin/ahub-run (adjust if needed).\n- Smoke check you must run and make pass: `go build ./... \u0026\u0026 go vet ./... \u0026\u0026 go test ./...` (whole tree), then `bin/agenthubd --config config.example.yaml` with a fake VIKUNJA_TOKEN env — it must start, log the bucket-resolution failure gracefully (retry next tick, not crash-loop-exit), and /healthz must answer. Note in the bead comment if SPEC/behavior forced any deviation.\n\nConstraints: you own cmd/agenthubd, cmd/ahub, internal/httpapi, plus minimal glue edits elsewhere ONLY if a sibling package has an integration bug you must fix to link (document any such fix in its own commit '\u003cpkg\u003e: fix ...'). No .beads/ changes. Commits: 'httpapi: ...', 'cmd: ...'. Do NOT push.\n","notes":"CONVENTION UPDATE (see SPEC §13, commit 5ce35c5+): tests use testify (require/assert); errors via auxilia culpa; agenthubd wires scribe handlers (TintHandler for ahub CLI, JSON or Multi for the daemon); steward MAY be used for daemon lifecycle wiring if it stays simple. testify + auxilia already in go.mod.\nREVIEW INPUT (data-layer review finding 4): agenthubd startup must PREFLIGHT the board — construct the vikunja client and resolve the configured bucket titles once at startup; a missing title / no-kanban-view error at that point is FATAL with a clear message (SPEC §8 'fatal config error'), while the same error later at runtime stays retryable inside the loop. Wire this into cmd/agenthubd.","status":"open","priority":1,"issue_type":"task","owner":"bigbes@gmail.com","created_at":"2026-07-12T23:35:55Z","created_by":"Eugene Blikh","updated_at":"2026-07-13T00:41:23Z"} | {"status":"in_progress"} | NULL | 2026-07-13T06:01:57Z |
| 019f597b-6e19-7278-a328-d93c488d0d8b | ah-nyl.6 | closed | Eugene Blikh | landed e116576+ae38c10+254c0f8: httpapi 3 endpoints, agenthubd wiring w/ fatal preflight + graceful shutdown, ahub CLI; scribe JSON/Tint handlers; steward skipped (justified); full happy-path smoke against fake vikunja done | NULL | 2026-07-13T06:18:09Z | |
| 019f597b-9422-7572-9a5a-bfd0d24aefd0 | ah-nyl.7 | status_changed | Eugene Blikh | {"id":"ah-nyl.7","title":"e2e: harness with fake vikunja + stub pi","description":"Build the end-to-end harness per docs/SPEC.md SS1/SS14 stage-1 acceptance: prove the full loop without live services. Build tag e2e, directory e2e/, run via `just e2e`.\n\nScenario (single test, subtests per phase): temp dir with (a) a real git repo as the target repo (one commit on master), (b) fake Vikunja: httptest server implementing the subset internal/vikunja uses (views, kanban tasks, buckets, move, comment) over in-memory state you can mutate from the test; (c) stub `pi` script on PATH that reads .task/PROMPT.md, makes a commit in the cwd repo ('stub: change'), emits 2-3 plausible JSONL lines to stdout, exits 0; (d) real zellij is NOT used: stub `zellij` script that for `run` executes the wrapped command directly (background), for attach --create-background no-ops, for list-sessions prints active names from a state file — i.e. simulate sessions with files. (e) real ahub-run and agenthubd binaries built by the test (go build into t.TempDir()).\n\nFlow: start agenthubd with a generated config (short poll_interval ~200ms) -\u003e put a task in fake-Vikunja Ready bucket -\u003e wait (poll with deadline, no fixed sleeps) for: card moved to In Progress with claim comment; then card in In Review with a comment containing the diff stat; store db has task in_review + run finished/success (inspect via ahub status --json against the daemon). Negative subtest: stub pi exits 1 -\u003e card lands in Failed with diagnostic comment. Timeout subtest optional (only if cheap with the fake clock — the daemon uses real time; skip if it needs sleeps \u003e2s and note why).\n\nConstraints: everything under e2e/ (+ justfile tweak if needed). Full-tree build allowed. If you find integration bugs in other packages, fix them in separate commits '\u003cpkg\u003e: fix ...' with a test where feasible. No .beads/ changes. Commit 'e2e: ...'. Do NOT push.\n","notes":"CONVENTION UPDATE (see SPEC §13): tests use testify (require/assert); errors via culpa. Deps already in go.mod.","status":"open","priority":2,"issue_type":"task","owner":"bigbes@gmail.com","created_at":"2026-07-12T23:35:56Z","created_by":"Eugene Blikh","updated_at":"2026-07-13T00:09:35Z"} | {"status":"in_progress"} | NULL | 2026-07-13T06:18:18Z |
| 019f598a-4241-7cc9-a4b1-e10b96c3b220 | ah-nyl.16 | created | Eugene Blikh | NULL | 2026-07-13T06:34:20Z | ||
| 019f598a-44a9-7bf6-95e5-e8e958b2b338 | ah-nyl.16 | status_changed | Eugene Blikh | {"id":"ah-nyl.16","title":"fix: wiring review findings 1-7 (flag swallowing, agenthubd tests, polish)","description":"Hostile review of the wiring commits (e116576/ae38c10/254c0f8) returned FIX-FIRST. Fix ALL seven. Line refs @ HEAD.\n\nW1 BLOCKER (cmd/agenthubd/main.go:70, cmd/ahub/main.go:105,200): stdlib flag.Parse stops at the first positional and nothing checks fs.NArg() -\u003e `agenthubd serve --config ./missing.yaml` silently starts with ./agenthub.yaml defaults (exit 0, WRONG config); `ahub status 127.0.0.1:9188` silently queries the default :9100 (wrong daemon, exit 0). FIX: after each fs.Parse (three call sites), reject fs.NArg() \u003e 0 with a usage error to stderr and exit 2. Tests for all three sites.\n\nW2 BLOCKER-adjacent (cmd/agenthubd): zero tests despite run() being injection-shaped. ADD minimum: bad flag -\u003e exit 2; positional arg -\u003e exit 2 (W1); missing/broken config -\u003e exit 1; invalid --log-level -\u003e exit 2; connection-refused preflight -\u003e exit 1 AND stderr contains the operator-friendly preflight message. Use the injected args/stderr seams; httptest fake vikunja where needed (views endpoint refusing/absent). Keep each test \u003c2s.\n\nW3 LOW (cmd/ahub/main.go:219-230 + internal/config/config.go:422-427): single-problem validate-config prints the path twice and skips the bullet format (culpa.Join(1) returns the bare error so the multi-unwrap loop never fires); also the existing two-problem test passes via Contains even if the multi-unwrap loop is deleted. FIX in ahub only (do not change config's wrap): fallback branch prints the problem without the duplicated prefix; pin the EXACT multi-line output format for the \u003e=2 case and the exact single-line format for the ==1 case with require.Equal.\n\nW4 LOW (internal/httpapi/httpapi.go:116-119): wire http.Server.ErrorLog = slog.NewLogLogger(\u003chandler\u003e, slog.LevelError) so per-connection panics/header noise join the structured stream instead of log.Default() raw text. Test optional (constructor wiring assertion is enough).\n\nW5 INFO (cmd/agenthubd/main.go:184): the explicit stop() next to defer stop() is load-bearing — it unregisters signal handling so a second SIGTERM during the drain hard-kills (desired escape hatch). Add the pinning comment so a cleanup doesn't remove it.\n\nW6 INFO (internal/httpapi run-exit): trailing garbage after the JSON object is accepted (Decode reads one value). Add a dec.More() strictness check -\u003e 400 on trailing content; adjust/add test.\n\nW7 INFO (cmd/agenthubd/main.go:117): SIGTERM during the preflight window logs the scary \"startup preflight failed ... check vikunja.url\" message and exits 1. Branch on errors.Is(err, context.Canceled) -\u003e quiet \"shutdown requested during startup\" log, still exit 1 (or 0 — pick 1 for \"did not reach ready\", document in the message). Test if cheap via the run() seam.\n\nConstraints: scope = cmd/agenthubd/, cmd/ahub/, internal/httpapi/. A sibling agent is writing e2e/ concurrently — do NOT touch e2e/, internal/\u003canything else\u003e, docs/, .beads/, go.mod. Conventions: testify, culpa, slog. Build/vet/test -race ONLY your three packages; never ./... . Commits: 'cmd: reject positional args, add agenthubd run() tests' + 'httpapi: strict run-exit decode, slog ErrorLog' (split as sensible); hooks bypassed (git -c core.hooksPath=/tmp/nohooks commit); retry on index.lock; no push.\n","status":"open","priority":0,"issue_type":"bug","owner":"bigbes@gmail.com","created_at":"2026-07-13T03:34:21Z","created_by":"Eugene Blikh","updated_at":"2026-07-13T03:34:21Z"} | {"status":"in_progress"} | NULL | 2026-07-13T06:34:21Z |
| 019f598f-8a09-7704-979f-9c6324aad248 | ah-nyl.7 | closed | Eugene Blikh | landed 892cbda: hermetic full-loop harness (fake vikunja w/ per-response pagination + preflight support, argv-faithful zellij/pi stubs, real binaries); happy/failure/timeout paths green 4x no flakes, just e2e 3.3s; zero integration bugs found | NULL | 2026-07-13T06:40:07Z | |
| 019f5996-076d-7a93-a3ed-3705e586a7c8 | ah-nyl.16 | closed | Eugene Blikh | landed c07e697+97133f9: NArg guards x3 w/ tests, agenthubd run() suite (9 tests), exact validate-config formats, slog ErrorLog, strict decode, stop() comment, calm preflight shutdown (found NotifyContext cause never unwraps to Canceled on go1.26) | NULL | 2026-07-13T06:47:12Z | |
| 019f59a4-40d1-7d9c-bd68-c657f7a56e41 | ah-nyl | closed | Eugene Blikh | Stage 1 complete: all 15 child beads closed; e2e acceptance green (happy/failure/timeout); 3 review rounds + 2 empirical validations converged to SHIP | NULL | 2026-07-13T07:02:44Z | |
| 019f59e6-461e-7860-834a-a6fc38027e10 | ah-xuc.1 | created | Eugene Blikh | NULL | 2026-07-13T08:14:51Z | ||
| 019f59e6-8639-7603-80dc-7aee95e670a6 | ah-xuc.2 | created | Eugene Blikh | NULL | 2026-07-13T08:15:07Z | ||
| 019f59e6-902a-7566-9107-548982eff4b3 | ah-xuc.3 | created | Eugene Blikh | NULL | 2026-07-13T08:15:10Z | ||
| 019f59e6-bc60-7c63-827d-9105a660bc1e | ah-xuc.4 | created | Eugene Blikh | NULL | 2026-07-13T08:15:21Z |