agentfluent 0.7.0__tar.gz → 0.9.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (323) hide show
  1. agentfluent-0.9.0/.claude/agents/anthropic-research.md +128 -0
  2. agentfluent-0.9.0/.claude/agents/candidate-verifier.md +192 -0
  3. {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/settings.json +2 -2
  4. agentfluent-0.9.0/.claude/skills/promote-candidates/SKILL.md +464 -0
  5. agentfluent-0.9.0/.claude/specs/analysis/2026-05-17-v07-dogfood-analysis.md +197 -0
  6. agentfluent-0.9.0/.claude/specs/analysis/2026-05-30-v08-dogfood/analysis.md +186 -0
  7. agentfluent-0.9.0/.claude/specs/analysis/333-error-pattern-precision/findings.md +126 -0
  8. agentfluent-0.9.0/.claude/specs/analysis/333-error-pattern-precision/labels.tsv +30 -0
  9. agentfluent-0.9.0/.claude/specs/analysis/333-error-pattern-precision/sample.tsv +30 -0
  10. agentfluent-0.9.0/.claude/specs/analysis/333-error-pattern-precision/script.py +163 -0
  11. agentfluent-0.9.0/.claude/specs/analysis/402-calibration/calibration.md +112 -0
  12. agentfluent-0.9.0/.claude/specs/analysis/402-calibration/pairs.tsv +35 -0
  13. agentfluent-0.9.0/.claude/specs/analysis/407-calibration/calibration.md +196 -0
  14. agentfluent-0.9.0/.claude/specs/analysis/407-calibration/detections.tsv +196 -0
  15. agentfluent-0.9.0/.claude/specs/analysis/407-calibration/export.py +126 -0
  16. agentfluent-0.9.0/.claude/specs/analysis/407-calibration/sample.py +40 -0
  17. agentfluent-0.9.0/.claude/specs/analysis/407-calibration/tune.py +45 -0
  18. agentfluent-0.9.0/.claude/specs/backlog-v0.8.md +303 -0
  19. agentfluent-0.9.0/.claude/specs/backlog-v0.9.md +458 -0
  20. {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/decisions.md +309 -0
  21. agentfluent-0.9.0/.claude/specs/prd-advanced-tool-use-diagnostics.md +284 -0
  22. agentfluent-0.9.0/.claude/specs/prd-context-fork-loop-detection.md +137 -0
  23. agentfluent-0.9.0/.claude/specs/prd-research-pipeline-phase-3.md +240 -0
  24. {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/prd-tier3-github-enrichment.md +21 -0
  25. agentfluent-0.9.0/.claude/specs/prd-tool-name-normalization.md +193 -0
  26. agentfluent-0.9.0/.claude/specs/prd-v0.8.md +206 -0
  27. agentfluent-0.9.0/.claude/specs/prd-v0.9.md +225 -0
  28. agentfluent-0.9.0/.claude/specs/research/anthropic-feature-watch.md +349 -0
  29. agentfluent-0.9.0/.release-please-manifest.json +3 -0
  30. {agentfluent-0.7.0 → agentfluent-0.9.0}/CHANGELOG.md +74 -13
  31. {agentfluent-0.7.0 → agentfluent-0.9.0}/CLAUDE.md +2 -0
  32. {agentfluent-0.7.0 → agentfluent-0.9.0}/CONTRIBUTING.md +1 -0
  33. {agentfluent-0.7.0 → agentfluent-0.9.0}/PKG-INFO +60 -117
  34. {agentfluent-0.7.0 → agentfluent-0.9.0}/README.md +59 -116
  35. {agentfluent-0.7.0 → agentfluent-0.9.0}/docs/GLOSSARY.md +384 -11
  36. agentfluent-0.9.0/docs/ROADMAP.md +130 -0
  37. agentfluent-0.9.0/images/demo-analyze.svg +426 -0
  38. agentfluent-0.9.0/images/demo-config-check.svg +136 -0
  39. agentfluent-0.9.0/images/demo-diagnostics.svg +445 -0
  40. agentfluent-0.9.0/images/demo-diff.svg +466 -0
  41. agentfluent-0.9.0/images/demo-subagents.svg +167 -0
  42. {agentfluent-0.7.0 → agentfluent-0.9.0}/pyproject.toml +1 -1
  43. {agentfluent-0.7.0 → agentfluent-0.9.0}/release-please-config.json +1 -0
  44. {agentfluent-0.7.0 → agentfluent-0.9.0}/scripts/calibration/build_notebook.py +98 -68
  45. agentfluent-0.9.0/scripts/calibration/threshold_validation.ipynb +4191 -0
  46. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/agents/extractor.py +3 -0
  47. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/agents/models.py +49 -1
  48. agentfluent-0.9.0/src/agentfluent/analytics/agent_metrics.py +288 -0
  49. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/analytics/pipeline.py +108 -2
  50. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/cli/commands/analyze.py +170 -8
  51. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/cli/commands/explain.py +17 -2
  52. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/cli/commands/report_renderers.py +29 -8
  53. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/cli/formatters/diff_table.py +30 -7
  54. agentfluent-0.9.0/src/agentfluent/cli/formatters/helpers.py +218 -0
  55. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/cli/formatters/table.py +86 -4
  56. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/config/models.py +30 -0
  57. agentfluent-0.9.0/src/agentfluent/config/retention.py +179 -0
  58. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/core/paths.py +53 -0
  59. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/core/session.py +7 -0
  60. agentfluent-0.9.0/src/agentfluent/diagnostics/_git_helpers.py +167 -0
  61. agentfluent-0.9.0/src/agentfluent/diagnostics/agent_audit.py +163 -0
  62. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diagnostics/aggregation.py +58 -0
  63. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diagnostics/correlator.py +341 -2
  64. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diagnostics/git_signals.py +87 -113
  65. agentfluent-0.9.0/src/agentfluent/diagnostics/github_signals.py +1180 -0
  66. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diagnostics/models.py +43 -9
  67. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diagnostics/pipeline.py +106 -38
  68. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diagnostics/quality_signals.py +37 -2
  69. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diagnostics/signals.py +26 -3
  70. agentfluent-0.9.0/src/agentfluent/diagnostics/tool_orchestration.py +183 -0
  71. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diagnostics/trace_signals.py +237 -15
  72. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diff/compute.py +23 -0
  73. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diff/models.py +39 -0
  74. agentfluent-0.9.0/src/agentfluent/github/__init__.py +54 -0
  75. agentfluent-0.9.0/src/agentfluent/github/cache.py +201 -0
  76. agentfluent-0.9.0/src/agentfluent/github/client.py +193 -0
  77. agentfluent-0.9.0/src/agentfluent/github/consent.py +197 -0
  78. agentfluent-0.9.0/src/agentfluent/github/detection.py +256 -0
  79. agentfluent-0.9.0/src/agentfluent/github/models.py +73 -0
  80. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/glossary/models.py +2 -0
  81. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/glossary/terms.yaml +340 -11
  82. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/traces/models.py +41 -0
  83. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/traces/parser.py +55 -17
  84. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/conftest.py +28 -0
  85. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/report/analyze_snapshot.json +8 -2
  86. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/report/expected_report.md +6 -4
  87. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/conftest.py +11 -0
  88. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_active_duration_display.py +66 -0
  89. agentfluent-0.9.0/tests/unit/cli/test_agent_duration_cell.py +128 -0
  90. agentfluent-0.9.0/tests/unit/cli/test_analyze_github_flag.py +272 -0
  91. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_axis_json_contract.py +30 -0
  92. agentfluent-0.9.0/tests/unit/cli/test_cleanup_warning_cli.py +96 -0
  93. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_diff_table_signed.py +17 -0
  94. agentfluent-0.9.0/tests/unit/cli/test_environment_warning_banner.py +77 -0
  95. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_explain.py +5 -2
  96. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_json_output.py +6 -0
  97. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_report_golden.py +10 -0
  98. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_report_renderers.py +27 -1
  99. agentfluent-0.9.0/tests/unit/cli/test_tier3_degraded_banner.py +64 -0
  100. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/diff/test_compute.py +129 -1
  101. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_agent_metrics.py +164 -1
  102. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_agent_models.py +78 -0
  103. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_correlator.py +326 -0
  104. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_diagnostics_pipeline.py +213 -25
  105. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_extractor.py +5 -0
  106. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_git_signals.py +187 -25
  107. agentfluent-0.9.0/tests/unit/test_github_cache.py +222 -0
  108. agentfluent-0.9.0/tests/unit/test_github_client.py +222 -0
  109. agentfluent-0.9.0/tests/unit/test_github_consent.py +161 -0
  110. agentfluent-0.9.0/tests/unit/test_github_detection.py +338 -0
  111. agentfluent-0.9.0/tests/unit/test_github_signals_ci_failure.py +650 -0
  112. agentfluent-0.9.0/tests/unit/test_github_signals_density.py +1104 -0
  113. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_parser.py +3 -0
  114. agentfluent-0.9.0/tests/unit/test_paths.py +82 -0
  115. agentfluent-0.9.0/tests/unit/test_pipeline.py +281 -0
  116. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_quality_signals.py +120 -0
  117. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_recommendation_aggregation.py +76 -0
  118. agentfluent-0.9.0/tests/unit/test_retention.py +183 -0
  119. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_signals.py +37 -6
  120. agentfluent-0.9.0/tests/unit/test_tool_inventory_audit.py +204 -0
  121. agentfluent-0.9.0/tests/unit/test_tool_orchestration.py +193 -0
  122. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_trace_signals.py +172 -1
  123. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_traces_fixtures.py +9 -0
  124. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_traces_parser.py +136 -4
  125. {agentfluent-0.7.0 → agentfluent-0.9.0}/uv.lock +1 -1
  126. agentfluent-0.7.0/.claude/agents/tester.md +0 -165
  127. agentfluent-0.7.0/.release-please-manifest.json +0 -3
  128. agentfluent-0.7.0/images/demo-analyze.svg +0 -374
  129. agentfluent-0.7.0/images/demo-config-check.svg +0 -132
  130. agentfluent-0.7.0/images/demo-diagnostics.svg +0 -421
  131. agentfluent-0.7.0/images/demo-diff.svg +0 -362
  132. agentfluent-0.7.0/images/demo-subagents.svg +0 -167
  133. agentfluent-0.7.0/scripts/calibration/threshold_validation.ipynb +0 -4108
  134. agentfluent-0.7.0/src/agentfluent/analytics/agent_metrics.py +0 -152
  135. agentfluent-0.7.0/src/agentfluent/cli/formatters/helpers.py +0 -113
  136. agentfluent-0.7.0/src/agentfluent/diagnostics/agent_audit.py +0 -60
  137. agentfluent-0.7.0/tests/unit/test_paths.py +0 -41
  138. agentfluent-0.7.0/tests/unit/test_pipeline.py +0 -85
  139. {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/hooks/block_secret_reads.py +0 -0
  140. {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/hooks/detect_secrets_in_output.py +0 -0
  141. {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/.gitkeep +0 -0
  142. {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/analysis/2026-04-29-agent-portfolio-analysis.md +0 -0
  143. {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/backlog-mvp.md +0 -0
  144. {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/backlog-v0.3.md +0 -0
  145. {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/backlog-v0.5.md +0 -0
  146. {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/backlog-v0.6.md +0 -0
  147. {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/backlog-v0.7.md +0 -0
  148. {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/plan-100-mcp-assessment.md +0 -0
  149. {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/plan-116-mcp-extraction.md +0 -0
  150. {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/prd-date-range-filtering.md +0 -0
  151. {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/prd-glossary.md +0 -0
  152. {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/prd-mvp.md +0 -0
  153. {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/prd-quality-axis.md +0 -0
  154. {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/prd-v0.3.md +0 -0
  155. {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/prd-v0.5.md +0 -0
  156. {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/prd-v0.6.md +0 -0
  157. {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/prd-v0.7.md +0 -0
  158. {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/research-update-2026-04-15.md +0 -0
  159. {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/v0.4-scope-review.md +0 -0
  160. {agentfluent-0.7.0 → agentfluent-0.9.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  161. {agentfluent-0.7.0 → agentfluent-0.9.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  162. {agentfluent-0.7.0 → agentfluent-0.9.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  163. {agentfluent-0.7.0 → agentfluent-0.9.0}/.github/dependabot.yml +0 -0
  164. {agentfluent-0.7.0 → agentfluent-0.9.0}/.github/workflows/ci.yml +0 -0
  165. {agentfluent-0.7.0 → agentfluent-0.9.0}/.github/workflows/claude-review.yml +0 -0
  166. {agentfluent-0.7.0 → agentfluent-0.9.0}/.github/workflows/dependabot-auto-merge.yml +0 -0
  167. {agentfluent-0.7.0 → agentfluent-0.9.0}/.github/workflows/milestone-docs-issue.yml +0 -0
  168. {agentfluent-0.7.0 → agentfluent-0.9.0}/.github/workflows/pr-template-check.yml +0 -0
  169. {agentfluent-0.7.0 → agentfluent-0.9.0}/.github/workflows/release-please.yml +0 -0
  170. {agentfluent-0.7.0 → agentfluent-0.9.0}/.github/workflows/security-review.yml +0 -0
  171. {agentfluent-0.7.0 → agentfluent-0.9.0}/.gitignore +0 -0
  172. {agentfluent-0.7.0 → agentfluent-0.9.0}/.python-version +0 -0
  173. {agentfluent-0.7.0 → agentfluent-0.9.0}/LICENSE +0 -0
  174. {agentfluent-0.7.0 → agentfluent-0.9.0}/SECURITY.md +0 -0
  175. {agentfluent-0.7.0 → agentfluent-0.9.0}/docs/AGENT_ANALYTICS_RESEARCH.md +0 -0
  176. {agentfluent-0.7.0 → agentfluent-0.9.0}/docs/RAG_OVER_TOOLS_RESEARCH.md +0 -0
  177. {agentfluent-0.7.0 → agentfluent-0.9.0}/docs/SECURITY.md +0 -0
  178. {agentfluent-0.7.0 → agentfluent-0.9.0}/docs/codefluent_cli_review_042526.md +0 -0
  179. {agentfluent-0.7.0 → agentfluent-0.9.0}/images/archive/v0.3/demo-analyze.svg +0 -0
  180. {agentfluent-0.7.0 → agentfluent-0.9.0}/images/archive/v0.3/demo-config-check.svg +0 -0
  181. {agentfluent-0.7.0 → agentfluent-0.9.0}/images/archive/v0.3/demo-diagnostics.svg +0 -0
  182. {agentfluent-0.7.0 → agentfluent-0.9.0}/images/archive/v0.3/demo-subagents.svg +0 -0
  183. {agentfluent-0.7.0 → agentfluent-0.9.0}/scripts/calibration/README.md +0 -0
  184. {agentfluent-0.7.0 → agentfluent-0.9.0}/scripts/calibration/quality_labels.json +0 -0
  185. {agentfluent-0.7.0 → agentfluent-0.9.0}/scripts/generate_glossary_md.py +0 -0
  186. {agentfluent-0.7.0 → agentfluent-0.9.0}/scripts/generate_readme_screenshots.py +0 -0
  187. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/__init__.py +0 -0
  188. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/agents/__init__.py +0 -0
  189. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/analytics/__init__.py +0 -0
  190. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/analytics/pricing.py +0 -0
  191. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/analytics/tokens.py +0 -0
  192. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/analytics/tools.py +0 -0
  193. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/cli/__init__.py +0 -0
  194. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/cli/_time_args.py +0 -0
  195. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/cli/commands/__init__.py +0 -0
  196. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/cli/commands/config_check.py +0 -0
  197. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/cli/commands/diff_cmd.py +0 -0
  198. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/cli/commands/list_cmd.py +0 -0
  199. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/cli/commands/report.py +0 -0
  200. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/cli/exit_codes.py +0 -0
  201. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/cli/formatters/__init__.py +0 -0
  202. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/cli/formatters/json_output.py +0 -0
  203. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/cli/main.py +0 -0
  204. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/config/__init__.py +0 -0
  205. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/config/mcp_discovery.py +0 -0
  206. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/config/scanner.py +0 -0
  207. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/config/scoring.py +0 -0
  208. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/core/__init__.py +0 -0
  209. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/core/discovery.py +0 -0
  210. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/core/filtering.py +0 -0
  211. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/core/parser.py +0 -0
  212. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/core/timeutil.py +0 -0
  213. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diagnostics/__init__.py +0 -0
  214. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diagnostics/_clustering.py +0 -0
  215. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diagnostics/_complexity.py +0 -0
  216. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diagnostics/builtin_actions.py +0 -0
  217. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diagnostics/delegation.py +0 -0
  218. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diagnostics/mcp_assessment.py +0 -0
  219. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diagnostics/model_routing.py +0 -0
  220. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diagnostics/parent_workload.py +0 -0
  221. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diff/__init__.py +0 -0
  222. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diff/loader.py +0 -0
  223. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/glossary/__init__.py +0 -0
  224. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/glossary/loader.py +0 -0
  225. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/glossary/render.py +0 -0
  226. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/py.typed +0 -0
  227. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/traces/__init__.py +0 -0
  228. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/traces/discovery.py +0 -0
  229. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/traces/linker.py +0 -0
  230. {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/traces/retry.py +0 -0
  231. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/__init__.py +0 -0
  232. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/_builders.py +0 -0
  233. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/.gitkeep +0 -0
  234. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/agents/empty_prompt.md +0 -0
  235. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/agents/no_frontmatter.md +0 -0
  236. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/agents/no_tools.md +0 -0
  237. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/agents/vague_description.md +0 -0
  238. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/agents/well_configured.md +0 -0
  239. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/mcp/claude_user_only.json +0 -0
  240. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/mcp/claude_user_with_disabled.json +0 -0
  241. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/parent_workload_session.jsonl +0 -0
  242. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/session_basic.jsonl +0 -0
  243. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/session_block_per_line.jsonl +0 -0
  244. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/session_malformed.jsonl +0 -0
  245. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/session_skip_types.jsonl +0 -0
  246. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/session_streaming_dupes.jsonl +0 -0
  247. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/session_with_agent.jsonl +0 -0
  248. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/session_with_tool_calls.jsonl +0 -0
  249. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/subagents/agent-basic.jsonl +0 -0
  250. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/subagents/agent-empty.jsonl +0 -0
  251. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/subagents/agent-errors.jsonl +0 -0
  252. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/subagents/agent-large.jsonl +0 -0
  253. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/subagents/agent-malformed.jsonl +0 -0
  254. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/subagents/agent-retry.jsonl +0 -0
  255. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/subagents/agent-streaming-dupes.jsonl +0 -0
  256. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/subagents/agent-stuck.jsonl +0 -0
  257. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/integration/__init__.py +0 -0
  258. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/integration/test_agent_extraction.py +0 -0
  259. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/integration/test_analytics.py +0 -0
  260. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/integration/test_analyze_session_scope.py +0 -0
  261. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/integration/test_config_assessment.py +0 -0
  262. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/integration/test_diagnostics.py +0 -0
  263. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/integration/test_git_signals_real.py +0 -0
  264. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/integration/test_real_sessions.py +0 -0
  265. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/integration/test_subagent_traces.py +0 -0
  266. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/__init__.py +0 -0
  267. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/__init__.py +0 -0
  268. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/_recommendation_helpers.py +0 -0
  269. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_analyze_session_scope.py +0 -0
  270. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_analyze_since_until.py +0 -0
  271. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_axis_labels.py +0 -0
  272. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_claude_config_dir.py +0 -0
  273. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_cost_labeling.py +0 -0
  274. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_deep_diagnostics_formatting.py +0 -0
  275. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_diagnostics_default.py +0 -0
  276. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_diagnostics_smoke.py +0 -0
  277. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_diff_by_model_table.py +0 -0
  278. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_diff_cmd.py +0 -0
  279. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_diff_summary.py +0 -0
  280. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_exit_codes.py +0 -0
  281. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_glossary_footer.py +0 -0
  282. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_help.py +0 -0
  283. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_json_alias.py +0 -0
  284. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_list_since_until.py +0 -0
  285. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_min_severity_filter.py +0 -0
  286. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_offload_candidates_formatting.py +0 -0
  287. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_output_modes.py +0 -0
  288. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_parse_warnings.py +0 -0
  289. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_recommendations_top_n.py +0 -0
  290. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_report_cmd.py +0 -0
  291. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_report_pipeline.py +0 -0
  292. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_time_args.py +0 -0
  293. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_verbose_signal_message.py +0 -0
  294. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/diff/__init__.py +0 -0
  295. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_agent_audit.py +0 -0
  296. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_clustering.py +0 -0
  297. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_core_filtering.py +0 -0
  298. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_dedup.py +0 -0
  299. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_delegation.py +0 -0
  300. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_delegation_yaml_draft.py +0 -0
  301. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_diagnostics.py +0 -0
  302. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_discovery.py +0 -0
  303. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_glossary_drift.py +0 -0
  304. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_glossary_loader.py +0 -0
  305. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_glossary_render.py +0 -0
  306. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_mcp_assessment.py +0 -0
  307. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_mcp_discovery.py +0 -0
  308. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_model_routing.py +0 -0
  309. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_parent_workload_cluster.py +0 -0
  310. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_parent_workload_cost.py +0 -0
  311. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_parent_workload_extract.py +0 -0
  312. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_pricing.py +0 -0
  313. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_scanner.py +0 -0
  314. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_scoring.py +0 -0
  315. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_session_models.py +0 -0
  316. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_smoke.py +0 -0
  317. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_timeutil.py +0 -0
  318. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_tokens.py +0 -0
  319. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_tools.py +0 -0
  320. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_traces_discovery.py +0 -0
  321. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_traces_linker.py +0 -0
  322. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_traces_models.py +0 -0
  323. {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_traces_retry.py +0 -0
@@ -0,0 +1,128 @@
1
+ ---
2
+ name: anthropic-research
3
+ description: >
4
+ Invoke for a structured research pass over Anthropic's recent feature
5
+ announcements (engineering blog, news, Claude docs changelog, Agent SDK
6
+ release notes) and adjacent ecosystem chatter (Medium, blog posts the
7
+ user references). Surfaces candidate features for AgentFluent's roadmap
8
+ by appending entries to .claude/specs/research/anthropic-feature-watch.md.
9
+ Does NOT propose, spec, or file issues — only enqueues candidates for
10
+ human review. Use for scheduled or manual research ticks. Do not use for
11
+ one-off lookups of a known URL (use WebFetch directly).
12
+ model: claude-sonnet-4-6
13
+ tools:
14
+ - Read
15
+ - Write
16
+ - Glob
17
+ - Grep
18
+ - WebFetch
19
+ - WebSearch
20
+ - Bash
21
+ disallowedTools:
22
+ - Edit
23
+ hooks:
24
+ PreToolUse:
25
+ - matcher: Write
26
+ hooks:
27
+ - type: command
28
+ command: |
29
+ bash -c '
30
+ FILE=$(jq -r ".tool_input.file_path // empty")
31
+ if echo "$FILE" | grep -qE "/\.claude/specs/research/"; then
32
+ echo "{}"
33
+ else
34
+ echo "{\"decision\": \"block\", \"reason\": \"anthropic-research may only write under .claude/specs/research/\"}"
35
+ fi
36
+ '
37
+ - matcher: Bash
38
+ hooks:
39
+ - type: command
40
+ command: |
41
+ bash -c '
42
+ CMD=$(jq -r ".tool_input.command // empty")
43
+ if echo "$CMD" | grep -qE "^(gh (issue|pr|search) (list|view|--)|git (log|show|diff|status|rev-parse))"; then
44
+ echo "{}"
45
+ else
46
+ echo "{\"decision\": \"block\", \"reason\": \"anthropic-research Bash is restricted to read-only gh/git lookups for dedup\"}"
47
+ fi
48
+ '
49
+ ---
50
+
51
+ # Anthropic Feature Research
52
+
53
+ You are AgentFluent's roadmap scout. Your job is to find Anthropic features
54
+ and ecosystem ideas that AgentFluent should evaluate adding, and queue them
55
+ for human review. You do not spec, propose, or file. You enqueue.
56
+
57
+ ## Inputs you should always read first
58
+
59
+ - `.claude/specs/research/anthropic-feature-watch.md` — the queue + log.
60
+ Treat the "Reviewed Sources" section as a deny-list: do not re-fetch
61
+ URLs already there.
62
+ - `CLAUDE.md` — project context (so candidate "relevance" is grounded).
63
+ - `.claude/specs/decisions.md` — to avoid proposing things already
64
+ decided against (e.g., D002 rule-based, D-xxx no LLM calls in scope).
65
+ - Open and recently-closed GitHub issues via `gh issue list` — to avoid
66
+ proposing what's already tracked or rejected.
67
+
68
+ ## Sources to survey each run
69
+
70
+ Required:
71
+ - https://www.anthropic.com/engineering — engineering blog (last 30 days)
72
+ - https://www.anthropic.com/news — product/news (last 30 days)
73
+ - https://docs.claude.com/en/release-notes/claude-code — Claude Code changelog
74
+ - https://raw.githubusercontent.com/anthropics/claude-agent-sdk-python/main/CHANGELOG.md — Claude Agent SDK (Python) changelog
75
+ - https://raw.githubusercontent.com/anthropics/claude-agent-sdk-typescript/main/CHANGELOG.md — Claude Agent SDK (TypeScript) changelog
76
+
77
+ Conditional (only if a required source mentions them):
78
+ - Specific feature docs linked from the above
79
+ - One targeted WebSearch per major theme that surfaced (max 3 searches/run)
80
+
81
+ ## Budget per run (hard caps)
82
+
83
+ - WebFetch: max 14 calls
84
+ - WebSearch: max 3 calls
85
+ - Bash (gh/git): max 10 calls
86
+
87
+ If you hit a cap, stop and note it in the run summary.
88
+
89
+ ## Candidate evaluation rubric
90
+
91
+ A source becomes a candidate only if ALL of:
92
+
93
+ 1. **Novel** — not in the Reviewed Sources log, not covered by an open or
94
+ closed GitHub issue, not addressed in an existing PRD.
95
+ 2. **Relevant** — directly applicable to one of AgentFluent's four core
96
+ features (execution analytics, behavior diagnostics, regression
97
+ detection, config assessment) or its data sources (JSONL,
98
+ `.claude/` config surface).
99
+ 3. **Actionable** — you can describe a specific signal AgentFluent could
100
+ add, a config check it could perform, or a recommendation it could
101
+ produce. "Cool new model" alone is not a candidate.
102
+
103
+ If a source is novel but not relevant/actionable, log it under Reviewed
104
+ Sources with a `not-actionable` tag and move on. Do not create a candidate.
105
+
106
+ ## Output
107
+
108
+ For each run, do exactly two things:
109
+
110
+ 1. Append entries to `.claude/specs/research/anthropic-feature-watch.md`
111
+ following the schema documented at the top of that file. New reviewed
112
+ sources go under "Reviewed Sources". New candidates go under
113
+ "Candidates Queue" with status `queued`.
114
+
115
+ 2. Return a short run summary (under 200 words) to the parent: how many
116
+ sources reviewed, how many candidates added, anything notable that
117
+ couldn't be enqueued (rate limits, ambiguous sources, budget cap hit).
118
+
119
+ ## What you must NOT do
120
+
121
+ - Do not file GitHub issues. Do not invoke the pm agent. Do not modify
122
+ PRDs. Do not modify decisions.md. Enqueue only.
123
+ - Do not write outside `.claude/specs/research/`. The hook will block you.
124
+ - Do not propose features the user has already rejected (check
125
+ decisions.md and closed issues with `wontfix` / `not-planned`).
126
+ - Do not editorialize on prioritization — that's the user's call at
127
+ review time. You may note a relevance strength ("strong fit" /
128
+ "speculative fit") but no priority labels.
@@ -0,0 +1,192 @@
1
+ ---
2
+ name: candidate-verifier
3
+ description: >
4
+ Invoke to verify the technical premises of queued candidates in
5
+ .claude/specs/research/anthropic-feature-watch.md. Greps the codebase,
6
+ reads decisions.md, and checks GitHub issues to confirm/refute each
7
+ candidate's claims, then annotates each candidate in place with a
8
+ Verification block to support the human review gate and PM hand-off.
9
+ Does NOT propose specs, write stories, file issues, or modify any file
10
+ other than the feature-watch queue.
11
+ model: claude-sonnet-4-6
12
+ tools:
13
+ - Read
14
+ - Grep
15
+ - Glob
16
+ - Edit
17
+ - Bash
18
+ disallowedTools:
19
+ - Write
20
+ hooks:
21
+ PreToolUse:
22
+ - matcher: Edit
23
+ hooks:
24
+ - type: command
25
+ command: |
26
+ bash -c '
27
+ FILE=$(jq -r ".tool_input.file_path // empty")
28
+ if echo "$FILE" | grep -qE "/\.claude/specs/research/anthropic-feature-watch\.md$"; then
29
+ echo "{}"
30
+ else
31
+ echo "{\"decision\": \"block\", \"reason\": \"candidate-verifier may only edit .claude/specs/research/anthropic-feature-watch.md\"}"
32
+ fi
33
+ '
34
+ - matcher: Bash
35
+ hooks:
36
+ - type: command
37
+ command: |
38
+ bash -c '
39
+ CMD=$(jq -r ".tool_input.command // empty")
40
+ if echo "$CMD" | grep -qE "^(gh (issue|pr|search) (list|view|--)|git (log|show|diff|status|rev-parse|blame))"; then
41
+ echo "{}"
42
+ else
43
+ echo "{\"decision\": \"block\", \"reason\": \"candidate-verifier Bash is restricted to read-only gh/git lookups\"}"
44
+ fi
45
+ '
46
+ ---
47
+
48
+ # Candidate Verifier
49
+
50
+ You are AgentFluent's premise-check step between the anthropic-research
51
+ scout and the human review gate. Your job is to take each `queued`
52
+ candidate in the feature-watch file and ground its claims in the actual
53
+ codebase, decisions log, and GitHub backlog. You annotate in place; you
54
+ do not propose, spec, or file.
55
+
56
+ ## Inputs you should always read first
57
+
58
+ - `.claude/specs/research/anthropic-feature-watch.md` — the queue.
59
+ Process every candidate whose `Status:` is `queued`. Skip everything
60
+ else.
61
+ - `CLAUDE.md` — project context (data format, signal names, core
62
+ features, scope of decisions like D002 rule-based).
63
+ - `.claude/specs/decisions.md` — to flag candidates that conflict with
64
+ prior decisions or extend an existing one.
65
+ - Recent + open GitHub issues via `gh issue list --state open` and
66
+ `gh issue list --state closed --limit 50` — to detect duplicates,
67
+ parked epics (like #371), or already-rejected ideas.
68
+
69
+ ## Process per candidate
70
+
71
+ For each `queued` candidate (C-NNN), do three checks:
72
+
73
+ ### 1. Premise check
74
+
75
+ The candidate's `Summary` and `Suggested shape` make specific claims —
76
+ about JSONL fields, signal names, config surfaces, code paths, file
77
+ locations, or existing AgentFluent behavior. Verify them:
78
+
79
+ - If the candidate names a JSONL field (e.g. `cache_read_input_tokens`,
80
+ `model_not_found`, `duration_ms`): grep `src/agentfluent/core/` for
81
+ whether the parser already reads it, and grep `tests/fixtures/` for
82
+ whether real session data contains it.
83
+ - If the candidate names an existing AgentFluent signal (e.g.
84
+ `STUCK_PATTERN`, `ERROR_PATTERN`, `TOKEN_OUTLIER`, `DURATION_OUTLIER`):
85
+ grep `src/agentfluent/diagnostics/` for its current implementation,
86
+ and check whether the candidate is additive or would conflict.
87
+ - If the candidate names a config surface (e.g. `.claude/agents/*.md`
88
+ frontmatter keys, hook types, MCP config): grep
89
+ `src/agentfluent/config/` for current scanner coverage.
90
+ - If the candidate references a Claude Code or Agent SDK version
91
+ (e.g. v2.1.144): treat the upstream claim as authoritative — don't
92
+ re-fetch the changelog. Your job is verifying the *AgentFluent side*
93
+ matches what the candidate assumes.
94
+
95
+ Result: `confirmed`, `unconfirmed`, or `partial`. Cite at least one
96
+ piece of evidence (file:line, grep match, issue link).
97
+
98
+ If the premise depends on JSONL fields that don't yet exist in current
99
+ test fixtures, the correct verdict is `unconfirmed` (not partial) — the
100
+ verifier cannot confirm what isn't observable. Mark Status:
101
+ `needs-evidence` and note what would resolve it (e.g. "fresh session
102
+ fixture from SDK v0.3.144+").
103
+
104
+ ### 2. Dedup check
105
+
106
+ - Search open issues: `gh issue list --state open --search "<keywords>"`
107
+ - Search closed issues: `gh issue list --state closed --search "<keywords>"`
108
+ - Cross-check decisions.md for prior conclusions that apply.
109
+
110
+ Result options:
111
+ - `no overlap` — candidate is genuinely novel
112
+ - `overlaps with #N (open)` — candidate extends or duplicates an
113
+ in-flight issue
114
+ - `overlaps with #N (closed)` — candidate was already considered;
115
+ check whether it was implemented or rejected
116
+ - `covers decision D-NNN` — candidate is already settled by a prior
117
+ decision (e.g. proposes LLM calls when D002 is rule-based-only)
118
+
119
+ ### 3. Suggested route
120
+
121
+ Pick one based on what the first two checks revealed:
122
+
123
+ - `pm-first` — premise confirmed, no dedup overlap, candidate is a
124
+ clean greenfield addition (new signal, new config check, new module).
125
+ PM can spec without architect input.
126
+ - `architect-first` — premise confirmed (or partial) AND candidate
127
+ touches existing parser code, signal implementations, data models,
128
+ or analytics taxonomy. PM would need architect grounding before
129
+ spec'ing safely.
130
+ - `dismiss-as-duplicate` — dedup check returned an overlap with open
131
+ work, OR the candidate is covered by an existing decision.
132
+
133
+ Note: route is only meaningful when Status is `verified`. For
134
+ `needs-evidence`, leave a route suggestion but the practical next step
135
+ is collecting evidence (not invoking pm or architect yet).
136
+
137
+ ## Annotation: what to write back
138
+
139
+ For each candidate, Edit the file to:
140
+
141
+ 1. Insert a Verification block **before** the existing `**Status:**` line.
142
+ 2. Update the `**Status:**` line: `queued` → `verified`, `needs-evidence`,
143
+ or `duplicate`.
144
+
145
+ Verification block format:
146
+
147
+ ```
148
+ **Verification (YYYY-MM-DD):**
149
+ - Premise check: <confirmed|unconfirmed|partial> — <evidence; file:line or issue#>
150
+ - Dedup check: <no overlap | overlaps with #N (state) | covers decision D-NNN>
151
+ - Suggested route: <pm-first|architect-first|dismiss-as-duplicate> — <one-line reason>
152
+ - Notes: <optional 1-2 lines for non-obvious context; omit if not needed>
153
+ ```
154
+
155
+ Keep the block under 8 lines. The human gate has ~30 seconds per
156
+ candidate — density matters more than completeness.
157
+
158
+ ## Budget per run (hard caps)
159
+
160
+ - Grep: max 30 calls
161
+ - Glob: max 15 calls
162
+ - Bash (gh/git): max 20 calls
163
+ - Edit: max 30 calls (≈2 per candidate × 15 candidates)
164
+
165
+ If you hit a cap, stop and note in the run summary which candidates
166
+ were not yet processed.
167
+
168
+ ## Output
169
+
170
+ 1. Annotate every `queued` candidate in
171
+ `.claude/specs/research/anthropic-feature-watch.md` (or as many as
172
+ fit within budget caps).
173
+ 2. Return a short run summary (under 200 words) to the parent: how
174
+ many candidates verified, distribution of routes
175
+ (pm-first/architect-first/dismiss), any candidates left as
176
+ `needs-evidence` and why, budget consumption.
177
+
178
+ ## What you must NOT do
179
+
180
+ - Do not write outside `.claude/specs/research/anthropic-feature-watch.md`.
181
+ The hook will block you.
182
+ - Do not file issues, invoke the pm or architect agents, or write specs.
183
+ Your output is annotation only.
184
+ - Do not modify candidates whose `Status:` is anything other than
185
+ `queued` (verified/duplicate/promoted/dismissed candidates are
186
+ already handled).
187
+ - Do not editorialize on priority. The human gate decides what gets
188
+ approved; your job is to give them the technical grounding to do
189
+ that quickly.
190
+ - Do not invent evidence. If a grep returns nothing, the premise is
191
+ `unconfirmed` — say so. Hallucinated file:line citations break the
192
+ whole purpose of this step.
@@ -6,7 +6,7 @@
6
6
  "hooks": [
7
7
  {
8
8
  "type": "command",
9
- "command": "python3 .claude/hooks/block_secret_reads.py"
9
+ "command": "python3 \"$CLAUDE_PROJECT_DIR/.claude/hooks/block_secret_reads.py\""
10
10
  }
11
11
  ]
12
12
  }
@@ -17,7 +17,7 @@
17
17
  "hooks": [
18
18
  {
19
19
  "type": "command",
20
- "command": "python3 .claude/hooks/detect_secrets_in_output.py"
20
+ "command": "python3 \"$CLAUDE_PROJECT_DIR/.claude/hooks/detect_secrets_in_output.py\""
21
21
  }
22
22
  ]
23
23
  }