@event4u/agent-config 1.15.0 → 1.17.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/.agent-src/commands/{agents-audit.md → agents/audit.md} +4 -3
- package/.agent-src/commands/{agents-cleanup.md → agents/cleanup.md} +12 -6
- package/.agent-src/commands/{agents-prepare.md → agents/prepare.md} +4 -3
- package/.agent-src/commands/agents.md +46 -0
- package/.agent-src/commands/bug-fix.md +1 -1
- package/.agent-src/commands/bug-investigate.md +2 -2
- package/.agent-src/commands/{chat-history-checkpoint.md → chat-history/checkpoint.md} +5 -5
- package/.agent-src/commands/{chat-history-clear.md → chat-history/clear.md} +5 -5
- package/.agent-src/commands/{chat-history-resume.md → chat-history/resume.md} +4 -4
- package/.agent-src/commands/chat-history/show.md +107 -0
- package/.agent-src/commands/chat-history.md +33 -89
- package/.agent-src/commands/check-current-md.md +1 -1
- package/.agent-src/commands/{commit-in-chunks.md → commit/in-chunks.md} +15 -13
- package/.agent-src/commands/commit.md +22 -2
- package/.agent-src/commands/{context-create.md → context/create.md} +4 -3
- package/.agent-src/commands/{context-refactor.md → context/refactor.md} +4 -3
- package/.agent-src/commands/context.md +44 -0
- package/.agent-src/commands/{copilot-agents-init.md → copilot-agents/init.md} +4 -3
- package/.agent-src/commands/{copilot-agents-optimize.md → copilot-agents/optimize.md} +4 -3
- package/.agent-src/commands/copilot-agents.md +44 -0
- package/.agent-src/commands/council/default.md +221 -0
- package/.agent-src/commands/council/design.md +97 -0
- package/.agent-src/commands/council/optimize.md +116 -0
- package/.agent-src/commands/council/pr.md +124 -0
- package/.agent-src/commands/council.md +54 -0
- package/.agent-src/commands/{create-pr-description.md → create-pr/description-only.md} +4 -2
- package/.agent-src/commands/create-pr.md +49 -5
- package/.agent-src/commands/e2e-heal.md +1 -1
- package/.agent-src/commands/e2e-plan.md +1 -1
- package/.agent-src/commands/{feature-dev.md → feature/dev.md} +6 -3
- package/.agent-src/commands/{feature-explore.md → feature/explore.md} +5 -4
- package/.agent-src/commands/{feature-plan.md → feature/plan.md} +32 -5
- package/.agent-src/commands/{feature-refactor.md → feature/refactor.md} +4 -3
- package/.agent-src/commands/{feature-roadmap.md → feature/roadmap.md} +7 -6
- package/.agent-src/commands/feature.md +52 -0
- package/.agent-src/commands/{fix-ci.md → fix/ci.md} +4 -3
- package/.agent-src/commands/{fix-portability.md → fix/portability.md} +4 -3
- package/.agent-src/commands/{fix-pr-bot-comments.md → fix/pr-bots.md} +4 -3
- package/.agent-src/commands/{fix-pr-developer-comments.md → fix/pr-developers.md} +4 -3
- package/.agent-src/commands/{fix-pr-comments.md → fix/pr.md} +7 -6
- package/.agent-src/commands/{fix-references.md → fix/refs.md} +4 -3
- package/.agent-src/commands/{fix-seeder.md → fix/seeder.md} +4 -3
- package/.agent-src/commands/fix.md +54 -0
- package/.agent-src/commands/jira-ticket.md +1 -1
- package/.agent-src/commands/{do-and-judge.md → judge/on-diff.md} +7 -6
- package/.agent-src/commands/judge/solo.md +90 -0
- package/.agent-src/commands/{do-in-steps.md → judge/steps.md} +8 -7
- package/.agent-src/commands/judge.md +35 -70
- package/.agent-src/commands/{memory-add.md → memory/add.md} +7 -6
- package/.agent-src/commands/{memory-full.md → memory/load.md} +6 -5
- package/.agent-src/commands/{memory-promote.md → memory/promote.md} +6 -5
- package/.agent-src/commands/{propose-memory.md → memory/propose.md} +6 -5
- package/.agent-src/commands/memory.md +48 -0
- package/.agent-src/commands/mode.md +5 -5
- package/.agent-src/commands/{module-create.md → module/create.md} +4 -3
- package/.agent-src/commands/{module-explore.md → module/explore.md} +4 -3
- package/.agent-src/commands/module.md +44 -0
- package/.agent-src/commands/onboard.md +3 -3
- package/.agent-src/commands/{optimize-agents.md → optimize/agents.md} +5 -4
- package/.agent-src/commands/{optimize-augmentignore.md → optimize/augmentignore.md} +4 -4
- package/.agent-src/commands/{optimize-rtk-filters.md → optimize/rtk.md} +4 -3
- package/.agent-src/commands/{optimize-skills.md → optimize/skills.md} +5 -4
- package/.agent-src/commands/optimize.md +48 -0
- package/.agent-src/commands/{override-create.md → override/create.md} +4 -3
- package/.agent-src/commands/{override-manage.md → override/manage.md} +4 -3
- package/.agent-src/commands/override.md +44 -0
- package/.agent-src/commands/review-changes.md +26 -1
- package/.agent-src/commands/review-routing.md +1 -1
- package/.agent-src/commands/{roadmap-create.md → roadmap/create.md} +33 -5
- package/.agent-src/commands/{roadmap-execute.md → roadmap/execute.md} +4 -3
- package/.agent-src/commands/roadmap.md +44 -0
- package/.agent-src/commands/set-cost-profile.md +3 -3
- package/.agent-src/commands/sync-agent-settings.md +2 -2
- package/.agent-src/commands/{tests-create.md → tests/create.md} +5 -4
- package/.agent-src/commands/{tests-execute.md → tests/execute.md} +4 -3
- package/.agent-src/commands/tests.md +44 -0
- package/.agent-src/commands/upstream-contribute.md +1 -1
- package/.agent-src/contexts/authority/commit-mechanics.md +57 -0
- package/.agent-src/contexts/authority/destructive-mechanics.md +66 -0
- package/.agent-src/contexts/authority/scope-mechanics.md +87 -0
- package/.agent-src/contexts/communication/rules-auto/artifact-engagement-recording-mechanics.md +72 -0
- package/.agent-src/contexts/communication/rules-auto/augment-portability-mechanics.md +79 -0
- package/.agent-src/contexts/communication/rules-auto/augment-source-of-truth-mechanics.md +98 -0
- package/.agent-src/contexts/communication/rules-auto/cli-output-handling-mechanics.md +87 -0
- package/.agent-src/contexts/communication/rules-auto/command-suggestion-policy-mechanics.md +62 -0
- package/.agent-src/contexts/communication/rules-auto/docs-sync-mechanics.md +78 -0
- package/.agent-src/contexts/communication/rules-auto/package-ci-checks-mechanics.md +85 -0
- package/.agent-src/contexts/communication/rules-auto/review-routing-awareness-mechanics.md +65 -0
- package/.agent-src/contexts/communication/rules-auto/roadmap-progress-sync-mechanics.md +78 -0
- package/.agent-src/contexts/communication/rules-auto/skill-quality-mechanics.md +62 -0
- package/.agent-src/contexts/communication/rules-auto/slash-command-routing-policy-mechanics.md +55 -0
- package/.agent-src/contexts/communication/rules-auto/ui-audit-gate-mechanics.md +53 -0
- package/.agent-src/contexts/communication/rules-auto/user-interaction-mechanics.md +77 -0
- package/.agent-src/contexts/execution/autonomy-detection.md +54 -0
- package/.agent-src/contexts/execution/autonomy-examples.md +90 -0
- package/.agent-src/contexts/execution/autonomy-mechanics.md +29 -0
- package/.agent-src/contexts/execution/verification-mechanics.md +80 -0
- package/.agent-src/contexts/judges/no-consolidate-rationale.md +102 -0
- package/.agent-src/contexts/judges/persona-voice-rubric.md +140 -0
- package/.agent-src/personas/README.md +1 -1
- package/.agent-src/rules/agent-authority.md +24 -0
- package/.agent-src/rules/architecture.md +1 -1
- package/.agent-src/rules/artifact-drafting-protocol.md +1 -1
- package/.agent-src/rules/artifact-engagement-recording.md +14 -70
- package/.agent-src/rules/ask-when-uncertain.md +28 -43
- package/.agent-src/rules/augment-portability.md +15 -61
- package/.agent-src/rules/augment-source-of-truth.md +27 -93
- package/.agent-src/rules/autonomous-execution.md +78 -114
- package/.agent-src/rules/capture-learnings.md +1 -1
- package/.agent-src/rules/chat-history-cadence.md +3 -3
- package/.agent-src/rules/chat-history-ownership.md +3 -3
- package/.agent-src/rules/chat-history-visibility.md +3 -3
- package/.agent-src/rules/cli-output-handling.md +10 -76
- package/.agent-src/rules/command-suggestion-policy.md +93 -0
- package/.agent-src/rules/commit-conventions.md +17 -14
- package/.agent-src/rules/commit-policy.md +14 -42
- package/.agent-src/rules/context-hygiene.md +3 -3
- package/.agent-src/rules/direct-answers.md +34 -49
- package/.agent-src/rules/docker-commands.md +5 -5
- package/.agent-src/rules/docs-sync.md +16 -70
- package/.agent-src/rules/e2e-testing.md +1 -1
- package/.agent-src/rules/guidelines.md +4 -4
- package/.agent-src/rules/improve-before-implement.md +2 -2
- package/.agent-src/rules/language-and-tone.md +50 -133
- package/.agent-src/rules/minimal-safe-diff.md +3 -3
- package/.agent-src/rules/missing-tool-handling.md +28 -22
- package/.agent-src/rules/model-recommendation.md +4 -4
- package/.agent-src/rules/no-cheap-questions.md +82 -0
- package/.agent-src/rules/no-roadmap-references.md +73 -0
- package/.agent-src/rules/non-destructive-by-default.md +15 -49
- package/.agent-src/rules/onboarding-gate.md +5 -5
- package/.agent-src/rules/package-ci-checks.md +21 -61
- package/.agent-src/rules/preservation-guard.md +64 -29
- package/.agent-src/rules/review-routing-awareness.md +26 -45
- package/.agent-src/rules/roadmap-progress-sync.md +28 -96
- package/.agent-src/rules/role-mode-adherence.md +2 -2
- package/.agent-src/rules/scope-control.md +65 -46
- package/.agent-src/rules/security-sensitive-stop.md +9 -9
- package/.agent-src/rules/size-enforcement.md +1 -1
- package/.agent-src/rules/skill-quality.md +16 -48
- package/.agent-src/rules/{slash-commands.md → slash-command-routing-policy.md} +7 -4
- package/.agent-src/rules/think-before-action.md +55 -45
- package/.agent-src/rules/token-efficiency.md +4 -4
- package/.agent-src/rules/tool-safety.md +19 -16
- package/.agent-src/rules/{ui-audit-before-build.md → ui-audit-gate.md} +27 -41
- package/.agent-src/rules/user-interaction.md +16 -71
- package/.agent-src/rules/verify-before-complete.md +12 -67
- package/.agent-src/scripts/update_roadmap_progress.py +9 -4
- package/.agent-src/skills/ai-council/SKILL.md +335 -0
- package/.agent-src/skills/api-endpoint/SKILL.md +2 -2
- package/.agent-src/skills/api-testing/SKILL.md +1 -1
- package/.agent-src/skills/blade-ui/SKILL.md +1 -1
- package/.agent-src/skills/blast-radius-analyzer/SKILL.md +1 -1
- package/.agent-src/skills/bug-analyzer/SKILL.md +1 -1
- package/.agent-src/skills/check-refs/SKILL.md +59 -40
- package/.agent-src/skills/command-routing/SKILL.md +1 -1
- package/.agent-src/skills/command-writing/SKILL.md +1 -1
- package/.agent-src/skills/conventional-commits-writing/SKILL.md +86 -28
- package/.agent-src/skills/copilot-agents-optimization/SKILL.md +7 -7
- package/.agent-src/skills/developer-like-execution/SKILL.md +6 -6
- package/.agent-src/skills/finishing-a-development-branch/SKILL.md +101 -65
- package/.agent-src/skills/flux/SKILL.md +31 -11
- package/.agent-src/skills/git-workflow/SKILL.md +1 -1
- package/.agent-src/skills/github-ci/SKILL.md +2 -2
- package/.agent-src/skills/guideline-writing/SKILL.md +11 -11
- package/.agent-src/skills/judge-code-quality/SKILL.md +7 -8
- package/.agent-src/skills/judge-security-auditor/SKILL.md +4 -5
- package/.agent-src/skills/judge-test-coverage/SKILL.md +3 -4
- package/.agent-src/skills/learning-to-rule-or-skill/SKILL.md +4 -4
- package/.agent-src/skills/lint-skills/SKILL.md +57 -39
- package/.agent-src/skills/livewire/SKILL.md +1 -1
- package/.agent-src/skills/md-language-check/SKILL.md +61 -39
- package/.agent-src/skills/override-management/SKILL.md +7 -7
- package/.agent-src/skills/php-coder/SKILL.md +1 -1
- package/.agent-src/skills/playwright-testing/SKILL.md +2 -2
- package/.agent-src/skills/quality-tools/SKILL.md +2 -2
- package/.agent-src/skills/react-shadcn-ui/SKILL.md +116 -43
- package/.agent-src/skills/readme-reviewer/SKILL.md +31 -30
- package/.agent-src/skills/readme-writing/SKILL.md +79 -54
- package/.agent-src/skills/readme-writing-package/SKILL.md +51 -48
- package/.agent-src/skills/receiving-code-review/SKILL.md +53 -48
- package/.agent-src/skills/refine-prompt/SKILL.md +0 -1
- package/.agent-src/skills/requesting-code-review/SKILL.md +35 -30
- package/.agent-src/skills/review-routing/SKILL.md +2 -2
- package/.agent-src/skills/rule-writing/SKILL.md +1 -1
- package/.agent-src/skills/security/SKILL.md +7 -2
- package/.agent-src/skills/security-audit/SKILL.md +7 -3
- package/.agent-src/skills/skill-reviewer/SKILL.md +1 -1
- package/.agent-src/skills/skill-writing/SKILL.md +3 -3
- package/.agent-src/skills/subagent-orchestration/SKILL.md +1 -0
- package/.agent-src/skills/systematic-debugging/SKILL.md +69 -61
- package/.agent-src/skills/test-driven-development/SKILL.md +59 -57
- package/.agent-src/skills/test-performance/SKILL.md +0 -1
- package/.agent-src/skills/traefik/SKILL.md +4 -4
- package/.agent-src/skills/upstream-contribute/SKILL.md +1 -1
- package/.agent-src/skills/validate-feature-fit/SKILL.md +2 -2
- package/.agent-src/skills/{verify-before-complete → verify-completion-evidence}/SKILL.md +30 -28
- package/.agent-src/templates/agent-settings.md +8 -8
- package/.agent-src/templates/contexts/auth-model.md +1 -1
- package/.agent-src/templates/scripts/README.md +2 -2
- package/.agent-src/templates/scripts/telemetry/aggregator.py +16 -1
- package/.agent-src/templates/scripts/telemetry/engagement.py +59 -0
- package/.agent-src/templates/scripts/telemetry/report_renderer.py +28 -1
- package/.agent-src/templates/scripts/telemetry_record.py +14 -1
- package/.claude-plugin/marketplace.json +31 -12
- package/AGENTS.md +11 -9
- package/CHANGELOG.md +213 -2
- package/README.md +43 -44
- package/config/agent-settings.template.yml +58 -1
- package/config/gitignore-block.txt +3 -0
- package/docs/architecture.md +5 -7
- package/docs/catalog.md +359 -0
- package/docs/contracts/STABILITY.md +46 -1
- package/docs/contracts/adr-chat-history-split.md +1 -3
- package/docs/contracts/adr-command-suggestion.md +3 -5
- package/docs/contracts/adr-implement-ticket-runtime.md +1 -2
- package/docs/contracts/adr-product-ui-track.md +5 -8
- package/docs/contracts/adr-prompt-driven-execution.md +3 -4
- package/docs/contracts/agent-memory-contract.md +8 -13
- package/docs/contracts/artifact-engagement-flow.md +7 -10
- package/docs/contracts/command-clusters.md +56 -46
- package/docs/contracts/command-suggestion-flow.md +4 -6
- package/docs/contracts/context-paths.md +99 -0
- package/docs/contracts/file-ownership-matrix.json +6722 -0
- package/docs/contracts/file-ownership-matrix.md +134 -0
- package/docs/contracts/implement-ticket-flow.md +8 -11
- package/docs/contracts/linear-ai-rules-inclusion.md +1 -2
- package/docs/contracts/linear-ai-three-layers.md +0 -2
- package/docs/contracts/load-context-budget-model.md +178 -0
- package/docs/contracts/load-context-schema.md +184 -0
- package/docs/contracts/rule-interactions.md +0 -1
- package/docs/contracts/rule-interactions.yml +96 -0
- package/docs/contracts/rule-priority-hierarchy.md +87 -0
- package/docs/contracts/ui-track-flow.md +8 -18
- package/docs/customization.md +16 -0
- package/docs/end-to-end-walkthroughs.md +165 -0
- package/docs/getting-started.md +29 -10
- package/docs/github-topics.md +12 -3
- package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +100 -0
- package/docs/guidelines/agent-infra/language-and-tone-examples.md +79 -0
- package/{.agent-src → docs}/guidelines/docs/readme-size-and-splitting.md +26 -25
- package/docs/guidelines/php/git.md +164 -0
- package/docs/migrations/commands-1.15.0.md +1 -1
- package/docs/showcase.md +9 -4
- package/docs/skills-catalog.md +14 -8
- package/docs/ui-track-mental-model.md +2 -2
- package/llms.txt +13 -7
- package/package.json +1 -1
- package/scripts/_one_off_phase4_dispatch_latency.py +108 -0
- package/scripts/_one_off_phase6_trigger_jaccard.py +92 -0
- package/scripts/_phase2_shim_helper.py +109 -0
- package/scripts/agent-config +33 -0
- package/scripts/ai_council/__init__.py +39 -0
- package/scripts/ai_council/_default_prices.py +41 -0
- package/scripts/ai_council/_one_off_2a4_acceptance.py +208 -0
- package/scripts/ai_council/_one_off_context_layer_v1_estimate.py +67 -0
- package/scripts/ai_council/_one_off_context_layer_v1_review.py +292 -0
- package/scripts/ai_council/_one_off_followups_review.py +259 -0
- package/scripts/ai_council/_one_off_nondestructive_inline_audit.py +209 -0
- package/scripts/ai_council/_one_off_phase_2a_budget_rebalance.py +257 -0
- package/scripts/ai_council/_one_off_phase_2a_post_revert.py +197 -0
- package/scripts/ai_council/_one_off_rebalancing_audit.py +149 -0
- package/scripts/ai_council/_one_off_roundtrip.py +106 -0
- package/scripts/ai_council/_one_off_rule_hardening_v1.py +251 -0
- package/scripts/ai_council/_one_off_structural_open_questions.py +232 -0
- package/scripts/ai_council/_one_off_structural_optimization.py +144 -0
- package/scripts/ai_council/_one_off_structural_v3_gaps.py +252 -0
- package/scripts/ai_council/_one_off_structural_v3_review.py +240 -0
- package/scripts/ai_council/budget_guard.py +172 -0
- package/scripts/ai_council/bundler.py +261 -0
- package/scripts/ai_council/clients.py +381 -0
- package/scripts/ai_council/modes.py +127 -0
- package/scripts/ai_council/orchestrator.py +350 -0
- package/scripts/ai_council/pricing.py +213 -0
- package/scripts/ai_council/project_context.py +159 -0
- package/scripts/ai_council/prompts.py +232 -0
- package/scripts/ai_council/session.py +144 -0
- package/scripts/check_always_budget.py +444 -0
- package/scripts/check_augmentignore.py +69 -0
- package/scripts/check_cluster_patterns.py +159 -0
- package/scripts/check_command_count_messaging.py +127 -0
- package/scripts/check_context_paths.py +201 -0
- package/scripts/check_no_roadmap_refs.py +155 -0
- package/scripts/check_phase_coupling.py +148 -0
- package/scripts/check_portability.py +57 -0
- package/scripts/check_public_catalog_links.py +122 -0
- package/scripts/check_references.py +33 -3
- package/scripts/check_roadmap_trackable.py +111 -0
- package/scripts/check_safety_floor_untouched.py +125 -0
- package/scripts/command_suggester/cooldown.py +1 -1
- package/scripts/command_suggester/loader.py +4 -1
- package/scripts/compress.py +59 -13
- package/scripts/generate_index.py +270 -0
- package/scripts/generate_ownership_matrix.py +323 -0
- package/scripts/hooks/augment-roadmap-progress.sh +57 -0
- package/scripts/install.py +49 -28
- package/scripts/install_anthropic_key.sh +5 -0
- package/scripts/install_openai_key.sh +106 -0
- package/scripts/lint_load_context.py +163 -0
- package/scripts/lint_no_new_atomic_commands.py +12 -11
- package/scripts/requirements-evals.txt +1 -0
- package/scripts/roadmap_progress_hook.py +159 -0
- package/scripts/schemas/command.schema.json +22 -1
- package/scripts/schemas/rule.schema.json +10 -0
- package/scripts/skill_linter.py +13 -4
- package/scripts/sync_agent_settings.py +26 -3
- package/scripts/update_counts.py +16 -4
- package/scripts/update_prices.py +124 -0
- package/.agent-src/guidelines/php/git.md +0 -96
- package/.agent-src/rules/command-suggestion.md +0 -134
- /package/{.agent-src → docs}/guidelines/agent-infra/agent-interaction-and-decision-quality.md +0 -0
- /package/{.agent-src → docs}/guidelines/agent-infra/break-glass-usage.md +0 -0
- /package/{.agent-src → docs}/guidelines/agent-infra/developer-judgment.md +0 -0
- /package/{.agent-src → docs}/guidelines/agent-infra/engineering-memory-data-format.md +0 -0
- /package/{.agent-src → docs}/guidelines/agent-infra/layered-settings.md +0 -0
- /package/{.agent-src → docs}/guidelines/agent-infra/memory-access.md +0 -0
- /package/{.agent-src → docs}/guidelines/agent-infra/naming.md +0 -0
- /package/{.agent-src → docs}/guidelines/agent-infra/output-patterns.md +0 -0
- /package/{.agent-src → docs}/guidelines/agent-infra/review-routing-data-format.md +0 -0
- /package/{.agent-src → docs}/guidelines/agent-infra/role-contracts.md +0 -0
- /package/{.agent-src → docs}/guidelines/agent-infra/role-mode-router.md +0 -0
- /package/{.agent-src → docs}/guidelines/agent-infra/runtime-layer.md +0 -0
- /package/{.agent-src → docs}/guidelines/agent-infra/self-improvement-pipeline.md +0 -0
- /package/{.agent-src → docs}/guidelines/agent-infra/size-and-scope.md +0 -0
- /package/{.agent-src → docs}/guidelines/agent-infra/tool-integration.md +0 -0
- /package/{.agent-src → docs}/guidelines/e2e/playwright.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/api-design.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/artisan-commands.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/blade-ui.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/controllers.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/database.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/eloquent.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/flux.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/general.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/jobs.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/livewire.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/logging.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/naming.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/patterns/dependency-injection.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/patterns/dtos.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/patterns/events.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/patterns/factory.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/patterns/pipelines.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/patterns/policies.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/patterns/repositories.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/patterns/service-layer.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/patterns/strategy.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/patterns.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/performance.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/resources.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/security.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/sql.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/validations.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/websocket.md +0 -0
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
"""Council acceptance review of Phase 0.4 2A.4 worked example.
|
|
2
|
+
|
|
3
|
+
Purpose: Phase 0.4.3 of road-to-structural-optimization.md requires a
|
|
4
|
+
council acceptance pass on the 2A.4 obligation-keyword-diff contract
|
|
5
|
+
before Phase 2A may begin. The artefact lives at
|
|
6
|
+
`agents/roadmaps/structural-optimization-2A4-example.md` plus two
|
|
7
|
+
sandbox files. Status will move from `draft` to `locked` only on
|
|
8
|
+
ACCEPT or ACCEPT_WITH_REVISIONS where revisions are minor.
|
|
9
|
+
|
|
10
|
+
Invocation:
|
|
11
|
+
.venv/bin/python -m scripts.ai_council._one_off_2a4_acceptance
|
|
12
|
+
"""
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import sys
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
|
|
18
|
+
from scripts.ai_council.bundler import bundle_files
|
|
19
|
+
from scripts.ai_council.clients import (
|
|
20
|
+
AnthropicClient,
|
|
21
|
+
OpenAIClient,
|
|
22
|
+
load_anthropic_key,
|
|
23
|
+
load_openai_key,
|
|
24
|
+
)
|
|
25
|
+
from scripts.ai_council.orchestrator import (
|
|
26
|
+
CostBudget,
|
|
27
|
+
CouncilQuestion,
|
|
28
|
+
consult,
|
|
29
|
+
estimate,
|
|
30
|
+
)
|
|
31
|
+
from scripts.ai_council.pricing import estimate_cost, load_prices
|
|
32
|
+
from scripts.ai_council.project_context import detect_project_context
|
|
33
|
+
from scripts.ai_council.session import SessionManifest, save as save_session
|
|
34
|
+
|
|
35
|
+
REPO_ROOT = Path(__file__).resolve().parents[2]
|
|
36
|
+
ARTEFACTS = [
|
|
37
|
+
REPO_ROOT / "agents/roadmaps/structural-optimization-2A4-example.md",
|
|
38
|
+
REPO_ROOT / "agents/roadmaps/examples/2A4-direct-answers/direct-answers.slim.md",
|
|
39
|
+
REPO_ROOT / "agents/roadmaps/examples/2A4-direct-answers/direct-answers-mechanics.md",
|
|
40
|
+
]
|
|
41
|
+
|
|
42
|
+
ORIGINAL_ASK = (
|
|
43
|
+
"Phase 0.4 of road-to-structural-optimization v3.1 dry-runs the "
|
|
44
|
+
"2A.4 obligation-keyword-diff contract on `direct-answers.md` to "
|
|
45
|
+
"lock the contract before Phase 2A begins. The artefact and two "
|
|
46
|
+
"sandbox files (slim rule + extracted mechanics) are presented. "
|
|
47
|
+
"Council task: ACCEPT / ACCEPT_WITH_REVISIONS / REJECT the "
|
|
48
|
+
"contract for use across the remaining 8 always-rules in Phase 2A."
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
REVIEW_PROMPT = """\
|
|
52
|
+
# Council Acceptance Review — 2A.4 Worked Example
|
|
53
|
+
|
|
54
|
+
## Context
|
|
55
|
+
|
|
56
|
+
The host agent ran Phase 0.4 of `road-to-structural-optimization` v3.1: \
|
|
57
|
+
took one always-rule (`direct-answers.md`, smallest of the top-3), split \
|
|
58
|
+
it into a slim RULE+LOGIC half and a MECHANICS context, then applied \
|
|
59
|
+
the 2A.4 obligation-keyword diff contract. The artefact is the report \
|
|
60
|
+
of that dry-run; the two sandbox files are the actual produced split.
|
|
61
|
+
|
|
62
|
+
You are not asked to re-litigate the v3.1 roadmap or the choice of \
|
|
63
|
+
`direct-answers.md` — both were settled in earlier rounds. Verdict \
|
|
64
|
+
solely concerns whether the **contract** (keyword × counts × \
|
|
65
|
+
accept-rationale table, plus its tie-break rules) is now ready to be \
|
|
66
|
+
applied to the remaining 8 always-rules in Phase 2A.
|
|
67
|
+
|
|
68
|
+
## Output Contract (STRICT)
|
|
69
|
+
|
|
70
|
+
Produce exactly these blocks in order. Be decisive — total response \
|
|
71
|
+
budget <= 1200 words.
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
### Contract correctness
|
|
75
|
+
|
|
76
|
+
**Verdict:** <ACCEPT | ACCEPT_WITH_REVISIONS | REJECT>
|
|
77
|
+
**Keyword extraction completeness:** <COMPLETE | PARTIAL — list missing>
|
|
78
|
+
**Tie-break rules sufficient:** <YES | NO — name the gap>
|
|
79
|
+
**Required revisions (numbered, 1-3 max, only on ACCEPT_WITH_REVISIONS):**
|
|
80
|
+
1. <one sentence — smallest change>
|
|
81
|
+
2. <...>
|
|
82
|
+
3. <...>
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
```
|
|
86
|
+
### Sandbox split quality
|
|
87
|
+
|
|
88
|
+
**Slim file preserves all RULE+LOGIC obligations:** <YES | NO — list lost>
|
|
89
|
+
**Mechanics file holds only mechanics+examples:** <YES | NO — list misplaced>
|
|
90
|
+
**Round-trip: rule_slim + load_context(mechanics) == original behaviour:**
|
|
91
|
+
<YES | NO — name the divergence>
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
### Generalisability to remaining 8 rules
|
|
96
|
+
|
|
97
|
+
**Contract scales without per-rule tuning:** <YES | NO — name failure mode>
|
|
98
|
+
**Single biggest risk on the next rule (likely `non-destructive-by-default`):**
|
|
99
|
+
<one sentence>
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
### Final verdict
|
|
104
|
+
|
|
105
|
+
**Lockable as-is for Phase 2A?** <YES | NO>
|
|
106
|
+
**If NO, single blocking change required:** <one sentence>
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Verdict definitions:
|
|
110
|
+
- **ACCEPT** — contract ships unchanged; status moves to locked.
|
|
111
|
+
- **ACCEPT_WITH_REVISIONS** — locks after the 1-3 listed revisions land.
|
|
112
|
+
- **REJECT** — contract is structurally wrong; describe the fault.
|
|
113
|
+
|
|
114
|
+
The three artefacts follow this prompt verbatim.
|
|
115
|
+
"""
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def main() -> int:
|
|
119
|
+
anthropic = AnthropicClient(api_key=load_anthropic_key(), model="claude-sonnet-4-5")
|
|
120
|
+
openai = OpenAIClient(api_key=load_openai_key(), model="gpt-4o")
|
|
121
|
+
members = [anthropic, openai]
|
|
122
|
+
|
|
123
|
+
context = bundle_files(ARTEFACTS)
|
|
124
|
+
project = detect_project_context(REPO_ROOT)
|
|
125
|
+
table = load_prices()
|
|
126
|
+
|
|
127
|
+
user_prompt = REVIEW_PROMPT + "\n\n---\n\n" + context.text
|
|
128
|
+
|
|
129
|
+
question = CouncilQuestion(
|
|
130
|
+
mode="files",
|
|
131
|
+
user_prompt=user_prompt,
|
|
132
|
+
max_tokens=3072,
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
estimates = estimate(
|
|
136
|
+
question, members, table, project=project, original_ask=ORIGINAL_ASK,
|
|
137
|
+
)
|
|
138
|
+
print("=== ESTIMATE (single round, max tokens) ===")
|
|
139
|
+
total_est = 0.0
|
|
140
|
+
for c, e in zip(members, estimates):
|
|
141
|
+
print(f" {c.name}/{c.model}: ~{e.input_tokens} in + {e.output_tokens} out = ${e.total_usd:.4f}")
|
|
142
|
+
total_est += e.total_usd
|
|
143
|
+
print(f" TOTAL per round (max): ${total_est:.4f}")
|
|
144
|
+
print()
|
|
145
|
+
|
|
146
|
+
budget = CostBudget(
|
|
147
|
+
max_input_tokens=200_000,
|
|
148
|
+
max_output_tokens=80_000,
|
|
149
|
+
max_calls=20,
|
|
150
|
+
max_total_usd=2.50,
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
rounds_collected: list[list] = []
|
|
154
|
+
|
|
155
|
+
def _on_round_complete(round_idx: int, round_responses) -> None:
|
|
156
|
+
rounds_collected.append(list(round_responses))
|
|
157
|
+
print(f"=== ROUND {round_idx + 1} COMPLETE ===")
|
|
158
|
+
for r in round_responses:
|
|
159
|
+
if r.error:
|
|
160
|
+
print(f" [error] {r.provider}/{r.model}: {r.error}")
|
|
161
|
+
continue
|
|
162
|
+
actual = estimate_cost(r.provider, r.model, r.input_tokens, r.output_tokens, table)
|
|
163
|
+
print(f" [done] {r.provider}/{r.model}: {r.input_tokens} in / "
|
|
164
|
+
f"{r.output_tokens} out · {r.latency_ms} ms · ${actual.total_usd:.4f}")
|
|
165
|
+
print()
|
|
166
|
+
|
|
167
|
+
print("=== CONSULT (1 round, 2A.4 acceptance review) ===")
|
|
168
|
+
consult(
|
|
169
|
+
members, question, budget,
|
|
170
|
+
rounds=1,
|
|
171
|
+
on_round_complete=_on_round_complete,
|
|
172
|
+
table=table, project=project, original_ask=ORIGINAL_ASK,
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
if not rounds_collected:
|
|
176
|
+
print("[error] no rounds completed", file=sys.stderr)
|
|
177
|
+
return 1
|
|
178
|
+
|
|
179
|
+
actual_total = 0.0
|
|
180
|
+
for round_responses in rounds_collected:
|
|
181
|
+
for r in round_responses:
|
|
182
|
+
if r.error:
|
|
183
|
+
continue
|
|
184
|
+
actual = estimate_cost(r.provider, r.model, r.input_tokens, r.output_tokens, table)
|
|
185
|
+
actual_total += actual.total_usd
|
|
186
|
+
print(f"=== TOTAL ACTUAL: ${actual_total:.4f} ===")
|
|
187
|
+
|
|
188
|
+
final_round = rounds_collected[-1]
|
|
189
|
+
if not [r for r in final_round if not r.error]:
|
|
190
|
+
return 1
|
|
191
|
+
|
|
192
|
+
manifest = SessionManifest(
|
|
193
|
+
mode="files",
|
|
194
|
+
artefact="agents/roadmaps/structural-optimization-2A4-example.md",
|
|
195
|
+
original_ask=ORIGINAL_ASK,
|
|
196
|
+
members=[f"{r.provider}/{r.model}" for r in final_round],
|
|
197
|
+
rounds=len(rounds_collected),
|
|
198
|
+
cost_usd_estimated=total_est,
|
|
199
|
+
cost_usd_actual=actual_total,
|
|
200
|
+
extra={"purpose": "Council acceptance review of Phase 0.4 2A.4 worked example"},
|
|
201
|
+
)
|
|
202
|
+
session_dir = save_session(manifest=manifest, responses=rounds_collected)
|
|
203
|
+
print(f"[saved] {session_dir.relative_to(REPO_ROOT)}/")
|
|
204
|
+
return 1 if any(r.error for round_r in rounds_collected for r in round_r) else 0
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
if __name__ == "__main__":
|
|
208
|
+
raise SystemExit(main())
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"""One-shot estimator for the v1 council review (no consult call).
|
|
2
|
+
|
|
3
|
+
Sibling of `_one_off_context_layer_v1_review.py`. Prints bundle size and
|
|
4
|
+
per-model token / cost projection so the user can confirm spend before
|
|
5
|
+
the actual consult fires.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
from scripts.ai_council._one_off_context_layer_v1_review import (
|
|
12
|
+
ORIGINAL_ASK,
|
|
13
|
+
REVIEW_PROMPT_HEADER,
|
|
14
|
+
ROADMAP_PATH,
|
|
15
|
+
_diff_stat,
|
|
16
|
+
_pr_body,
|
|
17
|
+
)
|
|
18
|
+
from scripts.ai_council.bundler import bundle_prompt
|
|
19
|
+
from scripts.ai_council.clients import (
|
|
20
|
+
AnthropicClient,
|
|
21
|
+
OpenAIClient,
|
|
22
|
+
load_anthropic_key,
|
|
23
|
+
load_openai_key,
|
|
24
|
+
)
|
|
25
|
+
from scripts.ai_council.orchestrator import CouncilQuestion, estimate
|
|
26
|
+
from scripts.ai_council.pricing import load_prices
|
|
27
|
+
from scripts.ai_council.project_context import detect_project_context
|
|
28
|
+
|
|
29
|
+
REPO_ROOT = Path(__file__).resolve().parents[2]
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def main() -> int:
|
|
33
|
+
roadmap_text = ROADMAP_PATH.read_text(encoding="utf-8")
|
|
34
|
+
parts = [
|
|
35
|
+
REVIEW_PROMPT_HEADER,
|
|
36
|
+
"## PR #36 — diff --stat\n\n```\n" + _diff_stat() + "\n```",
|
|
37
|
+
"## PR #36 — body\n\n" + _pr_body(),
|
|
38
|
+
"## Roadmap v1\n\n" + roadmap_text,
|
|
39
|
+
]
|
|
40
|
+
bundle_text = "\n\n---\n\n".join(parts)
|
|
41
|
+
print(f"Bundle bytes: {len(bundle_text.encode('utf-8'))}")
|
|
42
|
+
|
|
43
|
+
ctx = bundle_prompt(bundle_text)
|
|
44
|
+
project = detect_project_context(REPO_ROOT)
|
|
45
|
+
table = load_prices()
|
|
46
|
+
|
|
47
|
+
anthropic = AnthropicClient(api_key=load_anthropic_key(), model="claude-sonnet-4-5")
|
|
48
|
+
openai = OpenAIClient(api_key=load_openai_key(), model="gpt-4o")
|
|
49
|
+
members = [anthropic, openai]
|
|
50
|
+
|
|
51
|
+
question = CouncilQuestion(mode="prompt", user_prompt=ctx.text, max_tokens=4096)
|
|
52
|
+
estimates = estimate(
|
|
53
|
+
question, members, table, project=project, original_ask=ORIGINAL_ASK,
|
|
54
|
+
)
|
|
55
|
+
total = 0.0
|
|
56
|
+
for c, e in zip(members, estimates):
|
|
57
|
+
print(
|
|
58
|
+
f" {c.name}/{c.model}: ~{e.input_tokens} in + "
|
|
59
|
+
f"{e.output_tokens} out = ${e.total_usd:.4f}"
|
|
60
|
+
)
|
|
61
|
+
total += e.total_usd
|
|
62
|
+
print(f" TOTAL (max, single round): ${total:.4f}")
|
|
63
|
+
return 0
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
if __name__ == "__main__":
|
|
67
|
+
raise SystemExit(main())
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
"""Council review of road-to-context-layer-maturity.md draft v1 + PR #36.
|
|
2
|
+
|
|
3
|
+
Both reviewers ran independent preview-reviews on PR #36 and converged on
|
|
4
|
+
the same gap: rule layer is mature, context layer is unproven. The host
|
|
5
|
+
agent distilled the convergence into road-to-context-layer-maturity.md
|
|
6
|
+
(draft v1, 6 phases, lightweight tier).
|
|
7
|
+
|
|
8
|
+
Council task: validate v1 against (a) the two preview-reviews summarised
|
|
9
|
+
inline, (b) the actual PR #36 shape (description + diff stat), and (c)
|
|
10
|
+
the existing always-budget contract. Together with the host agent,
|
|
11
|
+
define the binding step list before lock.
|
|
12
|
+
|
|
13
|
+
Single round, structured per-phase verdict. Saves the session under
|
|
14
|
+
agents/council-sessions/.
|
|
15
|
+
|
|
16
|
+
Invocation:
|
|
17
|
+
.venv/bin/python -m scripts.ai_council._one_off_context_layer_v1_review
|
|
18
|
+
"""
|
|
19
|
+
from __future__ import annotations
|
|
20
|
+
|
|
21
|
+
import subprocess
|
|
22
|
+
import sys
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
|
|
25
|
+
from scripts.ai_council.bundler import bundle_prompt
|
|
26
|
+
from scripts.ai_council.clients import (
|
|
27
|
+
AnthropicClient,
|
|
28
|
+
OpenAIClient,
|
|
29
|
+
load_anthropic_key,
|
|
30
|
+
load_openai_key,
|
|
31
|
+
)
|
|
32
|
+
from scripts.ai_council.orchestrator import (
|
|
33
|
+
CostBudget,
|
|
34
|
+
CouncilQuestion,
|
|
35
|
+
consult,
|
|
36
|
+
estimate,
|
|
37
|
+
)
|
|
38
|
+
from scripts.ai_council.pricing import estimate_cost, load_prices
|
|
39
|
+
from scripts.ai_council.project_context import detect_project_context
|
|
40
|
+
from scripts.ai_council.session import SessionManifest, save as save_session
|
|
41
|
+
|
|
42
|
+
REPO_ROOT = Path(__file__).resolve().parents[2]
|
|
43
|
+
ROADMAP_PATH = REPO_ROOT / "agents/roadmaps/road-to-context-layer-maturity.md"
|
|
44
|
+
|
|
45
|
+
ORIGINAL_ASK = (
|
|
46
|
+
"Two independent preview-reviews on PR #36 converged on the same "
|
|
47
|
+
"finding: rule layer is now mature; context layer is unproven. The "
|
|
48
|
+
"host agent distilled the convergence into a 6-phase lightweight "
|
|
49
|
+
"roadmap (road-to-context-layer-maturity.md draft v1). Council task: "
|
|
50
|
+
"validate v1 against the reviewers' findings, the PR's actual shape, "
|
|
51
|
+
"and the always-budget contract; together with the host agent, "
|
|
52
|
+
"define the binding step list."
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
REVIEW_PROMPT_HEADER = """\
|
|
56
|
+
# Council Review — road-to-context-layer-maturity.md draft v1 + PR #36
|
|
57
|
+
|
|
58
|
+
## Background (verbatim, do not re-frame)
|
|
59
|
+
|
|
60
|
+
Two preview-reviews of PR #36 (`feat/better-basement` branch, 174 files,
|
|
61
|
+
+20k/-3.6k diff, structural-optimization roadmap closed + 1.16.0
|
|
62
|
+
follow-ups Phase 1+2 closed) produced converging findings.
|
|
63
|
+
|
|
64
|
+
### Reviewer #1 — 3-Layer Architecture lens
|
|
65
|
+
|
|
66
|
+
- PR #36 is not a feature PR; it is the first **post-maturity
|
|
67
|
+
architecture move**.
|
|
68
|
+
- Names a 3-Layer Architecture: **Rule** (Obligation / MUST), **Context**
|
|
69
|
+
(Decision Logic / HOW to think), **Examples** (Pattern Memory / HOW it
|
|
70
|
+
looks). Phase 2A revert proved the boundary matters — moving Iron-Law
|
|
71
|
+
prose into context made the rule unsafe.
|
|
72
|
+
- Lauds: contexts/communication/ as a previously-unsolved area;
|
|
73
|
+
always-budget guard + golden tests as a maturity signal.
|
|
74
|
+
- Gaps: (a) no Level-2 context-loading design (chain, priority,
|
|
75
|
+
budget, activation order); (b) no outcome measurement — golden tests
|
|
76
|
+
measure structure, not whether the agent decides better; (c)
|
|
77
|
+
context-activation clarity unclear (when, how many concurrently);
|
|
78
|
+
(d) Iron Laws must stay in Rule, never migrate to Context; (e)
|
|
79
|
+
Examples-as-demos under-leveraged.
|
|
80
|
+
- Verdict: 9.6/10. Recommendation: do NOT add features/skills/rules;
|
|
81
|
+
perfect Context, make Examples real demos, make Decision-System
|
|
82
|
+
visible.
|
|
83
|
+
|
|
84
|
+
### Reviewer #2 — Consolidation / scope-discipline lens
|
|
85
|
+
|
|
86
|
+
- PR #36 is correctly framed as "Structural optimization foundation +
|
|
87
|
+
regression gates + command surface reduction", not a feature PR.
|
|
88
|
+
- Lauds: Phase 2A abort + honest Model-(b) finding (Context Tax >
|
|
89
|
+
rule-slim gain); roadmap reflexion depth (council rounds, locked
|
|
90
|
+
decisions, file-ownership matrix); test gates; 1.16-followup clean
|
|
91
|
+
closure.
|
|
92
|
+
- Gaps: (1) PR size 174 files reduces reviewability; (2) roadmaps
|
|
93
|
+
too heavy — auditable but not consumable for normal feature work,
|
|
94
|
+
needs complexity standard; (3) always-budget headroom 1,552 chars
|
|
95
|
+
(96.8% utilization) — slimming hebel exhausted, new strategy needed
|
|
96
|
+
(demote / merge / hard-compress / shared-context amortization);
|
|
97
|
+
(4) slow-rollout protocol compressed under autonomy mandate;
|
|
98
|
+
(5) one-off scripts accumulating in scripts/ai_council/.
|
|
99
|
+
- P0 before merge: PR description rewrite, one-off-script decision,
|
|
100
|
+
honest budget block, Phase 2A as finding.
|
|
101
|
+
- Verdict: 8.8/10 current, 9.1/10 with cleanup. "Inhaltlich stark.
|
|
102
|
+
Strategisch richtig. Aber zu groß und zu meta-lastig."
|
|
103
|
+
|
|
104
|
+
### Convergence
|
|
105
|
+
|
|
106
|
+
- Both: don't add more rules / skills / commands.
|
|
107
|
+
- Both: context activation / loading / budget = the unsolved next
|
|
108
|
+
question.
|
|
109
|
+
- Both: praise audit honesty, criticise size/concentration.
|
|
110
|
+
- Both: PR #36 should ship after cleanup, not be expanded.
|
|
111
|
+
|
|
112
|
+
## PR #36 shape
|
|
113
|
+
|
|
114
|
+
- 174 files changed · +20,120 / −3,629
|
|
115
|
+
- Branch: feat/better-basement → main (open)
|
|
116
|
+
- Title: docs(roadmap): add structural-optimization v3.1 + 1.16.0 follow-ups v1.1
|
|
117
|
+
|
|
118
|
+
(Full diff stat appended below; PR body appended below.)
|
|
119
|
+
|
|
120
|
+
## Your task
|
|
121
|
+
|
|
122
|
+
Review **road-to-context-layer-maturity.md draft v1** (full text appended
|
|
123
|
+
below) against:
|
|
124
|
+
|
|
125
|
+
1. **Reviewer convergence:** does v1 close every gap both reviewers
|
|
126
|
+
named, or does it merely paraphrase them?
|
|
127
|
+
2. **PR #36 fit:** is Phase 0 (PR closeout) sufficient to ship #36
|
|
128
|
+
honestly, or are items missing that the diff exposes?
|
|
129
|
+
3. **Always-budget contract:** is Phase 4 (Always-Budget v2)
|
|
130
|
+
structurally sound, or does it re-walk Phase 2A's path?
|
|
131
|
+
4. **Lightweight-tier discipline:** does the roadmap itself follow
|
|
132
|
+
the standard it locks in Phase 5, or does it cheat its own gate?
|
|
133
|
+
5. **Sequencing:** is `0 → 1 → 2 → 3 → 4 → 5` the right order, or
|
|
134
|
+
should something move?
|
|
135
|
+
|
|
136
|
+
## Output contract (STRICT)
|
|
137
|
+
|
|
138
|
+
For EACH of the six phases, produce:
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
### Phase N — <title>
|
|
142
|
+
|
|
143
|
+
**Verdict:** <ACCEPT | PARTIAL | REJECT>
|
|
144
|
+
**What v1 gets right (1 sentence):** ...
|
|
145
|
+
**What v1 misses or over-reaches (1-2 sentences):** ...
|
|
146
|
+
**Concrete change to v2 (binding):** ...
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Then a final block:
|
|
150
|
+
|
|
151
|
+
```
|
|
152
|
+
### Greenlight verdict
|
|
153
|
+
|
|
154
|
+
<one of: FULL GREENLIGHT — lock v1 / CONDITIONAL GREENLIGHT — apply N
|
|
155
|
+
revisions then lock / BLOCKED — major rework needed>
|
|
156
|
+
|
|
157
|
+
**Binding revisions for v2 (numbered, ≤ 8):** ...
|
|
158
|
+
**Estimated total effort:** <engineer-days>
|
|
159
|
+
**One-line strategic risk you would still fly with:** ...
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
Total response budget: ≤ 1800 words. Do not re-write the roadmap. Do
|
|
163
|
+
not propose a separate roadmap unless you mark BLOCKED.
|
|
164
|
+
"""
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def _read(path: Path) -> str:
|
|
168
|
+
return path.read_text(encoding="utf-8") if path.exists() else ""
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def _diff_stat() -> str:
|
|
172
|
+
proc = subprocess.run(
|
|
173
|
+
["git", "diff", "--stat", "origin/main..HEAD"],
|
|
174
|
+
cwd=REPO_ROOT, check=True, capture_output=True, text=True,
|
|
175
|
+
)
|
|
176
|
+
lines = proc.stdout.splitlines()
|
|
177
|
+
if len(lines) > 60:
|
|
178
|
+
return "\n".join(lines[:30] + ["... [middle truncated] ..."] + lines[-15:])
|
|
179
|
+
return proc.stdout
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
def _pr_body() -> str:
|
|
183
|
+
try:
|
|
184
|
+
proc = subprocess.run(
|
|
185
|
+
["gh", "pr", "view", "36", "--json", "body", "--jq", ".body"],
|
|
186
|
+
cwd=REPO_ROOT, check=True, capture_output=True, text=True,
|
|
187
|
+
)
|
|
188
|
+
return proc.stdout
|
|
189
|
+
except subprocess.CalledProcessError:
|
|
190
|
+
return "[gh pr view 36 unavailable]"
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
def main() -> int:
|
|
194
|
+
anthropic = AnthropicClient(api_key=load_anthropic_key(), model="claude-sonnet-4-5")
|
|
195
|
+
openai = OpenAIClient(api_key=load_openai_key(), model="gpt-4o")
|
|
196
|
+
members = [anthropic, openai]
|
|
197
|
+
|
|
198
|
+
roadmap_text = _read(ROADMAP_PATH)
|
|
199
|
+
if not roadmap_text:
|
|
200
|
+
print(f"[error] roadmap not found: {ROADMAP_PATH}", file=sys.stderr)
|
|
201
|
+
return 1
|
|
202
|
+
|
|
203
|
+
bundle_text = "\n\n---\n\n".join([
|
|
204
|
+
REVIEW_PROMPT_HEADER,
|
|
205
|
+
"## PR #36 — diff --stat (origin/main..HEAD)\n\n```\n" + _diff_stat() + "\n```",
|
|
206
|
+
"## PR #36 — body (verbatim)\n\n" + _pr_body(),
|
|
207
|
+
"## Roadmap v1 (verbatim, the artefact to validate)\n\n" + roadmap_text,
|
|
208
|
+
])
|
|
209
|
+
context = bundle_prompt(bundle_text)
|
|
210
|
+
project = detect_project_context(REPO_ROOT)
|
|
211
|
+
table = load_prices()
|
|
212
|
+
|
|
213
|
+
question = CouncilQuestion(
|
|
214
|
+
mode="prompt",
|
|
215
|
+
user_prompt=context.text,
|
|
216
|
+
max_tokens=4096,
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
estimates = estimate(
|
|
220
|
+
question, members, table, project=project, original_ask=ORIGINAL_ASK,
|
|
221
|
+
)
|
|
222
|
+
print("=== ESTIMATE (single round, max tokens) ===")
|
|
223
|
+
total_est = 0.0
|
|
224
|
+
for c, e in zip(members, estimates):
|
|
225
|
+
print(f" {c.name}/{c.model}: ~{e.input_tokens} in + {e.output_tokens} out = ${e.total_usd:.4f}")
|
|
226
|
+
total_est += e.total_usd
|
|
227
|
+
print(f" TOTAL per round (max): ${total_est:.4f}")
|
|
228
|
+
print()
|
|
229
|
+
|
|
230
|
+
budget = CostBudget(
|
|
231
|
+
max_input_tokens=200_000,
|
|
232
|
+
max_output_tokens=80_000,
|
|
233
|
+
max_calls=20,
|
|
234
|
+
max_total_usd=2.50,
|
|
235
|
+
)
|
|
236
|
+
|
|
237
|
+
rounds_collected: list[list] = []
|
|
238
|
+
|
|
239
|
+
def _on_round_complete(round_idx: int, round_responses) -> None:
|
|
240
|
+
rounds_collected.append(list(round_responses))
|
|
241
|
+
print(f"=== ROUND {round_idx + 1} COMPLETE ===")
|
|
242
|
+
for r in round_responses:
|
|
243
|
+
if r.error:
|
|
244
|
+
print(f" [error] {r.provider}/{r.model}: {r.error}")
|
|
245
|
+
continue
|
|
246
|
+
actual = estimate_cost(r.provider, r.model, r.input_tokens, r.output_tokens, table)
|
|
247
|
+
print(f" [done] {r.provider}/{r.model}: {r.input_tokens} in / "
|
|
248
|
+
f"{r.output_tokens} out · {r.latency_ms} ms · ${actual.total_usd:.4f}")
|
|
249
|
+
print()
|
|
250
|
+
|
|
251
|
+
print("=== CONSULT (1 round) ===")
|
|
252
|
+
consult(
|
|
253
|
+
members, question, budget,
|
|
254
|
+
rounds=1,
|
|
255
|
+
on_round_complete=_on_round_complete,
|
|
256
|
+
table=table, project=project, original_ask=ORIGINAL_ASK,
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
if not rounds_collected:
|
|
260
|
+
print("[error] no rounds completed", file=sys.stderr)
|
|
261
|
+
return 1
|
|
262
|
+
|
|
263
|
+
actual_total = 0.0
|
|
264
|
+
for round_responses in rounds_collected:
|
|
265
|
+
for r in round_responses:
|
|
266
|
+
if r.error:
|
|
267
|
+
continue
|
|
268
|
+
actual = estimate_cost(r.provider, r.model, r.input_tokens, r.output_tokens, table)
|
|
269
|
+
actual_total += actual.total_usd
|
|
270
|
+
print(f"=== TOTAL ACTUAL: ${actual_total:.4f} ===")
|
|
271
|
+
|
|
272
|
+
final_round = rounds_collected[-1]
|
|
273
|
+
if not [r for r in final_round if not r.error]:
|
|
274
|
+
return 1
|
|
275
|
+
|
|
276
|
+
manifest = SessionManifest(
|
|
277
|
+
mode="prompt",
|
|
278
|
+
artefact=str(ROADMAP_PATH.relative_to(REPO_ROOT)),
|
|
279
|
+
original_ask=ORIGINAL_ASK,
|
|
280
|
+
members=[f"{r.provider}/{r.model}" for r in final_round],
|
|
281
|
+
rounds=len(rounds_collected),
|
|
282
|
+
cost_usd_estimated=total_est,
|
|
283
|
+
cost_usd_actual=actual_total,
|
|
284
|
+
extra={"purpose": "Council review of road-to-context-layer-maturity v1 + PR #36"},
|
|
285
|
+
)
|
|
286
|
+
session_dir = save_session(manifest=manifest, responses=rounds_collected)
|
|
287
|
+
print(f"[saved] {session_dir.relative_to(REPO_ROOT)}/")
|
|
288
|
+
return 1 if any(r.error for round_r in rounds_collected for r in round_r) else 0
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
if __name__ == "__main__":
|
|
292
|
+
raise SystemExit(main())
|