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.
- agentfluent-0.9.0/.claude/agents/anthropic-research.md +128 -0
- agentfluent-0.9.0/.claude/agents/candidate-verifier.md +192 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/settings.json +2 -2
- agentfluent-0.9.0/.claude/skills/promote-candidates/SKILL.md +464 -0
- agentfluent-0.9.0/.claude/specs/analysis/2026-05-17-v07-dogfood-analysis.md +197 -0
- agentfluent-0.9.0/.claude/specs/analysis/2026-05-30-v08-dogfood/analysis.md +186 -0
- agentfluent-0.9.0/.claude/specs/analysis/333-error-pattern-precision/findings.md +126 -0
- agentfluent-0.9.0/.claude/specs/analysis/333-error-pattern-precision/labels.tsv +30 -0
- agentfluent-0.9.0/.claude/specs/analysis/333-error-pattern-precision/sample.tsv +30 -0
- agentfluent-0.9.0/.claude/specs/analysis/333-error-pattern-precision/script.py +163 -0
- agentfluent-0.9.0/.claude/specs/analysis/402-calibration/calibration.md +112 -0
- agentfluent-0.9.0/.claude/specs/analysis/402-calibration/pairs.tsv +35 -0
- agentfluent-0.9.0/.claude/specs/analysis/407-calibration/calibration.md +196 -0
- agentfluent-0.9.0/.claude/specs/analysis/407-calibration/detections.tsv +196 -0
- agentfluent-0.9.0/.claude/specs/analysis/407-calibration/export.py +126 -0
- agentfluent-0.9.0/.claude/specs/analysis/407-calibration/sample.py +40 -0
- agentfluent-0.9.0/.claude/specs/analysis/407-calibration/tune.py +45 -0
- agentfluent-0.9.0/.claude/specs/backlog-v0.8.md +303 -0
- agentfluent-0.9.0/.claude/specs/backlog-v0.9.md +458 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/decisions.md +309 -0
- agentfluent-0.9.0/.claude/specs/prd-advanced-tool-use-diagnostics.md +284 -0
- agentfluent-0.9.0/.claude/specs/prd-context-fork-loop-detection.md +137 -0
- agentfluent-0.9.0/.claude/specs/prd-research-pipeline-phase-3.md +240 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/prd-tier3-github-enrichment.md +21 -0
- agentfluent-0.9.0/.claude/specs/prd-tool-name-normalization.md +193 -0
- agentfluent-0.9.0/.claude/specs/prd-v0.8.md +206 -0
- agentfluent-0.9.0/.claude/specs/prd-v0.9.md +225 -0
- agentfluent-0.9.0/.claude/specs/research/anthropic-feature-watch.md +349 -0
- agentfluent-0.9.0/.release-please-manifest.json +3 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/CHANGELOG.md +74 -13
- {agentfluent-0.7.0 → agentfluent-0.9.0}/CLAUDE.md +2 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/CONTRIBUTING.md +1 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/PKG-INFO +60 -117
- {agentfluent-0.7.0 → agentfluent-0.9.0}/README.md +59 -116
- {agentfluent-0.7.0 → agentfluent-0.9.0}/docs/GLOSSARY.md +384 -11
- agentfluent-0.9.0/docs/ROADMAP.md +130 -0
- agentfluent-0.9.0/images/demo-analyze.svg +426 -0
- agentfluent-0.9.0/images/demo-config-check.svg +136 -0
- agentfluent-0.9.0/images/demo-diagnostics.svg +445 -0
- agentfluent-0.9.0/images/demo-diff.svg +466 -0
- agentfluent-0.9.0/images/demo-subagents.svg +167 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/pyproject.toml +1 -1
- {agentfluent-0.7.0 → agentfluent-0.9.0}/release-please-config.json +1 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/scripts/calibration/build_notebook.py +98 -68
- agentfluent-0.9.0/scripts/calibration/threshold_validation.ipynb +4191 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/agents/extractor.py +3 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/agents/models.py +49 -1
- agentfluent-0.9.0/src/agentfluent/analytics/agent_metrics.py +288 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/analytics/pipeline.py +108 -2
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/cli/commands/analyze.py +170 -8
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/cli/commands/explain.py +17 -2
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/cli/commands/report_renderers.py +29 -8
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/cli/formatters/diff_table.py +30 -7
- agentfluent-0.9.0/src/agentfluent/cli/formatters/helpers.py +218 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/cli/formatters/table.py +86 -4
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/config/models.py +30 -0
- agentfluent-0.9.0/src/agentfluent/config/retention.py +179 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/core/paths.py +53 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/core/session.py +7 -0
- agentfluent-0.9.0/src/agentfluent/diagnostics/_git_helpers.py +167 -0
- agentfluent-0.9.0/src/agentfluent/diagnostics/agent_audit.py +163 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diagnostics/aggregation.py +58 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diagnostics/correlator.py +341 -2
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diagnostics/git_signals.py +87 -113
- agentfluent-0.9.0/src/agentfluent/diagnostics/github_signals.py +1180 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diagnostics/models.py +43 -9
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diagnostics/pipeline.py +106 -38
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diagnostics/quality_signals.py +37 -2
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diagnostics/signals.py +26 -3
- agentfluent-0.9.0/src/agentfluent/diagnostics/tool_orchestration.py +183 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diagnostics/trace_signals.py +237 -15
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diff/compute.py +23 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diff/models.py +39 -0
- agentfluent-0.9.0/src/agentfluent/github/__init__.py +54 -0
- agentfluent-0.9.0/src/agentfluent/github/cache.py +201 -0
- agentfluent-0.9.0/src/agentfluent/github/client.py +193 -0
- agentfluent-0.9.0/src/agentfluent/github/consent.py +197 -0
- agentfluent-0.9.0/src/agentfluent/github/detection.py +256 -0
- agentfluent-0.9.0/src/agentfluent/github/models.py +73 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/glossary/models.py +2 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/glossary/terms.yaml +340 -11
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/traces/models.py +41 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/traces/parser.py +55 -17
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/conftest.py +28 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/report/analyze_snapshot.json +8 -2
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/report/expected_report.md +6 -4
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/conftest.py +11 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_active_duration_display.py +66 -0
- agentfluent-0.9.0/tests/unit/cli/test_agent_duration_cell.py +128 -0
- agentfluent-0.9.0/tests/unit/cli/test_analyze_github_flag.py +272 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_axis_json_contract.py +30 -0
- agentfluent-0.9.0/tests/unit/cli/test_cleanup_warning_cli.py +96 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_diff_table_signed.py +17 -0
- agentfluent-0.9.0/tests/unit/cli/test_environment_warning_banner.py +77 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_explain.py +5 -2
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_json_output.py +6 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_report_golden.py +10 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_report_renderers.py +27 -1
- agentfluent-0.9.0/tests/unit/cli/test_tier3_degraded_banner.py +64 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/diff/test_compute.py +129 -1
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_agent_metrics.py +164 -1
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_agent_models.py +78 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_correlator.py +326 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_diagnostics_pipeline.py +213 -25
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_extractor.py +5 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_git_signals.py +187 -25
- agentfluent-0.9.0/tests/unit/test_github_cache.py +222 -0
- agentfluent-0.9.0/tests/unit/test_github_client.py +222 -0
- agentfluent-0.9.0/tests/unit/test_github_consent.py +161 -0
- agentfluent-0.9.0/tests/unit/test_github_detection.py +338 -0
- agentfluent-0.9.0/tests/unit/test_github_signals_ci_failure.py +650 -0
- agentfluent-0.9.0/tests/unit/test_github_signals_density.py +1104 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_parser.py +3 -0
- agentfluent-0.9.0/tests/unit/test_paths.py +82 -0
- agentfluent-0.9.0/tests/unit/test_pipeline.py +281 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_quality_signals.py +120 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_recommendation_aggregation.py +76 -0
- agentfluent-0.9.0/tests/unit/test_retention.py +183 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_signals.py +37 -6
- agentfluent-0.9.0/tests/unit/test_tool_inventory_audit.py +204 -0
- agentfluent-0.9.0/tests/unit/test_tool_orchestration.py +193 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_trace_signals.py +172 -1
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_traces_fixtures.py +9 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_traces_parser.py +136 -4
- {agentfluent-0.7.0 → agentfluent-0.9.0}/uv.lock +1 -1
- agentfluent-0.7.0/.claude/agents/tester.md +0 -165
- agentfluent-0.7.0/.release-please-manifest.json +0 -3
- agentfluent-0.7.0/images/demo-analyze.svg +0 -374
- agentfluent-0.7.0/images/demo-config-check.svg +0 -132
- agentfluent-0.7.0/images/demo-diagnostics.svg +0 -421
- agentfluent-0.7.0/images/demo-diff.svg +0 -362
- agentfluent-0.7.0/images/demo-subagents.svg +0 -167
- agentfluent-0.7.0/scripts/calibration/threshold_validation.ipynb +0 -4108
- agentfluent-0.7.0/src/agentfluent/analytics/agent_metrics.py +0 -152
- agentfluent-0.7.0/src/agentfluent/cli/formatters/helpers.py +0 -113
- agentfluent-0.7.0/src/agentfluent/diagnostics/agent_audit.py +0 -60
- agentfluent-0.7.0/tests/unit/test_paths.py +0 -41
- agentfluent-0.7.0/tests/unit/test_pipeline.py +0 -85
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/hooks/block_secret_reads.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/hooks/detect_secrets_in_output.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/.gitkeep +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/analysis/2026-04-29-agent-portfolio-analysis.md +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/backlog-mvp.md +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/backlog-v0.3.md +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/backlog-v0.5.md +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/backlog-v0.6.md +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/backlog-v0.7.md +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/plan-100-mcp-assessment.md +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/plan-116-mcp-extraction.md +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/prd-date-range-filtering.md +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/prd-glossary.md +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/prd-mvp.md +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/prd-quality-axis.md +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/prd-v0.3.md +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/prd-v0.5.md +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/prd-v0.6.md +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/prd-v0.7.md +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/research-update-2026-04-15.md +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.claude/specs/v0.4-scope-review.md +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.github/dependabot.yml +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.github/workflows/ci.yml +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.github/workflows/claude-review.yml +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.github/workflows/dependabot-auto-merge.yml +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.github/workflows/milestone-docs-issue.yml +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.github/workflows/pr-template-check.yml +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.github/workflows/release-please.yml +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.github/workflows/security-review.yml +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.gitignore +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/.python-version +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/LICENSE +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/SECURITY.md +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/docs/AGENT_ANALYTICS_RESEARCH.md +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/docs/RAG_OVER_TOOLS_RESEARCH.md +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/docs/SECURITY.md +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/docs/codefluent_cli_review_042526.md +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/images/archive/v0.3/demo-analyze.svg +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/images/archive/v0.3/demo-config-check.svg +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/images/archive/v0.3/demo-diagnostics.svg +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/images/archive/v0.3/demo-subagents.svg +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/scripts/calibration/README.md +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/scripts/calibration/quality_labels.json +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/scripts/generate_glossary_md.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/scripts/generate_readme_screenshots.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/__init__.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/agents/__init__.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/analytics/__init__.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/analytics/pricing.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/analytics/tokens.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/analytics/tools.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/cli/__init__.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/cli/_time_args.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/cli/commands/__init__.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/cli/commands/config_check.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/cli/commands/diff_cmd.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/cli/commands/list_cmd.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/cli/commands/report.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/cli/exit_codes.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/cli/formatters/__init__.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/cli/formatters/json_output.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/cli/main.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/config/__init__.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/config/mcp_discovery.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/config/scanner.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/config/scoring.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/core/__init__.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/core/discovery.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/core/filtering.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/core/parser.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/core/timeutil.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diagnostics/__init__.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diagnostics/_clustering.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diagnostics/_complexity.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diagnostics/builtin_actions.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diagnostics/delegation.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diagnostics/mcp_assessment.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diagnostics/model_routing.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diagnostics/parent_workload.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diff/__init__.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/diff/loader.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/glossary/__init__.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/glossary/loader.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/glossary/render.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/py.typed +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/traces/__init__.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/traces/discovery.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/traces/linker.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/src/agentfluent/traces/retry.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/__init__.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/_builders.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/.gitkeep +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/agents/empty_prompt.md +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/agents/no_frontmatter.md +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/agents/no_tools.md +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/agents/vague_description.md +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/agents/well_configured.md +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/mcp/claude_user_only.json +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/mcp/claude_user_with_disabled.json +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/parent_workload_session.jsonl +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/session_basic.jsonl +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/session_block_per_line.jsonl +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/session_malformed.jsonl +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/session_skip_types.jsonl +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/session_streaming_dupes.jsonl +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/session_with_agent.jsonl +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/session_with_tool_calls.jsonl +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/subagents/agent-basic.jsonl +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/subagents/agent-empty.jsonl +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/subagents/agent-errors.jsonl +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/subagents/agent-large.jsonl +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/subagents/agent-malformed.jsonl +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/subagents/agent-retry.jsonl +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/subagents/agent-streaming-dupes.jsonl +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/fixtures/subagents/agent-stuck.jsonl +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/integration/__init__.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/integration/test_agent_extraction.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/integration/test_analytics.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/integration/test_analyze_session_scope.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/integration/test_config_assessment.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/integration/test_diagnostics.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/integration/test_git_signals_real.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/integration/test_real_sessions.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/integration/test_subagent_traces.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/__init__.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/__init__.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/_recommendation_helpers.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_analyze_session_scope.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_analyze_since_until.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_axis_labels.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_claude_config_dir.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_cost_labeling.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_deep_diagnostics_formatting.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_diagnostics_default.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_diagnostics_smoke.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_diff_by_model_table.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_diff_cmd.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_diff_summary.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_exit_codes.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_glossary_footer.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_help.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_json_alias.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_list_since_until.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_min_severity_filter.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_offload_candidates_formatting.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_output_modes.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_parse_warnings.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_recommendations_top_n.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_report_cmd.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_report_pipeline.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_time_args.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/cli/test_verbose_signal_message.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/diff/__init__.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_agent_audit.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_clustering.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_core_filtering.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_dedup.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_delegation.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_delegation_yaml_draft.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_diagnostics.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_discovery.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_glossary_drift.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_glossary_loader.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_glossary_render.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_mcp_assessment.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_mcp_discovery.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_model_routing.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_parent_workload_cluster.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_parent_workload_cost.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_parent_workload_extract.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_pricing.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_scanner.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_scoring.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_session_models.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_smoke.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_timeutil.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_tokens.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_tools.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_traces_discovery.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_traces_linker.py +0 -0
- {agentfluent-0.7.0 → agentfluent-0.9.0}/tests/unit/test_traces_models.py +0 -0
- {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
|
|
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
|
|
20
|
+
"command": "python3 \"$CLAUDE_PROJECT_DIR/.claude/hooks/detect_secrets_in_output.py\""
|
|
21
21
|
}
|
|
22
22
|
]
|
|
23
23
|
}
|