Skip to content

Analyzer autonomy (sub-project 4b): agreed deferrals + operator-visible behavior change #52

Description

@vnovick

Sub-project 4b (scheduled + incremental analysis — spec: `docs/superpowers/specs/2026-08-04-analyzer-autonomy-design.md`) shipped. Items deferred at final review, none blocking.

⚠️ Operator-visible behavior change (release-note material)

Linear's `FetchIssuesByStates` now honors the runtime project filter the same way `FetchCandidateIssues` always did. Consequence: with a runtime project filter set, cron/poll automations, the dashboard issue list, and the TUI backlog now narrow to the filtered projects. The pre-fix behavior (automations acting on issues outside the filtered working set) was the anomaly; cross-project blocker resolution on audit rows is unaffected (identifier-based fetches).

Deferrals

  • IssuesScanned / CLI "analyzed N issues" report the fetch count, not the analyzed count — actively misleading under incremental default (a revalidation-only run says "analyzed 50" when 0 hit the agent). Fix opportunistically: "scanned N / analyzed M".
  • Guard no-op leaves `DepsLastAnalyzedAt` at the last successful pass (deliberate: the guard writes nothing).
  • `DedupeInferredEdges` tie-break ignores `InferredAt` (pre-existing; tie case untested).
  • `startDepsAutoAnalyze` wired inside `if srvListener != nil` — always taken today; would silently disable auto-analysis under a future headless mode.
  • `resolveProfile` reads two cfgMu sections non-atomically (transient spurious warn, self-heals next tick).
  • Content edits to an already-terminal issue never trigger re-analysis (signal rule iterates candidates only) — harmless, terminal issues don't gate.
  • An Analyzed entry whose recorded state is later removed from `active_states` config won't signal on absence — self-corrects on the next pass.
  • The Linear project-filter merge block is now duplicated between `FetchCandidateIssues` and `FetchIssuesByStates` (mirrors pre-existing structure).
  • The dashboard "auto" badge on analyzer jobs is visible only via the click-driven poll loop, not as a passive background indicator (spec-sanctioned; a passive surface needs snapshot/SSE plumbing).

Test-shape lesson, third occurrence

All three completed sub-projects' sole production-fatal bugs were fixture-shape-vs-production-shape (reason strings; audit map keys; this time: `Analyzed` built from the union fetch diffed against active-only candidates — proven as 24 scheduler fires per 24 quiescent hours). The fix's regression tests now cover terminal-issue and blank-state sidecar shapes. Tests that diff two data sources must draw both from their real producers.

🤖 Generated with Claude Code

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions