claude-dev-env 2.8.0 → 2.10.0
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.
- package/CLAUDE.md +8 -2
- package/_shared/pr-loop/CLAUDE.md +1 -1
- package/_shared/pr-loop/audit-contract.md +17 -6
- package/_shared/pr-loop/audit-reply-template.md +4 -4
- package/_shared/pr-loop/code-rules-gate.md +3 -5
- package/_shared/pr-loop/fix-protocol.md +2 -3
- package/_shared/pr-loop/gh-payloads.md +1 -1
- package/_shared/pr-loop/scripts/CLAUDE.md +1 -1
- package/_shared/pr-loop/scripts/README.md +1 -1
- package/_shared/pr-loop/scripts/code_rules_gate.py +2 -0
- package/_shared/pr-loop/scripts/code_rules_gate_parts/gate_running.py +16 -1
- package/_shared/pr-loop/scripts/code_rules_gate_parts/git_blob_readers.py +11 -5
- package/_shared/pr-loop/scripts/preflight.py +9 -4
- package/_shared/pr-loop/scripts/reviews_disabled.py +50 -22
- package/_shared/pr-loop/scripts/tests/conftest.py +20 -0
- package/_shared/pr-loop/scripts/tests/test_claude_permissions_common.py +6 -6
- package/_shared/pr-loop/scripts/tests/test_reviews_disabled.py +50 -6
- package/_shared/pr-loop/scripts/tests/test_revoke_project_claude_permissions.py +1 -1
- package/_shared/pr-loop/state-schema.md +5 -14
- package/agents/CLAUDE.md +2 -2
- package/agents/clean-coder.md +62 -562
- package/agents/code-quality-agent.md +10 -2
- package/agents/code-verifier.md +1 -1
- package/agents/test_agent_frontmatter.py +58 -40
- package/audit-rubrics/CLAUDE.md +2 -1
- package/audit-rubrics/audit-categories.json +704 -0
- package/audit-rubrics/prompts/category-i-concurrency.md +1 -1
- package/bin/CLAUDE.md +16 -5
- package/bin/ever-shipped-skills.mjs +2 -0
- package/bin/install-plan.mjs +402 -0
- package/bin/install-transaction.mjs +455 -0
- package/bin/install.mjs +593 -147
- package/bin/install.plan.test.mjs +194 -0
- package/bin/install.profile-root.test.mjs +154 -0
- package/bin/install.profiles.test.mjs +253 -0
- package/bin/install.settings-defaults.test.mjs +200 -0
- package/bin/install.transaction.test.mjs +400 -0
- package/bin/install.uninstall-transaction.test.mjs +418 -0
- package/bin/merge_managed_permissions.mjs +130 -0
- package/bin/resolve-install-root.mjs +181 -0
- package/bin/select-install-targets.mjs +401 -0
- package/commands/CLAUDE.md +0 -2
- package/docs/CODE_RULES.md +4 -2
- package/docs/references/CLAUDE.md +3 -2
- package/docs/references/advisor-tool.md +44 -6
- package/docs/references/prose-style-enforcement.md +25 -0
- package/docs/references/team-advisor-skill.md +14 -8
- package/hooks/blocking/CLAUDE.md +6 -6
- package/hooks/blocking/_path_setup.py +9 -5
- package/hooks/blocking/code_rules_docstrings.py +124 -30
- package/hooks/blocking/code_rules_enforcer.py +161 -16
- package/hooks/blocking/code_rules_shared.py +40 -23
- package/hooks/blocking/config/CLAUDE.md +3 -5
- package/hooks/blocking/config/prose_style_enforcement_constants.py +38 -0
- package/hooks/blocking/config/test_prose_style_enforcement_constants.py +45 -0
- package/hooks/blocking/eli11_reply_enforcer.py +70 -113
- package/hooks/blocking/hedging_language_blocker.py +103 -20
- package/hooks/blocking/hook_prose_detector_consistency.py +6 -0
- package/hooks/blocking/intent_only_ending_blocker.py +6 -0
- package/hooks/blocking/plain_language_blocker.py +139 -20
- package/hooks/blocking/pre_tool_use_dispatcher.py +102 -20
- package/hooks/blocking/state_description_blocker.py +7 -1
- package/hooks/blocking/tdd_enforcer.py +8 -0
- package/hooks/blocking/test__path_setup.py +28 -0
- package/hooks/blocking/test_code_rules_enforcer_agent_home_tooling.py +99 -0
- package/hooks/blocking/test_code_rules_enforcer_docstring_args_span_scope.py +232 -10
- package/hooks/blocking/test_code_rules_enforcer_ephemeral.py +1 -1
- package/hooks/blocking/test_code_rules_enforcer_join_separator_magic.py +41 -0
- package/hooks/blocking/test_code_rules_enforcer_string_magic.py +98 -0
- package/hooks/blocking/test_eli11_reply_enforcer.py +98 -165
- package/hooks/blocking/test_hedging_language_blocker.py +120 -1
- package/hooks/blocking/test_hook_prose_detector_consistency.py +28 -8
- package/hooks/blocking/test_intent_only_ending_blocker.py +27 -2
- package/hooks/blocking/test_package_inventory_stale_blocker.py +11 -4
- package/hooks/blocking/test_plain_language_blocker.py +129 -19
- package/hooks/blocking/test_plain_language_blocker_allowlist.py +70 -26
- package/hooks/blocking/test_pre_tool_use_dispatcher.py +99 -26
- package/hooks/blocking/test_pre_tool_use_dispatcher_native.py +87 -50
- package/hooks/blocking/test_state_description_blocker.py +45 -2
- package/hooks/blocking/test_stop_dispatcher.py +11 -7
- package/hooks/blocking/test_volatile_path_in_post_blocker.py +12 -12
- package/hooks/blocking/volatile_path_in_post_blocker.py +2 -2
- package/hooks/hooks.json +15 -0
- package/hooks/hooks_constants/CLAUDE.md +14 -3
- package/hooks/hooks_constants/ask_user_question_shape.py +281 -0
- package/hooks/hooks_constants/code_rules_enforcer_constants.py +2 -1
- package/hooks/hooks_constants/code_rules_path_utils_constants.py +1 -0
- package/hooks/hooks_constants/eli11_reply_enforcer_constants.py +5 -12
- package/hooks/hooks_constants/hedging_uncertainty_constants.py +42 -0
- package/hooks/hooks_constants/issue_tracker_session_starter_constants.py +23 -0
- package/hooks/hooks_constants/orchestrator_auto_starter_constants.py +23 -0
- package/hooks/hooks_constants/piped_pytest_blocker_constants.py +4 -1
- package/hooks/hooks_constants/plain_language_blocker_constants.py +4 -1
- package/hooks/hooks_constants/pre_tool_use_dispatcher_constants.py +6 -0
- package/hooks/hooks_constants/project_paths_reader.py +31 -4
- package/hooks/hooks_constants/prose_matcher_precision_constants.py +40 -0
- package/hooks/hooks_constants/pytest_invocation.py +354 -0
- package/hooks/hooks_constants/session_start_injector.py +163 -0
- package/hooks/hooks_constants/session_start_injector_constants.py +46 -0
- package/hooks/hooks_constants/shell_command_pipeline.py +397 -0
- package/hooks/hooks_constants/shell_command_segments.py +5 -0
- package/hooks/hooks_constants/test_ask_user_question_shape.py +167 -0
- package/hooks/hooks_constants/test_project_paths_reader.py +29 -0
- package/hooks/hooks_constants/test_prose_metrics_parity.py +8 -0
- package/hooks/hooks_constants/test_pytest_invocation.py +130 -0
- package/hooks/hooks_constants/test_session_start_injector.py +168 -0
- package/hooks/hooks_constants/test_shell_command_pipeline.py +135 -0
- package/hooks/hooks_constants/volatile_path_in_post_blocker_constants.py +1 -1
- package/hooks/hooks_constants/working_style_prompt_constants.py +30 -0
- package/hooks/observability/CLAUDE.md +2 -0
- package/hooks/observability/prose_matcher_advisory.py +237 -0
- package/hooks/observability/test_prose_matcher_advisory.py +143 -0
- package/hooks/session/CLAUDE.md +9 -1
- package/hooks/session/_path_setup.py +13 -0
- package/hooks/session/issue_tracker_session_starter.py +135 -0
- package/hooks/session/orchestrator_auto_starter.py +100 -0
- package/hooks/session/test__path_setup.py +28 -0
- package/hooks/session/test_issue_tracker_session_starter.py +104 -0
- package/hooks/session/test_orchestrator_auto_starter.py +99 -0
- package/hooks/session/test_working_style_prompt.py +47 -0
- package/hooks/session/untracked_repo_detector.py +1 -24
- package/hooks/session/working_style_prompt.py +36 -0
- package/hooks/validators/_path_setup.py +19 -0
- package/hooks/validators/run_all_validators.py +8 -13
- package/installable-surfaces.manifest.json +21 -0
- package/output-styles/CLAUDE.md +15 -0
- package/package.json +5 -2
- package/rules/CLAUDE.md +1 -0
- package/rules/code-standards.md +33 -7
- package/rules/durable-post-artifacts.md +2 -2
- package/rules/eli11-replies.md +7 -2
- package/rules/hedging-claims.md +4 -2
- package/rules/long-horizon-autonomy.md +3 -1
- package/rules/opus5-communication-contract.md +45 -0
- package/rules/plain-language.md +2 -2
- package/rules/research-mode.md +1 -1
- package/scripts/CLAUDE.md +13 -2
- package/scripts/Sync-RepoMain.ps1 +215 -0
- package/scripts/active_capability_references.py +218 -0
- package/scripts/ci/windows-installer-lifecycle.ps1 +78 -0
- package/scripts/claude_chain_runner.py +394 -6
- package/scripts/claude_chain_usage.py +1 -1
- package/scripts/codex_compat_materializer.py +105 -85
- package/scripts/dev_env_scripts_constants/CLAUDE.md +3 -1
- package/scripts/dev_env_scripts_constants/active_capability_constants.py +46 -0
- package/scripts/dev_env_scripts_constants/claude_chain_constants.py +74 -0
- package/scripts/dev_env_scripts_constants/grok_run_ledger_constants.py +50 -0
- package/scripts/dev_env_scripts_constants/grok_worker_constants.py +104 -0
- package/scripts/dev_env_scripts_constants/verify_installable_package_constants.py +116 -0
- package/scripts/grok_patch_artifacts.py +123 -0
- package/scripts/grok_run_ledger.py +318 -0
- package/scripts/profile-isolation-launchers/config/mcp-bundles.json +25 -0
- package/scripts/profile-isolation-launchers/config/profile-isolation-constants.mjs +60 -0
- package/scripts/profile-isolation-launchers/config/profiles.manifest.json +54 -0
- package/scripts/profile-isolation-launchers/config/shared-allowlist.json +64 -0
- package/scripts/profile-isolation-launchers/launcher-runtime.mjs +180 -0
- package/scripts/profile-isolation-launchers/lib/profile-manifest.mjs +288 -0
- package/scripts/profile-isolation-launchers/mcp-bundles.mjs +275 -0
- package/scripts/profile-isolation-launchers/profile-isolation-contract.test.mjs +221 -0
- package/scripts/profile-isolation-launchers/tests/launcher-runtime.test.mjs +108 -0
- package/scripts/profile-isolation-launchers/tests/mcp-bundles.test.mjs +147 -0
- package/scripts/profile-isolation-launchers/tests/shortcut-contract.test.ps1 +102 -0
- package/scripts/profile-isolation-launchers/tests/version-compatibility.test.mjs +210 -0
- package/scripts/profile-isolation-launchers/version-compatibility.mjs +299 -0
- package/scripts/profile-isolation-launchers/windows/shortcut-inventory.ps1 +127 -0
- package/scripts/profile-isolation-launchers/windows/shortcut-manifest.json +51 -0
- package/scripts/profile-isolation-launchers/windows/shortcut-reconcile.ps1 +77 -0
- package/scripts/spawn_grok_batch.py +556 -9
- package/scripts/test_active_capability_references.py +108 -0
- package/scripts/test_claude_chain_runner.py +414 -82
- package/scripts/test_claude_chain_usage.py +12 -12
- package/scripts/test_grok_patch_artifacts.py +82 -0
- package/scripts/test_grok_run_ledger.py +116 -0
- package/scripts/test_resolve_worker_spawn.py +2 -2
- package/scripts/test_spawn_grok_batch.py +295 -0
- package/scripts/test_verify_installable_package.py +208 -0
- package/scripts/tests/test_codex_compat_materializer.py +33 -0
- package/scripts/verify_installable_package.py +612 -0
- package/settings.json +10 -0
- package/skills/CLAUDE.md +6 -2
- package/skills/_shared/CLAUDE.md +37 -4
- package/skills/_shared/advisor/CLAUDE.md +9 -0
- package/skills/_shared/advisor/advisor-protocol.md +5 -0
- package/skills/_shared/advisor/scripts/README.md +9 -0
- package/skills/_shared/end-of-run-gotcha-recommendations.md +156 -0
- package/skills/_shared/pr-loop/CLAUDE.md +18 -1
- package/skills/_shared/pr-loop/audit-contract.md +5 -0
- package/skills/_shared/pr-loop/audit-reply-template.md +5 -0
- package/skills/_shared/pr-loop/code-rules-gate.md +5 -0
- package/skills/_shared/pr-loop/fix-protocol.md +5 -0
- package/skills/_shared/pr-loop/gh-payloads.md +5 -0
- package/skills/_shared/pr-loop/post-audit-thread-contract.md +5 -0
- package/skills/_shared/pr-loop/precatch-rubric.md +5 -0
- package/skills/_shared/pr-loop/scripts/CLAUDE.md +9 -1
- package/skills/_shared/pr-loop/scripts/RUNTIME_SCRIPTS.md +29 -0
- package/skills/_shared/pr-loop/scripts/audit_category_schema.py +355 -0
- package/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/CLAUDE.md +1 -0
- package/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/audit_category_schema_constants.py +32 -0
- package/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/path_resolver_constants.py +7 -19
- package/skills/_shared/pr-loop/scripts/test_audit_category_schema.py +94 -0
- package/skills/_shared/pr-loop/scripts/test_build_audit_prompt.py +21 -0
- package/skills/_shared/pr-loop/state-schema.md +5 -0
- package/skills/_shared/pr-loop/worker-spawn.md +5 -0
- package/skills/autoconverge/reference/convergence.md +2 -1
- package/skills/autoconverge/reference/stop-conditions.md +5 -3
- package/skills/beat-sheet/SKILL.md +54 -0
- package/skills/beat-sheet/reference/visual-beats.md +29 -0
- package/skills/bugteam/CONSTRAINTS.md +4 -4
- package/skills/bugteam/EXAMPLES.md +1 -1
- package/skills/bugteam/reference/README.md +1 -1
- package/skills/e-code-review/SKILL.md +29 -3
- package/skills/e-code-review/reference/effort-evaluation.md +35 -0
- package/skills/e-code-review/reference/medium.md +15 -4
- package/skills/e-code-review/reference/runner-selection.md +40 -0
- package/skills/e-code-review/scripts/config/e_code_review_effort_constants/__init__.py +41 -0
- package/skills/e-code-review/scripts/config/e_code_review_effort_constants/effort_constants.py +40 -0
- package/skills/e-code-review/scripts/e_code_review_scripts_constants/__init__.py +1 -0
- package/skills/e-code-review/scripts/e_code_review_scripts_constants/finding_pipeline_constants.py +49 -0
- package/skills/e-code-review/scripts/e_code_review_scripts_constants/grok_code_review_constants.py +55 -0
- package/skills/e-code-review/scripts/effort_defaults_evidence.json +186 -0
- package/skills/e-code-review/scripts/effort_evaluation.py +362 -0
- package/skills/e-code-review/scripts/finding_pipeline.py +140 -0
- package/skills/e-code-review/scripts/fixtures/demanding.json +26 -0
- package/skills/e-code-review/scripts/fixtures/easy.json +14 -0
- package/skills/e-code-review/scripts/fixtures/medium.json +20 -0
- package/skills/e-code-review/scripts/grok_code_review.py +230 -0
- package/skills/e-code-review/scripts/test_effort_evaluation.py +180 -0
- package/skills/e-code-review/scripts/test_finding_pipeline.py +197 -0
- package/skills/e-code-review/scripts/test_grok_code_review.py +289 -0
- package/skills/grok-spawn/SKILL.md +5 -0
- package/skills/orchestrator/SKILL.md +5 -0
- package/skills/plan-to-pr/scripts/create_packet.py +4 -4
- package/skills/plan-to-pr/scripts/load_skill_constants.py +41 -0
- package/skills/plan-to-pr/scripts/validate_packet.py +4 -4
- package/skills/plan-to-pr/scripts/validate_protocol.py +4 -1
- package/skills/plan-to-pr/scripts/validate_run.py +4 -1
- package/skills/pr-converge/scripts/check_convergence.py +21 -19
- package/skills/pr-converge/scripts/check_convergence_availability.py +50 -7
- package/skills/pr-converge/scripts/conftest.py +35 -0
- package/skills/pr-converge/scripts/test_check_convergence_availability.py +65 -0
- package/skills/pr-converge/scripts/test_check_convergence_codex.py +11 -1
- package/skills/pr-converge/scripts/test_check_convergence_contract.py +9 -2
- package/skills/pr-loop-cloud-transport/SKILL.md +1 -1
- package/skills/rebase/SKILL.md +15 -3
- package/skills/reviewer-gates/SKILL.md +2 -2
- package/skills/show/SKILL.md +51 -0
- package/skills/show/references/accessibility.md +7 -0
- package/skills/show/references/art.md +3 -0
- package/skills/show/references/charts.md +3 -0
- package/skills/show/references/core-design.md +14 -0
- package/skills/show/references/erds.md +3 -0
- package/skills/show/references/flowcharts.md +3 -0
- package/skills/show/references/host-and-html.md +3 -0
- package/skills/show/references/illustrative-diagrams.md +10 -0
- package/skills/show/references/interaction.md +3 -0
- package/skills/show/references/mockups.md +3 -0
- package/skills/show/references/quality-gates.md +7 -0
- package/skills/show/references/structural-diagrams.md +3 -0
- package/skills/show/references/subject-inventory.md +21 -0
- package/skills/show/references/svg-contract.md +22 -0
- package/skills/show/routing.yaml +30 -0
- package/skills/show/samples/pr1262-v2.svg +222 -0
- package/skills/show/scripts/README.md +6 -0
- package/skills/show/scripts/validate-artifact.py +91 -0
- package/skills/show/scripts/validate-package.py +18 -0
- package/skills/show/templates/html-widget.html +4 -0
- package/skills/show/templates/svg-base.svg +19 -0
- package/skills/show/tests/fixtures/css-var.svg +6 -0
- package/skills/show/tests/fixtures/dead-ref.svg +7 -0
- package/skills/show/tests/fixtures/filled-glyph.svg +8 -0
- package/skills/show/tests/fixtures/inherited-fill.svg +18 -0
- package/skills/show/tests/fixtures/invalid.svg +1 -0
- package/skills/show/tests/fixtures/large-canvas.svg +21 -0
- package/skills/show/tests/fixtures/unfilled-connector.svg +15 -0
- package/skills/show/tests/fixtures/valid.html +1 -0
- package/skills/show/tests/test_validate-artifact.py +74 -0
- package/skills/show/tests/test_validators.py +59 -0
- package/skills/show/workflows/create-visual.md +13 -0
- package/skills/show/workflows/review-visual.md +20 -0
- package/skills/split-pr/SKILL.md +85 -0
- package/skills/split-pr/reference/path-layers.md +16 -0
- package/skills/split-pr/reference/proposal-format.md +15 -0
- package/skills/split-pr/reference/split-further-loop.md +10 -0
- package/skills/split-pr/reference/splitting-principles.md +26 -0
- package/skills/split-pr/scripts/analyze_pr.py +279 -0
- package/skills/split-pr/scripts/categorize_files.py +106 -0
- package/skills/split-pr/scripts/config/__init__.py +1 -0
- package/skills/split-pr/scripts/config/dependency_constants.py +14 -0
- package/skills/split-pr/scripts/config/git_operations_constants.py +36 -0
- package/skills/split-pr/scripts/config/packing_constants.py +61 -0
- package/skills/split-pr/scripts/config/plan_constants.py +49 -0
- package/skills/split-pr/scripts/config/split_pr_constants.py +110 -0
- package/skills/split-pr/scripts/execute_split_slices.py +82 -0
- package/skills/split-pr/scripts/pack_files_into_slices.py +212 -0
- package/skills/split-pr/scripts/split_pr_dependency_graph.py +70 -0
- package/skills/split-pr/scripts/split_pr_git_operations.py +184 -0
- package/skills/split-pr/scripts/split_pr_layer_order.py +58 -0
- package/skills/split-pr/scripts/split_pr_paginate.py +119 -0
- package/skills/split-pr/scripts/split_pr_process_runner.py +52 -0
- package/skills/split-pr/scripts/split_pr_script_types.py +126 -0
- package/skills/split-pr/scripts/split_pr_title.py +41 -0
- package/skills/split-pr/scripts/test_analyze_pr.py +228 -0
- package/skills/split-pr/scripts/test_categorize_files.py +55 -0
- package/skills/split-pr/scripts/test_categorize_files_packing.py +59 -0
- package/skills/split-pr/scripts/test_execute_split_slices.py +99 -0
- package/skills/split-pr/scripts/test_split_pr_dependency_graph.py +47 -0
- package/skills/split-pr/scripts/test_split_pr_git_operations.py +125 -0
- package/skills/split-pr/scripts/test_split_pr_layer_order.py +36 -0
- package/skills/split-pr/scripts/test_split_pr_paginate.py +65 -0
- package/skills/split-pr/scripts/test_split_pr_script_types.py +73 -0
- package/skills/split-pr/scripts/test_split_pr_title.py +28 -0
- package/skills/split-pr/scripts/test_verify_dependency_graph.py +46 -0
- package/skills/split-pr/scripts/test_verify_plan.py +56 -0
- package/skills/split-pr/scripts/test_verify_plan_contract.py +50 -0
- package/skills/split-pr/scripts/test_verify_plan_path_normalization.py +45 -0
- package/skills/split-pr/scripts/verify_dependency_graph.py +111 -0
- package/skills/split-pr/scripts/verify_plan.py +139 -0
- package/skills/task-build/reference/tool-routing.md +3 -0
- package/skills/team-advisor/SKILL.md +23 -44
- package/system-prompts/software-engineer.xml +17 -5
- package/commands/initialize.md +0 -90
- package/commands/stubcheck.md +0 -88
- package/skills/test_markdown_link_integrity.py +0 -107
|
@@ -80,7 +80,7 @@ For reusable Variant C audit prompts scoped to a single category, see `../audit-
|
|
|
80
80
|
}
|
|
81
81
|
```
|
|
82
82
|
|
|
83
|
-
`id` uses the form `loop<N>-<K>` for /bugteam and
|
|
83
|
+
`id` uses the form `loop<N>-<K>` for /bugteam and pr-converge invocations and `find<K>` for standalone audit calls. The orchestrator supplies the prefix in the prompt; honor whatever it gives you.
|
|
84
84
|
|
|
85
85
|
**The `failure_mode` field is the audit-to-fix handoff.** State the failing line, the desired post-fix property, and a one-line validation the fix agent can run to confirm correctness. The fix agent reads `failure_mode` without re-running your audit — make it self-sufficient.
|
|
86
86
|
|
|
@@ -113,6 +113,14 @@ A bare verified-clean label is inadequate: every Shape B entry lists the files o
|
|
|
113
113
|
| P1 | Regression, silent failure, or behavior change that escapes existing tests. |
|
|
114
114
|
| P2 | Dead code, minor smell, style issue, category J finding without runtime impact. |
|
|
115
115
|
|
|
116
|
+
## Collection before filtering
|
|
117
|
+
|
|
118
|
+
Report every real finding at its true severity. Collection retains P0, P1, and
|
|
119
|
+
P2 findings with file, line, evidence (`excerpt` / `failure_mode`), and
|
|
120
|
+
category. Do not drop lower-severity real findings during collection so a later
|
|
121
|
+
consumer can filter. Severity or action filtering is a separate stage after the
|
|
122
|
+
collection record is complete.
|
|
123
|
+
|
|
116
124
|
## Per-Category Expectation
|
|
117
125
|
|
|
118
126
|
Every category A through Q is investigated. The output for each category is one of:
|
|
@@ -175,7 +183,7 @@ Followed by the Shape A finding list, the Shape B proof-of-absence list, and the
|
|
|
175
183
|
|
|
176
184
|
## Caller Context
|
|
177
185
|
|
|
178
|
-
Callers /bugteam, /
|
|
186
|
+
Callers /bugteam, /pr-converge, and /autoconverge invoke this agent at different models per call (opus for /bugteam; the PR-loop orchestrators set their own Agent model). The frontmatter carries no `model:` key, so each caller's `Agent()` model applies. Persistence files such as `loop-N-audit.json` and `loop-N-diagnostics.json` are the calling skill's responsibility — your output is the structured finding list defined above.
|
|
179
187
|
|
|
180
188
|
## Examples
|
|
181
189
|
|
package/agents/code-verifier.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: code-verifier
|
|
3
|
-
description: Post-hoc verification agent
|
|
3
|
+
description: Post-hoc verification agent. Runs only when the task owner asks for a verification pass — never spawned automatically because a coder agent finished. Runs every check itself in a fresh context — named gates, tests against recorded baselines, two-way diff-vs-task reading — puts the draft verdict through one strongest-tier validation subagent that tries to refute it, then ends with a fenced verdict block the verifier_verdict_minter hook turns into the commit-gate verdict. Never edits files in the tree under review — its one exception is a deliberate break at an off-tree break site outside that tree, defined in its body.
|
|
4
4
|
tools: Read, Grep, Glob, Bash, Task
|
|
5
5
|
color: orange
|
|
6
6
|
---
|
|
@@ -23,23 +23,20 @@ a plain scalar reads as a mapping key and makes the whole block unloadable::
|
|
|
23
23
|
flag: description: ... constraints. Examples: <- block no longer loads
|
|
24
24
|
|
|
25
25
|
Two parsers read these files, and a block that satisfies one can still be
|
|
26
|
-
unreadable by the other. `scripts/codex_compat_materializer.py`
|
|
27
|
-
block
|
|
26
|
+
unreadable by the other. `scripts/codex_compat_materializer.py` loads the
|
|
27
|
+
block through YAML with duplicate-key rejection, so block-scalar descriptions
|
|
28
|
+
and empty `tools: []` lists parse::
|
|
28
29
|
|
|
29
|
-
ok: description:
|
|
30
|
-
|
|
30
|
+
ok: description: |
|
|
31
|
+
multi-line body
|
|
32
|
+
ok: tools: []
|
|
31
33
|
|
|
32
|
-
That reader
|
|
34
|
+
That reader still counts fence lines across the whole file, so a bare `---`
|
|
33
35
|
anywhere in the body reads as a second frontmatter fence::
|
|
34
36
|
|
|
35
37
|
ok: ```yaml ... ``` example blocks in the body
|
|
36
38
|
flag: a `---` line inside a body example <- counted as a fence
|
|
37
39
|
|
|
38
|
-
That reader also cannot express an empty `tools: []` list, which is a defect
|
|
39
|
-
in the reader rather than in the one definition that declares it, so that
|
|
40
|
-
definition is named in `_codex_materializable_paths` and covered by every
|
|
41
|
-
other check here.
|
|
42
|
-
|
|
43
40
|
Each definition also has to carry a `name` and a `description` bound to a
|
|
44
41
|
non-empty string, and a `name` equal to its file stem — a mapping that loads
|
|
45
42
|
but binds `description` to nothing, or names an agent the file does not,
|
|
@@ -82,7 +79,6 @@ import pytest
|
|
|
82
79
|
import yaml
|
|
83
80
|
|
|
84
81
|
ACCEPTED_FRONTMATTER_KEYS = frozenset({"name", "description", "tools", "color"})
|
|
85
|
-
EMPTY_TOOLS_LIST_FILENAME = "code-advisor.md"
|
|
86
82
|
EXEMPT_MARKDOWN_FILENAME = "CLAUDE.md"
|
|
87
83
|
FRONTMATTER_FENCE_LINE = "---"
|
|
88
84
|
MATERIALIZER_MODULE_NAME = "codex_compat_materializer"
|
|
@@ -156,36 +152,9 @@ def _top_level_keys(frontmatter_block: str) -> set[str]:
|
|
|
156
152
|
return set(TOP_LEVEL_KEY_PATTERN.findall(frontmatter_block))
|
|
157
153
|
|
|
158
154
|
|
|
159
|
-
@cache
|
|
160
|
-
def _codex_materializable_paths() -> tuple[Path, ...]:
|
|
161
|
-
"""Return the definitions the Codex materializer is expected to read.
|
|
162
|
-
|
|
163
|
-
`code-advisor.md` declares `tools: []`, and its body states the agent has
|
|
164
|
-
zero tools, so the empty list is the field saying what the author meant.
|
|
165
|
-
The materializer's list parser raises on an empty list, so it cannot
|
|
166
|
-
express a correct declaration::
|
|
167
|
-
|
|
168
|
-
tools: Read, Bash -> ok: parsed
|
|
169
|
-
tools: [] -> flag: MaterializerError, though the file is right
|
|
170
|
-
|
|
171
|
-
The gap belongs to that parser, so the definition stays as written and only
|
|
172
|
-
this one check steps around it. The YAML-load, required-field, accepted-key,
|
|
173
|
-
model-ban, and name checks all still cover the file.
|
|
174
|
-
|
|
175
|
-
Returns:
|
|
176
|
-
Every agent definition path except the one whose correct frontmatter
|
|
177
|
-
the materializer's list parser cannot express.
|
|
178
|
-
"""
|
|
179
|
-
return tuple(
|
|
180
|
-
each_path
|
|
181
|
-
for each_path in _agent_definition_paths()
|
|
182
|
-
if each_path.name != EMPTY_TOOLS_LIST_FILENAME
|
|
183
|
-
)
|
|
184
|
-
|
|
185
|
-
|
|
186
155
|
@cache
|
|
187
156
|
def _codex_materializer_module() -> ModuleType:
|
|
188
|
-
"""Load the package's
|
|
157
|
+
"""Load the package's YAML frontmatter materializer from disk.
|
|
189
158
|
|
|
190
159
|
Returns:
|
|
191
160
|
The imported `codex_compat_materializer` module.
|
|
@@ -317,6 +286,29 @@ def test_agent_frontmatter_loads_as_a_yaml_mapping(
|
|
|
317
286
|
)
|
|
318
287
|
|
|
319
288
|
|
|
289
|
+
@pytest.mark.parametrize(
|
|
290
|
+
"agent_file_name",
|
|
291
|
+
(
|
|
292
|
+
"docs-agent.md",
|
|
293
|
+
"issue-tracker.md",
|
|
294
|
+
"skill-writer-agent.md",
|
|
295
|
+
),
|
|
296
|
+
)
|
|
297
|
+
def named_agents_yaml_safe_load_as_mapping(agent_file_name: str) -> None:
|
|
298
|
+
"""P-107 regression: named agents remain real YAML mappings under safe_load."""
|
|
299
|
+
agent_definition_path = Path(__file__).parent / agent_file_name
|
|
300
|
+
assert agent_definition_path.is_file(), (
|
|
301
|
+
f"{agent_file_name} missing from agents/ — P-107 surface gone"
|
|
302
|
+
)
|
|
303
|
+
parsed_frontmatter = yaml.safe_load(_frontmatter_block(agent_definition_path))
|
|
304
|
+
field_problem = _required_field_problem(parsed_frontmatter)
|
|
305
|
+
assert field_problem is None, f"{agent_file_name} {field_problem}"
|
|
306
|
+
name_problem = _agent_name_problem(
|
|
307
|
+
parsed_frontmatter, agent_definition_path.stem
|
|
308
|
+
)
|
|
309
|
+
assert name_problem is None, f"{agent_file_name} {name_problem}"
|
|
310
|
+
|
|
311
|
+
|
|
320
312
|
def test_every_agent_definition_yields_a_frontmatter_block() -> None:
|
|
321
313
|
covered_names = {each_path.name for each_path in _agent_definition_paths()}
|
|
322
314
|
uncovered_names = sorted(
|
|
@@ -333,7 +325,7 @@ def test_every_agent_definition_yields_a_frontmatter_block() -> None:
|
|
|
333
325
|
|
|
334
326
|
@pytest.mark.parametrize(
|
|
335
327
|
"agent_definition_path",
|
|
336
|
-
|
|
328
|
+
_agent_definition_paths(),
|
|
337
329
|
ids=lambda each_path: each_path.name,
|
|
338
330
|
)
|
|
339
331
|
def test_agent_frontmatter_parses_with_the_codex_materializer(
|
|
@@ -422,3 +414,29 @@ def test_agent_frontmatter_carries_no_model_key(
|
|
|
422
414
|
"the caller supplies the model on every spawn, so agent definitions "
|
|
423
415
|
"carry no model key at all, not even model: inherit"
|
|
424
416
|
)
|
|
417
|
+
|
|
418
|
+
|
|
419
|
+
def _clean_coder_body() -> str:
|
|
420
|
+
return (Path(__file__).parent / "clean-coder.md").read_text(encoding="utf-8")
|
|
421
|
+
|
|
422
|
+
|
|
423
|
+
def test_clean_coder_never_globs_or_reads_dotenv_files() -> None:
|
|
424
|
+
body = _clean_coder_body()
|
|
425
|
+
assert "`**/.env`" not in body
|
|
426
|
+
assert "`**/.env.*`" not in body
|
|
427
|
+
assert "Never open `.env`" in body or "Do **not** glob or open `.env`" in body
|
|
428
|
+
assert re.search(r"(?i)glob.*\.env|\.env.*glob", body) is None or "Do **not** glob or open `.env`" in body
|
|
429
|
+
|
|
430
|
+
|
|
431
|
+
def test_clean_coder_uses_task_local_config_discovery() -> None:
|
|
432
|
+
body = _clean_coder_body()
|
|
433
|
+
assert "task-local" in body.lower()
|
|
434
|
+
assert "project-wide preload" in body.lower() or "Do **not** glob the whole tree" in body
|
|
435
|
+
assert "Issue all five Glob calls" not in body
|
|
436
|
+
assert "Issue all seven Glob calls" not in body
|
|
437
|
+
|
|
438
|
+
|
|
439
|
+
def test_clean_coder_examples_import_constants_from_config() -> None:
|
|
440
|
+
body = _clean_coder_body()
|
|
441
|
+
assert "from config.timing import MAXIMUM_RETRIES" in body
|
|
442
|
+
assert re.search(r"(?m)^MAXIMUM_RETRIES\s*=\s*\d+", body) is None
|
package/audit-rubrics/CLAUDE.md
CHANGED
|
@@ -6,6 +6,7 @@ Audit rubrics for the PR-loop code-review suite. The rubrics define the 17 bug c
|
|
|
6
6
|
|
|
7
7
|
| File | Purpose |
|
|
8
8
|
|---|---|
|
|
9
|
+
| `audit-categories.json` | Machine-readable A-Q schema: id, title, slug, and sub-bucket id/axis pairs; single source for rubric and prompt skeleton parity |
|
|
9
10
|
| `source-material-section-types.md` | Lookup table for how to chunk an artifact into sections for an audit prompt; covers code PRs, docs, SQL schemas, config files, and more |
|
|
10
11
|
|
|
11
12
|
## Subdirectories
|
|
@@ -39,4 +40,4 @@ Audit rubrics for the PR-loop code-review suite. The rubrics define the 17 bug c
|
|
|
39
40
|
|
|
40
41
|
## Breaking-change rule
|
|
41
42
|
|
|
42
|
-
Adding a sub-bucket to a category rubric requires updating the matching prompt template in `prompts/` in the same commit. Skills that reference category IDs (`bugteam`, `findbugs`) rely on stable sub-bucket IDs (A1, A2, …
|
|
43
|
+
Adding a sub-bucket to a category rubric requires updating `audit-categories.json` and the matching prompt template in `prompts/` in the same commit, then running `audit_category_schema.py --validate`. Skills that reference category IDs (`bugteam`, `findbugs`) rely on stable sub-bucket IDs (A1, A2, … Q-n). Worked examples stay in the rubric markdown only; they are outside the schema.
|