ptdv71fbtmig62b3urle3tp1gtpkig8f · 21 rows
| id | issue_id | event_type | actor | old_value | new_value | comment | created_at |
|---|---|---|---|---|---|---|---|
| 019f58ae-407c-7999-875f-11c78322b49e | ah-nyl | created | Eugene Blikh | NULL | 2026-07-13T02:34:02Z | ||
| 019f58ae-43b8-7683-a96f-8e547b31ec37 | ah-nyl.1 | created | Eugene Blikh | NULL | 2026-07-13T02:34:03Z | ||
| 019f58ae-b83d-752c-8b26-9aba0aaeb237 | ah-nyl.2 | created | Eugene Blikh | NULL | 2026-07-13T02:34:33Z | ||
| 019f58ae-bbf8-7b85-a2f8-a341f3fc6d9d | ah-nyl.3 | created | Eugene Blikh | NULL | 2026-07-13T02:34:34Z | ||
| 019f58af-5f36-73b9-b949-03c66a15432a | ah-nyl.4 | created | Eugene Blikh | NULL | 2026-07-13T02:35:16Z | ||
| 019f58af-62ab-7a9e-b2a4-6d11ed68d18b | ah-nyl.5 | created | Eugene Blikh | NULL | 2026-07-13T02:35:16Z | ||
| 019f58af-f5f5-7403-90eb-db4c754742f1 | ah-nyl.6 | created | Eugene Blikh | NULL | 2026-07-13T02:35:54Z | ||
| 019f58af-fad9-748c-a6a1-71948b188bcc | ah-nyl.7 | created | Eugene Blikh | NULL | 2026-07-13T02:35:55Z | ||
| 019f58af-fe8c-793b-8700-9ce02148b86f | ah-nyl.8 | created | Eugene Blikh | NULL | 2026-07-13T02:35:56Z | ||
| 019f58b0-7816-7c6b-a36d-bbbd7f5b5eb4 | ah-xuc | created | Eugene Blikh | NULL | 2026-07-13T02:36:27Z | ||
| 019f58b0-7a39-74fd-ae5f-365c75d5aab6 | ah-ydx | created | Eugene Blikh | NULL | 2026-07-13T02:36:28Z | ||
| 019f58b0-7c89-7f0f-b898-f324000256f4 | ah-0ge | created | Eugene Blikh | NULL | 2026-07-13T02:36:29Z | ||
| 019f58b0-7e71-72b3-9040-55429df727a2 | ah-oeq | created | Eugene Blikh | NULL | 2026-07-13T02:36:29Z | ||
| 019f58b0-806b-71d0-9c76-31cf450cbe41 | ah-k23 | created | Eugene Blikh | NULL | 2026-07-13T02:36:30Z | ||
| 019f58b2-07e1-78e5-81fa-b80c23cd0964 | ah-nyl.1 | status_changed | Eugene Blikh | {"id":"ah-nyl.1","title":"foundation: go module, domain, ports, config","description":"Create the Go foundation of agents-dev exactly per docs/SPEC.md (read it fully first; SS4-6, SS12-13 are normative for this task).\n\nDeliverables:\n1. go.mod: module go.bigb.es/agents-dev, go 1.26. Add ALL stage-1 external deps now so siblings never touch go.mod: modernc.org/sqlite, gopkg.in/yaml.v3. Populate go.sum by building a throwaway smoke import (e.g. internal/smoke_test.go importing both, then delete the file but keep go.sum entries; or keep a tiny blank-import file under internal/deps/deps.go with build tag 'deps' — your choice, document it).\n2. internal/domain: types + constants from SPEC SS5 (State, Outcome, Task, Repo, TaskRecord, Run, Event, RunSummary) and pure transition helpers, at minimum CanClaim(*TaskRecord) bool per SS5 semantics. Table tests for every helper.\n3. internal/ports: interfaces exactly as SPEC SS6 (Board, Runner, Store, Notifier + BoardTask, StartSpec, RunInfo, RunStatus). Doc comments on every method stating error/nil semantics ((nil, nil) for absent, etc.).\n4. internal/config: Load(path string) (*Config, error) implementing SPEC SS12: yaml.v3 with KnownFields(true), ${VAR} env expansion in string values (only for vars that exist; unknown var = validation error), \"~\" expansion in paths, duration parsing, validation that collects ALL problems into one error (repos non-empty, default_repo/default_role resolve, buckets map has all six canonical keys, listen is loopback host:port). Config struct mirrors config.example.yaml at repo root (keep the two in sync; fix the example if you find an inconsistency and note it in the commit message). Tests: golden-load of config.example.yaml with env set, plus failure cases.\n\nRules: stdlib + the two deps only; log/slog if logging is needed (probably not here); no package-level state. Run: go build ./... \u0026\u0026 go vet ./... \u0026\u0026 go test ./... (allowed for THIS task only, since you own the whole tree). Commit everything as one or two commits, message style 'domain: ...', 'config: ...'. Do NOT push. Do NOT touch .beads/.\n\nAcceptance: go build/vet/test green on a clean checkout; interfaces compile exactly against the names/signatures in SPEC SS6 (parallel siblings will implement them verbatim); config.example.yaml loads.\n","status":"open","priority":0,"issue_type":"task","owner":"bigbes@gmail.com","created_at":"2026-07-12T23:34:03Z","created_by":"Eugene Blikh","updated_at":"2026-07-12T23:34:03Z"} | {"status":"in_progress"} | NULL | 2026-07-13T02:38:10Z |
| 019f58c1-7bc1-7589-bf55-7eba737f89bf | ah-nyl.1 | closed | Eugene Blikh | Closed | NULL | 2026-07-13T02:55:02Z | |
| 019f58c1-7e91-7947-accb-8220e4be6b23 | ah-nyl.2 | status_changed | Eugene Blikh | {"id":"ah-nyl.2","title":"store: SQLite implementation of ports.Store","description":"Implement internal/store per docs/SPEC.md SS7 (read SPEC fully; SS5-7 normative). ports.Store on modernc.org/sqlite.\n\nDeliverables:\n- internal/store/store.go: New(path string) (*Store, error) — opens DB, applies PRAGMAs (WAL, busy_timeout=5000, foreign_keys=on), runs migrations; Close().\n- Migrations: embedded schema.sql (embed package), applied under a PRAGMA user_version gate (hand-rolled, target version 1). DDL exactly per SPEC SS7.\n- All ports.Store methods with the documented semantics: GetTask/LatestRun return (nil, nil) when absent; CreateRun surfaces UNIQUE(task_id, attempt) violation as a distinguishable error (exported sentinel ErrDuplicateRun); UpsertTask insert-or-update by id; timestamps RFC3339 UTC; contexts honored (database/sql *Context variants everywhere).\n- Compile-time check: var _ ports.Store = (*Store)(nil).\n\nTests (stdlib testing only, t.TempDir() databases): round-trip every method; absent-row nil,nil; duplicate run -\u003e ErrDuplicateRun; upsert updates fields + updated_at; ListTasks ordering deterministic (by id); events append + monotonically increasing seq; migration idempotence (New twice on same file).\n\nConstraints: work ONLY under internal/store/. Do not modify go.mod/go.sum (deps are already there), other packages, or .beads/. Build/test ONLY your package: go build ./internal/store/... \u0026\u0026 go vet ./internal/store/... \u0026\u0026 go test ./internal/store/... . Commit with 'store: ...' staging only internal/store. Do NOT push.\n","status":"open","priority":1,"issue_type":"task","owner":"bigbes@gmail.com","created_at":"2026-07-12T23:34:33Z","created_by":"Eugene Blikh","updated_at":"2026-07-12T23:34:33Z"} | {"status":"in_progress"} | NULL | 2026-07-13T02:55:03Z |
| 019f58c1-8017-7207-9931-05352f4e49b1 | ah-nyl.3 | status_changed | Eugene Blikh | {"id":"ah-nyl.3","title":"vikunja: Board adapter over the REST API","description":"Implement internal/vikunja per docs/SPEC.md SS8 (read SPEC fully; SS6, SS8 normative). ports.Board over the Vikunja 2.3.0 REST API.\n\nDeliverables:\n- New(cfg config.Vikunja, logger *slog.Logger) (*Client, error) storing an http.Client with a sane timeout (~15s).\n- Bucket resolution per SPEC SS8: locate the kanban view of the configured project, build title-\u003ebucketID and bucketID-\u003ecanonical-name maps from the config buckets mapping; missing configured title = error listing found titles. Resolve lazily on first use and cache; provide a Refresh path when a lookup misses (board edited).\n- Snapshot(ctx): tasks of the project with canonical bucket names (\"\" for unmapped buckets), honoring pagination.\n- MoveToBucket(ctx, taskID, canonical), Comment(ctx, taskID, markdown), each per SPEC SS8 endpoints.\n- Error style: non-2xx -\u003e error with method, path, status, and \u003c=200 bytes of body.\n- Compile-time check: var _ ports.Board = (*Client)(nil).\n\nIMPORTANT — verify the real API contract before coding: the live OpenAPI JSON is at https://tasks.bigb.es/api/v1/docs.json (Swagger UI at /api/v1/docs) — fetch it (no auth needed for the spec itself) and confirm exact paths, request/response shapes, and pagination headers for: project views list, kanban view tasks, buckets list, bucket task move, comment create (Vikunja uses PUT-for-create), single task get. If the live spec is unreachable, use the upstream docs at https://vikunja.io/docs/ and pin your best understanding in code comments + fixtures. SPEC SS8's endpoint list is the expected shape, not gospel — trust the OpenAPI.\n\nTests: httptest.Server fixtures (JSON canned from the OpenAPI shapes) covering snapshot incl. pagination + unmapped buckets, bucket resolution failure (helpful error), move, comment, non-2xx error rendering. No live-network tests.\n\nConstraints: work ONLY under internal/vikunja/. No go.mod changes, no other packages, no .beads/. Build/test ONLY your package (go build/vet/test ./internal/vikunja/...). Commit 'vikunja: ...' staging only internal/vikunja. Do NOT push.\n","status":"open","priority":1,"issue_type":"task","owner":"bigbes@gmail.com","created_at":"2026-07-12T23:34:34Z","created_by":"Eugene Blikh","updated_at":"2026-07-12T23:34:34Z"} | {"status":"in_progress"} | NULL | 2026-07-13T02:55:04Z |
| 019f58c1-8183-729f-af88-6eec7c4ef330 | ah-nyl.4 | status_changed | Eugene Blikh | {"id":"ah-nyl.4","title":"runner: pi+zellij implementation + ahub-run supervisor","description":"Implement internal/runner + cmd/ahub-run per docs/SPEC.md SS9 (read SPEC fully; SS6, SS9 normative). This is the trickiest package — the SS9 contract (worktree layout, .task/ files, status precedence) is normative; follow it to the letter.\n\nDeliverables:\n- internal/runner: New(cfg *config.Config, logger *slog.Logger) *PiZellij implementing ports.Runner (compile-time check var _ ports.Runner = ...).\n - Start: create/reuse worktree + branch per SS9 (git -C \u003crepo\u003e worktree add ...; handle existing worktree dir and existing branch for retries), write .task/PROMPT.md and .task/meta.json, worktree-local ignore via the resolved git-dir info/exclude per SS9, ensure zellij session (zellij attach --create-background task-\u003cid\u003e), spawn the pane (zellij --session task-\u003cid\u003e run --cwd \u003cworktree\u003e -- ahub-run --task-id N --attempt K --report-url \u003curl\u003e -- pi --mode json -p @.task/PROMPT.md --model \u003cmodel\u003e --no-skills --no-extensions [pi_args...]). Return RunInfo.\n - Status: precedence per SS9 — exit.json =\u003e Completed (outcome success/error by code); else session alive in `zellij list-sessions --short` =\u003e Running with LastEvent=mtime(events.jsonl); else Completed with OutcomeCrashed, exit -1. Parse PiSession + CostUSD from events.jsonl leniently: scan lines as loose JSON maps; session id from the first object that has a plausible session identifier; cost accumulated from usage/cost fields when present. IMPORTANT: pi 0.70.2 is installed locally — empirically capture a real `pi --mode json -p 'say hi'` JSONL sample (any cheap/configured model, or ask for the shape via `pi --help` + a dry attempt; if no model is invocable offline, mark the parser 'best-effort, fixture-based' and derive fixtures from pi's documented event shape), commit the sample as a testdata fixture, and pin the parser to it.\n - Kill: zellij kill-session + best-effort delete-session. Summary: git log/diff per SS9.\n - ALL zellij/pi/git argv construction centralized in commands.go with unit tests asserting exact argv (SS9 requirement).\n- cmd/ahub-run: supervisor per SS9 contract — tee child stdout to .task/events.jsonl (stderr passthrough), atomic exit.json (tmp+rename), best-effort POST to --report-url (2s timeout, 1 retry), signal-death -\u003e 128+sig, --keep-pane default true iff $ZELLIJ set (then print resume hint + exec $SHELL), false =\u003e exit with child code.\n\nTests: stub `zellij`/`pi`/(where sensible `git` is real — use real git with a t.TempDir() repo for worktree tests) as executable scripts prepended to PATH; cover: worktree create+reuse, argv construction, status precedence matrix (exit.json / alive / gone), events parsing from fixture, ahub-run end-to-end via os/exec (tee, atomic exit.json, report POST to httptest, exit-code mapping). No sleeps \u003e100ms; no real zellij sessions in tests.\n\nConstraints: work ONLY under internal/runner/ and cmd/ahub-run/. No go.mod changes, no other packages, no .beads/. Build/test ONLY yours: go build ./internal/runner/... ./cmd/ahub-run/... \u0026\u0026 go vet \u003csame\u003e \u0026\u0026 go test \u003csame\u003e. Commit 'runner: ...' staging only your paths. Do NOT push.\n","status":"open","priority":1,"issue_type":"task","owner":"bigbes@gmail.com","created_at":"2026-07-12T23:35:16Z","created_by":"Eugene Blikh","updated_at":"2026-07-12T23:35:16Z"} | {"status":"in_progress"} | NULL | 2026-07-13T02:55:04Z |
| 019f58c1-82f6-7835-84f8-e7bdd4c477a5 | ah-nyl.5 | status_changed | Eugene Blikh | {"id":"ah-nyl.5","title":"reconcile: the control loop","description":"Implement internal/reconcile per docs/SPEC.md SS10 (read SPEC fully; SS5, SS6, SS10, SS12 normative). The reconciler imports ONLY internal/domain, internal/ports, internal/config (+ stdlib). Sibling packages (store/vikunja/runner) may not compile yet — you must not import or build them.\n\nDeliverables:\n- New(deps Deps) *Reconciler where Deps{Store ports.Store; Board ports.Board; Runner ports.Runner; Notifier ports.Notifier; Cfg *config.Config; Log *slog.Logger; Now func() time.Time}.\n- Run(ctx): loop — iterate every cfg.PollInterval, plus immediately when poked; Poke() (non-blocking, coalescing via 1-buffered channel); clean shutdown on ctx cancel.\n- iterate(ctx) implementing SPEC SS10 verbatim: the bucket switch (ready claim/heal; in_progress adopt-or-fail/check; terminal buckets kill+align), vanish handling for store tasks missing from snapshot, claim ordering (persist BEFORE moving the card), check() with finalize on Completed, timeout kill (Now() - StartedAt \u003e cfg.Timeout -\u003e Kill + OutcomeTimeout), comments per the SS10 templates (claim comment with attach hint; success comment with DiffStat+Commits; failure comment with outcome + fenced tail of events — obtain the tail via Runner.Summary? No: events tail is runner-internal; include what RunStatus/Summary give you: outcome, exit code, diff stat if any, and reference to the worktree path + zellij attach hint. Keep comment builders as small pure funcs with tests).\n- Prompt rendering per SPEC SS12: text/template over the role prompt file with {ID, Title, Description, Branch, RepoSlug}; render errors -\u003e comment + move to failed (per SS12).\n- Per-task action errors: log, append event where sensible, continue with other tasks; Snapshot error aborts the iteration (SS10).\n- Every state-changing action appends a domain.Event via Store.AppendEvent.\n\nTests (the heart of this task — table-driven, in-memory fakes for all four ports, fake clock): claim happy path (verify order: CreateRun+UpsertTask precede MoveToBucket; comment posted), exit-0 finalize -\u003e in_review + summary comment, exit!=0 -\u003e failed + diagnostic comment, timeout -\u003e Kill + failed(timeout), human drag to cancelled mid-run -\u003e Kill + killed + aligned, crash-between-persist-and-move heal (rec in_progress + bucket ready -\u003e just MoveToBucket), adopt (bucket in_progress, no rec, runner reports running), adopt-fail (no runtime -\u003e failed + comment), vanish (in store, not on board -\u003e kill + cancelled), poke triggers immediate iteration, ctx cancel stops Run. Fakes record calls for assertion; no real time.Sleep beyond trivial.\n\nConstraints: work ONLY under internal/reconcile/. No go.mod changes, no .beads/. Build/test ONLY: go build ./internal/reconcile/... \u0026\u0026 go vet ./internal/reconcile/... \u0026\u0026 go test ./internal/reconcile/... . Commit 'reconcile: ...' staging only internal/reconcile. Do NOT push.\n","status":"open","priority":1,"issue_type":"task","owner":"bigbes@gmail.com","created_at":"2026-07-12T23:35:17Z","created_by":"Eugene Blikh","updated_at":"2026-07-12T23:35:17Z"} | {"status":"in_progress"} | NULL | 2026-07-13T02:55:04Z |
| 019f58ce-c5e4-77fe-a553-0daf95ce21f3 | ah-nyl.8 | closed | Eugene Blikh | superseded: auxilia + testify adopted as baseline conventions before wave 2 (user directive); refit of landed packages tracked in a dedicated bead | NULL | 2026-07-13T03:09:33Z |