Skip to content

feat: add coverage mode to task-manager-agent and goal-manager-agent - #293

Merged
bborbe merged 3 commits into
masterfrom
feat/coverage-mode
Oct 15, 2026
Merged

bborbe merged 3 commits into
masterfrom
feat/coverage-mode

Conversation

@bborbe

@bborbe bborbe commented Oct 15, 2026

Copy link
Copy Markdown
Owner

Adds the reverse map both manager agents were missing.

task-manager-agent and goal-manager-agent each checked necessity in the forward direction only — a task → the goal box it serves, and a goal's tasks → the box each serves. Nothing answered the inverse: for each open box, what drives it, and what evidence exists for it.

What ships

A new coverage action on both agents, emitting one row per closure box:

<box verbatim> | <driving item or "none"> | <evidence: measured(<source>) | asserted | none> | <proposal: create | re-scope | split | diagnosis-task | —>
  • goal subject — boxes: # Success Criteria + # Definition of Done; drivers: the tasks linked in # Tasks
  • topic subject — boxes: # Success Criteria + # Completion Gate (a topic carries no # Definition of Done); drivers: the member goals under # Goals

The subject kind is resolved goal-first and reported, because the two kinds differ in both halves of the map.

/vault-cli:task-status --coverage and /vault-cli:goal-status --coverage render the table below the anchor pair.

Why measured must name a source

A rating that scans a box's own text for a quoted result reads nothing, and is indistinguishable from a real reading unless the row names where the result came from. So measured(<source>) names the Progress entry or artifact — measured(progress 2026-10-10), measured(PR #240), measured(tag v0.126.0) — and a measured row carrying no source is a defect rather than a pass.

Likewise a none driving cell must carry a proposal naming the missing prerequisite; — against none is an omission, not a pass. Each run ends with a reconciliation line whose parts must sum to the box count.

Both actions are read-only — they never modify, create, re-link or tick anything, on the subject or on any driver.

Verification

  • make precommit — passes (8 Go packages, 10 rule suites, golangci-lint, go vet, osv-scanner, trivy fs, CHANGELOG structure, addlicense).
  • make check-versions — all four version strings equal at 0.168.7; the new ## Unreleased heading does not disturb the alignment check.
  • Markdown-only change: agents/ and commands/ are executable surface, not docs.

@bborbe
bborbe marked this pull request as ready for review October 15, 2026 14:45

@ben-s-pull-request-reviewer ben-s-pull-request-reviewer Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Now I have all the information needed for classification. Let me do the in-session classify and adjudicate:

Classification (Step 4c-sel):

  • agent-cmd/agent-frontmatter → applicable (agents/*.md changed)
  • agent-cmd/command-frontmatter → applicable (commands/*.md changed)
  • agent-cmd/command-thin → applicable (agents/.md + commands/.md changed)
  • agent-cmd/gap-driven-feedback → applicable (agents/.md + commands/.md changed)
  • agent-cmd/no-user-prompts → applicable (agents/.md + commands/.md changed)
  • agent-cmd/scripts-in-claude-dir → applicable (agents/.md + commands/.md changed)
  • agent-cmd/single-source-of-truth → applicable (agents/.md + commands/.md changed)
  • changelog/conventional-prefix-required → applicable (CHANGELOG.md changed)
  • git-commit/feature-branch-no-tag → skipped — @commits trigger, not a diff rule
  • git-commit/imperative-mood → skipped — @commits trigger, not a diff rule
  • git-workflow/never-direct-commit-to-master → skipped — @commits trigger, not a diff rule
  • go-security/resource-ownership → skipped — @commits trigger, not a diff rule
  • go-security/tenant-isolation → skipped — @commits trigger, not a diff rule
  • markdown-todo/lowercase-x-for-complete → applicable (**/*.md changed)

Adjudication (Step 4d-sel):

All 8 applicable rules were reviewed against the diff. All agents have valid frontmatter (name, description, tools, model), all commands have valid frontmatter (description, argument-hint, allowed-tools), CHANGELOG uses feat: prefix. No violations found. No mechanical findings from Step 4a.

Traceability: 15 candidates, 8 applicable, 6 skipped (all @commits-triggered), 1 skipped (not a code change)


PR Review: feat: add coverage mode to task-manager-agent and goal-manager-agent

Reviewer: selector mode, no sub-agents spawned
Files changed: 5 (CHANGELOG.md, agents/goal-manager-agent.md, agents/task-manager-agent.md, commands/goal-status.md, commands/task-status.md)
+134 lines, −6 lines

Selector Mode Traceability

  • Candidates: 15 rules matched by Step 4b-i glob filter
  • Applicable: 8 rules selected by Step 4c-sel (8 ≤ 15)
  • Skipped:
    • git-commit/feature-branch-no-tag → @commits trigger not applicable to diff review
    • git-commit/imperative-mood → @commits trigger not applicable to diff review
    • git-workflow/never-direct-commit-to-master → @commits trigger not applicable to diff review
    • go-security/resource-ownership → @commits trigger not applicable to diff review
    • go-security/tenant-isolation → @commits trigger not applicable to diff review
  • Mechanical funnel: 0 findings from 79 YAMLs run

Must Fix (Critical)

None.

Should Fix (Important)

None.

Nice to Have (Optional)

None.

Notes

  • The feature is well-scoped: a new coverage action added to both agents, gated behind a --coverage flag on the two slash commands. The specification correctly identifies the inverse-map gap (forward necessity checking already existed; reverse coverage hadn't been answered).
  • The goal-manager-agent coverage action correctly handles the goal/topic distinction for subject resolution and for closure-box identification (topic has no # Definition of Done — uses # Completion Gate instead).
  • The task-manager-agent coverage action correctly excludes parse_checkboxes for box collection (it greps the whole file including # Tasks which are drivers, not boxes), requiring section-bounded parsing instead.
  • Both actions correctly enforce: measured requires an external named source; — proposal against none driving cell is an omission; reconciliation line has two independent partitions; evidence shape is exactly one row per box.
  • The commands correctly delegate to the agents without re-deriving the rating, per spec.

selector clean — no adjudication needed


{
  "verdict": "approve",
  "summary": "Feature adds a well-specified coverage action to both agents and commands. The reverse-map specification correctly handles the goal/topic subject distinction, box vs driver separation, evidence rating rules, reconciliation line partitions, and read-only constraint. No violations found in applicable rule set (agent/command frontmatter, changelog prefix, thin-command, gap-driven-feedback, no-user-prompts, scripts-in-claude-dir, single-source-of-truth, markdown-todo).",
  "comments": [],
  "concerns_addressed": [
    {
      "concern": "correctness: coverage action specification must accurately describe forward+reverse mapping logic",
      "disposition": "addressed",
      "detail": "Both agents' coverage actions correctly implement the reverse map (box→driver), distinct from the existing forward necessity check (driver→box). goal-manager-agent properly distinguishes goal vs topic subjects and their different closure boxes; task-manager-agent correctly uses section-bounded parsing to exclude # Tasks from box collection."
    },
    {
      "concern": "correctness: --coverage flag behavior must correctly render the coverage table per specification",
      "disposition": "addressed",
      "detail": "Both commands (goal-status.md, task-status.md) delegate to their respective agents with the coverage action, render the table verbatim below the anchor pair, suppress the status body, and explicitly do not re-derive the rating — matching the spec's requirements."
    }
  ]
}

@bborbe
bborbe merged commit 7fd1ba7 into master Oct 15, 2026
5 checks passed
@bborbe
bborbe deleted the feat/coverage-mode branch October 15, 2026 14:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant