Skip to content

v0.63.0

Choose a tag to compare

@github-actions github-actions released this 28 May 21:19
· 441 commits to main since this release

Phase B — symbol-extraction unlock + anti-escape-hatch gate hardening + memory UX surfacing + parallel-review polish. Field calibrations #2–#4 against greenfield-api delivered a coherent batch of structural improvements across 13 tasks. The headline change: greenfield's #1-ranked memory UX gap (candidates sitting in _suggestions.md without ambient signal) closed via three coordinated surfaces, plus the symbol-extraction cascade that caused graphify_scan_prep to silently skip on noun-heavy tasks. Smoke: 689 → 711 passed, 0 failed.

Added

  • memory candidates-status + memory candidates-touch-surface CLI. Single source of truth for the passive memory-candidate surfacing across three ambient surfaces: SessionStart hint (when no active workflow + cooldown elapsed), /devt:next "no workflow" branch (count + Triage option), and present_findings footer in 4 workflows. Config keys memory.candidates_surface_threshold (default 5) + memory.candidates_surface_cooldown_hours (default 24).
  • Knowledge-candidates-tagged gate (state assert-knowledge-candidates-tagged). Treats #KNOWLEDGE-CANDIDATE lines in scratchpad as the canonical curator capture path; explicit none-declaration via knowledge-candidates-none.txt with enum reason=<task_too_routine | no_novel_patterns | all_subsumed_by_existing_memory> is the deliberate escape hatch. Wired into the final user-presentation step of 5 workflows. Closes the prose-only candidate leak greenfield calibration #2 flagged (4 candidates described in review.md narrative, zero scratchpad tags).
  • state aggregate-knowledge-candidates CLI. Aggregates #KNOWLEDGE-CANDIDATE: lines from review-lane-*.md + review.md into scratchpad with provenance comments. Wired into code-review-parallel.md::present_findings so parallel-flow lane tags reach the gate above. Dedup by line content; idempotent re-runs.
  • MCP correlation_id per tools/call. 8-char hex id (crypto.randomBytes) injected into trace records AND MCP response envelope (_meta.correlation_id). New filter mcp-stats --correlation-id=<id> for retrospective single-call lookup. F16 drill-down headings across 5 workflows updated to ## Drill-down: <dep> [call: <correlation_id>] so lane findings can cite specific calls. Code-reviewer and verifier prose now reference [call: <id>] as the audit handle.
  • mcp-stats --since-workflow-created flag. Reads workflow.yaml::created_at and filters trace records by ts >= created_at. Resolves the workflow_id rotation issue greenfield calibration #4 documented (82 graphify calls invisible via --workflow-id=<current> because calls were stamped with the prior workflow_id during context_init before partition rotation). Composes conjunctively with --since; later timestamp wins.
  • Symbol-level F17 god-node check (graphify check-symbol-godnodes). Sibling to check-large-files; reports every above-threshold symbol whose source_file is in the diff with no per-file aggregation. Surfaces god-nodes that file-level checks miss when a same-file sibling has higher max degree. Wired into code-review.md::F17 alongside the file-level check, with three independent signals (blast_radius / file-level / symbol-level) documented as orthogonal.
  • graphify symbols-in-files + graphify lane-suggestions CLI. Drive the bulk_scoped tier change (B-XI) and community-driven partition (B-XIII). symbols-in-files returns top-N non-noise symbols whose source_file is in the diff; lane-suggestions groups files by dominant Leiden community attribute with graceful fallback when clustering didn't run.
  • reuse-search-attempted.txt marker. Workflow bash writes the marker BEFORE invoking state derive-reuse-candidates. assertReuseAnalyzed now distinguishes "never ran" (marker absent → BLOCK) from "ran with 0 candidates" (legit no-op → PASS). Closes the silent-skip escape hatch greenfield calibration #2 flagged (v0.61.0 reuse-search feature ran zero times in a workflow).
  • topic.resolution_path enum in preflight-brief.json. Tracks the deepest fallback leg that produced the final symbol set: diff | text | snake_fts | kebab_fts | full_text_fts | none. Calibrations can measure how often each leg is load-bearing without ad-hoc instrumentation. Surfaces automatically via the existing topic sidecar dump.

