claude-dev-env 2.16.0 → 2.18.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/.agents/agents/AGENTS.md +6 -0
- package/.agents/skills/AGENTS.md +34 -35
- package/.agents/skills/_shared/pr-loop/AGENTS.md +22 -15
- package/.agents/skills/_shared/pr-loop/portable-driver.md +6 -7
- package/.agents/skills/_shared/pr-loop/prompts/AGENTS.md +2 -2
- package/.agents/skills/_shared/pr-loop/scripts/AGENTS.md +1 -1
- package/.agents/skills/_shared/pr-loop/scripts/portable_converge_driver.py +25 -16
- package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/portable_driver_constants.py +1 -5
- package/.agents/skills/autoconverge/reference/convergence-gates.md +31 -0
- package/.agents/skills/autoconverge/reference/convergence.md +8 -10
- package/.agents/skills/autoconverge/reference/gotchas.md +1 -1
- package/.agents/skills/autoconverge/reference/stop-conditions.md +1 -1
- package/.agents/skills/autoconverge/workflow/converge.codex-gate.test.mjs +1 -1
- package/.agents/skills/autoconverge/workflow/converge.contract.test.mjs +1 -1
- package/.agents/skills/autoconverge/workflow/converge.mjs +3 -3
- package/.agents/skills/cert-classification-rule/SKILL.md +224 -0
- package/.agents/skills/cert-classification-rule/scripts/resort_cert_folders.py +158 -0
- package/.agents/skills/eli5/SKILL.md +128 -0
- package/.agents/skills/eli5/reference/task-seeds.md +11 -0
- package/.agents/skills/fresh-branch/scripts/test_create_fresh_branch.py +2 -3
- package/.agents/skills/name-by-capability-audit/SKILL.md +67 -0
- package/.agents/skills/name-by-capability-audit/reference/fetch-commands.md +29 -0
- package/.agents/skills/name-by-capability-audit/reference/offense-examples.md +32 -0
- package/.agents/skills/name-by-capability-audit/reference/report-template.md +29 -0
- package/.agents/skills/name-by-capability-audit/reference/rule-checklist.md +38 -0
- package/.agents/skills/name-by-capability-audit/reference/task-seeds.md +9 -0
- package/.agents/skills/orchestrator/SKILL.md +6 -4
- package/.agents/skills/orchestrator-refresh/SKILL.md +9 -5
- package/.agents/skills/pr-cleanup/SKILL.md +99 -0
- package/.agents/skills/prototype/reference/honest-limitations.md +1 -1
- package/.agents/skills/prototype/reference/promotion-tasks.md +1 -1
- package/.agents/skills/prototype/scripts/test_build_sandbox_settings.py +2 -2
- package/.agents/skills/prototype/workflows/promotion.md +2 -2
- package/.agents/skills/review-router/SKILL.md +51 -0
- package/.agents/skills/review-router/reference/route-policy.json +7 -0
- package/.agents/skills/review-router/reference/task-seeds.md +1 -0
- package/.agents/skills/review-router/scripts/conftest.py +4 -0
- package/.agents/skills/review-router/scripts/review_router.py +50 -0
- package/.agents/skills/review-router/scripts/review_router_cli.py +211 -0
- package/.agents/skills/review-router/scripts/review_router_constants/__init__.py +1 -0
- package/.agents/skills/review-router/scripts/review_router_constants/config/__init__.py +0 -0
- package/.agents/skills/review-router/scripts/review_router_constants/config/constants.py +13 -0
- package/.agents/skills/review-router/scripts/test_review_router.py +23 -0
- package/.agents/skills/review-router/scripts/test_review_router_cli.py +47 -0
- package/.agents/skills/review-tier/SKILL.md +56 -0
- package/.agents/skills/review-tier/reference/task-seeds.md +1 -0
- package/.agents/skills/review-tier/reference/tier-policy.json +9 -0
- package/.agents/skills/review-tier/scripts/conftest.py +4 -0
- package/.agents/skills/review-tier/scripts/review_tier.py +332 -0
- package/.agents/skills/review-tier/scripts/review_tier_constants/__init__.py +1 -0
- package/.agents/skills/review-tier/scripts/review_tier_constants/config/__init__.py +0 -0
- package/.agents/skills/review-tier/scripts/review_tier_constants/config/constants.py +29 -0
- package/.agents/skills/review-tier/scripts/test_generation.py +171 -0
- package/.agents/skills/review-tier/scripts/test_review_tier.py +33 -0
- package/.agents/skills/session-log/SKILL.md +1 -1
- package/.agents/skills/shared-extraction-audit/SKILL.md +160 -0
- package/.agents/skills/shared-extraction-audit/reference/examples.md +46 -0
- package/.agents/skills/shared-extraction-audit/reference/offense-taxonomy.md +100 -0
- package/.agents/skills/source-command-logifix/SKILL.md +29 -0
- package/.agents/skills/source-command-sr-loop/SKILL.md +58 -0
- package/.agents/skills/team-advisor/SKILL.md +5 -5
- package/.agents/skills-archived/AGENTS.md +45 -0
- package/.agents/{skills → skills-archived}/anthropic-plan/AGENTS.md +1 -1
- package/.agents/{skills → skills-archived}/bugteam/scripts/reflow_skill_md.py +3 -3
- package/.agents/{skills → skills-archived}/codex-review/test_skill_scaffold.py +1 -1
- package/.agents/{skills → skills-archived}/copilot-finding-triage/SKILL.md +1 -1
- package/.agents/{skills → skills-archived}/pr-converge/SKILL.md +6 -6
- package/.agents/{skills → skills-archived}/pr-converge/pr_converge_skill_constants/AGENTS.md +1 -1
- package/.agents/{skills → skills-archived}/pr-converge/pr_converge_skill_constants/constants.py +1 -1
- package/.agents/{skills → skills-archived}/pr-converge/reference/multi-pr-orchestration.md +1 -1
- package/.agents/{skills → skills-archived}/pr-converge/reference/per-tick.md +3 -3
- package/.agents/{skills → skills-archived}/pr-converge/scripts/reflow_skill_md.py +2 -2
- package/.agents/{skills → skills-archived}/pr-converge/test_portable_pacer_gate.py +6 -2
- package/.agents/{skills → skills-archived}/pr-converge/workflows/schedule-wakeup-loop.md +1 -1
- package/.agents/{skills → skills-archived}/split-pr/reference/proposal-format.md +1 -1
- package/AGENTS.md +34 -58
- package/_shared/AGENTS.md +2 -0
- package/_shared/advisor/AGENTS.md +5 -5
- package/_shared/advisor/advisor-protocol.md +54 -31
- package/_shared/advisor/reference/advisor-block.md +5 -1
- package/_shared/advisor/reference/consult-format.md +1 -1
- package/_shared/advisor/reference/identity.md +28 -0
- package/_shared/advisor/reference/lifecycle.md +8 -1
- package/_shared/advisor/reference/sol-rung.md +14 -9
- package/_shared/advisor/reference/spawn-walk-log.md +6 -5
- package/_shared/advisor/reference/third-party-bind.md +6 -7
- package/_shared/advisor/reference/warm-up.md +9 -2
- package/_shared/advisor/scripts/codex_sol_advisor.py +66 -11
- package/_shared/advisor/scripts/config/advisor_scripts_constants/advisor_route_constants.py +9 -0
- package/_shared/advisor/scripts/config/advisor_scripts_constants/model_tier_run_validator_constants.py +16 -4
- package/_shared/advisor/scripts/config/advisor_scripts_constants/sol_advisor_constants.py +11 -10
- package/_shared/advisor/scripts/model_tier_run_validator.py +50 -23
- package/_shared/advisor/scripts/tests/test_codex_sol_advisor.py +108 -3
- package/_shared/advisor/scripts/tests/test_model_tier_run_validator.py +171 -82
- package/_shared/advisor/scripts/tests/test_tier_model_ids.py +43 -0
- package/_shared/advisor/scripts/tier_model_ids.py +75 -7
- package/_shared/pr-loop/audit-reply-template.md +4 -0
- package/_shared/pr-loop/fix-protocol.md +7 -6
- package/_shared/pr-loop/gh-payloads.md +8 -6
- package/_shared/pr-loop/precatch-rubric.md +6 -5
- package/_shared/pr-loop/scripts/AGENTS.md +15 -0
- package/_shared/pr-loop/scripts/_pr_converge_path_setup.py +38 -0
- package/_shared/pr-loop/scripts/check_bugbot_ci.py +279 -0
- package/_shared/pr-loop/scripts/check_convergence.py +923 -0
- package/_shared/pr-loop/scripts/check_convergence_availability.py +275 -0
- package/_shared/pr-loop/scripts/check_convergence_gates.py +279 -0
- package/_shared/pr-loop/scripts/check_convergence_thread_gates.py +219 -0
- package/_shared/pr-loop/scripts/check_pending_reviews.py +154 -0
- package/_shared/pr-loop/scripts/codex_down_classifier.py +98 -0
- package/_shared/pr-loop/scripts/codex_review_scripts_constants/.claude/CLAUDE.md +1 -0
- package/_shared/pr-loop/scripts/codex_review_scripts_constants/AGENTS.md +18 -0
- package/_shared/pr-loop/scripts/codex_review_scripts_constants/__init__.py +1 -0
- package/_shared/pr-loop/scripts/codex_review_scripts_constants/classifier_constants.py +35 -0
- package/_shared/pr-loop/scripts/codex_review_scripts_constants/codex_usage_probe_constants.py +82 -0
- package/_shared/pr-loop/scripts/codex_review_scripts_constants/findings_constants.py +18 -0
- package/_shared/pr-loop/scripts/codex_review_scripts_constants/run_constants.py +53 -0
- package/_shared/pr-loop/scripts/codex_usage_probe.py +570 -0
- package/_shared/pr-loop/scripts/conftest.py +43 -0
- package/_shared/pr-loop/scripts/fetch_copilot_reviews.py +134 -0
- package/_shared/pr-loop/scripts/fixtures/auth_failure_synthetic.txt +1 -0
- package/_shared/pr-loop/scripts/fixtures/config_load_failure_v0.125.0.txt +1 -0
- package/_shared/pr-loop/scripts/fixtures/freeform_findings_v0.144.3.txt +6 -0
- package/_shared/pr-loop/scripts/fixtures/model_rejection_v0.125.0.jsonl +5 -0
- package/_shared/pr-loop/scripts/fixtures/structured_findings.txt +13 -0
- package/_shared/pr-loop/scripts/fixtures/success_stream_v0.144.3.jsonl +6 -0
- package/_shared/pr-loop/scripts/fixtures/unknown_failure_synthetic.txt +1 -0
- package/_shared/pr-loop/scripts/fixtures/usage_limit_synthetic.txt +1 -0
- package/_shared/pr-loop/scripts/parse_codex_findings.py +207 -0
- package/_shared/pr-loop/scripts/post_fix_reply.py +168 -0
- package/_shared/pr-loop/scripts/pr_converge_scripts_constants/.claude/CLAUDE.md +1 -0
- package/_shared/pr-loop/scripts/pr_converge_scripts_constants/AGENTS.md +18 -0
- package/_shared/pr-loop/scripts/pr_converge_scripts_constants/__init__.py +0 -0
- package/_shared/pr-loop/scripts/pr_converge_scripts_constants/convergence_gate_constants.py +70 -0
- package/_shared/pr-loop/scripts/pr_converge_scripts_constants/pr_converge_constants.py +118 -0
- package/_shared/pr-loop/scripts/pr_converge_scripts_constants/reflow_skill_md_constants.py +13 -0
- package/_shared/pr-loop/scripts/pr_converge_skill_constants/.claude/CLAUDE.md +1 -0
- package/_shared/pr-loop/scripts/pr_converge_skill_constants/AGENTS.md +26 -0
- package/_shared/pr-loop/scripts/pr_converge_skill_constants/__init__.py +0 -0
- package/_shared/pr-loop/scripts/pr_converge_skill_constants/constants.py +69 -0
- package/_shared/pr-loop/scripts/run_codex_review.py +609 -0
- package/_shared/pr-loop/scripts/test__pr_converge_path_setup.py +30 -0
- package/_shared/pr-loop/scripts/test_check_bugbot_ci.py +312 -0
- package/_shared/pr-loop/scripts/test_check_convergence.py +438 -0
- package/_shared/pr-loop/scripts/test_check_convergence_availability.py +391 -0
- package/_shared/pr-loop/scripts/test_check_convergence_codex.py +517 -0
- package/_shared/pr-loop/scripts/test_check_convergence_contract.py +400 -0
- package/_shared/pr-loop/scripts/test_check_convergence_fixture.py +179 -0
- package/_shared/pr-loop/scripts/test_check_convergence_gates.py +84 -0
- package/_shared/pr-loop/scripts/test_check_convergence_thread_gates.py +99 -0
- package/_shared/pr-loop/scripts/test_codex_down_classifier.py +143 -0
- package/_shared/pr-loop/scripts/test_codex_usage_probe.py +683 -0
- package/_shared/pr-loop/scripts/test_parse_codex_findings.py +130 -0
- package/_shared/pr-loop/scripts/test_run_codex_review.py +969 -0
- package/_shared/pr-loop/scripts/tests/test_claude_permissions_common.py +1 -1
- package/_shared/pr-loop/scripts/tests/test_code_rules_gate.py +1 -1
- package/_shared/pr-loop/scripts/tests/test_fix_hookspath.py +1 -1
- package/_shared/pr-loop/state-schema.md +20 -28
- package/_shared/pr-loop/worker-spawn.md +4 -3
- package/_shared/process-tree/AGENTS.md +3 -3
- package/bin/ever-shipped-skills.mjs +29 -1
- package/bin/install-constants.mjs +15 -6
- package/bin/install.agents-home.test.mjs +13 -0
- package/bin/install.cursor-rules.test.mjs +3 -3
- package/bin/install.mjs +80 -20
- package/bin/install.profile-root.test.mjs +1 -1
- package/bin/install.prune.test.mjs +23 -204
- package/bin/install.test.mjs +8 -5
- package/bin/resolve-install-root.mjs +21 -0
- package/bin/resolve-package-managed-directory.mjs +4 -4
- package/commands/AGENTS.md +2 -0
- package/commands/sr-loop.md +3 -0
- package/docs/references/prose-style-enforcement.md +3 -7
- package/docs/references/team-advisor-skill.md +2 -2
- package/hooks/AGENTS.md +0 -3
- package/hooks/blocking/AGENTS.md +0 -2
- package/hooks/blocking/ask_user_question_shape_blocker.py +83 -0
- package/hooks/blocking/pre_tool_use_dispatcher.py +2 -19
- package/hooks/blocking/state_description_blocker.py +1 -1
- package/hooks/blocking/test_ask_user_question_shape.py +69 -0
- package/hooks/blocking/test_pre_tool_use_dispatcher.py +17 -58
- package/hooks/blocking/test_pre_tool_use_dispatcher_native.py +9 -104
- package/hooks/blocking/test_state_description_blocker.py +1 -0
- package/hooks/blocking/test_stop_dispatcher.py +1 -26
- package/hooks/hooks.json +1 -1
- package/hooks/hooks_constants/AGENTS.md +0 -3
- package/hooks/hooks_constants/ask_user_question_shape.py +1 -1
- package/hooks/hooks_constants/ask_user_question_shape_constants.py +73 -0
- package/hooks/hooks_constants/bot_mention_comment_blocker_constants.py +1 -2
- package/hooks/hooks_constants/code_rules_path_utils_constants.py +0 -1
- package/hooks/hooks_constants/pre_tool_use_dispatcher_constants.py +0 -7
- package/hooks/hooks_constants/stop_dispatcher_constants.py +0 -1
- package/hooks/hooks_constants/test_ask_user_question_shape.py +1 -1
- package/hooks/hooks_constants/test_prose_metrics_parity.py +29 -107
- package/hooks/hooks_constants/test_stop_dispatcher_constants.py +0 -1
- package/hooks/hooks_constants/working_style_prompt_constants.py +9 -10
- package/hooks/session/AGENTS.md +4 -1
- package/hooks/session/test_working_style_prompt.py +8 -4
- package/hooks/session/working_style_prompt.py +4 -2
- package/package.json +1 -4
- package/rules/AGENTS.md +2 -5
- package/rules/asd-ste100-language.md +39 -0
- package/rules/ask-user-question-required.md +1 -1
- package/rules/long-horizon-autonomy.md +1 -1
- package/scripts/AGENTS.md +1 -0
- package/scripts/Show-Asset.ps1 +106 -0
- package/scripts/test_validate_instruction_pairs.py +30 -3
- package/scripts/tests/test_engine.py +4 -4
- package/scripts/tests/test_rules.py +5 -5
- package/system-prompts/AGENTS.md +8 -0
- package/system-prompts/software-engineer.xml +8 -3
- package/.agents/skills/grokify/evals/README.md +0 -72
- package/.agents/skills/grokify/evals/parse-payload.test.mjs +0 -171
- package/.agents/skills/grokify/evals/run-capability-evals.mjs +0 -545
- package/_shared/pr-loop/scripts/README.md +0 -21
- package/docs/imagegen.md +0 -22
- package/hooks/blocking/eli11_reply_enforcer.py +0 -436
- package/hooks/blocking/plain_language_blocker.py +0 -758
- package/hooks/blocking/test_eli11_reply_enforcer.py +0 -390
- package/hooks/blocking/test_plain_language_blocker.py +0 -683
- package/hooks/blocking/test_plain_language_blocker_allowlist.py +0 -228
- package/hooks/diagnostic/AGENTS.md +0 -75
- package/hooks/diagnostic/CLAUDE.md +0 -1
- package/hooks/diagnostic/hook_log_extractor.py +0 -875
- package/hooks/diagnostic/hook_log_init.py +0 -202
- package/hooks/diagnostic/hook_log_stop_wrapper.py +0 -26
- package/hooks/diagnostic/migrations/2026-04-25-drop-themes-hook-events.sql +0 -3
- package/hooks/diagnostic/migrations/AGENTS.md +0 -16
- package/hooks/diagnostic/migrations/CLAUDE.md +0 -1
- package/hooks/diagnostic/migrations/README.md +0 -76
- package/hooks/diagnostic/queries/AGENTS.md +0 -19
- package/hooks/diagnostic/queries/CLAUDE.md +0 -1
- package/hooks/diagnostic/queries/block_details_for_hook.sql +0 -26
- package/hooks/diagnostic/queries/blocks_by_category.sql +0 -10
- package/hooks/diagnostic/queries/blocks_by_tool.sql +0 -9
- package/hooks/diagnostic/queries/blocks_last_7_days.sql +0 -11
- package/hooks/diagnostic/queries/top_blockers_last_24_hours.sql +0 -12
- package/hooks/diagnostic/queries/top_blockers_overall.sql +0 -12
- package/hooks/diagnostic/requirements-hook-logs-dev.txt +0 -2
- package/hooks/diagnostic/requirements-hook-logs.txt +0 -1
- package/hooks/diagnostic/schema.sql +0 -51
- package/hooks/diagnostic/test_hook_log_extractor.py +0 -1518
- package/hooks/diagnostic/test_hook_log_init.py +0 -227
- package/hooks/diagnostic/test_hook_log_stop_wrapper.py +0 -17
- package/hooks/hooks_constants/eli11_reply_enforcer_constants.py +0 -94
- package/hooks/hooks_constants/hook_log_extractor_constants.py +0 -233
- package/hooks/hooks_constants/plain_language_blocker_constants.py +0 -366
- package/hooks/hooks_constants/test_hook_log_extractor_constants.py +0 -123
- package/rules/doc-prose-cuts.md +0 -58
- package/rules/eli11-replies.md +0 -36
- package/rules/opus5-communication-contract.md +0 -45
- package/rules/plain-language.md +0 -9
- /package/.agents/{skills → skills-archived}/anthropic-plan/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/anthropic_plan_scripts_constants/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/anthropic_plan_scripts_constants/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/anthropic_plan_scripts_constants/__init__.py +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/anthropic_plan_scripts_constants/validate_packet_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/test_validate_packet.py +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/validate_packet.py +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/templates/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/templates/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/templates/README.md +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/templates/build-prompt.md +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/templates/reuse-audit.md +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/templates/source-map.md +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/templates/visual-plan.template.html +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/test_skill_contract.py +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/workflow/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/workflow/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/workflow/plan-packet.contract.test.mjs +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/workflow/plan-packet.mjs +0 -0
- /package/.agents/{skills → skills-archived}/auditing-claude-config/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/auditing-claude-config/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/auditing-claude-config/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/auditing-claude-config/reference/probe-hook.md +0 -0
- /package/.agents/{skills → skills-archived}/beat-sheet/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/beat-sheet/reference/visual-beats.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/CONSTRAINTS.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/EXAMPLES.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/PROMPTS.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/README.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/audit-and-teammates.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/copilot-gap-analysis.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/design-rationale.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/github-pr-reviews.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/audit-assign-ids.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/audit-capture-excerpts.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/audit-walk-categories.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/audit-write-xml.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-append-summary.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-apply-fixes.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-git-add-commit.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-git-push.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-post-reply.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-publish-summary.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-py-compile.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-read-files.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-resolve-thread.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-test-suite.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-violation-count.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-write-xml.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/team-setup.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/README.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_code_rules_gate.py +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_fix_hookspath.py +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_preflight.py +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_scripts_constants/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_scripts_constants/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_scripts_constants/__init__.py +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_scripts_constants/probe_code_rules_enforcer_check_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_scripts_constants/reflow_skill_md_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_scripts_constants/windows_safe_rmtree_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/probe_code_rules_enforcer_check.py +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/test_bugteam_code_rules_gate.py +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/test_bugteam_fix_hookspath.py +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/test_bugteam_preflight.py +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/test_probe_code_rules_enforcer_check.py +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/test_windows_safe_rmtree.py +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/windows_safe_rmtree.py +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/sources.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/test_skill_additions.py +0 -0
- /package/.agents/{skills → skills-archived}/closeout/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/closeout/reference/handoff-prompt-template.md +0 -0
- /package/.agents/{skills → skills-archived}/closeout/reference/pii-redaction-checklist.md +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/reference/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/reference/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/reference/cli-contract.md +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/reference/loop-integration.md +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_down_classifier.py +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/__init__.py +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/classifier_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/codex_usage_probe_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/findings_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/run_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_usage_probe.py +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/auth_failure_synthetic.txt +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/config_load_failure_v0.125.0.txt +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/freeform_findings_v0.144.3.txt +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/model_rejection_v0.125.0.jsonl +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/structured_findings.txt +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/success_stream_v0.144.3.jsonl +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/unknown_failure_synthetic.txt +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/usage_limit_synthetic.txt +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/parse_codex_findings.py +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/run_codex_review.py +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/test_codex_down_classifier.py +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/test_codex_usage_probe.py +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/test_parse_codex_findings.py +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/test_run_codex_review.py +0 -0
- /package/.agents/{skills → skills-archived}/comments/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/condensing-instructions/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/copilot-finding-triage/reference/tier-rubric.md +0 -0
- /package/.agents/{skills → skills-archived}/copilot-finding-triage/scripts/conftest.py +0 -0
- /package/.agents/{skills → skills-archived}/copilot-finding-triage/scripts/copilot_finding_triage_constants/__init__.py +0 -0
- /package/.agents/{skills → skills-archived}/copilot-finding-triage/scripts/copilot_finding_triage_constants/config/__init__.py +0 -0
- /package/.agents/{skills → skills-archived}/copilot-finding-triage/scripts/copilot_finding_triage_constants/config/notify_ntfy_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/copilot-finding-triage/scripts/notify_ntfy.py +0 -0
- /package/.agents/{skills → skills-archived}/copilot-finding-triage/scripts/test_notify_ntfy.py +0 -0
- /package/.agents/{skills → skills-archived}/copilot-finding-triage/templates/notification.md +0 -0
- /package/.agents/{skills → skills-archived}/copilot-review/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/copilot-review/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/copilot-review/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/copilot-review/templates/subagent-prompt.md +0 -0
- /package/.agents/{skills → skills-archived}/descriptions/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/emergencies/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/grokify/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/grokify/capability-claims.test.mjs +0 -0
- /package/.agents/{skills → skills-archived}/grokify/templates/handoff-template.md +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/reference/final-validation-tasks.md +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/reference/model-routing.md +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/reference/packet-contract.md +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/reference/packet-schema.json +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/reference/process-inventory.md +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/reference/review-loop.md +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/reference/run-record.schema.json +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/reference/self-audit-tasks.md +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/reference/task-seeds.md +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/reference/task-ticket.md +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/config/__init__.py +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/config/constants.py +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/create_packet.py +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/load_skill_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/test_create_packet.py +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/test_validate_packet.py +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/test_validate_protocol.py +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/test_validate_run.py +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/validate_packet.py +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/validate_protocol.py +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/validate_run.py +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/test_skill_contract.py +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/test_task_ticket_contract.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/pr_converge_skill_constants/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/pr_converge_skill_constants/__init__.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/convergence-gates.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/examples.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/fix-protocol.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/ground-rules.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-post-replies.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-publish-summary.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-push.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-read-filelines.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-reset-state.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-resolve-threads.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-spawn-clean-coder.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-stage-commit.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-trigger-bugbot.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-write-test.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/progress-checklist.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/state-schema.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/stop-conditions.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/README.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/_pr_converge_path_setup.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/caller-window-pid.ps1 +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/check_bugbot_ci.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/check_convergence.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/check_convergence_availability.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/check_convergence_gates.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/check_convergence_thread_gates.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/check_pending_reviews.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/conftest.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/cursor-agents-continue-caller.cmd +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/cursor-agents-continue-stop-others.ps1 +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/cursor-agents-continue.ahk +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/cursor-agents-continue.cmd +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/fetch_copilot_reviews.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/post_fix_reply.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/pr_converge_scripts_constants/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/pr_converge_scripts_constants/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/pr_converge_scripts_constants/__init__.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/pr_converge_scripts_constants/convergence_gate_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/pr_converge_scripts_constants/pr_converge_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/pr_converge_scripts_constants/reflow_skill_md_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/test__pr_converge_path_setup.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_bugbot_ci.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence_availability.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence_codex.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence_contract.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence_fixture.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence_gates.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence_thread_gates.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_cursor_agents_continue.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_reflow_skill_md.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/test_step5_host_branch.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/workflows/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/workflows/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-fix-protocol/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-loop-cloud-transport/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-loop-cloud-transport/reference/identity-and-hooks.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-loop-cloud-transport/reference/substitution-matrix.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-loop-lifecycle/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-loop-lifecycle/reference/teardown-publish-permissions.md +0 -0
- /package/.agents/{skills → skills-archived}/recall/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/recall/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/recall/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/release-notes-html/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/remember/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/remember/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/remember/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/reviewer-gates/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/reviews/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/show/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/show/references/accessibility.md +0 -0
- /package/.agents/{skills → skills-archived}/show/references/art.md +0 -0
- /package/.agents/{skills → skills-archived}/show/references/charts.md +0 -0
- /package/.agents/{skills → skills-archived}/show/references/core-design.md +0 -0
- /package/.agents/{skills → skills-archived}/show/references/erds.md +0 -0
- /package/.agents/{skills → skills-archived}/show/references/flowcharts.md +0 -0
- /package/.agents/{skills → skills-archived}/show/references/host-and-html.md +0 -0
- /package/.agents/{skills → skills-archived}/show/references/illustrative-diagrams.md +0 -0
- /package/.agents/{skills → skills-archived}/show/references/interaction.md +0 -0
- /package/.agents/{skills → skills-archived}/show/references/mockups.md +0 -0
- /package/.agents/{skills → skills-archived}/show/references/quality-gates.md +0 -0
- /package/.agents/{skills → skills-archived}/show/references/structural-diagrams.md +0 -0
- /package/.agents/{skills → skills-archived}/show/references/subject-inventory.md +0 -0
- /package/.agents/{skills → skills-archived}/show/references/svg-contract.md +0 -0
- /package/.agents/{skills → skills-archived}/show/routing.yaml +0 -0
- /package/.agents/{skills → skills-archived}/show/samples/pr1262-v2.svg +0 -0
- /package/.agents/{skills → skills-archived}/show/scripts/README.md +0 -0
- /package/.agents/{skills → skills-archived}/show/scripts/validate-artifact.py +0 -0
- /package/.agents/{skills → skills-archived}/show/scripts/validate-package.py +0 -0
- /package/.agents/{skills → skills-archived}/show/templates/html-widget.html +0 -0
- /package/.agents/{skills → skills-archived}/show/templates/svg-base.svg +0 -0
- /package/.agents/{skills → skills-archived}/show/tests/fixtures/css-var.svg +0 -0
- /package/.agents/{skills → skills-archived}/show/tests/fixtures/dead-ref.svg +0 -0
- /package/.agents/{skills → skills-archived}/show/tests/fixtures/filled-glyph.svg +0 -0
- /package/.agents/{skills → skills-archived}/show/tests/fixtures/inherited-fill.svg +0 -0
- /package/.agents/{skills → skills-archived}/show/tests/fixtures/invalid.svg +0 -0
- /package/.agents/{skills → skills-archived}/show/tests/fixtures/large-canvas.svg +0 -0
- /package/.agents/{skills → skills-archived}/show/tests/fixtures/unfilled-connector.svg +0 -0
- /package/.agents/{skills → skills-archived}/show/tests/fixtures/valid.html +0 -0
- /package/.agents/{skills → skills-archived}/show/tests/test_validate-artifact.py +0 -0
- /package/.agents/{skills → skills-archived}/show/tests/test_validators.py +0 -0
- /package/.agents/{skills → skills-archived}/show/workflows/create-visual.md +0 -0
- /package/.agents/{skills → skills-archived}/show/workflows/review-visual.md +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/reference/path-layers.md +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/reference/split-further-loop.md +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/reference/splitting-principles.md +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/analyze_pr.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/categorize_files.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/config/__init__.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/config/dependency_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/config/git_operations_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/config/packing_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/config/plan_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/config/split_pr_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/execute_split_slices.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/pack_files_into_slices.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_dependency_graph.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_git_operations.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_layer_order.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_paginate.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_process_runner.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_script_types.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_title.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/test_analyze_pr.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/test_categorize_files.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/test_categorize_files_packing.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/test_execute_split_slices.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/test_split_pr_dependency_graph.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/test_split_pr_git_operations.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/test_split_pr_layer_order.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/test_split_pr_paginate.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/test_split_pr_script_types.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/test_split_pr_title.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/test_verify_dependency_graph.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/test_verify_plan.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/test_verify_plan_contract.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/test_verify_plan_path_normalization.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/verify_dependency_graph.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/verify_plan.py +0 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import subprocess
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
|
|
4
|
+
import pytest
|
|
5
|
+
|
|
6
|
+
from review_tier import build_generation, inventory_generation, router_state_directory, router_state_root, router_state_root_id
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def test_generation_uses_live_git_surface(tmp_path: Path) -> None:
|
|
10
|
+
subprocess.run(["git", "init", "-q", "-b", "main"], cwd=tmp_path, check=True)
|
|
11
|
+
(tmp_path / "tracked.py").write_text("x = 1\n", encoding="utf-8")
|
|
12
|
+
subprocess.run(["git", "add", "tracked.py"], cwd=tmp_path, check=True)
|
|
13
|
+
subprocess.run(["git", "-c", "user.name=Test", "-c", "user.email=test@example.com", "commit", "-qm", "init"], cwd=tmp_path, check=True)
|
|
14
|
+
(tmp_path / "untracked.py").write_text("y = 2\n", encoding="utf-8")
|
|
15
|
+
inventory = inventory_generation(tmp_path)
|
|
16
|
+
assert "untracked.py" in inventory["untracked"]
|
|
17
|
+
card = build_generation(tmp_path, card_path=tmp_path / "card.json")
|
|
18
|
+
assert card["inventory_hash"] == inventory["inventory_hash"]
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def test_router_state_root_id_is_stable_for_normalized_roots(tmp_path: Path) -> None:
|
|
22
|
+
(tmp_path / "data").mkdir()
|
|
23
|
+
(tmp_path / "data-link").symlink_to(tmp_path / "data", target_is_directory=True)
|
|
24
|
+
state_root = router_state_root(tmp_path, {"CLAUDE_PLUGIN_DATA": str(tmp_path / "data" / ".." / "data")})
|
|
25
|
+
symlink_root = router_state_root(tmp_path, {"CLAUDE_PLUGIN_DATA": str(tmp_path / "data-link")})
|
|
26
|
+
assert state_root == symlink_root
|
|
27
|
+
assert router_state_root_id(state_root) == router_state_root_id(symlink_root)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def test_router_state_directory_is_scoped_under_the_router_root(tmp_path: Path) -> None:
|
|
31
|
+
state_directory = router_state_directory(tmp_path)
|
|
32
|
+
custom_environment = {"CLAUDE_PLUGIN_DATA": str(tmp_path / "custom-data")}
|
|
33
|
+
custom_state_directory = router_state_directory(tmp_path, custom_environment)
|
|
34
|
+
|
|
35
|
+
assert state_directory.parent == router_state_root(tmp_path)
|
|
36
|
+
assert custom_state_directory == router_state_root(tmp_path, custom_environment) / state_directory.name
|
|
37
|
+
assert custom_state_directory != state_directory
|
|
38
|
+
assert len(state_directory.name) == 64
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def test_generation_records_committed_and_working_domains_once(tmp_path: Path) -> None:
|
|
42
|
+
repository = tmp_path / "repository"
|
|
43
|
+
repository.mkdir()
|
|
44
|
+
subprocess.run(["git", "init", "-q", "-b", "main"], cwd=repository, check=True)
|
|
45
|
+
subprocess.run(["git", "config", "user.name", "Test"], cwd=repository, check=True)
|
|
46
|
+
subprocess.run(["git", "config", "user.email", "test@example.com"], cwd=repository, check=True)
|
|
47
|
+
tracked = repository / "packages" / "feature.py"
|
|
48
|
+
tracked.parent.mkdir()
|
|
49
|
+
tracked.write_text("one\n", encoding="utf-8")
|
|
50
|
+
subprocess.run(["git", "add", "."], cwd=repository, check=True)
|
|
51
|
+
subprocess.run(["git", "commit", "-qm", "initial"], cwd=repository, check=True)
|
|
52
|
+
initial_commit = subprocess.run(["git", "rev-parse", "HEAD"], cwd=repository, check=True, capture_output=True, text=True).stdout.strip()
|
|
53
|
+
tracked.write_text("one\nbase\n", encoding="utf-8")
|
|
54
|
+
subprocess.run(["git", "add", str(tracked)], cwd=repository, check=True)
|
|
55
|
+
subprocess.run(["git", "commit", "-qm", "feature"], cwd=repository, check=True)
|
|
56
|
+
tracked.write_text("one\ntwo\n", encoding="utf-8")
|
|
57
|
+
subprocess.run(["git", "add", str(tracked)], cwd=repository, check=True)
|
|
58
|
+
tracked.write_text("one\ntwo\nthree\n", encoding="utf-8")
|
|
59
|
+
(repository / "new.py").write_text("new\n", encoding="utf-8")
|
|
60
|
+
inventory = inventory_generation(repository, initial_commit)
|
|
61
|
+
records = {record["path"]: record["domains"] for record in inventory["files_by_domain"]}
|
|
62
|
+
assert records["packages/feature.py"] == ["committed", "staged", "unstaged"]
|
|
63
|
+
assert records["new.py"] == ["untracked"]
|
|
64
|
+
assert inventory["base_ref"] and inventory["merge_base"] and inventory["HEAD"]
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@pytest.mark.parametrize("base_ref", ["missing", "HEAD~99"])
|
|
68
|
+
def test_invalid_base_writes_no_card(tmp_path: Path, base_ref: str) -> None:
|
|
69
|
+
repository = tmp_path / "repository"
|
|
70
|
+
repository.mkdir()
|
|
71
|
+
subprocess.run(["git", "init", "-q", "-b", "main"], cwd=repository, check=True)
|
|
72
|
+
(repository / "seed.txt").write_text("seed\n", encoding="utf-8")
|
|
73
|
+
subprocess.run(["git", "add", "seed.txt"], cwd=repository, check=True)
|
|
74
|
+
subprocess.run(["git", "-c", "user.name=Test", "-c", "user.email=test@example.com", "commit", "-qm", "initial"], cwd=repository, check=True)
|
|
75
|
+
with pytest.raises(ValueError, match="INVALID_BASE_REF"):
|
|
76
|
+
build_generation(repository, base_ref=base_ref, card_path=tmp_path / "card.json")
|
|
77
|
+
assert not (tmp_path / "card.json").exists()
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def _git_repository(root: Path) -> None:
|
|
81
|
+
subprocess.run(["git", "init", "-q", "-b", "main"], cwd=root, check=True)
|
|
82
|
+
subprocess.run(["git", "config", "user.name", "Test"], cwd=root, check=True)
|
|
83
|
+
subprocess.run(["git", "config", "user.email", "test@example.com"], cwd=root, check=True)
|
|
84
|
+
(root / "seed.txt").write_text("seed\n", encoding="utf-8")
|
|
85
|
+
subprocess.run(["git", "add", "."], cwd=root, check=True)
|
|
86
|
+
subprocess.run(["git", "commit", "-qm", "initial"], cwd=root, check=True)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def test_diff_hash_changes_when_same_path_content_changes(tmp_path: Path) -> None:
|
|
90
|
+
_git_repository(tmp_path)
|
|
91
|
+
tracked_path = tmp_path / "seed.txt"
|
|
92
|
+
first_hash = inventory_generation(tmp_path)["diff_hash"]
|
|
93
|
+
tracked_path.write_text("changed\n", encoding="utf-8")
|
|
94
|
+
assert inventory_generation(tmp_path)["diff_hash"] != first_hash
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def test_effective_lines_include_committed_staged_unstaged_and_untracked(tmp_path: Path) -> None:
|
|
98
|
+
_git_repository(tmp_path)
|
|
99
|
+
committed_path = tmp_path / "committed.txt"
|
|
100
|
+
committed_path.write_text("one\ntwo\n", encoding="utf-8")
|
|
101
|
+
subprocess.run(["git", "add", "."], cwd=tmp_path, check=True)
|
|
102
|
+
subprocess.run(["git", "commit", "-qm", "committed"], cwd=tmp_path, check=True)
|
|
103
|
+
staged_path = tmp_path / "staged.txt"
|
|
104
|
+
staged_path.write_text("one\ntwo\n", encoding="utf-8")
|
|
105
|
+
subprocess.run(["git", "add", str(staged_path)], cwd=tmp_path, check=True)
|
|
106
|
+
staged_path.write_text("one\ntwo\nthree\n", encoding="utf-8")
|
|
107
|
+
unstaged_path = tmp_path / "seed.txt"
|
|
108
|
+
unstaged_path.write_text("seed\nchanged\n", encoding="utf-8")
|
|
109
|
+
(tmp_path / "untracked.txt").write_text("one\ntwo\n", encoding="utf-8")
|
|
110
|
+
inventory = inventory_generation(tmp_path)
|
|
111
|
+
assert inventory["lines"] >= 6
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def test_inventory_preserves_rename_prior_path_and_operations(tmp_path: Path) -> None:
|
|
115
|
+
_git_repository(tmp_path)
|
|
116
|
+
old_path = tmp_path / "old name.txt"
|
|
117
|
+
old_path.write_text("content\n", encoding="utf-8")
|
|
118
|
+
subprocess.run(["git", "add", "."], cwd=tmp_path, check=True)
|
|
119
|
+
subprocess.run(["git", "commit", "-qm", "rename source"], cwd=tmp_path, check=True)
|
|
120
|
+
new_path = tmp_path / "new name.txt"
|
|
121
|
+
old_path.rename(new_path)
|
|
122
|
+
subprocess.run(["git", "add", "-A"], cwd=tmp_path, check=True)
|
|
123
|
+
records = {record["path"]: record for record in inventory_generation(tmp_path)["files_by_domain"]}
|
|
124
|
+
assert records["new name.txt"]["prior_path"] == "old name.txt"
|
|
125
|
+
assert records["new name.txt"]["operation_by_domain"]["staged"] == "R"
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def test_inventory_preserves_delete_binary_space_unicode_and_symlink_identity(tmp_path: Path) -> None:
|
|
129
|
+
_git_repository(tmp_path)
|
|
130
|
+
deleted = tmp_path / "deleted file.txt"
|
|
131
|
+
deleted.write_text("delete me\n", encoding="utf-8")
|
|
132
|
+
binary = tmp_path / "binary.bin"
|
|
133
|
+
binary.write_bytes(b"\0\xff")
|
|
134
|
+
unicode_path = tmp_path / "café.txt"
|
|
135
|
+
unicode_path.write_text("unicode\n", encoding="utf-8")
|
|
136
|
+
link = tmp_path / "link.txt"
|
|
137
|
+
link.symlink_to("seed.txt")
|
|
138
|
+
subprocess.run(["git", "add", "."], cwd=tmp_path, check=True)
|
|
139
|
+
subprocess.run(["git", "commit", "-qm", "surface"], cwd=tmp_path, check=True)
|
|
140
|
+
surface_commit = subprocess.run(["git", "rev-parse", "HEAD"], cwd=tmp_path, check=True, capture_output=True, text=True).stdout.strip()
|
|
141
|
+
deleted.unlink()
|
|
142
|
+
binary.write_bytes(b"\0\x00changed")
|
|
143
|
+
unicode_path.write_text("unicode changed\n", encoding="utf-8")
|
|
144
|
+
link.unlink()
|
|
145
|
+
link.symlink_to("café.txt")
|
|
146
|
+
subprocess.run(["git", "add", "-u"], cwd=tmp_path, check=True)
|
|
147
|
+
subprocess.run(["git", "add", "-A"], cwd=tmp_path, check=True)
|
|
148
|
+
records = {record["path"]: record for record in inventory_generation(tmp_path, surface_commit)["files_by_domain"]}
|
|
149
|
+
assert records["deleted file.txt"]["content_sha256"] != "0" * 64
|
|
150
|
+
assert records["binary.bin"]["binary"] is True
|
|
151
|
+
assert records["café.txt"]["path"] == "café.txt"
|
|
152
|
+
assert records["link.txt"]["content_sha256"]
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def test_package_count_uses_distinct_monorepo_package_keys(tmp_path: Path) -> None:
|
|
156
|
+
_git_repository(tmp_path)
|
|
157
|
+
for path in ("packages/one/a.py", "packages/one/b.py", "apps/two/c.py", "root.py"):
|
|
158
|
+
target = tmp_path / path
|
|
159
|
+
target.parent.mkdir(parents=True, exist_ok=True)
|
|
160
|
+
target.write_text("x\n", encoding="utf-8")
|
|
161
|
+
assert inventory_generation(tmp_path)["packages"] == 3
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def test_explicit_and_default_base_provenance_fields_are_exact(tmp_path: Path) -> None:
|
|
165
|
+
_git_repository(tmp_path)
|
|
166
|
+
default_inventory = inventory_generation(tmp_path)
|
|
167
|
+
explicit_inventory = inventory_generation(tmp_path, "HEAD")
|
|
168
|
+
assert default_inventory["base_source"] == "configured_fallback"
|
|
169
|
+
assert explicit_inventory["base_source"] == "explicit"
|
|
170
|
+
for field in ("base_ref", "base_source", "base_sha", "merge_base_sha", "head_sha"):
|
|
171
|
+
assert default_inventory[field]
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from review_tier import build_decision, calculate_tier, canonical_json_hash, effective_tier, load_policy, policy_hash
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def test_public_policy_functions_return_behavior() -> None:
|
|
5
|
+
tier_policy = load_policy()
|
|
6
|
+
assert policy_hash(tier_policy)
|
|
7
|
+
assert canonical_json_hash(tier_policy) == policy_hash(tier_policy)
|
|
8
|
+
decision = build_decision({}, "base", "head", ".", "digest", requested_override="T1")
|
|
9
|
+
assert decision["effective_tier"] == "T1"
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def test_tier_boundaries_and_hard_trigger() -> None:
|
|
13
|
+
assert calculate_tier({"files": 0, "lines": 0, "packages": 0, "risk": 0}) == "T1"
|
|
14
|
+
assert calculate_tier({"files": 2}) == "T2"
|
|
15
|
+
assert calculate_tier({"files": 5}) == "T2"
|
|
16
|
+
assert calculate_tier({"hard_triggers": ["security"]}) == "T3"
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def test_all_six_axes_accept_zero_one_two_boundaries() -> None:
|
|
20
|
+
axes = ("files", "lines", "packages", "risk", "public_api", "dependencies")
|
|
21
|
+
assert calculate_tier({axis: 0 for axis in axes}) == "T1"
|
|
22
|
+
assert calculate_tier({axis: 1 for axis in axes}) == "T3"
|
|
23
|
+
assert calculate_tier({axis: 2 for axis in axes}) == "T3"
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def test_score_boundaries_keep_small_changes_below_t3() -> None:
|
|
27
|
+
assert calculate_tier({"files": 1, "lines": 1}) == "T2"
|
|
28
|
+
assert calculate_tier({"files": 2, "packages": 1, "risk": 1}) == "T3"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def test_upward_and_approved_downward_override() -> None:
|
|
32
|
+
assert effective_tier("T1", "T3") == "T3"
|
|
33
|
+
assert effective_tier("T3", "T1") == "T1"
|
|
@@ -25,7 +25,7 @@ Sessions come in many shapes — convergence loops, feature builds, research div
|
|
|
25
25
|
- **The `Artifact` tool wraps the file in a document skeleton at publish time.** It adds `<!doctype html>…<head>…</head><body>` around whatever the file holds — write page content only (a `<title>`, a `<style>` block, and the body markup). Do not include `<!DOCTYPE>`, `<html>`, `<head>`, or `<body>` tags in the file itself.
|
|
26
26
|
- **The `Artifact` tool redeploys to the same URL only within the current run.** Editing the session's HTML file in a later step of this same skill run and calling `Artifact` again does not mint a new URL — it updates the same published page in place. A fresh session has no memory of an artifact's URL from an earlier run, so republishing a session report written in a prior session always mints a new URL (there is no other way to target the old one without the user supplying it).
|
|
27
27
|
- **Vault paths sit outside `.claude/`.** Headless vault paths (e.g., `$OBSIDIAN_VAULT_PATH`) resolve outside the project tree. Session reports use HTML regardless of vault location — the Artifact tool needs a written file to publish.
|
|
28
|
-
- **Sessions describe current state by convention.** The state_description_blocker hook does not scan .html
|
|
28
|
+
- **Sessions describe current state by convention.** The state_description_blocker hook does not scan .html. Apply `~/.claude/rules/asd-ste100-language.md` for user-facing word choice and sentence style, and keep the session report current and self-contained.
|
|
29
29
|
- **`write_existing_file_blocker` rejects Write on existing paths.** Use Write only when creating a fresh session report; use Edit for the vault-context append in step 3.
|
|
30
30
|
- **Obsidian frontmatter index is HTML-blind.** Obsidian's native YAML-frontmatter parser reads only `.md` files. HTML files do not appear in Obsidian's frontmatter index. Search by content still works; search by `type: session-report` does not.
|
|
31
31
|
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: shared-extraction-audit
|
|
3
|
+
description: Audits pull requests and packages for general helpers living in workflow-specific code instead of shared_utils, then applies extraction fixes by default in small tested CLs. Use when reviewing PRs for architectural layering, migrating utilities out of cert_fix_queue/theme_dialer_pipeline/skills, auditing "similar offenses", or when the user mentions extraction audit, shared_utils migration, orchestration-only packages, thin wrappers, or layer inversions.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Shared Extraction Audit
|
|
7
|
+
|
|
8
|
+
Audit PRs and packages, report findings, and apply extraction fixes by default to keep **orchestration packages thin** and **shared_utils canonical**.
|
|
9
|
+
|
|
10
|
+
## When to use
|
|
11
|
+
|
|
12
|
+
- User points at a PR (e.g. `#1954`, `#1965`) and asks for the same review loop
|
|
13
|
+
- A package grew `fix_one`, `_default_*`, backup upload, rembg session, or residual gates alongside orchestration
|
|
14
|
+
- Before merge: confirm consumers are adapters, not second implementations
|
|
15
|
+
|
|
16
|
+
## Target architecture
|
|
17
|
+
|
|
18
|
+
| Layer | Holds | Examples |
|
|
19
|
+
|-------|--------|----------|
|
|
20
|
+
| **shared_utils** | Reusable actions, I/O, DB flips, inference, constants used by 2+ workflows | `status_promotion`, `background_removal`, `drive_production_backup`, `stp_filenames` |
|
|
21
|
+
| **Workflow package** | Orchestration, CLI, sweep loops, workflow-specific constants only | `cert_fix_queue/pipeline/queue_run.py`, `theme_dialer_pipeline` compose runners |
|
|
22
|
+
| **Skills / scripts** | Operator entrypoints that **delegate** to shared_utils | No parallel rembg/session stacks |
|
|
23
|
+
|
|
24
|
+
**Load-bearing rule:** If another package would import it, put it in `shared_utils`. After the move, every former caller imports the shared symbol and the old module is deleted.
|
|
25
|
+
|
|
26
|
+
## Audit workflow
|
|
27
|
+
|
|
28
|
+
Copy to TodoWrite:
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
Shared extraction audit:
|
|
32
|
+
- [ ] 1. Scope the PR (base branch, changed packages, stated goal)
|
|
33
|
+
- [ ] 2. Map canonical homes already in shared_utils
|
|
34
|
+
- [ ] 3. Grep for offense patterns (see reference/offense-taxonomy.md)
|
|
35
|
+
- [ ] 4. Write prioritized findings (P0–P3)
|
|
36
|
+
- [ ] 5. Apply the prioritized fix band by default; an explicit audit-only request ends after the report
|
|
37
|
+
- [ ] 6. Extract in small CLs (~100 lines) + move/adjust tests
|
|
38
|
+
- [ ] 7. Run scoped pytest, commit, push, update PR
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Step 1 — Scope
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
git fetch origin pull/<N>/head:pr-<N> # or checkout feature branch
|
|
45
|
+
git diff <base>...<head> --stat
|
|
46
|
+
git diff <base>...<head> --name-only | rg 'shared_utils|cert_fix_queue|theme_dialer|clean_room|\.claude/skills'
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Read the PR summary, then verify **what landed correctly** before listing offenses.
|
|
50
|
+
|
|
51
|
+
### Step 2 — Search patterns
|
|
52
|
+
|
|
53
|
+
Run these greps on the PR diff scope:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
# Rename-only seams and re-export facades
|
|
57
|
+
rg '_default_|def _.*_flipper|def _.*_one\b|promote_one|fix_one|backup_upload' <package> shared_utils
|
|
58
|
+
rg '^from shared_utils\..* import \w+$' <package>
|
|
59
|
+
|
|
60
|
+
# Layer inversions (shared importing consumer)
|
|
61
|
+
rg 'from (cert_fix_queue|theme_dialer_pipeline|clean_room_theme_icons)\.' shared_utils/
|
|
62
|
+
|
|
63
|
+
# Parallel stacks (second session/cache for same concern)
|
|
64
|
+
rg 'new_session|lru_cache.*session|rembg\.remove' .claude/skills shared_utils
|
|
65
|
+
|
|
66
|
+
# Duplicate constants
|
|
67
|
+
rg 'ALPHA_CHANNEL_INDEX|RGBA_ALPHA|DEFAULT_.*_PREFIX|ONEUI_STP_BASENAME' --glob '*.py'
|
|
68
|
+
|
|
69
|
+
# Duplicate test support
|
|
70
|
+
rg 'fail_if_called|build_rejected_theme_row|preserve_supplied_alpha' --glob '**/tests/**'
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Step 3 — Classify offenses
|
|
74
|
+
|
|
75
|
+
Use [reference/offense-taxonomy.md](reference/offense-taxonomy.md). Assign priority:
|
|
76
|
+
|
|
77
|
+
| Priority | Meaning |
|
|
78
|
+
|----------|---------|
|
|
79
|
+
| **P0** | Layer inversion or duplicate production stack (must fix before merge) |
|
|
80
|
+
| **P1** | General helper/constants/tests still in consumer package |
|
|
81
|
+
| **P2** | Module shape, I/O overlap, monolith size |
|
|
82
|
+
| **P3** | Stale names, docstrings, test attribute bugs |
|
|
83
|
+
|
|
84
|
+
### Step 4 — Report template
|
|
85
|
+
|
|
86
|
+
```markdown
|
|
87
|
+
## PR #<N> extraction audit
|
|
88
|
+
|
|
89
|
+
### Done well
|
|
90
|
+
- [canonical modules and deletions]
|
|
91
|
+
|
|
92
|
+
### P0 — …
|
|
93
|
+
| Offense | Where | Target module | Tests |
|
|
94
|
+
|---------|-------|---------------|-------|
|
|
95
|
+
|
|
96
|
+
### Suggested fix order
|
|
97
|
+
1. …
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Apply the prioritized fixes after the report by default. An explicit audit-only request ends after the report.
|
|
101
|
+
|
|
102
|
+
## Fix workflow
|
|
103
|
+
|
|
104
|
+
### Extraction rules
|
|
105
|
+
|
|
106
|
+
1. **Move behavior** — delete the consumer copy; every caller imports the shared symbol
|
|
107
|
+
2. **Wire shared APIs at the call site** — e.g. `db_flipper=promote_theme_to_status` with `filename_prefix=...`
|
|
108
|
+
3. **Retarget every caller, then delete the old module** — grep the old import path; remove re-export facades
|
|
109
|
+
4. **Constants:** one source; workflow CLI keeps only workflow-specific names (`LEDGER_FILENAME`, exit codes)
|
|
110
|
+
5. **Tests move with behavior** — shared module gets shared tests; orchestration keeps integration tests only
|
|
111
|
+
6. **Small CLs** — one concern per commit (~100 lines); run scoped pytest after each
|
|
112
|
+
|
|
113
|
+
### Canonical target map (this repo)
|
|
114
|
+
|
|
115
|
+
| Need | Home |
|
|
116
|
+
|------|------|
|
|
117
|
+
| Theme DB status flip | `shared_utils/theme_db/status_promotion.py` |
|
|
118
|
+
| Account folder ↔ ThemeAccount | `shared_utils/theme_persistence/account_adapter.py` |
|
|
119
|
+
| STP basename parsing | `shared_utils/samsung_utils/stp_filenames.py` |
|
|
120
|
+
| Drive backup upload | `shared_utils/files/drive_production_backup.py` |
|
|
121
|
+
| Timestamp scratch dirs | `shared_utils/files/timestamp_directory_retention.py` |
|
|
122
|
+
| Foreground extraction | `shared_utils/theme_assets/background_removal.py` |
|
|
123
|
+
| Cert fix / promote actions | `shared_utils/theme_assets/cert_closeout/` |
|
|
124
|
+
| Fixed-STP promotion sweep | `shared_utils/samsung_utils/promote_fixed_stp_sweep.py` |
|
|
125
|
+
| Cert queue orchestration only | `cert_fix_queue/pipeline/` (`queue_run`) and `run_cli` |
|
|
126
|
+
|
|
127
|
+
See also `.claude/rules/reuse-existing-tooling.md` before adding helpers.
|
|
128
|
+
|
|
129
|
+
### Verification
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
# Package under change (from its directory or shared_utils)
|
|
133
|
+
cd shared_utils && python -m pytest path/to/tests -n 0 -q
|
|
134
|
+
cd cert_fix_queue && python -m pytest tests/ -n 0 -q
|
|
135
|
+
|
|
136
|
+
# After moving tests: bump CI collect floor in .github/workflows/standalone-packages-tests.yml if applicable
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Provide evidence: pytest output counts, not "should work".
|
|
140
|
+
|
|
141
|
+
### Git / PR
|
|
142
|
+
|
|
143
|
+
- Branch: `cursor/<topic>-593d` or existing PR branch
|
|
144
|
+
- Commit message: `Extract <what> from <package> into shared_utils`
|
|
145
|
+
- Update PR body: architecture table + test counts
|
|
146
|
+
- Do not merge; draft PR unless user says otherwise
|
|
147
|
+
|
|
148
|
+
## Anti-patterns (flag these)
|
|
149
|
+
|
|
150
|
+
- `_default_*` adapter around a shared_utils function in a consumer module
|
|
151
|
+
- Workflow module that only does `from shared_utils... import foo as foo`
|
|
152
|
+
- `fix_one.py` / `promote_one.py` / `promote_run.py` / `backup_upload.py` in orchestration packages
|
|
153
|
+
- `shared_utils` importing `theme_dialer_pipeline` or `cert_fix_queue`
|
|
154
|
+
- Second rembg/BiRefNet session in a skill while `background_removal` exists
|
|
155
|
+
- Identical `tests/support.py` in two packages
|
|
156
|
+
- `config/constants.py` that only aliases extracted helpers
|
|
157
|
+
|
|
158
|
+
## Examples
|
|
159
|
+
|
|
160
|
+
See [reference/examples.md](reference/examples.md) for cert_fix_queue (#1965) and background_removal (#1954) audits.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Audit examples (this repo)
|
|
2
|
+
|
|
3
|
+
## cert_fix_queue — PR #1965
|
|
4
|
+
|
|
5
|
+
**Goal:** `cert_fix_queue` holds orchestration only; general cert-fix utilities in `shared_utils`.
|
|
6
|
+
|
|
7
|
+
**Done well:**
|
|
8
|
+
- `locate_cert_folder_for_row`, `select_production_stp`, atomic copy, drive staged upload → shared_utils
|
|
9
|
+
- Deleted `fix_one.py`, `promote_one.py`, `backup_upload.py` from pipeline
|
|
10
|
+
|
|
11
|
+
**Offenses found and fixed:**
|
|
12
|
+
- `_default_db_flipper` in `fix_theme.py` → wire `db_flipper=promote_theme_to_status` at the call site; delete the wrapper
|
|
13
|
+
- `production_backup.py` under cert_closeout → `shared_utils/files/drive_production_backup.py`
|
|
14
|
+
- Duplicate test `support.py` → `shared_utils/theme_assets/testing/cert_fix_test_support.py`
|
|
15
|
+
- `fix_queue_constants.py` misnamed → `fix_outcomes.py`
|
|
16
|
+
- `_account_by_fixed_stps_folder` → `cert_failure_folder_to_theme_account_map()` in `account_adapter`
|
|
17
|
+
- `_fresh_run_directories` / scratch helpers → `allocate_timestamp_run_directory()`
|
|
18
|
+
|
|
19
|
+
**Pipeline after:**
|
|
20
|
+
```
|
|
21
|
+
cert_fix_queue/pipeline/
|
|
22
|
+
queue_run.py
|
|
23
|
+
promote_run.py
|
|
24
|
+
run_cli.py
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## background_removal — PR #1954
|
|
30
|
+
|
|
31
|
+
**Goal:** One BiRefNet CPU path in `shared_utils/theme_assets/background_removal.py`.
|
|
32
|
+
|
|
33
|
+
**Done well:**
|
|
34
|
+
- Deleted `clean_room_theme_icons/chroma.py`, dialer `art_masks.py`, `png_io.py`
|
|
35
|
+
- Added `pixel_masks.py`, `png_canonical.py`
|
|
36
|
+
- Clean-room and dialer call `extract_foreground` / `extract_foreground_file`
|
|
37
|
+
|
|
38
|
+
**Remaining offenses (audit):**
|
|
39
|
+
- P0: Residual gates in `theme_dialer_pipeline/pipeline/chroma_extract.py` (shared algorithm output)
|
|
40
|
+
- P0: `_extract_component_foreground` wrapper; same pattern inlined in `compose_from_masters.py`
|
|
41
|
+
- P0: Parallel rembg in `misc-asset-remaster/scripts/generated_alpha_mask.py`
|
|
42
|
+
- P1: Duplicate extraction test fixtures (dialer conftest vs clean-room conftest)
|
|
43
|
+
- P1: `ALPHA_CHANNEL_INDEX` duplicated across dialer/clean-room/color_constants
|
|
44
|
+
- P2: Atomic write helpers inside 723-line `background_removal.py`; PNG path vs `png_canonical`
|
|
45
|
+
|
|
46
|
+
**Suggested fix order:** residual gates → shared test fixtures → dedupe constants → migrate misc rembg → I/O split (optional).
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# Offense taxonomy
|
|
2
|
+
|
|
3
|
+
## O1 — General action in workflow package
|
|
4
|
+
|
|
5
|
+
**Signal:** Per-item function named `*_one`, `fix_*`, `promote_*`, `upload_*` in orchestration tree.
|
|
6
|
+
|
|
7
|
+
**Example:** `cert_fix_queue/pipeline/fix_one.py` → `shared_utils/.../fix_theme.py` (`fix_cert_rejected_theme`).
|
|
8
|
+
|
|
9
|
+
**Fix:** Move module; consumer passes workflow-specific `filename_prefix` / folder ids at call site.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## O2 — Thin wrapper / default seam / re-export facade
|
|
14
|
+
|
|
15
|
+
**Signal:** `_default_db_flipper`, `_default_*` that only renames kwargs and calls shared_utils. Also: a workflow module that only re-exports a shared symbol under the old path.
|
|
16
|
+
|
|
17
|
+
**Example:** Wrapper around `promote_theme_to_status` with `db_flip_log_filename_prefix`. After a move, `clean_room_theme_icons.rebuild_nine_patch` still contains `from shared_utils... import rebuild_nine_patch`.
|
|
18
|
+
|
|
19
|
+
**Fix:** Update every caller to the shared symbol (`filename_prefix`, `shared_utils.theme_assets.nine_patch_rebuild`, etc.) and delete the wrapper or facade.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## O3 — Layer inversion
|
|
24
|
+
|
|
25
|
+
**Signal:** `shared_utils/...` imports from `cert_fix_queue`, `theme_dialer_pipeline`, `clean_room_theme_icons`, or `.claude/skills/...`.
|
|
26
|
+
|
|
27
|
+
**Fix:** Move imported symbol into shared_utils; consumer imports shared.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## O4 — Parallel production stack
|
|
32
|
+
|
|
33
|
+
**Signal:** Second implementation of same concern (rembg session, despill, STP walk, DB flip) in skill or sibling package.
|
|
34
|
+
|
|
35
|
+
**Example:** `misc-asset-remaster/.../generated_alpha_mask.py` vs `background_removal.py`.
|
|
36
|
+
|
|
37
|
+
**Fix:** Delegate to canonical module; delete duplicate constants and session cache.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## O5 — Validation/gates on shared output in consumer
|
|
42
|
+
|
|
43
|
+
**Signal:** Functions that only inspect output of shared algorithm (residual alpha, edge green excess) live in dialer/clean-room.
|
|
44
|
+
|
|
45
|
+
**Example:** `theme_dialer_pipeline/pipeline/chroma_extract.py` using `edge_green_excess_mask` from shared.
|
|
46
|
+
|
|
47
|
+
**Fix:** `shared_utils/theme_assets/background_removal/residual_gates.py` (or sibling); optional `extract_foreground_gated`.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## O6 — Duplicate constants
|
|
52
|
+
|
|
53
|
+
**Signal:** Same literal or semantic constant in workflow `config/constants.py` and shared config.
|
|
54
|
+
|
|
55
|
+
**Examples:** `ALPHA_CHANNEL_INDEX`, `ONEUI_STP_BASENAME_RE`, two `DEFAULT_*_DB_FLIP_*` with same value.
|
|
56
|
+
|
|
57
|
+
**Fix:** Single definition in shared config; delete consumer copies.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## O7 — Misplaced config module
|
|
62
|
+
|
|
63
|
+
**Signal:** Constants named for workflow A live under package B's config (e.g. `fix_queue_constants` under `cert_closeout`).
|
|
64
|
+
|
|
65
|
+
**Fix:** Rename/move to owning workflow or shared outcomes module; drop re-export-only facades.
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## O8 — Duplicate test support
|
|
70
|
+
|
|
71
|
+
**Signal:** Identical or near-identical `tests/support.py`, conftest bypass fixtures, synthetic PNG writers in multiple packages.
|
|
72
|
+
|
|
73
|
+
**Fix:** `shared_utils/theme_assets/testing/` or `shared_utils/.../tests/fixtures.py`; one import path.
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## O9 — General I/O in domain module
|
|
78
|
+
|
|
79
|
+
**Signal:** Atomic staged writes, Drive upload, UTC helpers duplicated inside a 700-line domain file.
|
|
80
|
+
|
|
81
|
+
**Fix:** `shared_utils/files/` (e.g. `drive_production_backup`, `timestamp_directory_retention`, `record_persist`).
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## O10 — Stale identifiers
|
|
86
|
+
|
|
87
|
+
**Signal:** Docstrings/tests still say `fix_one`, `promote_one`, `backup_upload` after rename.
|
|
88
|
+
|
|
89
|
+
**Fix:** Update docs; no behavior change.
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Priority guide
|
|
94
|
+
|
|
95
|
+
| Offense | Typical priority |
|
|
96
|
+
|---------|------------------|
|
|
97
|
+
| O3, O4 | P0 |
|
|
98
|
+
| O1, O2, O5, O6, O7, O8 | P1 |
|
|
99
|
+
| O9, monolith size | P2 |
|
|
100
|
+
| O10 | P3 |
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "source-command-logifix"
|
|
3
|
+
description: "Restore the Logitech Gaming Software (LCore) tray icon when it disappears on Windows"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# source-command-logifix
|
|
7
|
+
|
|
8
|
+
Use this skill when the user asks to run the migrated source command `logifix`.
|
|
9
|
+
|
|
10
|
+
## Command Template
|
|
11
|
+
|
|
12
|
+
Run the logifix recovery script to restore the LCore tray icon. The procedure is verified in `sessions/System Support/2. Logitech Tray Icon Fix Recurrence.md` (2026-04-25).
|
|
13
|
+
|
|
14
|
+
Execute the script via PowerShell 7+:
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
pwsh -NoProfile -File "$HOME\.Codex\skills\logifix\scripts\logifix.ps1"
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
The script will prompt for UAC once. Approve it. After it finishes, ask the user to confirm the tray icon is now visible.
|
|
21
|
+
|
|
22
|
+
If the script reports that UAC was canceled, or LCore did not respond after both relaunch attempts, instruct the user:
|
|
23
|
+
|
|
24
|
+
1. Press **Ctrl+Shift+Esc** to open Task Manager.
|
|
25
|
+
2. Find **Windows Explorer** in the process list.
|
|
26
|
+
3. Right-click → **Restart**.
|
|
27
|
+
4. Re-run `/logifix`.
|
|
28
|
+
|
|
29
|
+
The Task Manager Explorer restart is the guaranteed-correct fallback because it always hits the user's interactive session and the right elevation context, regardless of how the calling shell was launched.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "source-command-sr-loop"
|
|
3
|
+
description: "Converging cleanup loop: repeat /simplify until clean, then repeat /code-review --fix until clean"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# source-command-sr-loop
|
|
7
|
+
|
|
8
|
+
Use this skill when the user asks to run the migrated source command `sr-loop`.
|
|
9
|
+
|
|
10
|
+
## Command Template
|
|
11
|
+
|
|
12
|
+
Run the converging cleanup loop on the target the user names (a PR URL,
|
|
13
|
+
a branch, or blank for the current branch's diff). Each phase invokes an
|
|
14
|
+
existing skill and repeats it until a pass returns zero new findings.
|
|
15
|
+
|
|
16
|
+
### Phase A — loop simplify
|
|
17
|
+
|
|
18
|
+
1. Invoke the `simplify` skill (or its local equivalent, e.g. `e-simplify`)
|
|
19
|
+
on the target. Let it run its 4-lens review fan-out (reuse,
|
|
20
|
+
simplification, efficiency, altitude) and apply its fixes.
|
|
21
|
+
2. After each pass: run the scoped test suite (test files beside the touched
|
|
22
|
+
code, not the full repo suite), commit once (commit body via
|
|
23
|
+
`git commit -F <file>`, 10-minute timeout — the pre-commit gate runs its
|
|
24
|
+
own tests), and push to the PR head branch. The PR stays draft.
|
|
25
|
+
3. Repeat the invocation. Skips are sticky: carry every adjudicated skip
|
|
26
|
+
forward into the next pass as "already adjudicated — do not re-report: ..."
|
|
27
|
+
context, or the loop never converges.
|
|
28
|
+
4. Phase A converges when a full pass returns zero new findings. When the
|
|
29
|
+
previous pass changed only a line or two, a single combined-lens
|
|
30
|
+
confirmation agent may serve as the final pass.
|
|
31
|
+
|
|
32
|
+
### Phase B — loop code-review with fixes
|
|
33
|
+
|
|
34
|
+
1. Run the real code-review command through a headless subprocess in the
|
|
35
|
+
target worktree: `claude -p "/code-review low --fix" --max-turns 40` with a
|
|
36
|
+
10-minute timeout, reading its final text for findings and applied fixes.
|
|
37
|
+
(The skill's `disable-model-invocation` flag blocks only programmatic tool
|
|
38
|
+
starts; a `-p` prompt arrives as user input and loads normally.) Fallback
|
|
39
|
+
when the headless run fails: invoke the `e-code-review` skill with
|
|
40
|
+
`low --fix` — same review-and-fix contract, no invocation restriction.
|
|
41
|
+
2. After any pass that changed files: test, commit, push as in Phase A.
|
|
42
|
+
3. Repeat until a pass reports zero findings. Phase B usually converges in
|
|
43
|
+
one pass when Phase A ran first.
|
|
44
|
+
|
|
45
|
+
### Finish
|
|
46
|
+
|
|
47
|
+
Report: passes run per phase, commits pushed with hashes, fixes applied, and
|
|
48
|
+
the standing skip list with reasons.
|
|
49
|
+
|
|
50
|
+
### Constraints (observed under headless runs)
|
|
51
|
+
|
|
52
|
+
- Run this loop in the main conversation. A wrapper subagent cannot see the
|
|
53
|
+
review skills, and a nested agent's own subagent reports route to the main
|
|
54
|
+
conversation instead of back to it.
|
|
55
|
+
- Scope test runs to the touched files; a full-suite run can outlive one
|
|
56
|
+
foreground tool call.
|
|
57
|
+
- A hung or newly slow test suite is a finding to investigate, not an
|
|
58
|
+
inconvenience.
|
|
@@ -16,15 +16,15 @@ One warm advisor at the strongest tier this session can reach. This session is t
|
|
|
16
16
|
| Doc | Holds |
|
|
17
17
|
|---|---|
|
|
18
18
|
| [`docs/references/advisor-tool.md`](../../docs/references/advisor-tool.md) | **Consult cadence and weight** — when to call, hard rule before first write, how to treat advice. Read this for every consult. |
|
|
19
|
-
| [`~/.claude/_shared/advisor/advisor-protocol.md`](../../_shared/advisor/advisor-protocol.md) | **Bind and lifecycle** — host detect, model floor, warm-up, CLI fallback; its read map routes each moment to a `reference/` detail file. |
|
|
19
|
+
| [`~/.claude/_shared/advisor/advisor-protocol.md`](../../_shared/advisor/advisor-protocol.md) | **Bind and lifecycle** — session identity, host detect, model floor, warm-up, CLI fallback; its read map routes each moment to a `reference/` detail file. |
|
|
20
20
|
| [`agents/session-advisor.md`](../../agents/session-advisor.md) | **Reply contract** — ENDORSE / CORRECTION / PLAN / STOP; SendMessage only. |
|
|
21
21
|
| [`reference/advisor-docs-review.md`](reference/advisor-docs-review.md) | Anthropic advisor-tool source facts: measured effects, Sonnet steering, cost levers, failure modes. Background — read it when tuning the bind, not on every consult. |
|
|
22
22
|
|
|
23
23
|
## Bind
|
|
24
24
|
|
|
25
|
-
1.
|
|
26
|
-
2.
|
|
27
|
-
3. Name: `team-advisor-agent` on Claude (Agent spawn of `session-advisor`); one CLI `session_id` on a third-party host via the protocol Claude-chain.
|
|
25
|
+
1. Name the session identity first (protocol **Host profiles**), then walk the model floor.
|
|
26
|
+
2. Claude: Fable first in-session at `ADVISOR_EFFORT` (default low). When Fable is out of usage, bind Sol at the same effort. Codex: Sol in-session. Third-party: headless Fable then Sol. When the host's walk fails, fail closed.
|
|
27
|
+
3. Name: `team-advisor-agent` on Claude (Agent spawn of `session-advisor`); a native Sol subagent on Codex; one CLI `session_id` on a third-party host via the protocol Claude-chain.
|
|
28
28
|
4. A Fable-tier spawn or re-spawn carries the exact token `FABLE-SPAWN-AUTHORIZED` in its prompt (protocol warm-up; `fable_spawn_gate` requires it).
|
|
29
29
|
5. Skip the multi-consumer "who you are" opener — sole consumer.
|
|
30
30
|
6. When the bind or reply path fails, fail closed and report to the user. On a third-party host, only the bound Claude advisor issues ENDORSE / CORRECTION / PLAN / STOP.
|
|
@@ -41,6 +41,6 @@ Aim for two consults on a normal task: one after orientation and one after write
|
|
|
41
41
|
|
|
42
42
|
## Constraints
|
|
43
43
|
|
|
44
|
-
- One bind per session; this session owns spawn or CLI bind, drift re-bind, and shutdown.
|
|
44
|
+
- One bind per session; this session owns spawn, in-session Sol spawn, or CLI bind, drift re-bind, and shutdown.
|
|
45
45
|
- Bind at or above the protocol floor for this host.
|
|
46
46
|
- The advisor only answers (messaging); the session runs tools and posts.
|