@event4u/agent-config 16.3.0 → 16.5.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/.augment-plugin/marketplace.json +3 -3
- package/.augment-plugin/plugin.json +1 -1
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +178 -78
- package/README.md +2 -2
- package/agents/templates/.ai-council.yml.example +26 -8
- package/dist/agent-src/commands/analyze/inbox.md +10 -7
- package/dist/agent-src/commands/bug/investigate.md +1 -1
- package/dist/agent-src/commands/commit/in-chunks.md +40 -31
- package/dist/agent-src/commands/commit.md +72 -33
- package/dist/agent-src/commands/condense.md +2 -8
- package/dist/agent-src/commands/council/debate.md +11 -7
- package/dist/agent-src/commands/council/default.md +10 -9
- package/dist/agent-src/commands/council.md +1 -1
- package/dist/agent-src/commands/design.md +1 -1
- package/dist/agent-src/commands/estimate-ticket.md +1 -1
- package/dist/agent-src/commands/feature/explore.md +3 -3
- package/dist/agent-src/commands/feature/plan.md +1 -1
- package/dist/agent-src/commands/fix/ci.md +17 -3
- package/dist/agent-src/commands/fix/commit-messages.md +48 -23
- package/dist/agent-src/commands/fix/pr-comments.md +3 -6
- package/dist/agent-src/commands/implement-ticket.md +3 -3
- package/dist/agent-src/commands/memory/add.md +4 -16
- package/dist/agent-src/commands/memory/load.md +5 -6
- package/dist/agent-src/commands/memory/promote.md +3 -16
- package/dist/agent-src/commands/mission/upgrade.md +3 -2
- package/dist/agent-src/commands/optimize/agents-dir.md +2 -2
- package/dist/agent-src/commands/optimize/deep.md +4 -2
- package/dist/agent-src/commands/optimize/rtk.md +4 -26
- package/dist/agent-src/commands/pr/create/description-only.md +18 -15
- package/dist/agent-src/commands/pr/create.md +42 -34
- package/dist/agent-src/commands/pr/merge.md +136 -9
- package/dist/agent-src/commands/prepare-for-review.md +13 -11
- package/dist/agent-src/commands/project/analyze.md +7 -35
- package/dist/agent-src/commands/refine-ticket.md +1 -1
- package/dist/agent-src/commands/review/changes.md +14 -19
- package/dist/agent-src/commands/roadmap/next.md +10 -1
- package/dist/agent-src/commands/roadmap/process-full.md +52 -38
- package/dist/agent-src/commands/roadmap/resolve-blockers.md +64 -14
- package/dist/agent-src/commands/worktree/create.md +7 -3
- package/dist/agent-src/commands/worktree/verify.md +2 -1
- package/dist/agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +5 -3
- package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +7 -9
- package/dist/agent-src/contexts/contracts/command-suggestion-flow.md +8 -6
- package/dist/agent-src/contexts/contracts/frugality-charter.md +8 -5
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +1 -1
- package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +0 -1
- package/dist/agent-src/contexts/execution/evidence-discipline.md +2 -2
- package/dist/agent-src/contexts/execution/non-interactive-contract.md +5 -8
- package/dist/agent-src/contexts/execution/rdp-gate.md +4 -4
- package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +9 -8
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +67 -52
- package/dist/agent-src/contexts/execution/subagent-routing.md +8 -8
- package/dist/agent-src/contexts/execution/subagent-steering.md +6 -4
- package/dist/agent-src/contexts/execution/terminal-states.md +2 -2
- package/dist/agent-src/contexts/execution/toolchain-resolver.md +4 -10
- package/dist/agent-src/contexts/subagent-configuration.md +1 -1
- package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +39 -0
- package/dist/agent-src/guidelines/agent-infra/context-hygiene-mechanics.md +1 -1
- package/dist/agent-src/guidelines/agent-infra/cross-source-consistency-mechanics.md +8 -10
- package/dist/agent-src/guidelines/agent-infra/frontier-reasoning-operating-profile.md +3 -2
- package/dist/agent-src/guidelines/agent-infra/layered-settings.md +13 -1
- package/dist/agent-src/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
- package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +10 -3
- package/dist/agent-src/guidelines/agent-infra/size-and-scope.md +36 -0
- package/dist/agent-src/guidelines/design-antipatterns.md +1 -1
- package/dist/agent-src/guidelines/php/git.md +15 -2
- package/dist/agent-src/rules/active-remediation.md +0 -1
- package/dist/agent-src/rules/analysis-skill-routing.md +0 -1
- package/dist/agent-src/rules/architecture.md +0 -1
- package/dist/agent-src/rules/artifact-drafting-protocol.md +0 -1
- package/dist/agent-src/rules/artifact-engagement-recording.md +0 -1
- package/dist/agent-src/rules/augment-edit-discipline.md +0 -1
- package/dist/agent-src/rules/autonomous-execution.md +0 -1
- package/dist/agent-src/rules/brand-consistency.md +0 -1
- package/dist/agent-src/rules/brand-source-of-truth.md +0 -1
- package/dist/agent-src/rules/broken-access-control.md +0 -1
- package/dist/agent-src/rules/cli-output-handling.md +0 -1
- package/dist/agent-src/rules/code-comment-discipline.md +0 -1
- package/dist/agent-src/rules/code-provenance.md +0 -1
- package/dist/agent-src/rules/command-suggestion-policy.md +0 -1
- package/dist/agent-src/rules/commit-conventions.md +1 -2
- package/dist/agent-src/rules/communication-through-line.md +1 -2
- package/dist/agent-src/rules/content-quoting-floor.md +1 -2
- package/dist/agent-src/rules/context-hygiene.md +5 -5
- package/dist/agent-src/rules/copilot-routing.md +1 -2
- package/dist/agent-src/rules/council-availability.md +4 -4
- package/dist/agent-src/rules/cross-source-consistency.md +4 -6
- package/dist/agent-src/rules/decision-revisit-gate.md +2 -3
- package/dist/agent-src/rules/delegation-policy.md +2 -3
- package/dist/agent-src/rules/design-fidelity.md +0 -1
- package/dist/agent-src/rules/design-review-after-ui-write.md +3 -3
- package/dist/agent-src/rules/devcontainer-routing.md +1 -2
- package/dist/agent-src/rules/doc-screenshot-hygiene.md +0 -1
- package/dist/agent-src/rules/docker-commands.md +0 -1
- package/dist/agent-src/rules/domain-adoption-policy.md +0 -1
- package/dist/agent-src/rules/domain-safety-disclaimer.md +0 -1
- package/dist/agent-src/rules/domain-safety-pii.md +0 -1
- package/dist/agent-src/rules/domain-safety-retention.md +0 -1
- package/dist/agent-src/rules/downstream-changes.md +0 -1
- package/dist/agent-src/rules/engineering-safety-floor.md +0 -1
- package/dist/agent-src/rules/external-code-graph-interop.md +0 -1
- package/dist/agent-src/rules/external-reference-deep-dive.md +0 -1
- package/dist/agent-src/rules/fast-path-marker-visibility.md +1 -2
- package/dist/agent-src/rules/finance-safety-floor.md +0 -1
- package/dist/agent-src/rules/fix-what-you-see.md +6 -32
- package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +0 -1
- package/dist/agent-src/rules/git-history-discipline.md +1 -2
- package/dist/agent-src/rules/guidelines.md +0 -1
- package/dist/agent-src/rules/history-discipline.md +0 -1
- package/dist/agent-src/rules/icon-consistency.md +0 -1
- package/dist/agent-src/rules/image-likeness-and-rights.md +0 -1
- package/dist/agent-src/rules/improve-before-implement.md +0 -1
- package/dist/agent-src/rules/invite-challenge.md +0 -1
- package/dist/agent-src/rules/laravel-routing.md +1 -2
- package/dist/agent-src/rules/laravel-translations.md +0 -1
- package/dist/agent-src/rules/legal-safety-floor.md +0 -1
- package/dist/agent-src/rules/lethal-trifecta-guard.md +0 -1
- package/dist/agent-src/rules/linked-projects-onboarding-gate.md +0 -1
- package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +0 -1
- package/dist/agent-src/rules/markdown-safe-codeblocks.md +0 -1
- package/dist/agent-src/rules/media-governance-routing.md +1 -2
- package/dist/agent-src/rules/media-sync-ground-truth.md +0 -1
- package/dist/agent-src/rules/minimal-safe-diff.md +0 -1
- package/dist/agent-src/rules/missing-skill-recovery.md +0 -1
- package/dist/agent-src/rules/missing-tool-handling.md +0 -1
- package/dist/agent-src/rules/model-recommendation.md +0 -1
- package/dist/agent-src/rules/neighbour-precedence.md +64 -0
- package/dist/agent-src/rules/no-attribution-footers.md +0 -1
- package/dist/agent-src/rules/no-decorative-emojis-in-git-surfaces.md +0 -1
- package/dist/agent-src/rules/no-pr-progress-comments.md +0 -1
- package/dist/agent-src/rules/no-roadmap-references.md +0 -1
- package/dist/agent-src/rules/notes-first-reasoning.md +0 -1
- package/dist/agent-src/rules/onboarding-gate.md +0 -1
- package/dist/agent-src/rules/output-discipline.md +0 -1
- package/dist/agent-src/rules/package-ci-checks.md +0 -1
- package/dist/agent-src/rules/persona-governance.md +2 -3
- package/dist/agent-src/rules/php-coding.md +0 -1
- package/dist/agent-src/rules/prefer-enums-over-literals.md +0 -1
- package/dist/agent-src/rules/preservation-guard.md +0 -1
- package/dist/agent-src/rules/provider-lifecycle-discipline.md +2 -3
- package/dist/agent-src/rules/question-not-instruction.md +0 -1
- package/dist/agent-src/rules/reviewer-awareness.md +0 -1
- package/dist/agent-src/rules/roadmap-ci-steps-policy.md +0 -1
- package/dist/agent-src/rules/roadmap-progress-sync.md +3 -6
- package/dist/agent-src/rules/role-mode-adherence.md +0 -1
- package/dist/agent-src/rules/rule-type-governance.md +0 -1
- package/dist/agent-src/rules/runtime-safety.md +0 -1
- package/dist/agent-src/rules/scale-discipline.md +0 -1
- package/dist/agent-src/rules/secret-vcs-guard.md +0 -1
- package/dist/agent-src/rules/security-sensitive-stop.md +0 -1
- package/dist/agent-src/rules/self-repair-loop.md +0 -1
- package/dist/agent-src/rules/senior-engineering-discipline.md +0 -1
- package/dist/agent-src/rules/session-canary.md +0 -1
- package/dist/agent-src/rules/settings-ask-protocol.md +5 -6
- package/dist/agent-src/rules/size-enforcement.md +0 -1
- package/dist/agent-src/rules/skill-improvement-trigger.md +2 -3
- package/dist/agent-src/rules/skill-quality.md +0 -1
- package/dist/agent-src/rules/slash-command-routing-policy.md +0 -1
- package/dist/agent-src/rules/source-confidentiality.md +0 -1
- package/dist/agent-src/rules/source-discovery-gate.md +0 -1
- package/dist/agent-src/rules/source-of-truth.md +0 -1
- package/dist/agent-src/rules/spreadsheet-source-quality.md +1 -2
- package/dist/agent-src/rules/strategy-safety-floor.md +0 -1
- package/dist/agent-src/rules/symfony-routing.md +1 -2
- package/dist/agent-src/rules/think-before-action.md +0 -1
- package/dist/agent-src/rules/token-budget-discipline.md +14 -48
- package/dist/agent-src/rules/token-efficiency.md +0 -1
- package/dist/agent-src/rules/token-optimizer-maintenance.md +0 -1
- package/dist/agent-src/rules/tool-safety.md +0 -1
- package/dist/agent-src/rules/ui-audit-gate.md +1 -2
- package/dist/agent-src/rules/untrusted-input-defense.md +0 -1
- package/dist/agent-src/rules/upstream-proposal.md +0 -1
- package/dist/agent-src/rules/user-interaction.md +0 -1
- package/dist/agent-src/rules/user-interrupt-priority.md +0 -1
- package/dist/agent-src/scripts/gate_budget.ts +47 -23
- package/dist/agent-src/scripts/gate_execute.ts +12 -4
- package/dist/agent-src/skills/accessibility-auditor/data/aria-patterns.csv +2 -0
- package/dist/agent-src/skills/accessibility-auditor/data/manifest.json +3 -3
- package/dist/agent-src/skills/ai-council/SKILL.md +7 -4
- package/dist/agent-src/skills/ai-council/references/cost-and-redaction.md +21 -11
- package/dist/agent-src/skills/ai-council/references/procedure.md +12 -6
- package/dist/agent-src/skills/analysis-autonomous-mode/SKILL.md +1 -1
- package/dist/agent-src/skills/bug-analyzer/SKILL.md +1 -1
- package/dist/agent-src/skills/canvas-design/SKILL.md +4 -2
- package/dist/agent-src/skills/command-routing/SKILL.md +3 -4
- package/dist/agent-src/skills/conventional-commits-writing/SKILL.md +127 -139
- package/dist/agent-src/skills/corpus-grounding/ATTRIBUTION.md +39 -0
- package/dist/agent-src/skills/corpus-grounding/SKILL.md +8 -2
- package/dist/agent-src/skills/database/data/manifest.json +2 -2
- package/dist/agent-src/skills/database/data/query-tuning.csv +13 -13
- package/dist/agent-src/skills/design-intelligence/references/integration-mapping.md +13 -10
- package/dist/agent-src/skills/design-system-capture/SKILL.md +0 -3
- package/dist/agent-src/skills/estimate-ticket/SKILL.md +1 -1
- package/dist/agent-src/skills/fe-design/references/design-patterns.md +49 -2
- package/dist/agent-src/skills/feature-planning/SKILL.md +1 -1
- package/dist/agent-src/skills/frontend-render-security/SKILL.md +9 -0
- package/dist/agent-src/skills/git-workflow/SKILL.md +44 -44
- package/dist/agent-src/skills/git-workflow/references/branch-update.md +312 -0
- package/dist/agent-src/skills/git-workflow/references/commit-subject.md +205 -0
- package/dist/agent-src/skills/iconography/SKILL.md +4 -2
- package/dist/agent-src/skills/image-provider-routing/SKILL.md +16 -5
- package/dist/agent-src/skills/jira-integration/SKILL.md +3 -3
- package/dist/agent-src/skills/logo-generation/SKILL.md +12 -8
- package/dist/agent-src/skills/merge-conflicts/SKILL.md +10 -4
- package/dist/agent-src/skills/po-discovery/SKILL.md +1 -1
- package/dist/agent-src/skills/refine-ticket/SKILL.md +4 -4
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +2 -2
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +4 -2
- package/dist/agent-src/skills/source-discovery/SKILL.md +1 -1
- package/dist/agent-src/skills/svg-authoring/SKILL.md +318 -0
- package/dist/agent-src/skills/tailwind-engineer/SKILL.md +3 -1
- package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
- package/dist/agent-src/skills/using-git-worktrees/SKILL.md +1 -1
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +2 -2
- package/dist/agent-src/skills/wireframe/SKILL.md +5 -2
- package/dist/agent-src/templates/AGENTS.md +1 -1
- package/dist/agent-src/templates/agent-settings.md +46 -129
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +3 -3
- package/dist/agent-src/templates/command.md +2 -2
- package/dist/agent-src/templates/roadmaps.md +6 -1
- package/dist/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -6
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +11 -7
- package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +3 -2
- package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +2 -1
- package/dist/agent-src/templates/scripts/work_engine/hooks/settings.ts +0 -6
- package/dist/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +9 -12
- package/dist/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +2 -1
- package/dist/agent-src/templates/skill.md +1 -1
- package/dist/cli/commands/uiRender.js +201 -4
- package/dist/cli/commands/uiRenderAsset.js +1308 -0
- package/dist/cli/commands/uiRenderAssetCompare.js +752 -0
- package/dist/cli/commands/uiRenderAssetGrid.js +265 -0
- package/dist/cli/commands/uiRenderAssetGrounds.js +323 -0
- package/dist/cli/commands/uiRenderAssetIsolation.js +85 -0
- package/dist/cli/commands/uiRenderAssetTypes.js +145 -0
- package/dist/cli/main.js +47 -1
- package/dist/cli/registry.js +2 -1
- package/dist/cli-delegate/check_update_banner.js +195 -119
- package/dist/cli-delegate/{chunk-S4UMZNES.js → chunk-4DBG5K7M.js} +5 -5
- package/dist/cli-delegate/{chunk-TRI6DQZ6.js → chunk-5GPULQBE.js} +60 -42
- package/dist/cli-delegate/{chunk-JQVYKIZA.js → chunk-6SRJTYJS.js} +33 -177
- package/dist/cli-delegate/chunk-6V5FMA3P.js +186 -0
- package/dist/cli-delegate/chunk-6YQC2HLF.js +415 -0
- package/dist/cli-delegate/{chunk-E4XIZDIB.js → chunk-7HKRE54K.js} +1 -64
- package/dist/cli-delegate/{chunk-7HQ52DHU.js → chunk-AL3RZ22D.js} +1 -1
- package/dist/cli-delegate/{chunk-DBH4AHDK.js → chunk-ED7KCMLB.js} +9 -11
- package/dist/cli-delegate/{chunk-NXEILF2K.js → chunk-F3QDG2GT.js} +481 -72
- package/dist/cli-delegate/{chunk-CQWX336L.js → chunk-G5VVIZRC.js} +3 -3
- package/dist/cli-delegate/{chunk-JY2I2DXV.js → chunk-H76PHZBI.js} +137 -60
- package/dist/cli-delegate/chunk-IAYTIIQW.js +67 -0
- package/dist/cli-delegate/{chunk-LIYTLH6O.js → chunk-KXXWJTDO.js} +5 -10
- package/dist/cli-delegate/{chunk-T7L2QK3K.js → chunk-LQOCRFWT.js} +1 -1
- package/dist/cli-delegate/{chunk-S4YWNRKO.js → chunk-MDPPKQCQ.js} +34 -1
- package/dist/cli-delegate/chunk-OAFSJBHH.js +272 -0
- package/dist/cli-delegate/{chunk-GKE7ZVFA.js → chunk-PWX7CKMD.js} +1 -1
- package/dist/cli-delegate/{chunk-NDJLNC6Q.js → chunk-T6BP34WI.js} +1 -0
- package/dist/cli-delegate/{chunk-RQNNW7IF.js → chunk-T7XSJSUQ.js} +433 -632
- package/dist/cli-delegate/{chunk-NQ7WT43P.js → chunk-TMWYUOK4.js} +75 -12
- package/dist/cli-delegate/{chunk-EEHDXSYD.js → chunk-WQWXGIWB.js} +12 -273
- package/dist/cli-delegate/{chunk-QLDHIPWR.js → chunk-XQTPXKFA.js} +1 -1
- package/dist/cli-delegate/cmd_analyze_session.js +223 -43
- package/dist/cli-delegate/cmd_brand_status.js +3 -2
- package/dist/cli-delegate/cmd_conformance.js +489 -238
- package/dist/cli-delegate/cmd_converge.js +3 -3
- package/dist/cli-delegate/cmd_doctor.js +15 -12
- package/dist/cli-delegate/cmd_doctor_neighbours.js +11 -4
- package/dist/cli-delegate/cmd_explain.js +43 -19
- package/dist/cli-delegate/cmd_export.js +10 -10
- package/dist/cli-delegate/cmd_git_convention.js +1851 -0
- package/dist/cli-delegate/cmd_handoff.js +40 -21
- package/dist/cli-delegate/cmd_mcp_available.js +3 -2
- package/dist/cli-delegate/cmd_migrate.js +3 -3
- package/dist/cli-delegate/cmd_packs_active.js +4 -3
- package/dist/cli-delegate/cmd_prune.js +10 -10
- package/dist/cli-delegate/cmd_route_audit.js +7 -7
- package/dist/cli-delegate/cmd_route_explain.js +5 -5
- package/dist/cli-delegate/cmd_session_recycle.js +9 -7
- package/dist/cli-delegate/cmd_settings_check.js +54 -7
- package/dist/cli-delegate/cmd_settings_get.js +18 -8
- package/dist/cli-delegate/cmd_settings_migrate.js +10 -10
- package/dist/cli-delegate/cmd_settings_set.js +1 -1
- package/dist/cli-delegate/cmd_sync.js +10 -10
- package/dist/cli-delegate/cmd_uninstall.js +10 -10
- package/dist/cli-delegate/cmd_update.js +7 -7
- package/dist/cli-delegate/cmd_upgrade.js +7 -7
- package/dist/cli-delegate/cmd_validate.js +10 -10
- package/dist/cli-delegate/cmd_versions.js +5 -5
- package/dist/cli-delegate/gate_budget.js +1 -1
- package/dist/cli-delegate/gate_execute.js +2 -2
- package/dist/cli-delegate/roadmap_gates.js +2 -2
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +171 -107
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +7 -7
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +41 -22
- package/dist/discovery/trust-report.md +3 -3
- package/dist/discovery/workspaces.json +16 -11
- package/dist/hooks/dispatch.js +2520 -1924
- package/dist/hooks/dispatch.sha256 +1 -1
- package/dist/hooks/svg_rules.chunk.cjs +1626 -0
- package/dist/hooks/svg_rules.chunk.cjs.sha256 +1 -0
- package/dist/install/install.mjs +462 -431
- package/dist/install/installThinLayer.js +40 -12
- package/dist/install/installedRuleLinks.js +105 -19
- package/dist/mcp/awesome-mcp-servers.row.md +1 -1
- package/dist/mcp/mcp-cloudflare-catalogue.json +2 -2
- package/dist/mcp/registry-manifest.json +5 -5
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +3063 -2160
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/agent_settings.js +15 -120
- package/dist/scripts/_lib/compile_time_toggles.js +12 -21
- package/dist/scripts/_lib/git_convention.js +232 -0
- package/dist/scripts/_lib/global_deploy_inventory.js +730 -0
- package/dist/scripts/_lib/installed_layer.js +344 -18
- package/dist/scripts/_lib/package_root.js +68 -0
- package/dist/scripts/_lib/rule_law_section.js +1 -1
- package/dist/scripts/_lib/scan_scope.js +105 -0
- package/dist/scripts/_lib/settings_removed_keys.js +168 -0
- package/dist/scripts/_lib/svg_dom.js +284 -0
- package/dist/scripts/_lib/svg_geometry.js +477 -0
- package/dist/scripts/_lib/svg_motion.js +179 -0
- package/dist/scripts/_lib/svg_rules.js +1337 -0
- package/dist/scripts/_lib/svg_urls.js +67 -0
- package/dist/scripts/_lib/thin_rules.js +80 -3
- package/dist/scripts/lint_svg_asset.js +324 -0
- package/dist/server/app.js +2 -1
- package/dist/server/gitKeysGate.js +105 -0
- package/dist/server/routes/settings.js +67 -8
- package/dist/server/routes/wizard.js +4 -0
- package/dist/server/schemas/settings.js +23 -81
- package/dist/shared/skillRanking.js +30 -4
- package/dist/ui/assets/{index-Cwq4d0hX.js → index-C3djEJah.js} +2 -2
- package/dist/ui/index.html +1 -1
- package/docs/MIGRATION.md +72 -1
- package/docs/contracts/settings-classes.md +35 -65
- package/docs/guidelines/agent-infra/active-remediation-mechanics.md +39 -0
- package/docs/guidelines/agent-infra/context-hygiene-mechanics.md +1 -1
- package/docs/guidelines/agent-infra/cross-source-consistency-mechanics.md +8 -10
- package/docs/guidelines/agent-infra/frontier-reasoning-operating-profile.md +3 -2
- package/docs/guidelines/agent-infra/layered-settings.md +13 -1
- package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
- package/docs/guidelines/agent-infra/self-improvement-pipeline.md +10 -3
- package/docs/guidelines/agent-infra/size-and-scope.md +36 -0
- package/docs/guidelines/design-antipatterns.md +1 -1
- package/docs/guidelines/php/git.md +15 -2
- package/package.json +4 -3
- package/src/agent-src/scripts/gate_budget.ts +47 -23
- package/src/agent-src/scripts/gate_execute.ts +12 -4
- package/src/agent-src/templates/AGENTS.md +1 -1
- package/src/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -6
- package/src/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +11 -7
- package/src/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +3 -2
- package/src/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +2 -1
- package/src/agent-src/templates/scripts/work_engine/hooks/settings.ts +0 -6
- package/src/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +9 -12
- package/src/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +2 -1
- package/src/config/agent-settings.template.yml +79 -312
- package/src/config/agents-paths.yml +16 -0
- package/src/config/assurance-capability-registry.json +7 -3
- package/src/config/ci-local-parity.yml +3 -0
- package/src/config/continuity-surface.json +3 -3
- package/src/config/discovery/packs.yml +17 -1
- package/src/config/evaluator-budgets.json +19 -6
- package/src/config/gate-coverage.yml +65 -23
- package/src/config/gate-violation-baselines.json +56 -16
- package/src/config/gitignore-block.txt +19 -0
- package/src/config/hook-bundle-budget.json +1 -1
- package/src/config/release-gate-locality.yml +2 -1
- package/src/config/routing-coverage-seed.json +55 -6
- package/src/config/rule-law-ceilings.json +12 -6
- package/src/config/rule-obligations.json +833 -0
- package/src/install/installThinLayer.ts +76 -10
- package/src/install/installedRuleLinks.ts +105 -17
- package/src/scripts/_cli/cmd_analyze_session.ts +9 -15
- package/src/scripts/_cli/cmd_conformance.ts +13 -2
- package/src/scripts/_cli/cmd_doctor.ts +10 -10
- package/src/scripts/_cli/cmd_doctor_neighbours.ts +133 -0
- package/src/scripts/_cli/cmd_explain.ts +72 -14
- package/src/scripts/_cli/cmd_git_convention.ts +637 -0
- package/src/scripts/_cli/cmd_settings_check.ts +66 -8
- package/src/scripts/_cli/cmd_settings_get.ts +18 -3
- package/src/scripts/_cli/doctor_execution.ts +72 -1
- package/src/scripts/_dispatch.bash +37 -2
- package/src/scripts/_lib/agent_settings.ts +15 -124
- package/src/scripts/_lib/blocked_by_marker.ts +1 -1
- package/src/scripts/_lib/compile_time_toggles.ts +12 -21
- package/src/scripts/_lib/dispatch_import_closure.ts +163 -0
- package/src/scripts/_lib/git_base_ref.ts +92 -0
- package/src/scripts/_lib/git_convention.ts +291 -0
- package/src/scripts/_lib/git_convention_carrier.ts +389 -0
- package/src/scripts/_lib/git_convention_grammar.ts +246 -0
- package/src/scripts/_lib/git_convention_measure.ts +344 -0
- package/src/scripts/_lib/global_deploy_inventory.ts +74 -0
- package/src/scripts/_lib/graph_feeder_record.ts +236 -13
- package/src/scripts/_lib/installed_layer.ts +448 -23
- package/src/scripts/_lib/knowledge_global.ts +14 -1
- package/src/scripts/_lib/module_reach.ts +456 -0
- package/src/scripts/_lib/neighbour_contradictions.ts +236 -0
- package/src/scripts/_lib/neighbour_tool_use.ts +8 -10
- package/src/scripts/_lib/ratification_artifact.ts +220 -1
- package/src/scripts/_lib/ratification_subject.ts +92 -0
- package/src/scripts/_lib/release_findings_ingest.ts +15 -7
- package/src/scripts/_lib/release_highlights.ts +5 -0
- package/src/scripts/_lib/rule_law_section.ts +1 -1
- package/src/scripts/_lib/rule_obligations.ts +205 -0
- package/src/scripts/_lib/self_repair.ts +1 -1
- package/src/scripts/_lib/settings_removed_keys.ts +173 -0
- package/src/scripts/_lib/svg_dom.ts +318 -0
- package/src/scripts/_lib/svg_geometry.ts +480 -0
- package/src/scripts/_lib/svg_motion.ts +208 -0
- package/src/scripts/_lib/svg_rules.ts +1453 -0
- package/src/scripts/_lib/svg_urls.ts +72 -0
- package/src/scripts/_lib/test_red_state.ts +5 -0
- package/src/scripts/_lib/thin_rules.ts +83 -3
- package/src/scripts/_lib/touched_file_quality.ts +142 -6
- package/src/scripts/_lib/verification_command.ts +59 -0
- package/src/scripts/_lib/verify_clause.ts +27 -17
- package/src/scripts/_lib/worker_budget.ts +1 -1
- package/src/scripts/adr/regenerate_index.ts +16 -1
- package/src/scripts/ai_council/config.ts +7 -7
- package/src/scripts/ai_council/modification_review.ts +100 -0
- package/src/scripts/ai_council/modification_review_questions.ts +90 -0
- package/src/scripts/ai_council/orchestrator.ts +5 -5
- package/src/scripts/ai_council/spend_gate.ts +18 -7
- package/src/scripts/ai_team/config.ts +11 -16
- package/src/scripts/audit_user_type_axis.ts +20 -8
- package/src/scripts/bench_ab_clone.ts +1 -2
- package/src/scripts/bench_concern_spawn_path.ts +129 -0
- package/src/scripts/bench_graph_feeder_latency.ts +584 -0
- package/src/scripts/check_agent_artifact_location.ts +36 -0
- package/src/scripts/check_branch_freshness.ts +147 -24
- package/src/scripts/check_enforcement_coverage.ts +130 -0
- package/src/scripts/check_evaluator_budgets.ts +4 -0
- package/src/scripts/check_finding_dispositions.ts +88 -25
- package/src/scripts/check_gate_coverage.ts +4 -3
- package/src/scripts/check_gate_reachability.ts +48 -1
- package/src/scripts/check_generator_sync.ts +48 -0
- package/src/scripts/check_hook_bundle_composition.ts +107 -0
- package/src/scripts/check_kernel_edit_ratified.ts +86 -6
- package/src/scripts/check_pack_size.ts +1 -1
- package/src/scripts/check_release_manifest_content.ts +189 -0
- package/src/scripts/check_standing_rule_delivery.ts +96 -0
- package/src/scripts/check_suppression_hygiene.ts +2 -5
- package/src/scripts/ci_settle.ts +42 -5
- package/src/scripts/classify_merge_risk.ts +320 -0
- package/src/scripts/closure_scan.ts +91 -1
- package/src/scripts/command_suggester/settings.ts +8 -108
- package/src/scripts/command_suggester/types.ts +4 -5
- package/src/scripts/consumer_matrix.ts +102 -0
- package/src/scripts/context_hygiene_hook.ts +13 -23
- package/src/scripts/cost/preflight.mjs +12 -1
- package/src/scripts/council_cli.ts +7 -7
- package/src/scripts/dispatch_r2_reviewer.ts +24 -11
- package/src/scripts/explain_run.ts +8 -13
- package/src/scripts/generate_git_convention_grammar.ts +127 -0
- package/src/scripts/generate_host_cost_table.ts +20 -3
- package/src/scripts/handoff_context_hook.ts +86 -37
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +25 -6
- package/src/scripts/hooks/block_config_weakening.ts +48 -5
- package/src/scripts/hooks/block_plumbing_writes.ts +8 -4
- package/src/scripts/hooks/block_speaking_inbox_dir.ts +16 -1
- package/src/scripts/hooks/concern_registry.ts +2 -0
- package/src/scripts/hooks/delegation_nudge_hook.ts +2 -3
- package/src/scripts/hooks/design_pass_hook.ts +157 -3
- package/src/scripts/hooks/evidence_independence.ts +12 -4
- package/src/scripts/hooks/mcp_usage_observation_hook.ts +121 -0
- package/src/scripts/hooks/push_settle_hook.ts +4 -3
- package/src/scripts/hooks/rule_inject_hook.ts +44 -3
- package/src/scripts/hooks/state_io.ts +8 -4
- package/src/scripts/hooks/svg_obligation.ts +497 -0
- package/src/scripts/hooks/svg_rules_loader.ts +133 -0
- package/src/scripts/hooks/telemetry_usage_hook.ts +7 -46
- package/src/scripts/hooks/turn_end_gate_hook.ts +6 -3
- package/src/scripts/install-hooks.sh +42 -14
- package/src/scripts/install.ts +7 -31
- package/src/scripts/lint_blocker_citations.ts +198 -0
- package/src/scripts/lint_consolidation_lineage.ts +6 -3
- package/src/scripts/lint_design_quality.ts +60 -12
- package/src/scripts/lint_evidence_artifacts.ts +9 -0
- package/src/scripts/lint_hook_concern_budget.ts +10 -21
- package/src/scripts/lint_motion_authority_drift.ts +27 -0
- package/src/scripts/lint_pack_boundaries.ts +406 -28
- package/src/scripts/lint_roadmap_blockers.ts +282 -29
- package/src/scripts/lint_roadmap_complexity.ts +4 -2
- package/src/scripts/lint_rule_law_section.ts +151 -21
- package/src/scripts/lint_rule_skill_pack_reach.ts +17 -0
- package/src/scripts/lint_settings_classes.ts +1 -1
- package/src/scripts/lint_svg_asset.ts +365 -0
- package/src/scripts/lint_ticked_unmet_criteria.ts +165 -0
- package/src/scripts/lint_workflow_security.ts +12 -1
- package/src/scripts/measure_skill_ranker_baseline.ts +5 -0
- package/src/scripts/model_rule_injection.ts +3 -3
- package/src/scripts/onboarding_gate_hook.ts +7 -6
- package/src/scripts/print_required_checks.ts +15 -3
- package/src/scripts/probe_host_compliance.ts +33 -5
- package/src/scripts/probe_turnaround.ts +183 -3
- package/src/scripts/ratification_header.ts +77 -0
- package/src/scripts/refusal_envelope.ts +138 -0
- package/src/scripts/release_publication.ts +29 -3
- package/src/scripts/report_dispatch_import_closure.ts +76 -0
- package/src/scripts/report_installed_rule_links.ts +118 -1
- package/src/scripts/report_module_reach.ts +212 -0
- package/src/scripts/report_obligation_mechanism.ts +16 -18
- package/src/scripts/report_parked_blockers.ts +222 -0
- package/src/scripts/report_required_checks_drift.ts +196 -0
- package/src/scripts/report_skill_ranker_confusion.ts +103 -2
- package/src/scripts/report_standing_payload_by_host.ts +1 -1
- package/src/scripts/routing_doctor.ts +2 -2
- package/src/scripts/schemas/agent-settings.schema.json +17 -31
- package/src/scripts/schemas/command.schema.json +1 -1
- package/src/scripts/schemas/skill.schema.json +1 -1
- package/src/scripts/self_review_gate.ts +39 -2
- package/src/scripts/skill_tools/score_skill_relevance.ts +28 -19
- package/src/scripts/sync_pr_branch.ts +403 -132
- package/src/scripts/trigger_eval_grandfather.json +0 -16
- package/src/server/schemas/settings.ts +33 -177
- package/src/shared/skillRanking.ts +53 -4
- package/dist/cli-delegate/chunk-NYX3L2PZ.js +0 -99
- package/src/scripts/_lib/config_chain.ts +0 -477
- package/src/scripts/_lib/conformance_report.ts +0 -403
- package/src/scripts/_lib/eval_discrimination.ts +0 -95
- package/src/scripts/_lib/evaluator_promotion.ts +0 -225
- package/src/scripts/_lib/file_slicer.ts +0 -117
- package/src/scripts/_lib/legacy_boundary_map.ts +0 -228
- package/src/scripts/_lib/minimality_tiebreak.ts +0 -168
- package/src/scripts/_lib/overbuild_lens_contract.ts +0 -196
- package/src/scripts/_lib/role_split.ts +0 -338
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Census of open blockers in parked roadmaps — measures, never gates.
|
|
4
|
+
*
|
|
5
|
+
* `lint_roadmap_blockers` and `/roadmap:resolve-blockers` both exclude
|
|
6
|
+
* the parked directory (`later/`) by a recorded decision ("history rather than
|
|
7
|
+
* debt"). This report reads exactly that directory so the decision can be
|
|
8
|
+
* revisited on a number rather than a guess: every `### blocker:` entry whose
|
|
9
|
+
* `Status:` is not `resolved`, with its file, its raw `Owner:` value and
|
|
10
|
+
* whether that owner is the owner (maintainer / user / owner — the same set
|
|
11
|
+
* `lint_roadmap_blockers` treats as a user decision) or a condition an agent
|
|
12
|
+
* can reach. Separately it lists every blockquote that names an owner
|
|
13
|
+
* question or owner decision, because such a question is invisible to any
|
|
14
|
+
* blocker reader even when its directory is in scope.
|
|
15
|
+
*
|
|
16
|
+
* The raw `Owner:` value is printed beside its classification: the field is
|
|
17
|
+
* free text, and a misread must be visible to whoever reads the report.
|
|
18
|
+
*
|
|
19
|
+
* Usage:
|
|
20
|
+
* ./scripts-run src/scripts/report_parked_blockers
|
|
21
|
+
* ./scripts-run src/scripts/report_parked_blockers --format json
|
|
22
|
+
* ./scripts-run src/scripts/report_parked_blockers --dir <path>
|
|
23
|
+
*
|
|
24
|
+
* Exit codes: 0 report emitted · 2 usage error.
|
|
25
|
+
*/
|
|
26
|
+
import * as fs from 'node:fs';
|
|
27
|
+
import * as path from 'node:path';
|
|
28
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
29
|
+
|
|
30
|
+
import { REPO_ROOT, _stripFencedCode } from './lint_roadmap_blockers.js';
|
|
31
|
+
|
|
32
|
+
type OwnerWait = 'owner' | 'agent';
|
|
33
|
+
|
|
34
|
+
interface ParkedBlocker {
|
|
35
|
+
file: string;
|
|
36
|
+
id: string;
|
|
37
|
+
status: string;
|
|
38
|
+
owner: string;
|
|
39
|
+
wait: OwnerWait;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
interface OwnerQuestion {
|
|
43
|
+
file: string;
|
|
44
|
+
line: number;
|
|
45
|
+
text: string;
|
|
46
|
+
blocker_entries_in_file: number;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
interface Census {
|
|
50
|
+
dir: string;
|
|
51
|
+
files_scanned: number;
|
|
52
|
+
files_with_open_blockers: number;
|
|
53
|
+
blockers: ParkedBlocker[];
|
|
54
|
+
owner_questions: OwnerQuestion[];
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const BLOCKERS_SECTION_RE = /^##[ \t]+Blockers[ \t]*$/im;
|
|
58
|
+
const NEXT_H2_RE = /^##[ \t]+\S/m;
|
|
59
|
+
const BLOCKER_HEADING_RE = /^###[ \t]+blocker:[ \t]*(.+?)[ \t]*$/gim;
|
|
60
|
+
const STATUS_RE = /^-[ \t]*\*\*Status:\*\*[ \t]*(.*)$/im;
|
|
61
|
+
const OWNER_RE = /^-[ \t]*\*\*Owner:\*\*[ \t]*(.*)$/im;
|
|
62
|
+
const OWNER_WAIT_RE = /^(maintainer|user|owner)\b/i;
|
|
63
|
+
const OWNER_QUESTION_RE = /owner[ \t]+(question|decision)/i;
|
|
64
|
+
|
|
65
|
+
function _classifyOwner(raw: string): OwnerWait {
|
|
66
|
+
return OWNER_WAIT_RE.test(raw.trim()) ? 'owner' : 'agent';
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** Every blocker entry in one file's `## Blockers` section, open or not. */
|
|
70
|
+
function _blockerEntries(text: string): Array<{ id: string; status: string; owner: string }> {
|
|
71
|
+
const stripped = _stripFencedCode(text);
|
|
72
|
+
const sectionMatch = BLOCKERS_SECTION_RE.exec(stripped);
|
|
73
|
+
if (!sectionMatch) {
|
|
74
|
+
return [];
|
|
75
|
+
}
|
|
76
|
+
const start = sectionMatch.index + sectionMatch[0].length;
|
|
77
|
+
const rest = stripped.slice(start);
|
|
78
|
+
const h2 = NEXT_H2_RE.exec(rest);
|
|
79
|
+
const section = h2 ? rest.slice(0, h2.index) : rest;
|
|
80
|
+
|
|
81
|
+
const heads: Array<{ start: number; end: number; id: string }> = [];
|
|
82
|
+
BLOCKER_HEADING_RE.lastIndex = 0;
|
|
83
|
+
let hm: RegExpExecArray | null;
|
|
84
|
+
while ((hm = BLOCKER_HEADING_RE.exec(section)) !== null) {
|
|
85
|
+
heads.push({ start: hm.index, end: hm.index + hm[0].length, id: (hm[1] as string).trim() });
|
|
86
|
+
if (hm.index === BLOCKER_HEADING_RE.lastIndex) {
|
|
87
|
+
BLOCKER_HEADING_RE.lastIndex++;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return heads.map((cur, i) => {
|
|
91
|
+
const next = heads[i + 1];
|
|
92
|
+
const body = section.slice(cur.end, next ? next.start : section.length);
|
|
93
|
+
return {
|
|
94
|
+
id: cur.id,
|
|
95
|
+
status: (STATUS_RE.exec(body)?.[1] ?? '').trim(),
|
|
96
|
+
owner: (OWNER_RE.exec(body)?.[1] ?? '').trim(),
|
|
97
|
+
};
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** Blockquote lines that name an owner question or owner decision. */
|
|
102
|
+
function _ownerQuestionLines(text: string): Array<{ line: number; text: string }> {
|
|
103
|
+
const out: Array<{ line: number; text: string }> = [];
|
|
104
|
+
let inFence = false;
|
|
105
|
+
text.split('\n').forEach((raw, i) => {
|
|
106
|
+
if (/^[ \t]*```/.test(raw)) {
|
|
107
|
+
inFence = !inFence;
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
if (!inFence && /^[ \t]*>/.test(raw) && OWNER_QUESTION_RE.test(raw)) {
|
|
111
|
+
out.push({ line: i + 1, text: raw.trim() });
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
return out;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function collect(dir: string, root: string = REPO_ROOT): Census {
|
|
118
|
+
const files = fs.existsSync(dir)
|
|
119
|
+
? fs
|
|
120
|
+
.readdirSync(dir, { withFileTypes: true })
|
|
121
|
+
.filter((e) => e.isFile() && e.name.endsWith('.md'))
|
|
122
|
+
.map((e) => path.join(dir, e.name))
|
|
123
|
+
.sort()
|
|
124
|
+
: [];
|
|
125
|
+
const blockers: ParkedBlocker[] = [];
|
|
126
|
+
const ownerQuestions: OwnerQuestion[] = [];
|
|
127
|
+
const filesWithOpen = new Set<string>();
|
|
128
|
+
for (const abs of files) {
|
|
129
|
+
const rel = path.relative(root, abs).split(path.sep).join('/');
|
|
130
|
+
const text = fs.readFileSync(abs, 'utf8');
|
|
131
|
+
const entries = _blockerEntries(text);
|
|
132
|
+
for (const e of entries) {
|
|
133
|
+
if (/^resolved\b/i.test(e.status)) {
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
filesWithOpen.add(rel);
|
|
137
|
+
blockers.push({ file: rel, id: e.id, status: e.status, owner: e.owner, wait: _classifyOwner(e.owner) });
|
|
138
|
+
}
|
|
139
|
+
for (const q of _ownerQuestionLines(text)) {
|
|
140
|
+
ownerQuestions.push({ file: rel, line: q.line, text: q.text, blocker_entries_in_file: entries.length });
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return {
|
|
144
|
+
dir: path.relative(root, dir).split(path.sep).join('/'),
|
|
145
|
+
files_scanned: files.length,
|
|
146
|
+
files_with_open_blockers: filesWithOpen.size,
|
|
147
|
+
blockers,
|
|
148
|
+
owner_questions: ownerQuestions,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function format(c: Census): string {
|
|
153
|
+
const owner = c.blockers.filter((b) => b.wait === 'owner');
|
|
154
|
+
const agent = c.blockers.filter((b) => b.wait === 'agent');
|
|
155
|
+
const lines: string[] = [];
|
|
156
|
+
lines.push(`Parked blockers under ${c.dir}/`);
|
|
157
|
+
lines.push(
|
|
158
|
+
`files scanned: ${c.files_scanned} · files with an open blocker: ${c.files_with_open_blockers} · open blockers: ${c.blockers.length} (owner-wait ${owner.length}, agent-wait ${agent.length})`,
|
|
159
|
+
);
|
|
160
|
+
for (const [label, group] of [
|
|
161
|
+
['owner-wait', owner],
|
|
162
|
+
['agent-wait', agent],
|
|
163
|
+
] as const) {
|
|
164
|
+
lines.push('');
|
|
165
|
+
lines.push(`## ${label} (${group.length})`);
|
|
166
|
+
for (const b of group) {
|
|
167
|
+
lines.push(`- ${b.file} · ${b.id} · Owner: ${b.owner || '(none)'} · Status: ${b.status || '(none)'}`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
lines.push('');
|
|
171
|
+
lines.push(`## owner questions in blockquotes (${c.owner_questions.length})`);
|
|
172
|
+
for (const q of c.owner_questions) {
|
|
173
|
+
lines.push(`- ${q.file}:${q.line} · blocker entries in file: ${q.blocker_entries_in_file} · ${q.text.slice(0, 120)}`);
|
|
174
|
+
}
|
|
175
|
+
return `${lines.join('\n')}\n`;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function fail(message: string): never {
|
|
179
|
+
process.stderr.write(`report_parked_blockers: ${message}\n`);
|
|
180
|
+
process.exit(2);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function main(argv: string[] = process.argv.slice(2)): number {
|
|
184
|
+
let fmt: 'text' | 'json' = 'text';
|
|
185
|
+
let dir = path.join(REPO_ROOT, 'agents', 'roadmaps', 'later');
|
|
186
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
187
|
+
const arg = argv[i];
|
|
188
|
+
if (arg === '--format') {
|
|
189
|
+
const v = argv[i + 1];
|
|
190
|
+
if (v !== 'text' && v !== 'json') fail(`--format must be 'text' or 'json'`);
|
|
191
|
+
fmt = v;
|
|
192
|
+
i += 1;
|
|
193
|
+
} else if (arg === '--dir') {
|
|
194
|
+
const v = argv[i + 1];
|
|
195
|
+
if (v === undefined) fail('--dir requires a value');
|
|
196
|
+
dir = path.resolve(v);
|
|
197
|
+
i += 1;
|
|
198
|
+
} else {
|
|
199
|
+
fail(`unknown argument: ${arg}`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
const census = collect(dir);
|
|
203
|
+
process.stdout.write(fmt === 'json' ? `${JSON.stringify(census, null, 2)}\n` : format(census));
|
|
204
|
+
return 0;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
if (process.argv[1] !== undefined) {
|
|
208
|
+
try {
|
|
209
|
+
const here = fs.realpathSync(fileURLToPath(import.meta.url));
|
|
210
|
+
const argv1 = fs.realpathSync(path.resolve(process.argv[1]));
|
|
211
|
+
if (here === argv1) {
|
|
212
|
+
process.exit(main());
|
|
213
|
+
}
|
|
214
|
+
} catch {
|
|
215
|
+
if (import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href) {
|
|
216
|
+
process.exit(main());
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
export { _classifyOwner, _blockerEntries, _ownerQuestionLines, collect, format, main };
|
|
222
|
+
export type { Census, ParkedBlocker, OwnerQuestion };
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Required-check drift report — compares the live ruleset to the contract.
|
|
4
|
+
*
|
|
5
|
+
* `print_required_checks.ts` carries the list of status contexts the `main
|
|
6
|
+
* protection` ruleset requires, and it is contractually offline: it never calls
|
|
7
|
+
* `gh`. So nothing compared that list to the ruleset, and it drifted — it named
|
|
8
|
+
* one required context for a month after the ruleset gained a second. This
|
|
9
|
+
* report is the comparison: it reads the ruleset through `gh api`, extracts the
|
|
10
|
+
* required status contexts, and exits non-zero when they differ from
|
|
11
|
+
* `ENFORCED_CHECKS`.
|
|
12
|
+
*
|
|
13
|
+
* READ-ONLY. It writes nothing and changes nothing on the ruleset. It is run by
|
|
14
|
+
* hand or on a schedule and is NOT wired as a required check — a network read
|
|
15
|
+
* cannot sit on the path of every pull request, and the token it needs is a
|
|
16
|
+
* repository-read token, not something each PR should depend on.
|
|
17
|
+
*
|
|
18
|
+
* Usage:
|
|
19
|
+
* ./scripts-run src/scripts/report_required_checks_drift
|
|
20
|
+
* ./scripts-run src/scripts/report_required_checks_drift --repo <owner/name>
|
|
21
|
+
* ./scripts-run src/scripts/report_required_checks_drift --from-json <file>
|
|
22
|
+
*
|
|
23
|
+
* `--from-json` reads a ruleset object (the shape `gh api
|
|
24
|
+
* repos/{owner}/{repo}/rulesets/{id}` returns) from a file instead of the
|
|
25
|
+
* network, so the comparison itself is testable offline.
|
|
26
|
+
*
|
|
27
|
+
* Exit codes: 0 the lists agree · 1 they differ · 2 usage error, or the ruleset
|
|
28
|
+
* could not be read or carries no required-status-checks rule.
|
|
29
|
+
*/
|
|
30
|
+
import { spawnSync } from 'node:child_process';
|
|
31
|
+
import * as fs from 'node:fs';
|
|
32
|
+
import * as path from 'node:path';
|
|
33
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
34
|
+
|
|
35
|
+
import { ENFORCED_CHECKS } from './print_required_checks.js';
|
|
36
|
+
|
|
37
|
+
const _HERE = fileURLToPath(import.meta.url);
|
|
38
|
+
|
|
39
|
+
export const RULESET_NAME = 'main protection';
|
|
40
|
+
const DEFAULT_REPO = 'event4u-app/agent-config';
|
|
41
|
+
|
|
42
|
+
export interface Drift {
|
|
43
|
+
readonly missingFromContract: readonly string[];
|
|
44
|
+
readonly missingFromRuleset: readonly string[];
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
class ReadError extends Error {}
|
|
48
|
+
|
|
49
|
+
/** The required status contexts of one ruleset object, sorted. */
|
|
50
|
+
export function requiredContexts(ruleset: unknown): string[] {
|
|
51
|
+
const rules = (ruleset as { rules?: unknown }).rules;
|
|
52
|
+
if (!Array.isArray(rules)) {
|
|
53
|
+
throw new ReadError('the ruleset object carries no `rules` array');
|
|
54
|
+
}
|
|
55
|
+
const lists = rules
|
|
56
|
+
.filter(
|
|
57
|
+
(r): r is { parameters?: { required_status_checks?: unknown } } =>
|
|
58
|
+
typeof r === 'object' && r !== null && (r as { type?: unknown }).type === 'required_status_checks',
|
|
59
|
+
)
|
|
60
|
+
.map((r) => r.parameters?.required_status_checks)
|
|
61
|
+
.filter((c): c is unknown[] => Array.isArray(c));
|
|
62
|
+
if (lists.length === 0) {
|
|
63
|
+
throw new ReadError('the ruleset has no `required_status_checks` rule');
|
|
64
|
+
}
|
|
65
|
+
// Every such rule counts: a context required by any of them blocks the merge.
|
|
66
|
+
const contexts = new Set(
|
|
67
|
+
lists
|
|
68
|
+
.flat()
|
|
69
|
+
.map((c) => (c as { context?: unknown }).context)
|
|
70
|
+
.filter((c): c is string => typeof c === 'string'),
|
|
71
|
+
);
|
|
72
|
+
return [...contexts].sort();
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** Set difference in both directions; empty both ways means agreement. */
|
|
76
|
+
export function compare(live: readonly string[], contract: readonly string[]): Drift {
|
|
77
|
+
const liveSet = new Set(live);
|
|
78
|
+
const contractSet = new Set(contract);
|
|
79
|
+
return {
|
|
80
|
+
missingFromContract: live.filter((c) => !contractSet.has(c)).sort(),
|
|
81
|
+
missingFromRuleset: contract.filter((c) => !liveSet.has(c)).sort(),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function ghJson(endpoint: string, paginate = false): unknown {
|
|
86
|
+
const args = paginate ? ['api', '--paginate', '--slurp', endpoint] : ['api', endpoint];
|
|
87
|
+
const r = spawnSync('gh', args, { encoding: 'utf-8', maxBuffer: 16 * 1024 * 1024 });
|
|
88
|
+
if (r.status !== 0) {
|
|
89
|
+
throw new ReadError(`gh api ${endpoint} failed: ${(r.stderr ?? '').trim() || `exit ${String(r.status)}`}`);
|
|
90
|
+
}
|
|
91
|
+
return JSON.parse(r.stdout) as unknown;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function readLiveRuleset(repo: string): unknown {
|
|
95
|
+
// --paginate --slurp: one array per page, so a ruleset past the first page
|
|
96
|
+
// of 30 is still found.
|
|
97
|
+
const pages = ghJson(`repos/${repo}/rulesets`, true);
|
|
98
|
+
if (!Array.isArray(pages) || !pages.every((p) => Array.isArray(p))) {
|
|
99
|
+
throw new ReadError('the rulesets listing is not an array of pages');
|
|
100
|
+
}
|
|
101
|
+
const list = (pages as unknown[][]).flat();
|
|
102
|
+
const hit = list.find((r) => (r as { name?: unknown }).name === RULESET_NAME) as { id?: unknown } | undefined;
|
|
103
|
+
if (hit === undefined || typeof hit.id !== 'number') {
|
|
104
|
+
throw new ReadError(`no ruleset named "${RULESET_NAME}" on ${repo}`);
|
|
105
|
+
}
|
|
106
|
+
return ghJson(`repos/${repo}/rulesets/${String(hit.id)}`);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
interface Options {
|
|
110
|
+
repo: string;
|
|
111
|
+
fromJson: string | null;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function parseArgs(argv: readonly string[]): Options | string {
|
|
115
|
+
let repo = DEFAULT_REPO;
|
|
116
|
+
let fromJson: string | null = null;
|
|
117
|
+
for (let i = 0; i < argv.length; i++) {
|
|
118
|
+
const a = argv[i] as string;
|
|
119
|
+
if (a === '--repo' || a === '--from-json') {
|
|
120
|
+
const v = argv[i + 1];
|
|
121
|
+
if (v === undefined || v.startsWith('--')) {
|
|
122
|
+
return `${a} needs a value`;
|
|
123
|
+
}
|
|
124
|
+
if (a === '--repo') {
|
|
125
|
+
repo = v;
|
|
126
|
+
} else {
|
|
127
|
+
fromJson = v;
|
|
128
|
+
}
|
|
129
|
+
i++;
|
|
130
|
+
} else {
|
|
131
|
+
return `unknown argument: ${a}`;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return { repo, fromJson };
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export function main(argv: readonly string[] = process.argv.slice(2)): number {
|
|
138
|
+
const opts = parseArgs(argv);
|
|
139
|
+
if (typeof opts === 'string') {
|
|
140
|
+
process.stderr.write(`❌ report_required_checks_drift: ${opts}\n`);
|
|
141
|
+
process.stderr.write('usage: report_required_checks_drift [--repo OWNER/NAME] [--from-json FILE]\n');
|
|
142
|
+
return 2;
|
|
143
|
+
}
|
|
144
|
+
let live: string[];
|
|
145
|
+
try {
|
|
146
|
+
const ruleset =
|
|
147
|
+
opts.fromJson === null
|
|
148
|
+
? readLiveRuleset(opts.repo)
|
|
149
|
+
: (JSON.parse(fs.readFileSync(opts.fromJson, 'utf-8')) as unknown);
|
|
150
|
+
live = requiredContexts(ruleset);
|
|
151
|
+
} catch (e) {
|
|
152
|
+
process.stderr.write(`❌ report_required_checks_drift: ${e instanceof Error ? e.message : String(e)}\n`);
|
|
153
|
+
return 2;
|
|
154
|
+
}
|
|
155
|
+
const drift = compare(live, ENFORCED_CHECKS);
|
|
156
|
+
const source = opts.fromJson === null ? `${opts.repo} ruleset "${RULESET_NAME}"` : opts.fromJson;
|
|
157
|
+
process.stdout.write(`required contexts read from ${source}: ${String(live.length)}\n`);
|
|
158
|
+
for (const c of live) {
|
|
159
|
+
process.stdout.write(` - ${c}\n`);
|
|
160
|
+
}
|
|
161
|
+
if (drift.missingFromContract.length === 0 && drift.missingFromRuleset.length === 0) {
|
|
162
|
+
process.stdout.write(
|
|
163
|
+
'✅ agrees with ENFORCED_CHECKS in src/scripts/print_required_checks.ts\n',
|
|
164
|
+
);
|
|
165
|
+
return 0;
|
|
166
|
+
}
|
|
167
|
+
for (const c of drift.missingFromContract) {
|
|
168
|
+
process.stdout.write(` ❌ required by the ruleset, absent from the contract: ${c}\n`);
|
|
169
|
+
}
|
|
170
|
+
for (const c of drift.missingFromRuleset) {
|
|
171
|
+
process.stdout.write(` ❌ named by the contract, not required by the ruleset: ${c}\n`);
|
|
172
|
+
}
|
|
173
|
+
process.stdout.write(
|
|
174
|
+
'❌ drift — update ENFORCED_CHECKS and docs/contracts/branch-protection-policy.md ' +
|
|
175
|
+
'together, with the date the ruleset was read.\n',
|
|
176
|
+
);
|
|
177
|
+
return 1;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function _isCliEntry(): boolean {
|
|
181
|
+
if (process.argv[1] === undefined) {
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
if (pathToFileURL(path.resolve(process.argv[1])).href === import.meta.url) {
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
try {
|
|
188
|
+
return fs.realpathSync(path.resolve(process.argv[1])) === fs.realpathSync(_HERE);
|
|
189
|
+
} catch {
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
if (_isCliEntry()) {
|
|
195
|
+
process.exitCode = main();
|
|
196
|
+
}
|
|
@@ -55,7 +55,7 @@ import {
|
|
|
55
55
|
sliceForId,
|
|
56
56
|
sliceSizes,
|
|
57
57
|
} from './measure_skill_ranker_baseline.js';
|
|
58
|
-
import { _globSkillMd, rank, type RankRow } from './skill_tools/score_skill_relevance.js';
|
|
58
|
+
import { _globSkillMd, rank, rankDetailed, type RankRow } from './skill_tools/score_skill_relevance.js';
|
|
59
59
|
|
|
60
60
|
/** How deep "outside the top ten" is. 1.3's own number, not a derived one. */
|
|
61
61
|
export const DEEP_MISS_DEPTH = 10;
|
|
@@ -92,6 +92,38 @@ export interface RowReading {
|
|
|
92
92
|
rankedFirst: string | null;
|
|
93
93
|
topScore: number;
|
|
94
94
|
rankOfExpected: number;
|
|
95
|
+
/** An expected skill shares the winner's integer score (hit or miss). */
|
|
96
|
+
expectedInTopScoreBlock: boolean;
|
|
97
|
+
/** An expected skill shares the winner's whole ordering key and loses on name. */
|
|
98
|
+
lostOnTie: boolean;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* The two tie readings for one ranking.
|
|
103
|
+
*
|
|
104
|
+
* `inBlock` asks whether an expected skill scored the winner's INTEGER — the
|
|
105
|
+
* block the alphabet orders under `keyword-v1`. `lostOnTie` asks whether the
|
|
106
|
+
* row was a top-1 miss that nothing but the name decided: the expected skill
|
|
107
|
+
* shares the winner's integer score and, under `tieBreakUnrounded`, its
|
|
108
|
+
* unrounded score too. Without the flag the two keys coincide, so `lostOnTie`
|
|
109
|
+
* is the evidence page's "scored exactly the winner's score and lost on its
|
|
110
|
+
* initial" class; with it, `lostOnTie` is what the unrounded score left.
|
|
111
|
+
*/
|
|
112
|
+
export function tieReading(
|
|
113
|
+
rows: readonly RankRow[],
|
|
114
|
+
raw: ReadonlyMap<string, number>,
|
|
115
|
+
expected: readonly string[],
|
|
116
|
+
tieBreakUnrounded: boolean,
|
|
117
|
+
): { inBlock: boolean; lostOnTie: boolean } {
|
|
118
|
+
const first = rows[0];
|
|
119
|
+
if (!first) return { inBlock: false, lostOnTie: false };
|
|
120
|
+
const block = rows.filter((r) => r[1] === first[1]);
|
|
121
|
+
const inBlock = block.some((r) => expected.includes(r[0]));
|
|
122
|
+
if (!inBlock || expected.includes(first[0])) return { inBlock, lostOnTie: false };
|
|
123
|
+
const lostOnTie = block.some(
|
|
124
|
+
(r) => expected.includes(r[0]) && (!tieBreakUnrounded || raw.get(r[0]) === raw.get(first[0])),
|
|
125
|
+
);
|
|
126
|
+
return { inBlock, lostOnTie };
|
|
95
127
|
}
|
|
96
128
|
|
|
97
129
|
export function readRows(
|
|
@@ -101,13 +133,16 @@ export function readRows(
|
|
|
101
133
|
): RowReading[] {
|
|
102
134
|
const opts = rankOptionsFor(ranker);
|
|
103
135
|
return prompts.map((p) => {
|
|
104
|
-
const rows =
|
|
136
|
+
const { rows, raw } = rankDetailed(p.prompt, skillsDir, opts);
|
|
137
|
+
const tie = tieReading(rows, raw, p.expected, Boolean(opts.tieBreakUnrounded));
|
|
105
138
|
return {
|
|
106
139
|
id: p.id,
|
|
107
140
|
expected: p.expected,
|
|
108
141
|
rankedFirst: rows[0]?.[0] ?? null,
|
|
109
142
|
topScore: rows[0]?.[1] ?? 0,
|
|
110
143
|
rankOfExpected: firstExpectedRank(rows, p.expected),
|
|
144
|
+
expectedInTopScoreBlock: tie.inBlock,
|
|
145
|
+
lostOnTie: tie.lostOnTie,
|
|
111
146
|
};
|
|
112
147
|
});
|
|
113
148
|
}
|
|
@@ -262,6 +297,41 @@ export function falseActivation(
|
|
|
262
297
|
};
|
|
263
298
|
}
|
|
264
299
|
|
|
300
|
+
export interface AbstentionReading {
|
|
301
|
+
empties: number;
|
|
302
|
+
/** Empties whose top score is 0 — the ranker already abstains. */
|
|
303
|
+
noSkill: number;
|
|
304
|
+
threshold: number | null;
|
|
305
|
+
/** Empties whose top score is below `threshold`. */
|
|
306
|
+
abstainedEmpties: number;
|
|
307
|
+
correctHits: number;
|
|
308
|
+
/** Correct top-1 hits whose top score is below `threshold`. */
|
|
309
|
+
hitsLost: number;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* What abstaining below one threshold buys on the empties and costs on the hits.
|
|
314
|
+
*
|
|
315
|
+
* A `null` threshold reads the no-skill rate only: with no correct hit there is
|
|
316
|
+
* no recall to cost, and inventing a cutoff would put a number chosen here
|
|
317
|
+
* beside a measured one.
|
|
318
|
+
*/
|
|
319
|
+
export function abstentionReading(
|
|
320
|
+
labelled: readonly RowReading[],
|
|
321
|
+
emptyTopScores: readonly number[],
|
|
322
|
+
threshold: number | null,
|
|
323
|
+
): AbstentionReading {
|
|
324
|
+
const hits = labelled.filter((r) => r.rankOfExpected === 1);
|
|
325
|
+
return {
|
|
326
|
+
empties: emptyTopScores.length,
|
|
327
|
+
noSkill: emptyTopScores.filter((s) => s === 0).length,
|
|
328
|
+
threshold,
|
|
329
|
+
abstainedEmpties: threshold === null ? 0 : emptyTopScores.filter((s) => s < threshold).length,
|
|
330
|
+
correctHits: hits.length,
|
|
331
|
+
hitsLost: threshold === null ? 0 : hits.filter((r) => r.topScore < threshold).length,
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
|
|
265
335
|
function interval(successes: number, trials: number): string {
|
|
266
336
|
const raw = wilsonInterval(successes, trials);
|
|
267
337
|
return `${round3(raw.lower).toFixed(3)} – ${round3(raw.upper).toFixed(3)}`;
|
|
@@ -286,6 +356,8 @@ export function renderReport(opts: {
|
|
|
286
356
|
const misses = readings.filter((r) => r.rankOfExpected !== 1);
|
|
287
357
|
const deep = misses.filter((r) => r.rankOfExpected === 0 || r.rankOfExpected > DEEP_MISS_DEPTH).length;
|
|
288
358
|
const mrr = meanReciprocalRank(readings);
|
|
359
|
+
const tieLoss = readings.filter((r) => r.lostOnTie).length;
|
|
360
|
+
const inBlock = readings.filter((r) => r.expectedInTopScoreBlock).length;
|
|
289
361
|
|
|
290
362
|
const empties = emptyRowIds(opts.repo, opts.slice);
|
|
291
363
|
const rankOpts = rankOptionsFor(opts.ranker);
|
|
@@ -368,6 +440,18 @@ export function renderReport(opts: {
|
|
|
368
440
|
L.push('of the existing signal can recover a skill the formula never surfaces. The two');
|
|
369
441
|
L.push('take different fixes, which is why the split is reported rather than an average.');
|
|
370
442
|
L.push('');
|
|
443
|
+
L.push('## Ties');
|
|
444
|
+
L.push('');
|
|
445
|
+
L.push('| metric | rows | share of rows read |');
|
|
446
|
+
L.push('|---|---:|---:|');
|
|
447
|
+
L.push(`| \`top1_loss_due_to_tie\` | ${String(tieLoss)} | ${pct(tieLoss, n)} |`);
|
|
448
|
+
L.push(`| \`expected_in_top_score_block\` | ${String(inBlock)} | ${pct(inBlock, n)} |`);
|
|
449
|
+
L.push('');
|
|
450
|
+
L.push('`top1_loss_due_to_tie` counts top-1 misses where an expected skill shares the');
|
|
451
|
+
L.push('winner\'s whole ordering key and loses on the name alone — the integer score, and');
|
|
452
|
+
L.push('under `tieBreakUnrounded` the unrounded score as well. `expected_in_top_score_block`');
|
|
453
|
+
L.push('counts rows, hit or miss, whose expected skill scores the winner\'s integer.');
|
|
454
|
+
L.push('');
|
|
371
455
|
L.push('## False activation on the no-skill prompts');
|
|
372
456
|
L.push('');
|
|
373
457
|
L.push('| | |');
|
|
@@ -393,6 +477,23 @@ export function renderReport(opts: {
|
|
|
393
477
|
L.push('populations at all. A share near one half means it does not: a prompt a seat');
|
|
394
478
|
L.push('judged to have no skill answer is scored as confidently as a prompt it got right.');
|
|
395
479
|
L.push('');
|
|
480
|
+
const ab = abstentionReading(readings, emptyScores, fa.correct_hits > 0 ? fa.median_correct_hit_score : null);
|
|
481
|
+
L.push('## Abstention, beside its cost');
|
|
482
|
+
L.push('');
|
|
483
|
+
L.push('| | |');
|
|
484
|
+
L.push('|---|---:|');
|
|
485
|
+
L.push(`| empties the ranker already returns nothing for (no-skill rate) | ${String(ab.noSkill)} of ${String(ab.empties)} (${pct(ab.noSkill, ab.empties)}) |`);
|
|
486
|
+
if (ab.threshold === null) {
|
|
487
|
+
L.push('| abstention threshold | n/a — no correct top-1 hit, so no threshold |');
|
|
488
|
+
} else {
|
|
489
|
+
L.push(`| abstention threshold (abstain below the median correct-hit score) | ${String(ab.threshold)} |`);
|
|
490
|
+
L.push(`| empties that threshold abstains on | ${String(ab.abstainedEmpties)} of ${String(ab.empties)} (${pct(ab.abstainedEmpties, ab.empties)}) |`);
|
|
491
|
+
L.push(`| correct top-1 hits it would suppress (recall cost) | ${String(ab.hitsLost)} of ${String(ab.correctHits)} (${pct(ab.hitsLost, ab.correctHits)}) |`);
|
|
492
|
+
}
|
|
493
|
+
L.push('');
|
|
494
|
+
L.push('One threshold, the same median the false-activation table compares against, so');
|
|
495
|
+
L.push('the gain on the empties and the recall it costs are read off one number.');
|
|
496
|
+
L.push('');
|
|
396
497
|
L.push(`## Per-pack top-1, worst first`);
|
|
397
498
|
L.push('');
|
|
398
499
|
L.push('| pack | labelled rows | top-1 |');
|
|
@@ -229,7 +229,7 @@ export const HOST_SURFACES: readonly HostSurface[] = [
|
|
|
229
229
|
},
|
|
230
230
|
{
|
|
231
231
|
host: 'codex', surface: '.codex/agent-config.md', perRuleTree: false,
|
|
232
|
-
writer: 'src/scripts/install.ts:
|
|
232
|
+
writer: 'src/scripts/install.ts:1377',
|
|
233
233
|
// Scoped to `.codex` rather than the bare filename: nine other lines in
|
|
234
234
|
// `install.ts` write an `agent-config.md` for some other host, so the
|
|
235
235
|
// unscoped anchor would have accepted a drift onto any of them — the
|
|
@@ -355,10 +355,10 @@ export function collect_orchestration(
|
|
|
355
355
|
platform_assumed: boolean,
|
|
356
356
|
): OrchestrationReport {
|
|
357
357
|
const settings = load_agent_settings({ cwd: workspace_root });
|
|
358
|
-
const sub = (settings["subagents"] ?? {}) as Record<string, unknown>;
|
|
359
358
|
const emergency = (settings["emergency"] ?? {}) as Record<string, unknown>;
|
|
360
359
|
const halted = emergency["orchestration_halt"] === true;
|
|
361
|
-
|
|
360
|
+
// Fixed on: the `subagents.downshift` key was retired with this default.
|
|
361
|
+
const downshift = true;
|
|
362
362
|
const { manifest: host_manifest, sources: host_manifest_sources } =
|
|
363
363
|
describeHostCapabilities(platform);
|
|
364
364
|
const activationInputs: ActivationInputs = {
|
|
@@ -11,17 +11,6 @@
|
|
|
11
11
|
"enum": ["minimal", "balanced", "full", "custom"],
|
|
12
12
|
"description": "Rule-tier loading footprint. See docs/contracts/cost-profile-defaults.md and docs/contracts/rule-router.md. NOT a memory or model lever."
|
|
13
13
|
},
|
|
14
|
-
"memory": {
|
|
15
|
-
"type": "object",
|
|
16
|
-
"additionalProperties": true,
|
|
17
|
-
"properties": {
|
|
18
|
-
"cadence": {
|
|
19
|
-
"type": "string",
|
|
20
|
-
"enum": ["auto", "always", "never"],
|
|
21
|
-
"description": "Cadence of the 🧠 memory-visibility line. See docs/contracts/memory-visibility-v1.md. Owns its own key since the 2026-06-01 untangle; previously collided with rule_loading_tier."
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
},
|
|
25
14
|
"model": {
|
|
26
15
|
"type": "object",
|
|
27
16
|
"additionalProperties": true,
|
|
@@ -79,25 +68,34 @@
|
|
|
79
68
|
}
|
|
80
69
|
}
|
|
81
70
|
},
|
|
82
|
-
"
|
|
71
|
+
"git": {
|
|
83
72
|
"type": "object",
|
|
84
73
|
"additionalProperties": true,
|
|
85
74
|
"properties": {
|
|
86
|
-
"
|
|
75
|
+
"commit_format": {
|
|
87
76
|
"type": "string",
|
|
88
|
-
"enum": ["
|
|
89
|
-
"description": "
|
|
77
|
+
"enum": ["ticket-scope", "ticket-conventional"],
|
|
78
|
+
"description": "Where a ticket id goes in a commit subject. ticket-scope (default) = `feat(DEV-1234): …`; ticket-conventional = `DEV-1234 feat(area): …`, a ticket is never a scope."
|
|
79
|
+
},
|
|
80
|
+
"branch_pattern": {
|
|
81
|
+
"type": "string",
|
|
82
|
+
"description": "Shape of a branch name the agent creates. Placeholders {type}, {ticket}, {slug}. Default {type}/{slug}."
|
|
83
|
+
},
|
|
84
|
+
"update_strategy": {
|
|
85
|
+
"type": "string",
|
|
86
|
+
"enum": ["merge", "rebase"],
|
|
87
|
+
"description": "How a feature branch is brought up to date with its base. merge (default) = merge the base in; rebase = rebase onto origin/<base> and push with --force-with-lease, still asked for each time per git-history-discipline."
|
|
90
88
|
}
|
|
91
89
|
}
|
|
92
90
|
},
|
|
93
|
-
"
|
|
91
|
+
"design": {
|
|
94
92
|
"type": "object",
|
|
95
93
|
"additionalProperties": true,
|
|
96
94
|
"properties": {
|
|
97
|
-
"
|
|
95
|
+
"fidelity_mode": {
|
|
98
96
|
"type": "string",
|
|
99
|
-
"enum": ["
|
|
100
|
-
"description": "
|
|
97
|
+
"enum": ["strict", "structural", "hard-floor"],
|
|
98
|
+
"description": "How strictly the agent must follow a user-provided prototype / mockup / design system. Consumed by the design-fidelity rule. strict = build 1:1, every visible deviation needs confirmation; structural = structure locked, silent gaps fillable with a stated assumption; hard-floor = any deviation is never autonomous."
|
|
101
99
|
}
|
|
102
100
|
}
|
|
103
101
|
},
|
|
@@ -158,18 +156,6 @@
|
|
|
158
156
|
}
|
|
159
157
|
}
|
|
160
158
|
},
|
|
161
|
-
"tokens": {
|
|
162
|
-
"type": "object",
|
|
163
|
-
"additionalProperties": true,
|
|
164
|
-
"description": "Token-spend governance for skills marked token_budget_class: rich. See token-budget-discipline rule.",
|
|
165
|
-
"properties": {
|
|
166
|
-
"rich_skills": {
|
|
167
|
-
"type": "string",
|
|
168
|
-
"enum": ["on", "ask", "off"],
|
|
169
|
-
"description": "Controls whether skills marked token_budget_class: rich may load in full (exempt from telegraph-speak and thin-projector trimming). on = allowed (default); off = fall back to standard condensed behavior; ask = surface an estimated token delta (tokens, not dollars) and ask the user once per session before loading."
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
},
|
|
173
159
|
"commands": {
|
|
174
160
|
"type": "object",
|
|
175
161
|
"additionalProperties": true,
|