Changed

  • Symbol-extraction unlock (extractTopic in preflight.cjs). Closes the cascade where a single short PascalCase noise symbol (e.g., "Enrich") blocked the entire FTS rescue path under the legacy symbols.length === 0 gate. Four-leg unlock: (1) gate now also fires when surviving symbols are all ≤6 chars, (2) candidate regex now accepts kebab-case in addition to snake_case, (3) terminal FTS pass on full task text when keyword FTS yields zero, (4) resolution_path telemetry tracks which leg fired. Field signal: GFBUGS-180 with topic.symbols=['Enrich'] produced 0 useful symbols, but the system didn't know.
  • claude-mem-skipped.txt requires a structured payload. assertClaudeMemHarvest validates reason=<not_installed | mcp_unavailable | corpus_empty | task_unrelated_to_history>; task_unrelated_to_history additionally requires a details= line. Free-form one-liners no longer satisfy the gate. Closes the lazy-escape behavior greenfield flagged ("wrote a one-line skip reason instead of actually running mcp__plugin_claude-mem_mcp-search").
  • code-reviewer maxTurns 40 → 60, verifier maxTurns 40 → 50. Aligns with the tester/debugger deep-read agent class. Closes the input side of greenfield calibration #3's Lane C (25 files / 1577 LOC) exhausting maxTurns on both dispatches; the input-side counterpart (B-VIII per-lane sizing + oversized-lane pre-warn) closes the same gap from the other direction.
  • code-review-parallel.md::partition_lanes — community-driven partition with path fallback. When the graph has Leiden community attributes, partition diff files by dominant community per file (B-XIII). Falls back to legacy top-2-level path partition when graphify is disabled, the graph has no community labels, or any diff file is uncovered. Both branches feed the same downstream sizing + lane-yaml emission so workflow.yaml output stays uniform.
  • code-review-parallel.md::redispatch_lanes narrows the stub-retry prompt to "5 highest-signal findings only" (B-IX). Identical re-dispatch wasted budget on lanes that hit maxTurns during the broad first pass; constrained scope lets the limited budget produce substantive findings on the issues that actually matter. All L1 context blocks (scope_trust, scope_hint, memory_signal) remain identical — only the <task> directive changes.
  • code-review.md::context_init tier decision prefers symbol_anchored from diff-derived symbols when graphify is dense + scope > impact_threshold (B-XI). The legacy bulk_scoped query_graph(text=REVIEW_SCOPE) returned keyword matches that didn't reflect the call graph; blast_radius with symbolsInFiles(diff) output produces actual structural impact. Falls back to legacy bulk_scoped when no symbols can be extracted.
  • code-review-parallel.md::partition_lanes computes per-lane file_count + est_loc and flags oversized: true when a lane exceeds 15 files or 800 LOC (B-VIII). list-lane-outputs surfaces the fields; the workflow emits an oversized-lane warning with remediation hints (split PR / narrow scope / accept budget risk).
  • 8 substep navigation markers added to code-review.md::context_init (214 lines) and dev-workflow.md::context_init (185 lines). Greenfield calibration #2 flagged 188+ line context_init as hard to navigate. Markers are additive section headers — no bash, no assert, no agent dispatch moved. quick-implement.md (123 lines) deemed tractable and left alone.

Documentation

  • workflows/code-review-parallel.md::context_init documents the MCP-setup inheritance architecture (B-X). Greenfield audit flagged "0 functional MCP calls" — observation correct, architecture intentional. Lanes are MCP-blind by design (per CLAUDE.md::Critical Agent + Workflow Contracts); the orchestrator-mediated graph-impact.md handoff is the single source of caller analysis. Documentation closes the audit-loop so a future read doesn't re-flag the choice.
  • agents/code-reviewer.md disambiguates "no MCP" from "no graphify" (B-XII). graphify-helpers skill IS preloaded per skill-index.yaml; the skill uses Bash CLI (node bin/devt-tools.cjs graphify <subcmd>), not MCP. code-reviewer's tools include Bash. The architectural contract is "no MCP", not "no graphify access at all". Example CLI calls included for one-off finding verification.
  • skills/memory-curation/SKILL.md pre-recommendation heuristic (B-III.2). When a candidate matches tooling-evolving signal (version constraint / behavior pattern / lacks opinionated framing / title contains behavior|pattern|migration|syntax|quirk|workaround|gotcha), the curator's AskUserQuestion presents "Promote (candidate)" first with (Recommended) suffix. Project decisions still default to active. Greenfield calibration #2: "Tooling-related candidates from THIS session (Hurl scalar predicate behavior, CONCURRENTLY migration pattern) should likely auto-route to candidate status."
  • docs/INTERNALS.md::MCP Trace documents workflow_id rotation behavior and points at --since-workflow-created as the canonical current-session observability path.
  • skills/memory-curation/SKILL.md step headers renamed from Phase A/B/C/D to Step 1/2/3/4 — <descriptor>. devt-internal phase labels belong in CHANGELOG + git history only, per the documentation-discipline rule.

Smoke tests

  • K12–K32 (+16 net gates): K12 symbol-level F17, K13 since-workflow-created, K14a/b correlation_id producer + filter, K15–K18 symbol extraction four-leg unlock + resolution_path, K19 reuse-search marker matrix, K20 claude-mem structured payload, K21 knowledge-candidates five-case matrix, K22 lane aggregator dedup + provenance, K23/K24 candidates-status + cooldown, K25 curator heuristic presence, K26 context_init substep markers, K27 lane sizing surface, K28 narrowed-redispatch presence, K29 MCP-inheritance docs presence, K30 symbols-in-files, K31 graphify-access disambiguation presence, K32 lane-suggestions community + fallback.