@event4u/agent-config 14.23.0 → 16.0.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 +144 -152
- package/README.md +1 -1
- package/dist/agent-src/commands/agent-handoff.md +8 -7
- package/dist/agent-src/commands/agents/init.md +1 -1
- package/dist/agent-src/commands/agents/user/accept.md +4 -4
- package/dist/agent-src/commands/agents/user/delete.md +2 -2
- package/dist/agent-src/commands/agents/user/init.md +3 -3
- package/dist/agent-src/commands/agents/user/review.md +3 -3
- package/dist/agent-src/commands/agents/user/show.md +3 -3
- package/dist/agent-src/commands/agents/user/update.md +2 -2
- package/dist/agent-src/commands/agents/user.md +6 -6
- package/dist/agent-src/commands/analytics/prune.md +1 -1
- package/dist/agent-src/commands/analytics/show.md +2 -2
- package/dist/agent-src/commands/analyze/decision.md +2 -2
- package/dist/agent-src/commands/analyze/inbox.md +5 -5
- package/dist/agent-src/commands/analyze/incident.md +3 -3
- package/dist/agent-src/commands/analyze/near-miss.md +3 -3
- package/dist/agent-src/commands/analyze/postmortem.md +4 -4
- package/dist/agent-src/commands/analyze/premortem.md +2 -2
- package/dist/agent-src/commands/analyze.md +2 -2
- package/dist/agent-src/commands/bug/fix.md +1 -1
- package/dist/agent-src/commands/bug/investigate.md +2 -2
- package/dist/agent-src/commands/cost/profile.md +3 -3
- package/dist/agent-src/commands/design.md +1 -1
- package/dist/agent-src/commands/feature/explore.md +1 -1
- package/dist/agent-src/commands/feature/plan.md +2 -2
- package/dist/agent-src/commands/feature/roadmap.md +2 -2
- package/dist/agent-src/commands/ghostwriter/fetch.md +4 -4
- package/dist/agent-src/commands/ghostwriter/list.md +1 -1
- package/dist/agent-src/commands/ghostwriter/show.md +1 -1
- package/dist/agent-src/commands/ghostwriter/write.md +9 -9
- package/dist/agent-src/commands/humanize.md +6 -6
- package/dist/agent-src/commands/jira-ticket.md +1 -1
- package/dist/agent-src/commands/judge/solo.md +1 -1
- package/dist/agent-src/commands/judge.md +1 -1
- package/dist/agent-src/commands/knowledge/cross-repo.md +1 -1
- package/dist/agent-src/commands/knowledge/forget.md +1 -1
- package/dist/agent-src/commands/knowledge/ingest.md +2 -2
- package/dist/agent-src/commands/knowledge/list.md +1 -1
- package/dist/agent-src/commands/memory/add.md +3 -3
- package/dist/agent-src/commands/memory/load.md +4 -4
- package/dist/agent-src/commands/memory/mine-session.md +1 -1
- package/dist/agent-src/commands/memory/promote.md +4 -4
- package/dist/agent-src/commands/memory/propose.md +2 -2
- package/dist/agent-src/commands/mode.md +5 -5
- package/dist/agent-src/commands/post-as/ghostwriter.md +3 -3
- package/dist/agent-src/commands/post-as/me.md +7 -7
- package/dist/agent-src/commands/pr/create.md +1 -1
- package/dist/agent-src/commands/pr/merge.md +1 -1
- package/dist/agent-src/commands/profile/activate.md +1 -1
- package/dist/agent-src/commands/profile/show.md +1 -1
- package/dist/agent-src/commands/research/deep.md +2 -2
- package/dist/agent-src/commands/research/report.md +2 -2
- package/dist/agent-src/commands/review/changes.md +1 -1
- package/dist/agent-src/commands/review/routing.md +1 -1
- package/dist/agent-src/commands/roadmap/create.md +4 -3
- package/dist/agent-src/commands/roadmap/materialize.md +2 -2
- package/dist/agent-src/commands/roadmap/next.md +1 -1
- package/dist/agent-src/commands/roadmap/process-full.md +2 -2
- package/dist/agent-src/commands/security-audit-config.md +3 -3
- package/dist/agent-src/commands/skill/preview.md +1 -1
- package/dist/agent-src/commands/skills/discover.md +1 -1
- package/dist/agent-src/commands/sync/agent-settings.md +2 -2
- package/dist/agent-src/commands/sync/gitignore/fix.md +1 -1
- package/dist/agent-src/commands/tests/create.md +1 -1
- package/dist/agent-src/commands/tests/e2e-heal.md +1 -1
- package/dist/agent-src/commands/tests/e2e-plan.md +1 -1
- package/dist/agent-src/contexts/authority/kernel-rule-edits.md +6 -6
- package/dist/agent-src/contexts/communication/rules-auto/slash-command-routing-policy-mechanics.md +1 -2
- package/dist/agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +2 -2
- package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +88 -1
- package/dist/agent-src/contexts/communication/rules-auto/user-interaction-mechanics.md +51 -1
- package/dist/agent-src/contexts/contracts/frugality-charter.md +1 -1
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +1 -1
- package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +1 -1
- package/dist/agent-src/contexts/execution/autonomy-mechanics.md +1 -1
- package/dist/agent-src/contexts/execution/cheap-question-mechanics.md +1 -1
- package/dist/agent-src/contexts/execution/contract-decision-sheet.md +3 -3
- package/dist/agent-src/contexts/execution/mandated-lines.md +1 -1
- package/dist/agent-src/contexts/execution/non-interactive-contract.md +1 -1
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +1 -1
- package/dist/agent-src/contexts/execution/plan-confidence-gate.md +5 -5
- package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +1 -1
- package/dist/agent-src/contexts/execution/subagent-modes-detail.md +1 -1
- package/dist/agent-src/contexts/execution/subagent-routing.md +2 -2
- package/dist/agent-src/contexts/execution/subagent-spawn-contract.md +1 -1
- package/dist/agent-src/contexts/execution/user-memory-channels.md +3 -3
- package/dist/agent-src/contexts/execution/verification-mechanics.md +1 -1
- package/dist/agent-src/contexts/judges/persona-voice-rubric.md +2 -2
- package/dist/agent-src/guidelines/abstraction-thresholds.md +88 -0
- package/dist/agent-src/guidelines/agent-infra/5w2h-analysis.md +260 -0
- package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +99 -0
- package/dist/agent-src/guidelines/agent-infra/agent-interaction-and-decision-quality.md +325 -0
- package/dist/agent-src/guidelines/agent-infra/api-cost-levers.md +177 -0
- package/dist/agent-src/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +222 -0
- package/dist/agent-src/guidelines/agent-infra/ask-when-uncertain-demos.md +134 -0
- package/dist/agent-src/guidelines/agent-infra/asking-and-brevity-examples.md +198 -0
- package/dist/agent-src/guidelines/agent-infra/break-glass-usage.md +113 -0
- package/dist/agent-src/guidelines/agent-infra/carve-out-predicates.md +17 -0
- package/dist/agent-src/guidelines/agent-infra/comparison-matrix.md +179 -0
- package/dist/agent-src/guidelines/agent-infra/context-hygiene-mechanics.md +165 -0
- package/dist/agent-src/guidelines/agent-infra/corpus-grounding-authoring.md +91 -0
- package/dist/agent-src/guidelines/agent-infra/critical-thinking.md +156 -0
- package/dist/agent-src/guidelines/agent-infra/cross-source-consistency-mechanics.md +109 -0
- package/dist/agent-src/guidelines/agent-infra/developer-judgment.md +82 -0
- package/dist/agent-src/guidelines/agent-infra/direct-answers-demos.md +142 -0
- package/dist/agent-src/guidelines/agent-infra/domain-adoption-gates.md +112 -0
- package/dist/agent-src/guidelines/agent-infra/domain-eval-anti-pattern.md +53 -0
- package/dist/agent-src/guidelines/agent-infra/domain-pack-architecture.md +56 -0
- package/dist/agent-src/guidelines/agent-infra/downstream-changes-mechanics.md +91 -0
- package/dist/agent-src/guidelines/agent-infra/emphasis-budget.md +45 -0
- package/dist/agent-src/guidelines/agent-infra/engineering-memory-data-format.md +210 -0
- package/dist/agent-src/guidelines/agent-infra/evaluator-independence-mechanics.md +92 -0
- package/dist/agent-src/guidelines/agent-infra/existence-question-verdicts.md +80 -0
- package/dist/agent-src/guidelines/agent-infra/failure-signatures.md +70 -0
- package/dist/agent-src/guidelines/agent-infra/false-green.md +233 -0
- package/dist/agent-src/guidelines/agent-infra/first-principles.md +192 -0
- package/dist/agent-src/guidelines/agent-infra/framework-neutrality-patterns.md +66 -0
- package/dist/agent-src/guidelines/agent-infra/frontier-reasoning-operating-profile.md +169 -0
- package/dist/agent-src/guidelines/agent-infra/gate-authoring.md +177 -0
- package/dist/agent-src/guidelines/agent-infra/guarded-baseline.md +39 -0
- package/dist/agent-src/guidelines/agent-infra/installed-tools-manifest.md +142 -0
- package/dist/agent-src/guidelines/agent-infra/inversion-thinking.md +388 -0
- package/dist/agent-src/guidelines/agent-infra/ios-simulator-guide.md +378 -0
- package/dist/agent-src/guidelines/agent-infra/language-and-tone-examples.md +141 -0
- package/dist/agent-src/guidelines/agent-infra/layered-settings.md +317 -0
- package/dist/agent-src/guidelines/agent-infra/linked-projects-onboarding-gate.md +80 -0
- package/dist/agent-src/guidelines/agent-infra/mcp-request-signing.md +197 -0
- package/dist/agent-src/guidelines/agent-infra/memory-access.md +149 -0
- package/dist/agent-src/guidelines/agent-infra/mental-models.md +314 -0
- package/dist/agent-src/guidelines/agent-infra/minimal-safe-diff-mechanics.md +241 -0
- package/dist/agent-src/guidelines/agent-infra/missing-tool-handling.md +66 -0
- package/dist/agent-src/guidelines/agent-infra/model-recommendation.md +101 -0
- package/dist/agent-src/guidelines/agent-infra/naming.md +69 -0
- package/dist/agent-src/guidelines/agent-infra/notes-horizon-mechanics.md +90 -0
- package/dist/agent-src/guidelines/agent-infra/output-patterns.md +117 -0
- package/dist/agent-src/guidelines/agent-infra/recurring-criticism-mechanics.md +96 -0
- package/dist/agent-src/guidelines/agent-infra/reuse-verdict-mechanics.md +71 -0
- package/dist/agent-src/guidelines/agent-infra/review-routing-data-format.md +143 -0
- package/dist/agent-src/guidelines/agent-infra/roadmap-deferred-resolution-provenance.md +54 -0
- package/dist/agent-src/guidelines/agent-infra/roadmap-progress-mechanics.md +274 -0
- package/dist/agent-src/guidelines/agent-infra/role-contracts.md +209 -0
- package/dist/agent-src/guidelines/agent-infra/role-mode-router.md +89 -0
- package/dist/agent-src/guidelines/agent-infra/rule-body-migration-inventory.md +241 -0
- package/dist/agent-src/guidelines/agent-infra/rule-type-governance.md +73 -0
- package/dist/agent-src/guidelines/agent-infra/runtime-layer.md +89 -0
- package/dist/agent-src/guidelines/agent-infra/scqa-framework.md +526 -0
- package/dist/agent-src/guidelines/agent-infra/security-lint-containment.md +121 -0
- package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +134 -0
- package/dist/agent-src/guidelines/agent-infra/simplicity-and-goal-demos.md +211 -0
- package/dist/agent-src/guidelines/agent-infra/six-hats.md +353 -0
- package/dist/agent-src/guidelines/agent-infra/size-and-scope.md +229 -0
- package/dist/agent-src/guidelines/agent-infra/skill-quality-checklist.md +157 -0
- package/dist/agent-src/guidelines/agent-infra/source-confidentiality-mechanics.md +109 -0
- package/dist/agent-src/guidelines/agent-infra/symptom-driven-harvest-loop.md +104 -0
- package/dist/agent-src/guidelines/agent-infra/systems-thinking.md +220 -0
- package/dist/agent-src/guidelines/agent-infra/tool-description-as-policy.md +35 -0
- package/dist/agent-src/guidelines/agent-infra/tool-integration.md +73 -0
- package/dist/agent-src/guidelines/agent-infra/traceability-field-mechanics.md +50 -0
- package/dist/agent-src/guidelines/agent-infra/untrusted-input-spotlighting.md +166 -0
- package/dist/agent-src/guidelines/agent-infra/verify-before-complete-demos.md +128 -0
- package/dist/agent-src/guidelines/augment-portability-patterns.md +70 -0
- package/dist/agent-src/guidelines/code-clarity.md +350 -0
- package/dist/agent-src/guidelines/component-oriented-and-oop-development.md +189 -0
- package/dist/agent-src/guidelines/cross-role-handoff.md +127 -0
- package/dist/agent-src/guidelines/design-antipatterns-triggers.json +18 -0
- package/dist/agent-src/guidelines/design-antipatterns.md +327 -0
- package/dist/agent-src/guidelines/design-asset-discipline.md +38 -0
- package/dist/agent-src/guidelines/design-canon.md +63 -0
- package/dist/agent-src/guidelines/design-fidelity-mechanics.md +293 -0
- package/dist/agent-src/guidelines/design-fidelity-routing.md +78 -0
- package/dist/agent-src/guidelines/design-handover-extraction.md +117 -0
- package/dist/agent-src/guidelines/design-modes.md +143 -0
- package/dist/agent-src/guidelines/design-reconciliation.md +172 -0
- package/dist/agent-src/guidelines/docs/readme-size-and-splitting.md +209 -0
- package/dist/agent-src/guidelines/e2e/playwright.md +363 -0
- package/dist/agent-src/guidelines/gtm-handoff.md +114 -0
- package/dist/agent-src/guidelines/monorepo-antipatterns.md +141 -0
- package/dist/agent-src/guidelines/php/api-design.md +115 -0
- package/dist/agent-src/guidelines/php/artisan-commands.md +81 -0
- package/dist/agent-src/guidelines/php/blade-ui.md +78 -0
- package/dist/agent-src/guidelines/php/controllers.md +90 -0
- package/dist/agent-src/guidelines/php/database.md +194 -0
- package/dist/agent-src/guidelines/php/eloquent.md +208 -0
- package/dist/agent-src/guidelines/php/flux.md +80 -0
- package/dist/agent-src/guidelines/php/general.md +207 -0
- package/dist/agent-src/guidelines/php/git.md +164 -0
- package/dist/agent-src/guidelines/php/jobs.md +111 -0
- package/dist/agent-src/guidelines/php/livewire.md +71 -0
- package/dist/agent-src/guidelines/php/logging.md +79 -0
- package/dist/agent-src/guidelines/php/naming.md +89 -0
- package/dist/agent-src/guidelines/php/patterns/dependency-injection.md +57 -0
- package/dist/agent-src/guidelines/php/patterns/dtos.md +199 -0
- package/dist/agent-src/guidelines/php/patterns/events.md +67 -0
- package/dist/agent-src/guidelines/php/patterns/factory.md +53 -0
- package/dist/agent-src/guidelines/php/patterns/pipelines.md +66 -0
- package/dist/agent-src/guidelines/php/patterns/policies.md +66 -0
- package/dist/agent-src/guidelines/php/patterns/repositories.md +122 -0
- package/dist/agent-src/guidelines/php/patterns/service-layer.md +64 -0
- package/dist/agent-src/guidelines/php/patterns/strategy.md +247 -0
- package/dist/agent-src/guidelines/php/patterns.md +28 -0
- package/dist/agent-src/guidelines/php/performance.md +92 -0
- package/dist/agent-src/guidelines/php/php-coding-patterns.md +80 -0
- package/dist/agent-src/guidelines/php/resources.md +100 -0
- package/dist/agent-src/guidelines/php/security.md +110 -0
- package/dist/agent-src/guidelines/php/sql.md +97 -0
- package/dist/agent-src/guidelines/php/validations.md +119 -0
- package/dist/agent-src/guidelines/php/websocket.md +100 -0
- package/dist/agent-src/guidelines/prompt-templates.md +189 -0
- package/dist/agent-src/guidelines/redundancy-taxonomy.md +208 -0
- package/dist/agent-src/guidelines/wing4-handoff.md +127 -0
- package/dist/agent-src/personas/README.md +1 -1
- package/dist/agent-src/personas/_template-specialist/persona.md +1 -1
- package/dist/agent-src/personas/product-owner.md +1 -1
- package/dist/agent-src/rules/active-remediation.md +1 -1
- package/dist/agent-src/rules/architecture.md +2 -2
- package/dist/agent-src/rules/artifact-drafting-protocol.md +1 -1
- package/dist/agent-src/rules/ask-when-uncertain.md +2 -2
- package/dist/agent-src/rules/brand-source-of-truth.md +9 -7
- package/dist/agent-src/rules/code-comment-discipline.md +2 -2
- package/dist/agent-src/rules/code-provenance.md +1 -1
- package/dist/agent-src/rules/content-quoting-floor.md +1 -1
- package/dist/agent-src/rules/context-hygiene.md +5 -5
- package/dist/agent-src/rules/cross-source-consistency.md +1 -1
- package/dist/agent-src/rules/design-fidelity.md +36 -46
- package/dist/agent-src/rules/direct-answers.md +2 -2
- package/dist/agent-src/rules/domain-adoption-policy.md +1 -1
- package/dist/agent-src/rules/evaluator-independence.md +1 -1
- package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +1 -1
- package/dist/agent-src/rules/icon-consistency.md +5 -1
- package/dist/agent-src/rules/improve-before-implement.md +1 -1
- package/dist/agent-src/rules/language-and-tone.md +3 -3
- package/dist/agent-src/rules/minimal-safe-diff.md +1 -1
- package/dist/agent-src/rules/notes-first-reasoning.md +2 -2
- package/dist/agent-src/rules/recurring-criticism.md +1 -1
- package/dist/agent-src/rules/roadmap-progress-sync.md +1 -1
- package/dist/agent-src/rules/role-mode-adherence.md +2 -2
- package/dist/agent-src/rules/security-sensitive-stop.md +1 -1
- package/dist/agent-src/rules/size-enforcement.md +1 -1
- package/dist/agent-src/rules/source-confidentiality.md +2 -2
- package/dist/agent-src/rules/think-before-action.md +1 -1
- package/dist/agent-src/rules/token-efficiency.md +7 -5
- package/dist/agent-src/rules/ui-audit-gate.md +3 -2
- package/dist/agent-src/rules/untrusted-input-defense.md +3 -3
- package/dist/agent-src/rules/user-interaction.md +31 -30
- package/dist/agent-src/skills/activation-design/SKILL.md +2 -2
- package/dist/agent-src/skills/adr-create/SKILL.md +5 -5
- package/dist/agent-src/skills/ai-council/SKILL.md +1 -1
- package/dist/agent-src/skills/ai-council/references/advanced-modes.md +1 -1
- package/dist/agent-src/skills/blade-ui/SKILL.md +1 -1
- package/dist/agent-src/skills/blast-radius-analyzer/SKILL.md +1 -1
- package/dist/agent-src/skills/brand-to-tokens/SKILL.md +24 -3
- package/dist/agent-src/skills/bug-analyzer/SKILL.md +1 -1
- package/dist/agent-src/skills/build-buy-partner/SKILL.md +1 -1
- package/dist/agent-src/skills/churn-prevention/SKILL.md +2 -2
- package/dist/agent-src/skills/code-refactoring/SKILL.md +3 -3
- package/dist/agent-src/skills/code-review/SKILL.md +3 -3
- package/dist/agent-src/skills/command-writing/SKILL.md +3 -3
- package/dist/agent-src/skills/comp-banding/SKILL.md +1 -1
- package/dist/agent-src/skills/competitive-moat-analysis/SKILL.md +1 -1
- package/dist/agent-src/skills/competitive-positioning/SKILL.md +2 -2
- package/dist/agent-src/skills/complexity-first-planning/SKILL.md +1 -1
- package/dist/agent-src/skills/condense-memory/SKILL.md +1 -1
- package/dist/agent-src/skills/content-funnel-design/SKILL.md +2 -2
- package/dist/agent-src/skills/contracts-cognition/SKILL.md +1 -1
- package/dist/agent-src/skills/copilot-agents-optimization/SKILL.md +2 -2
- package/dist/agent-src/skills/corpus-grounding/SKILL.md +2 -2
- package/dist/agent-src/skills/customer-research/SKILL.md +2 -2
- package/dist/agent-src/skills/dashboard-design/SKILL.md +1 -1
- package/dist/agent-src/skills/data-handling-judgment/SKILL.md +1 -1
- package/dist/agent-src/skills/deal-qualification-meddic/SKILL.md +2 -2
- package/dist/agent-src/skills/decision-record/SKILL.md +3 -3
- package/dist/agent-src/skills/decision-review/SKILL.md +8 -8
- package/dist/agent-src/skills/deep-reading-analyst/SKILL.md +22 -22
- package/dist/agent-src/skills/design-intelligence/SKILL.md +4 -4
- package/dist/agent-src/skills/design-intelligence/references/context-and-registers.md +2 -2
- package/dist/agent-src/skills/design-review/SKILL.md +4 -4
- package/dist/agent-src/skills/design-system-capture/references/design-system-json.md +20 -1
- package/dist/agent-src/skills/design-tokens/SKILL.md +17 -2
- package/dist/agent-src/skills/design-variations/SKILL.md +2 -2
- package/dist/agent-src/skills/developer-like-execution/SKILL.md +2 -2
- package/dist/agent-src/skills/discovery-interview/SKILL.md +2 -2
- package/dist/agent-src/skills/doc-coauthoring/SKILL.md +3 -3
- package/dist/agent-src/skills/editorial-calendar/SKILL.md +2 -2
- package/dist/agent-src/skills/error-handling-patterns/SKILL.md +9 -0
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +44 -1
- package/dist/agent-src/skills/existing-ui-audit/references/anti-slop-cross-reference.md +2 -2
- package/dist/agent-src/skills/expansion-playbook/SKILL.md +2 -2
- package/dist/agent-src/skills/experiment-loop/SKILL.md +1 -1
- package/dist/agent-src/skills/experiment-loop/references/protocol.md +1 -1
- package/dist/agent-src/skills/fe-design/SKILL.md +3 -3
- package/dist/agent-src/skills/fe-design/references/design-patterns.md +1 -1
- package/dist/agent-src/skills/fe-design/references/design-read-and-memory.md +3 -3
- package/dist/agent-src/skills/fe-design/references/source-led-port.md +1 -1
- package/dist/agent-src/skills/feature-planning/SKILL.md +1 -1
- package/dist/agent-src/skills/flux/SKILL.md +1 -1
- package/dist/agent-src/skills/forecast-accuracy/SKILL.md +2 -2
- package/dist/agent-src/skills/forecasting/SKILL.md +2 -2
- package/dist/agent-src/skills/fundraising-narrative/SKILL.md +2 -2
- package/dist/agent-src/skills/funnel-analysis/SKILL.md +2 -2
- package/dist/agent-src/skills/gtm-launch/SKILL.md +2 -2
- package/dist/agent-src/skills/hiring-loop-design/SKILL.md +1 -1
- package/dist/agent-src/skills/html-deck/SKILL.md +5 -5
- package/dist/agent-src/skills/humanizer/SKILL.md +1 -1
- package/dist/agent-src/skills/humanizer/data/patterns.md +1 -1
- package/dist/agent-src/skills/iconography/SKILL.md +3 -3
- package/dist/agent-src/skills/judge-synthesis/SKILL.md +1 -1
- package/dist/agent-src/skills/laravel-api-endpoint/SKILL.md +2 -2
- package/dist/agent-src/skills/launch-readiness/SKILL.md +3 -3
- package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +6 -6
- package/dist/agent-src/skills/livewire/SKILL.md +1 -1
- package/dist/agent-src/skills/market-entry-analysis/SKILL.md +1 -1
- package/dist/agent-src/skills/mcp-builder/SKILL.md +1 -1
- package/dist/agent-src/skills/memory-consolidation/SKILL.md +3 -3
- package/dist/agent-src/skills/messaging-architecture/SKILL.md +2 -2
- package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
- package/dist/agent-src/skills/onboarding-design/SKILL.md +2 -2
- package/dist/agent-src/skills/onboarding-program/SKILL.md +1 -1
- package/dist/agent-src/skills/one-on-one-cadence/SKILL.md +1 -1
- package/dist/agent-src/skills/org-design/SKILL.md +1 -1
- package/dist/agent-src/skills/overbuild-review-lens/SKILL.md +3 -3
- package/dist/agent-src/skills/override-management/SKILL.md +1 -1
- package/dist/agent-src/skills/perf-feedback-craft/SKILL.md +1 -1
- package/dist/agent-src/skills/persona-writing/SKILL.md +1 -1
- package/dist/agent-src/skills/php-coder/SKILL.md +1 -1
- package/dist/agent-src/skills/pipeline-strategy/SKILL.md +2 -2
- package/dist/agent-src/skills/playwright-testing/SKILL.md +3 -3
- package/dist/agent-src/skills/po-discovery/SKILL.md +1 -1
- package/dist/agent-src/skills/positioning-strategy/SKILL.md +2 -2
- package/dist/agent-src/skills/privacy-review/SKILL.md +1 -1
- package/dist/agent-src/skills/prompt-optimizer/SKILL.md +3 -3
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +1 -1
- package/dist/agent-src/skills/reasoning-orchestrator/SKILL.md +2 -2
- package/dist/agent-src/skills/receiving-code-review/SKILL.md +1 -1
- package/dist/agent-src/skills/refine-ticket/SKILL.md +2 -2
- package/dist/agent-src/skills/release-comms/SKILL.md +2 -2
- package/dist/agent-src/skills/retention-loops/SKILL.md +2 -2
- package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
- package/dist/agent-src/skills/roadmap-management/SKILL.md +1 -1
- package/dist/agent-src/skills/roadmap-management/references/archival.md +1 -1
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +5 -5
- package/dist/agent-src/skills/rule-writing/SKILL.md +6 -6
- package/dist/agent-src/skills/runway-cognition/SKILL.md +2 -2
- package/dist/agent-src/skills/scenario-modeling/SKILL.md +2 -2
- package/dist/agent-src/skills/skill-writing/SKILL.md +2 -2
- package/dist/agent-src/skills/skill-writing/references/procedure.md +1 -1
- package/dist/agent-src/skills/skill-writing/references/section-patterns.md +3 -3
- package/dist/agent-src/skills/spreadsheet-authoring/SKILL.md +1 -1
- package/dist/agent-src/skills/stakeholder-tradeoff/SKILL.md +3 -3
- package/dist/agent-src/skills/subagent-orchestration/SKILL.md +1 -1
- package/dist/agent-src/skills/supply-chain-intake/SKILL.md +1 -1
- package/dist/agent-src/skills/systematic-debugging/SKILL.md +2 -2
- package/dist/agent-src/skills/tailwind-engineer/SKILL.md +11 -5
- package/dist/agent-src/skills/throughput-vs-morale-tradeoff/SKILL.md +1 -1
- package/dist/agent-src/skills/token-optimizer/SKILL.md +1 -1
- package/dist/agent-src/skills/typography-system/SKILL.md +2 -2
- package/dist/agent-src/skills/ui-component-architect/SKILL.md +28 -8
- package/dist/agent-src/skills/unit-economics-modeling/SKILL.md +2 -2
- package/dist/agent-src/skills/upstream-contribute/SKILL.md +1 -1
- package/dist/agent-src/skills/validate-feature-fit/SKILL.md +2 -2
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +2 -2
- package/dist/agent-src/skills/vision-articulation/SKILL.md +1 -1
- package/dist/agent-src/skills/voc-extract/SKILL.md +2 -2
- package/dist/agent-src/skills/voice-and-tone-design/SKILL.md +2 -2
- package/dist/agent-src/skills/wireframe/SKILL.md +1 -1
- package/dist/agent-src/skills/workspace-link/SKILL.md +1 -1
- package/dist/agent-src/templates/agent-settings.md +6 -6
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/contexts/knowledge-pages.md +2 -3
- package/dist/agent-src/templates/copilot-instructions.md +1 -1
- package/dist/agent-src/templates/roadmaps.md +1 -1
- package/dist/agent-src/templates/scripts/README.md +2 -2
- package/dist/agent-src/user-types/_template/user-type.md +1 -1
- package/dist/cli-delegate/check_update_banner.js +12 -1
- package/dist/cli-delegate/{chunk-NLP54U3J.js → chunk-2XY7ILBT.js} +13 -1
- package/dist/cli-delegate/{chunk-IAI3XL43.js → chunk-3FKR64R5.js} +22 -6
- package/dist/cli-delegate/{chunk-J3RFNKG4.js → chunk-55ACLDUE.js} +2 -2
- package/dist/cli-delegate/{chunk-PKOBQADP.js → chunk-57PN4GYJ.js} +1 -1
- package/dist/cli-delegate/{chunk-KCNTUSPI.js → chunk-AK6HODNQ.js} +4 -4
- package/dist/cli-delegate/{chunk-2FTMENJL.js → chunk-GYC3VRYN.js} +1 -1
- package/dist/cli-delegate/{chunk-LWTYTX6F.js → chunk-H32DGUJH.js} +15 -84
- package/dist/cli-delegate/{chunk-6RJA2F5A.js → chunk-IVBPRCQO.js} +1 -1
- package/dist/cli-delegate/chunk-NUHLI2RX.js +80 -0
- package/dist/cli-delegate/{chunk-TYSY33MD.js → chunk-QJWAUMJW.js} +12 -2
- package/dist/cli-delegate/{chunk-2KKXJW25.js → chunk-S3VFXMTM.js} +1 -1
- package/dist/cli-delegate/{chunk-I6RHFQEG.js → chunk-YUM5KURG.js} +17 -1
- package/dist/cli-delegate/cmd_analyze_session.js +1 -1
- package/dist/cli-delegate/cmd_brand_status.js +1 -1
- package/dist/cli-delegate/cmd_conformance.js +834 -275
- package/dist/cli-delegate/cmd_doctor.js +3 -3
- package/dist/cli-delegate/cmd_explain.js +5 -3
- package/dist/cli-delegate/cmd_export.js +4 -4
- package/dist/cli-delegate/cmd_handoff.js +6 -6
- package/dist/cli-delegate/cmd_mcp_available.js +1 -1
- package/dist/cli-delegate/cmd_memory_get.js +1 -1
- package/dist/cli-delegate/cmd_migrate.js +2 -2
- package/dist/cli-delegate/cmd_packs_active.js +3 -2
- package/dist/cli-delegate/cmd_prune.js +4 -4
- package/dist/cli-delegate/cmd_route_audit.js +3 -3
- package/dist/cli-delegate/cmd_route_explain.js +1 -1
- package/dist/cli-delegate/cmd_session_recycle.js +3 -3
- package/dist/cli-delegate/cmd_settings_get.js +15 -9
- package/dist/cli-delegate/cmd_settings_migrate.js +4 -4
- package/dist/cli-delegate/cmd_settings_set.js +54 -11
- package/dist/cli-delegate/cmd_sync.js +4 -4
- package/dist/cli-delegate/cmd_uninstall.js +4 -4
- package/dist/cli-delegate/cmd_update.js +1 -1
- package/dist/cli-delegate/cmd_upgrade.js +1 -1
- package/dist/cli-delegate/cmd_validate.js +4 -4
- package/dist/cli-delegate/cmd_versions.js +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +25 -78
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +3 -3
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +5 -7
- package/dist/discovery/trust-report.md +2 -2
- package/dist/discovery/workspaces.json +4 -6
- package/dist/hooks/dispatch.js +9684 -9304
- package/dist/install/install.mjs +36 -8
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +2147 -1470
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/agent_settings.js +73 -0
- package/dist/scripts/_lib/agent_src.js +20 -0
- package/dist/scripts/_lib/guidelines_lane.js +158 -0
- package/dist/scripts/_lib/installed_lock.js +1 -1
- package/dist/scripts/condense.js +2 -5
- package/dist/server/io/yamlIO.js +175 -17
- package/dist/server/schemas/settings.js +18 -4
- package/dist/shared/settingsSurface.js +6 -1
- package/docs/contracts/settings-classes.md +18 -9
- package/docs/guidelines/abstraction-thresholds.md +35 -0
- package/docs/guidelines/agent-infra/active-remediation-mechanics.md +3 -3
- package/docs/guidelines/agent-infra/false-green.md +2 -2
- package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
- package/docs/guidelines/agent-infra/skill-quality-checklist.md +1 -1
- package/docs/guidelines/design-fidelity-mechanics.md +4 -0
- package/docs/guidelines/design-fidelity-routing.md +78 -0
- package/docs/guidelines/design-reconciliation.md +172 -0
- package/docs/guidelines/gtm-handoff.md +2 -2
- package/docs/guidelines/wing4-handoff.md +2 -2
- package/package.json +7 -3
- package/src/config/agent-settings.template.yml +55 -8
- package/src/config/ci-local-parity.yml +34 -0
- package/src/config/continuity-surface.json +11 -32
- package/src/config/gate-coverage.yml +31 -8
- package/src/config/gate-reachability-exemptions.json +1 -0
- package/src/config/gate-violation-baselines.json +3 -3
- package/src/config/hook-token-budget.json +1 -1
- package/src/config/host-injection-effect.json +2 -2
- package/src/config/pack-size-budget.json +55 -4
- package/src/config/platform-anchor.json +47 -0
- package/src/config/preamble-payload-budget.json +12 -8
- package/src/config/preamble-payload-exceptions.json +28 -0
- package/src/config/publish-surface.json +4 -2
- package/src/config/ratification-policy.json +7 -0
- package/src/config/rule-stub-ceilings.json +16 -9
- package/src/scripts/_cli/cmd_settings_get.ts +22 -7
- package/src/scripts/_dispatch.bash +3 -1
- package/src/scripts/_lib/agent_settings.ts +85 -0
- package/src/scripts/_lib/agent_src.ts +21 -0
- package/src/scripts/_lib/artifact_maturity.ts +242 -0
- package/src/scripts/_lib/base_ref_payload.ts +315 -0
- package/src/scripts/_lib/conformance_report.ts +403 -0
- package/src/scripts/_lib/continuity_writer.ts +72 -13
- package/src/scripts/_lib/design_system_import.ts +20 -0
- package/src/scripts/_lib/design_tolerance.ts +281 -0
- package/src/scripts/_lib/dropped_decision.ts +142 -0
- package/src/scripts/_lib/guidelines_lane.ts +164 -0
- package/src/scripts/_lib/installed_lock.ts +1 -1
- package/src/scripts/_lib/measured_payload_ceiling.ts +424 -0
- package/src/scripts/_lib/obligation_frequency.ts +2 -3
- package/src/scripts/_lib/payload_catalogue_completeness.ts +211 -0
- package/src/scripts/_lib/platform_anchor.ts +1053 -0
- package/src/scripts/_lib/ratification_artifact.ts +278 -0
- package/src/scripts/_lib/release_findings_ingest.ts +324 -0
- package/src/scripts/_lib/release_tag_dispatch.ts +63 -0
- package/src/scripts/_lib/review_baseline.ts +254 -0
- package/src/scripts/_lib/review_skipped_record.ts +61 -1
- package/src/scripts/_lib/security_lint.ts +23 -2
- package/src/scripts/_lib/self_repair.ts +21 -0
- package/src/scripts/_lib/session_index_trust.ts +42 -1
- package/src/scripts/_lib/standing_bound_ratchet.ts +267 -88
- package/src/scripts/_lib/tolerance_shadow.ts +177 -0
- package/src/scripts/_lib/turn_end_refusals.ts +51 -4
- package/src/scripts/ai_council/redact_low_impact_entry.ts +8 -0
- package/src/scripts/autonomy_friction_traffic.ts +379 -0
- package/src/scripts/check_beta_review_markers.ts +35 -4
- package/src/scripts/check_finding_dispositions.ts +167 -16
- package/src/scripts/check_held_object_arrivals.ts +381 -0
- package/src/scripts/check_kernel_edit_ratified.ts +462 -0
- package/src/scripts/check_loss_class_declared.ts +793 -46
- package/src/scripts/check_platform_anchor.ts +390 -0
- package/src/scripts/check_preamble_payload_budget.ts +672 -107
- package/src/scripts/check_projected_rule_routes.ts +395 -0
- package/src/scripts/check_release_published.ts +1 -1
- package/src/scripts/check_reply_consistency.ts +86 -17
- package/src/scripts/code_graph/cli.ts +6 -0
- package/src/scripts/condense.ts +2 -6
- package/src/scripts/generate_host_cost_table.ts +354 -0
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +74 -30
- package/src/scripts/hooks/block_kernel_rule_writes.ts +12 -2
- package/src/scripts/hooks/category_a.ts +1 -1
- package/src/scripts/hooks/chain_nudge_hook.ts +311 -25
- package/src/scripts/hooks/concern_registry.ts +2 -0
- package/src/scripts/hooks/end_review_nudge_hook.ts +101 -21
- package/src/scripts/hooks/review_baseline_hook.ts +130 -0
- package/src/scripts/hooks/session_eol_hook.ts +68 -154
- package/src/scripts/hooks/source_first_gate_hook.ts +12 -0
- package/src/scripts/hooks/turn_end_gate_hook.ts +232 -14
- package/src/scripts/hooks/ui_route_nudge_hook.ts +52 -15
- package/src/scripts/hooks_doctor.ts +4 -1
- package/src/scripts/hot_context_hook.ts +41 -401
- package/src/scripts/install.ts +1 -1
- package/src/scripts/interruption_report.ts +8 -2
- package/src/scripts/janitor.ts +8 -1
- package/src/scripts/lint_evidence_artifacts.ts +1 -0
- package/src/scripts/lint_knowledge_scale.ts +0 -26
- package/src/scripts/measure_turn_end_gate.ts +302 -5
- package/src/scripts/memory_lookup.ts +9 -9
- package/src/scripts/release.ts +52 -64
- package/src/scripts/release_drill.ts +193 -14
- package/src/scripts/release_env.ts +1 -1
- package/src/scripts/release_publication.ts +1 -1
- package/src/scripts/report_held_object_arrivals.ts +456 -0
- package/src/scripts/report_standing_payload_by_host.ts +7 -7
- package/src/scripts/session_memory_index.ts +5 -0
- package/src/scripts/sync_agent_settings.ts +394 -12
- package/src/server/io/yamlIO.ts +175 -17
- package/src/server/schemas/settings.ts +25 -5
- package/src/shared/settingsSurface.ts +13 -2
- package/src/templates/compact-instructions.md +8 -3
- package/dist/agent-src/commands/chat-history/import.md +0 -170
- package/dist/agent-src/commands/chat-history.md +0 -63
package/src/server/io/yamlIO.ts
CHANGED
|
@@ -40,6 +40,25 @@ function formatScalar(value: unknown): string {
|
|
|
40
40
|
return yamlDump(value, { lineWidth: -1, flowLevel: 0 }).replace(/\n$/, '').trim();
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
+
/**
|
|
44
|
+
* A NESTED mapping key, as both the presence probe and the insertion walk read
|
|
45
|
+
* one. Shared so the writer and its own existence-probe cannot drift apart —
|
|
46
|
+
* that drift is the shape this file has now hit four times.
|
|
47
|
+
*
|
|
48
|
+
* `-` is in the class because a dashed key is ordinary YAML (`first-name`,
|
|
49
|
+
* `dry-run`, `retry-count`) and `detectIndentWidth` already accepted one.
|
|
50
|
+
* While this pattern did not, `findScalarLine` could never find such a key:
|
|
51
|
+
* `mergeIntoTemplate` then wrote a bogus top-level `x.first-principles:` line
|
|
52
|
+
* beside the real nested one and the intended value was never written — a save
|
|
53
|
+
* that silently did nothing — and `upsertScalar` appended another child line on
|
|
54
|
+
* EVERY call, growing without bound until the file stopped parsing.
|
|
55
|
+
*
|
|
56
|
+
* `.` stays OUT, deliberately. A dotted key is the FLAT form, which
|
|
57
|
+
* `replaceFlatDottedKey` owns; letting this pattern match `a.b:` would make the
|
|
58
|
+
* nested probe claim a line that is one key literally named "a.b".
|
|
59
|
+
*/
|
|
60
|
+
const NESTED_KEY_RE = /^([A-Za-z_][A-Za-z0-9_-]*)\s*:/;
|
|
61
|
+
|
|
43
62
|
interface FlatEntry {
|
|
44
63
|
path: string[];
|
|
45
64
|
value: unknown;
|
|
@@ -68,6 +87,25 @@ export function replaceScalar(template: string, dottedPath: string[], value: unk
|
|
|
68
87
|
const key = dottedPath[dottedPath.length - 1];
|
|
69
88
|
|
|
70
89
|
const lines = template.split('\n');
|
|
90
|
+
const at = findScalarLine(lines, sections, key);
|
|
91
|
+
if (at === -1) return template;
|
|
92
|
+
const width = detectIndentWidth(lines);
|
|
93
|
+
lines[at] = `${' '.repeat(width * sections.length)}${key}: ${formatScalar(value)}`;
|
|
94
|
+
return lines.join('\n');
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Index of the line holding the scalar at `sections`/`key`, or -1.
|
|
99
|
+
*
|
|
100
|
+
* Split out of `replaceScalar` so that "is this path present?" is answerable
|
|
101
|
+
* WITHOUT writing. `mergeIntoTemplate` used to infer presence from
|
|
102
|
+
* `replaceScalar` returning a changed string, which conflates "absent" with
|
|
103
|
+
* "present and already equal to the value being written" — under that test a
|
|
104
|
+
* no-op write reads as a miss and the caller appends a duplicate mapping key.
|
|
105
|
+
* A presence question answered by a mutation's side effect is the shape to
|
|
106
|
+
* look for here; the file already carries two earlier rounds of it.
|
|
107
|
+
*/
|
|
108
|
+
function findScalarLine(lines: readonly string[], sections: readonly string[], key: string | undefined): number {
|
|
71
109
|
// The document's own width, the same read `upsertScalar` performs.
|
|
72
110
|
//
|
|
73
111
|
// R2 round 5, finding 1, and it is the second half of round 4's finding 7.
|
|
@@ -84,9 +122,7 @@ export function replaceScalar(template: string, dottedPath: string[], value: unk
|
|
|
84
122
|
// A writer and its own existence-probe disagreeing about the format is the
|
|
85
123
|
// shape to look for whenever one of a pair is taught something new.
|
|
86
124
|
const width = detectIndentWidth(lines);
|
|
87
|
-
const targetIndent = ' '.repeat(width * sections.length);
|
|
88
125
|
const currentPath: (string | null)[] = new Array<string | null>(sections.length).fill(null);
|
|
89
|
-
const formatted = formatScalar(value);
|
|
90
126
|
|
|
91
127
|
for (let i = 0; i < lines.length; i++) {
|
|
92
128
|
const line = lines[i];
|
|
@@ -98,7 +134,7 @@ export function replaceScalar(template: string, dottedPath: string[], value: unk
|
|
|
98
134
|
const level = indentLen / width;
|
|
99
135
|
if (level > sections.length) continue;
|
|
100
136
|
|
|
101
|
-
const m =
|
|
137
|
+
const m = NESTED_KEY_RE.exec(stripped);
|
|
102
138
|
if (!m) continue;
|
|
103
139
|
const lineKey = m[1];
|
|
104
140
|
if (lineKey === undefined) continue;
|
|
@@ -115,10 +151,9 @@ export function replaceScalar(template: string, dottedPath: string[], value: unk
|
|
|
115
151
|
const parentsMatch = sections.every((s, idx) => currentPath[idx] === s);
|
|
116
152
|
if (!parentsMatch) continue;
|
|
117
153
|
if (lineKey !== key) continue;
|
|
118
|
-
|
|
119
|
-
return lines.join('\n');
|
|
154
|
+
return i;
|
|
120
155
|
}
|
|
121
|
-
return
|
|
156
|
+
return -1;
|
|
122
157
|
}
|
|
123
158
|
|
|
124
159
|
/**
|
|
@@ -182,11 +217,21 @@ export function detectIndentWidth(lines: readonly string[]): number {
|
|
|
182
217
|
*/
|
|
183
218
|
export function upsertScalar(template: string, dottedPath: string[], value: unknown): string {
|
|
184
219
|
if (dottedPath.length === 0) return template;
|
|
185
|
-
const replaced = replaceScalar(template, dottedPath, value);
|
|
186
|
-
if (replaced !== template) return replaced;
|
|
187
|
-
|
|
188
220
|
const sections = dottedPath.slice(0, -1);
|
|
189
221
|
const key = dottedPath[dottedPath.length - 1] as string;
|
|
222
|
+
|
|
223
|
+
// Presence is asked, never inferred from the write changing the text. The
|
|
224
|
+
// string compare that used to stand here read "key already holds this
|
|
225
|
+
// value" as "key absent" and fell through to the append below — so saving
|
|
226
|
+
// the wizard's council page twice WITHOUT changing a toggle wrote a second
|
|
227
|
+
// `api_on_quota:` into the same block, over two `{ok: true}` responses, and
|
|
228
|
+
// left `.ai-council.yml` rejected by a strict parser. Third instance of one
|
|
229
|
+
// shape in this file; `findScalarLine` exists to end it, and a fix that
|
|
230
|
+
// taught only `mergeIntoTemplate` would have left the live path here.
|
|
231
|
+
if (findScalarLine(template.split('\n'), sections, key) !== -1) {
|
|
232
|
+
return replaceScalar(template, dottedPath, value);
|
|
233
|
+
}
|
|
234
|
+
|
|
190
235
|
const formatted = formatScalar(value);
|
|
191
236
|
const lines = template.split('\n');
|
|
192
237
|
// The document's OWN indent width, not an assumed two.
|
|
@@ -228,7 +273,7 @@ export function upsertScalar(template: string, dottedPath: string[], value: unkn
|
|
|
228
273
|
if (line.trim() === '' || line.trim().startsWith('#')) continue;
|
|
229
274
|
const indentLen = line.length - line.trimStart().length;
|
|
230
275
|
if (indentLen !== indent.length) continue;
|
|
231
|
-
const m =
|
|
276
|
+
const m = NESTED_KEY_RE.exec(line.trim());
|
|
232
277
|
if (m !== null && m[1] === want) {
|
|
233
278
|
found = i;
|
|
234
279
|
break;
|
|
@@ -269,23 +314,136 @@ export function upsertScalar(template: string, dottedPath: string[], value: unkn
|
|
|
269
314
|
return lines.join('\n');
|
|
270
315
|
}
|
|
271
316
|
|
|
317
|
+
/**
|
|
318
|
+
* Rewrite an existing top-level `a.b.c: value` line — the FLAT form
|
|
319
|
+
* `mergeIntoTemplate` itself appends when a path has no template entry.
|
|
320
|
+
* Returns the template unchanged when no such line exists.
|
|
321
|
+
*
|
|
322
|
+
* `replaceScalar` cannot see this line: its key pattern is
|
|
323
|
+
* `[A-Za-z_][A-Za-z0-9_]*`, with no dot, so a path this module appended on
|
|
324
|
+
* one pass is invisible to the probe on the next and `mergeIntoTemplate`
|
|
325
|
+
* appends a SECOND copy. Two wizard saves therefore produce a file carrying
|
|
326
|
+
* duplicate mapping keys — a strict parser rejects it outright, which is what
|
|
327
|
+
* wedged `task release`: its `sync` step exits 2 with "Map keys must be
|
|
328
|
+
* unique" before the release does any git work.
|
|
329
|
+
*
|
|
330
|
+
* A pre-existing duplicate run is COLLAPSED, not merely updated: the first
|
|
331
|
+
* occurrence keeps its position and takes the new value, every later one is
|
|
332
|
+
* dropped. Collapsing is value-neutral — a lenient reader already resolved
|
|
333
|
+
* such a run last-wins — and it is the only way a file corrupted by the old
|
|
334
|
+
* behaviour becomes parseable again through the ordinary write path.
|
|
335
|
+
*
|
|
336
|
+
* Deliberately NOT folded into `replaceScalar`: `upsertScalar` calls that
|
|
337
|
+
* probe and documents the flat form as the WRONG shape for a nested key (a
|
|
338
|
+
* reader sees one key literally named "a.b"). Teaching the shared probe to
|
|
339
|
+
* match it would make `upsertScalar` write into that broken line instead of
|
|
340
|
+
* creating the nesting. The flat form is legitimate only here, where this
|
|
341
|
+
* function is the one that wrote it.
|
|
342
|
+
*/
|
|
343
|
+
function replaceFlatDottedKey(
|
|
344
|
+
template: string,
|
|
345
|
+
dottedPath: string[],
|
|
346
|
+
value: unknown,
|
|
347
|
+
): { found: boolean; body: string } {
|
|
348
|
+
if (dottedPath.length < 2) return { found: false, body: template };
|
|
349
|
+
const flat = dottedPath.join('.');
|
|
350
|
+
const lines = template.split('\n');
|
|
351
|
+
const hits: number[] = [];
|
|
352
|
+
for (let i = 0; i < lines.length; i++) {
|
|
353
|
+
const line = lines[i];
|
|
354
|
+
if (line === undefined) continue;
|
|
355
|
+
// Top level only — an indented `a.b:` is somebody else's child key.
|
|
356
|
+
if (line.length !== line.trimStart().length) continue;
|
|
357
|
+
const m = /^([A-Za-z_][A-Za-z0-9_.-]*)\s*:/.exec(line);
|
|
358
|
+
if (m === null || m[1] !== flat) continue;
|
|
359
|
+
hits.push(i);
|
|
360
|
+
}
|
|
361
|
+
if (hits.length === 0) return { found: false, body: template };
|
|
362
|
+
lines[hits[0] as number] = `${flat}: ${formatScalar(value)}`;
|
|
363
|
+
// Drop the later copies back-to-front so the earlier indices stay valid.
|
|
364
|
+
for (let i = hits.length - 1; i >= 1; i--) lines.splice(hits[i] as number, 1);
|
|
365
|
+
return { found: true, body: lines.join('\n') };
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
/**
|
|
369
|
+
* Drop every top-level `a.b.c:` line for a path whose NESTED form the caller
|
|
370
|
+
* has just resolved.
|
|
371
|
+
*
|
|
372
|
+
* Which reader this preserves, because the two forms can disagree and only one
|
|
373
|
+
* of them is ever consulted: by YAML semantics `a.b.c` is reached by walking
|
|
374
|
+
* the `a` mapping, so a top-level key literally named "a.b.c" is a DIFFERENT
|
|
375
|
+
* path that no lookup of the dotted one visits. Removing it therefore changes
|
|
376
|
+
* no reader's answer — strict and lenient alike already resolve through the
|
|
377
|
+
* nesting — while leaving it keeps the one line a human scanning the file
|
|
378
|
+
* reads as the value, saying something the program never agreed with. It
|
|
379
|
+
* cannot self-heal either: the duplicate-key pass sees a single occurrence,
|
|
380
|
+
* and `mergeIntoTemplate` writes the nested side, so the line is permanent.
|
|
381
|
+
*
|
|
382
|
+
* The nested twin IS the safety argument, not a convenience. A flat `a.b:`
|
|
383
|
+
* standing ALONE is a key somebody may have meant — `mergeIntoTemplate`'s own
|
|
384
|
+
* fallback branch writes exactly that shape for a path the template lacks — and
|
|
385
|
+
* this function is never reached for one: the caller takes the
|
|
386
|
+
* `replaceFlatDottedKey` branch instead, which updates that line in place.
|
|
387
|
+
*
|
|
388
|
+
* Two bounds, each of which turns the sweep into a data-loss bug if dropped:
|
|
389
|
+
*
|
|
390
|
+
* - Two segments minimum. A one-segment path joins to a name with no dot, so
|
|
391
|
+
* the match below would hit the very line `replaceScalar` just wrote and
|
|
392
|
+
* delete the key the caller asked to set — a rewrite silently becoming a
|
|
393
|
+
* removal. Same guard, same reason, as `replaceFlatDottedKey`.
|
|
394
|
+
* - Top level only, the bound `replaceFlatDottedKey` also draws: an INDENTED
|
|
395
|
+
* `a.b:` is somebody else's child key (`parent:` / ` a.b:` means
|
|
396
|
+
* `parent['a.b']`), an unrelated path this sweep has no claim on.
|
|
397
|
+
*/
|
|
398
|
+
function dropFlatDottedTwins(template: string, dottedPath: string[]): string {
|
|
399
|
+
if (dottedPath.length < 2) return template;
|
|
400
|
+
const flat = dottedPath.join('.');
|
|
401
|
+
const lines = template.split('\n');
|
|
402
|
+
const kept = lines.filter((line) => {
|
|
403
|
+
if (line.length !== line.trimStart().length) return true;
|
|
404
|
+
const m = /^([A-Za-z_][A-Za-z0-9_.-]*)\s*:/.exec(line);
|
|
405
|
+
return m === null || m[1] !== flat;
|
|
406
|
+
});
|
|
407
|
+
if (kept.length === lines.length) return template;
|
|
408
|
+
return kept.join('\n');
|
|
409
|
+
}
|
|
410
|
+
|
|
272
411
|
/**
|
|
273
412
|
* Apply every leaf change from `newValues` to `templateBody`. Paths that
|
|
274
413
|
* are not present in the template are appended at the end. Comments are
|
|
275
414
|
* preserved for every key that already exists in the template.
|
|
415
|
+
*
|
|
416
|
+
* Idempotent: applying the same values twice yields the same document, so a
|
|
417
|
+
* second wizard save re-writes the flat block instead of duplicating it.
|
|
276
418
|
*/
|
|
277
419
|
export function mergeIntoTemplate(templateBody: string, newValues: Record<string, unknown>): string {
|
|
278
420
|
let body = templateBody;
|
|
279
421
|
const appended: string[] = [];
|
|
280
422
|
for (const entry of flatten(newValues)) {
|
|
281
|
-
const
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
423
|
+
const sections = entry.path.slice(0, -1);
|
|
424
|
+
const leaf = entry.path[entry.path.length - 1];
|
|
425
|
+
// Presence is asked, never inferred from the write changing the text —
|
|
426
|
+
// see `findScalarLine`. Writing the value it already holds is a hit.
|
|
427
|
+
if (findScalarLine(body.split('\n'), sections, leaf) !== -1) {
|
|
428
|
+
body = replaceScalar(body, entry.path, entry.value);
|
|
429
|
+
// The nested form won, so any flat twin of this same path is dead
|
|
430
|
+
// and stays dead. The probe above is what licenses the removal:
|
|
431
|
+
// without a nested key to resolve through, a flat `a.b:` is the
|
|
432
|
+
// real entry and the branch below owns it.
|
|
433
|
+
body = dropFlatDottedTwins(body, entry.path);
|
|
434
|
+
continue;
|
|
435
|
+
}
|
|
436
|
+
// Not in the template's nested form. It may still be here as a flat
|
|
437
|
+
// dotted line this function appended on an earlier pass.
|
|
438
|
+
const flat = replaceFlatDottedKey(body, entry.path, entry.value);
|
|
439
|
+
if (flat.found) {
|
|
440
|
+
body = flat.body;
|
|
441
|
+
continue;
|
|
288
442
|
}
|
|
443
|
+
// Genuinely absent — append a flat key=value at EOF. Form coverage is
|
|
444
|
+
// asserted by parity test, so this branch only fires on hand-edited
|
|
445
|
+
// templates.
|
|
446
|
+
appended.push(`${entry.path.join('.')}: ${formatScalar(entry.value)}`);
|
|
289
447
|
}
|
|
290
448
|
if (appended.length > 0) {
|
|
291
449
|
if (!body.endsWith('\n')) body += '\n';
|
|
@@ -173,7 +173,7 @@ export const settingsSchema = z.object({
|
|
|
173
173
|
}),
|
|
174
174
|
chat_history: z.object({
|
|
175
175
|
enabled: z.boolean().default(true).describe(
|
|
176
|
-
'Persist a structured log of every chat turn to
|
|
176
|
+
'Persist a structured log of every chat turn to agents/runtime/.agent-chat-history (JSONL). Recording only — no command in this package replays a session from the file; it is a record on disk that a human or a later tool can read. Turn off if you never want chat transcripts on disk.',
|
|
177
177
|
),
|
|
178
178
|
frequency: chatFreq.default('per_turn').describe(
|
|
179
179
|
'How often the chat-history writer flushes to disk. per_turn = after every user / agent exchange (default, lowest data loss on crash). per_phase = at phase boundaries (cheaper I/O). per_tool = after every tool call (highest fidelity, noisiest log).',
|
|
@@ -247,7 +247,27 @@ export const settingsSchema = z.object({
|
|
|
247
247
|
fidelity_mode: fidelityMode.default('strict').describe(
|
|
248
248
|
'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.',
|
|
249
249
|
),
|
|
250
|
-
|
|
250
|
+
approximation: z
|
|
251
|
+
.object({
|
|
252
|
+
enabled: z.boolean().default(false).describe(
|
|
253
|
+
'Whether a value INSIDE the configured tolerance may be replaced by the project\'s own token without a per-value confirmation. Ships false. The distance from the artifact\'s value to the nearest project token is computed and REPORTED on every value row regardless of this switch — what it decides is whether the agent may act on it without asking. Turning it on for a whole install is a consumer-facing default flip and is owner-reserved (agents/roadmaps/stubs/road-to-frontend-power-default-flip.md); design.fidelity_mode: hard-floor overrides it to off.',
|
|
254
|
+
),
|
|
255
|
+
tolerance: z
|
|
256
|
+
.object({
|
|
257
|
+
color: z.number().nullable().default(null).describe(
|
|
258
|
+
'Colour distance below which a value may be reconciled, in OKLab ΔEOK. Ships null, and null means "preserve and report" rather than "reconcile freely". No number is set because none is supported: zero of seven design-to-code benchmarks in the evidence set score token conformance, and a number in a config file — even flagged unmeasured — shapes behavior and acquires the authority of a default. Not an RGB channel delta: RGB distance is not perceptually uniform.',
|
|
259
|
+
),
|
|
260
|
+
length: z.number().nullable().default(null).describe(
|
|
261
|
+
'Length distance below which a value may be reconciled, in absolute CSS pixels. Ships null, same reasoning as color. GitHub Primer\'s ±1px spacing widening is recorded as an externally observed candidate in src/scripts/_lib/design_tolerance.ts and is deliberately not the shipped value; max(1px, 2%) was rejected for growing more permissive at large dimensions with no evidence that this is wanted.',
|
|
262
|
+
),
|
|
263
|
+
})
|
|
264
|
+
.default({ color: null, length: null }),
|
|
265
|
+
})
|
|
266
|
+
.default({ enabled: false, tolerance: { color: null, length: null } }),
|
|
267
|
+
}).default({
|
|
268
|
+
fidelity_mode: 'strict',
|
|
269
|
+
approximation: { enabled: false, tolerance: { color: null, length: null } },
|
|
270
|
+
}),
|
|
251
271
|
consistency: z.object({
|
|
252
272
|
cross_source: crossSourceMode.default('on').describe(
|
|
253
273
|
'Consumed by the cross-source-consistency rule. When the agent works from multiple sources (ticket text, an attached image/mockup, the spec, the codebase) it checks them against each other and asks before proceeding on a discrepancy — instead of silently guessing. on (default) = surface every real cross-source contradiction / silent-scope-expansion as one question; auto = surface only high-confidence contradictions, state low-confidence as an assumption; off = no cross-source checking.',
|
|
@@ -450,11 +470,11 @@ export const settingsSchema = z.object({
|
|
|
450
470
|
}),
|
|
451
471
|
}),
|
|
452
472
|
continuity: z.object({
|
|
453
|
-
auto_record: z.enum(['on', 'off']).default('
|
|
454
|
-
'Deterministic continuity-record writer at session end (road-to-continuity-writer-activation Phase 1). on = the session-eol concern writes the continuity_record capsule variant on Stop for a substantive session that has claimed a roadmap; every field is computed from on-disk state, with no model spend and no subprocess. off
|
|
473
|
+
auto_record: z.enum(['on', 'off']).default('on').describe(
|
|
474
|
+
'Deterministic continuity-record writer at session end (road-to-continuity-writer-activation Phase 1). on (default since 2026-09-10) = the session-eol concern writes the continuity_record capsule variant on Stop for a substantive session that has claimed a roadmap; every field is computed from on-disk state, with no model spend and no subprocess. off = no automatic record, and only the explicit agent-config session:recycle writes one. The default flipped once the parity evidence landed, so the normal path carries an automatic writer rather than a remembered command; session:recycle is retained because the automatic writer skips a session that claimed no roadmap and omits the git-status anchors.',
|
|
455
475
|
),
|
|
456
476
|
run_checkpoints: z.enum(['on', 'off']).default('on').describe(
|
|
457
|
-
'Deterministic run-checkpoint production at session end (road-to-continuity-writer-activation Phase 1.4). on (default) = a session above the recycle threshold and inside a running roadmap contract leaves agents/runtime/state/checkpoints/<run>.json, so a killed run resumes from a derived checkpoint rather than from bookkeeping. off = no checkpoint; continuity writing, the recycle advisory and the context-fill surface are unaffected. Default ON because it is the
|
|
477
|
+
'Deterministic run-checkpoint production at session end (road-to-continuity-writer-activation Phase 1.4). on (default) = a session above the recycle threshold and inside a running roadmap contract leaves agents/runtime/state/checkpoints/<run>.json, so a killed run resumes from a derived checkpoint rather than from bookkeeping. off = no checkpoint; continuity writing, the recycle advisory and the context-fill surface are unaffected. Default ON because it is the behavior the tree already had — the switch exists to make the three session-end handlers independently disableable, not to change what ships.',
|
|
458
478
|
),
|
|
459
479
|
}),
|
|
460
480
|
memory: z.object({
|
|
@@ -23,7 +23,13 @@ export type JsonLike =
|
|
|
23
23
|
| { [key: string]: JsonLike };
|
|
24
24
|
|
|
25
25
|
export interface SurfaceEntry {
|
|
26
|
-
|
|
26
|
+
/**
|
|
27
|
+
* JSON-schema type. A STRING for an ordinary key, and an ARRAY for a
|
|
28
|
+
* nullable one (`["number", "null"]`) — which is what the generator has
|
|
29
|
+
* always produced for a `z.number().nullable()`, though this field was
|
|
30
|
+
* declared `string` until the first such key shipped.
|
|
31
|
+
*/
|
|
32
|
+
type: string | string[];
|
|
27
33
|
default?: JsonLike;
|
|
28
34
|
enum?: Array<string | number>;
|
|
29
35
|
description?: string;
|
|
@@ -129,7 +135,12 @@ export function computeSurfaceDelta(oldS: SettingsSurface, newS: SettingsSurface
|
|
|
129
135
|
continue;
|
|
130
136
|
}
|
|
131
137
|
const o = oldS.entries[key] as SurfaceEntry;
|
|
132
|
-
|
|
138
|
+
// `sameJson`, not `!==`: `type` is an array for a nullable key, and two
|
|
139
|
+
// structurally equal arrays are never `===`. Left as a strict compare
|
|
140
|
+
// it reported `type_changed` on EVERY version bump for every nullable
|
|
141
|
+
// key, forever — caught by the identical-surface test the moment the
|
|
142
|
+
// first one shipped (`design.approximation.tolerance.*`).
|
|
143
|
+
if (!sameJson(o.type, n.type)) {
|
|
133
144
|
changes.push({ key, kind: 'type_changed', old: o, new: n });
|
|
134
145
|
}
|
|
135
146
|
if (!sameJson(o.default, n.default)) {
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
# Compact-instructions template — lose less when you compact anyway
|
|
2
2
|
|
|
3
3
|
Fallback lane of `road-to-token-economy-recycling` Phase 3.3. The recycle
|
|
4
|
-
envelope
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
envelope is the primary path — validated state, no summarizer — and since
|
|
5
|
+
2026-09-10 it is written for you: the `session-eol` concern publishes the
|
|
6
|
+
continuity record at session end by default (`continuity.auto_record`), so
|
|
7
|
+
`/clear` resumes from it with no command to remember.
|
|
8
|
+
`agent-config session:recycle` still exists as an explicit affordance for the
|
|
9
|
+
cases the automatic writer does not cover (a session that claimed no roadmap, or
|
|
10
|
+
a record that should carry the `git status` anchors). This template is for the
|
|
11
|
+
user who compacts instead: Claude Code honours a `# Compact instructions` section in the
|
|
7
12
|
project's `CLAUDE.md` when it summarizes (see the "Manage context
|
|
8
13
|
proactively" section of the host's cost docs), and `/compact <instructions>`
|
|
9
14
|
accepts the same guidance ad hoc.
|
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
model_tier: medium
|
|
3
|
-
name: chat-history-import
|
|
4
|
-
pack: memory
|
|
5
|
-
visibility: internal
|
|
6
|
-
cluster: chat-history
|
|
7
|
-
sub: import
|
|
8
|
-
description: Surface prior chat-history sessions as a numbered table, let the user pick one, read it silently, and emit a short summary plus a resume offer — selective, user-driven cross-session import
|
|
9
|
-
suggestion:
|
|
10
|
-
eligible: false
|
|
11
|
-
rationale: "Cluster sub-command — reached via its cluster head's routing or its explicit /cluster:sub name; not independently suggested (surface-consolidation)."
|
|
12
|
-
workspaces:
|
|
13
|
-
- agent-config-maintainer
|
|
14
|
-
packs:
|
|
15
|
-
- memory
|
|
16
|
-
---
|
|
17
|
-
<!-- cloud_safe: noop -->
|
|
18
|
-
|
|
19
|
-
# /chat-history import
|
|
20
|
-
|
|
21
|
-
Read-only, **user-driven** cross-session import. Surfaces prior
|
|
22
|
-
sessions logged in `agents/runtime/.agent-chat-history` as a numbered table,
|
|
23
|
-
the user picks **one**, the agent reads that session **silently**
|
|
24
|
-
and emits a 2–5 sentence summary, then offers to resume the last
|
|
25
|
-
task from that session. The agent does **not** render entries
|
|
26
|
-
verbatim, auto-import, or rewrite the user's context without an
|
|
27
|
-
explicit instruction.
|
|
28
|
-
|
|
29
|
-
This is the opt-in counterpart to the read-path filter (Phase 3 of
|
|
30
|
-
`road-to-chat-history-session-isolation`): default reads stay
|
|
31
|
-
session-scoped; `import` is the explicit surface for crossing the
|
|
32
|
-
session boundary. For project-improving learnings derived from a
|
|
33
|
-
prior session, see [`/memory mine-session --mode=proposals`](../memory/mine-session/command.md).
|
|
34
|
-
|
|
35
|
-
## When NOT to use
|
|
36
|
-
|
|
37
|
-
- Inspect the current session — use the host's native transcript /
|
|
38
|
-
session view, or `./scripts-run scripts/chat_history read`.
|
|
39
|
-
- Generate a learning proposal from a prior session — use
|
|
40
|
-
[`/memory mine-session --mode=proposals`](../memory/mine-session/command.md),
|
|
41
|
-
which frames the session's signals and runs `learning-to-rule-or-skill`.
|
|
42
|
-
- Bulk-import all sessions — out of scope for v1. One session per
|
|
43
|
-
invocation; multi-pick is v2.
|
|
44
|
-
- Search prior sessions by content — out of scope for v1; no fuzzy
|
|
45
|
-
search, no full-text grep. The user picks by `last_ts` and
|
|
46
|
-
`summary` from the listing.
|
|
47
|
-
|
|
48
|
-
## Steps
|
|
49
|
-
|
|
50
|
-
### 1. Check if enabled
|
|
51
|
-
|
|
52
|
-
Read `chat_history.enabled` from `.agent-settings.yml`. If `false`
|
|
53
|
-
or the section is missing, say so and stop:
|
|
54
|
-
|
|
55
|
-
```
|
|
56
|
-
> 📒 chat-history is disabled (chat_history.enabled = false).
|
|
57
|
-
> Set it to true in .agent-settings.yml to start logging.
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
### 2. List sessions
|
|
61
|
-
|
|
62
|
-
Run `./scripts-run scripts/chat_history sessions --json --limit 20 --summary`.
|
|
63
|
-
The helper returns an array of
|
|
64
|
-
`{id, count, first_ts, last_ts, preview, summary}` sorted by
|
|
65
|
-
`last_ts` desc. The `summary` field is built **inside the helper**
|
|
66
|
-
from at most 10 sampled entries per session (5 oldest + 5 newest) —
|
|
67
|
-
token-cheap, no need to ever read the full body for the picker.
|
|
68
|
-
Default excludes empty buckets — only sessions with at least one
|
|
69
|
-
body entry are surfaced.
|
|
70
|
-
|
|
71
|
-
If the array is empty, stop:
|
|
72
|
-
|
|
73
|
-
```
|
|
74
|
-
> 📒 No prior sessions found in agents/runtime/.agent-chat-history.
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
### 3. Surface as a numbered table
|
|
78
|
-
|
|
79
|
-
Render the sessions as a markdown table — the row number is the
|
|
80
|
-
option (per `user-interaction` Iron Law: numbered options for any
|
|
81
|
-
picker). The session `id` is noise to humans; keep it **internal**
|
|
82
|
-
for step 5's `read --session <id>` call and never render it.
|
|
83
|
-
Format:
|
|
84
|
-
|
|
85
|
-
```
|
|
86
|
-
Pick a session to import:
|
|
87
|
-
|
|
88
|
-
| # | Date | Entries | Summary |
|
|
89
|
-
|----|------------------|---------|---------|
|
|
90
|
-
| 1 | YYYY-MM-DD HH:MM | N | {summary} |
|
|
91
|
-
| 2 | YYYY-MM-DD HH:MM | N | {summary} |
|
|
92
|
-
| … | | | |
|
|
93
|
-
| N | — | — | abort — do not read any session |
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
Format the timestamp as `YYYY-MM-DD HH:MM` (drop seconds and
|
|
97
|
-
timezone — the listing is for orientation, not forensics). Lead the
|
|
98
|
-
`Summary` cell with the helper's `summary` field — that is the
|
|
99
|
-
rough arc the user picks by (`<first user msg> → <last user msg>`
|
|
100
|
-
for normal sessions, or `(N entries — no user prompts; t-mix: …)`
|
|
101
|
-
for tool-only sessions). Do **not** truncate or rewrite `summary` —
|
|
102
|
-
markdown table wrap handles long values. Always include an explicit
|
|
103
|
-
`abort` row as the last numbered option. Track option-number → `id`
|
|
104
|
-
internally so step 5 can call `./scripts-run scripts/chat_history read
|
|
105
|
-
--session <id>` with the right id.
|
|
106
|
-
|
|
107
|
-
### 4. Wait for the pick
|
|
108
|
-
|
|
109
|
-
**One question per turn** (per `ask-when-uncertain`). Do not chain
|
|
110
|
-
the listing with anything else; do not auto-pick; do not surface a
|
|
111
|
-
default. Wait for the user's response.
|
|
112
|
-
|
|
113
|
-
If the user picks the abort option, stop without reading.
|
|
114
|
-
|
|
115
|
-
### 5. Read the picked session silently
|
|
116
|
-
|
|
117
|
-
Run `./scripts-run scripts/chat_history read --session <id> --last <count>`,
|
|
118
|
-
where `<count>` is the picked row's `count` from step 2. The
|
|
119
|
-
`--last` flag is **required** — the helper defaults to 5 entries,
|
|
120
|
-
which would silently truncate any longer session. The helper returns
|
|
121
|
-
the entries as JSON.
|
|
122
|
-
|
|
123
|
-
**Do not render the entries.** The verbose dump was reversed by the
|
|
124
|
-
user — token cost and scroll fatigue outweighed the verbatim
|
|
125
|
-
contract. Read the JSON in-context, then proceed to step 6.
|
|
126
|
-
|
|
127
|
-
### 6. Summarise and offer to resume
|
|
128
|
-
|
|
129
|
-
Emit a **2–5 sentence** summary of the picked session: the topic,
|
|
130
|
-
what was decided or built, and where it left off (the last task in
|
|
131
|
-
progress, if any). Plain prose — no bullets, no headings, no
|
|
132
|
-
verbatim quotes.
|
|
133
|
-
|
|
134
|
-
Then offer the resume choice as numbered options
|
|
135
|
-
(per `user-interaction`), one question per turn:
|
|
136
|
-
|
|
137
|
-
```
|
|
138
|
-
1. resume — pick up the last task from that session
|
|
139
|
-
2. stop — keep the summary in context, do nothing else
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
Wait for the pick. Do **not** auto-resume. If the user picks
|
|
143
|
-
`resume`, hand off to the relevant skill or command for that work;
|
|
144
|
-
do not silently start editing files. The agent does not write to
|
|
145
|
-
the current session's log on the user's behalf without an explicit
|
|
146
|
-
instruction.
|
|
147
|
-
|
|
148
|
-
## Gotchas
|
|
149
|
-
|
|
150
|
-
- **Summary, not verbatim.** Earlier Council R2-2 favoured verbatim
|
|
151
|
-
rendering; reversed in practice — too slow, too token-expensive.
|
|
152
|
-
The agent reads the picked session in-context and emits a 2–5
|
|
153
|
-
sentence summary. Verbatim rendering is no longer part of the
|
|
154
|
-
contract.
|
|
155
|
-
- **One pick per invocation.** Multi-pick is v2. If the user wants
|
|
156
|
-
a second session, run `/chat-history import` again.
|
|
157
|
-
- **Read-only.** This command never writes to `agents/runtime/.agent-chat-history`
|
|
158
|
-
and never rotates.
|
|
159
|
-
- **`<legacy>` and `<unknown>` buckets** show up like any other
|
|
160
|
-
session id when they have body entries — the user can pick them
|
|
161
|
-
too. The helper aggregates body entries with no `s` field into
|
|
162
|
-
`<legacy>` and entries with `s == "<unknown>"` into `<unknown>`.
|
|
163
|
-
|
|
164
|
-
## See also
|
|
165
|
-
|
|
166
|
-
- [`/memory mine-session --mode=proposals`](../memory/mine-session/command.md) — pick a prior session and turn it into a project-improving proposal via `learning-to-rule-or-skill` (the former `/chat-history learn`)
|
|
167
|
-
- [`chat-history-platform-hooks`](../../../agents/settings/contexts/chat-history-platform-hooks.md) — read contract, isolation default, opt-in cross-session path
|
|
168
|
-
- [`scripts/chat_history.ts`](../../../scripts/chat_history.ts) — `sessions` and `read --session` CLI surface
|
|
169
|
-
- [`user-interaction`](../../rules/user-interaction.md) — numbered-options Iron Law
|
|
170
|
-
- [`ask-when-uncertain`](../../rules/ask-when-uncertain.md) — one-question-per-turn Iron Law
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
model_tier: medium
|
|
3
|
-
name: chat-history
|
|
4
|
-
disable-model-invocation: true
|
|
5
|
-
argument-hint: "[import]"
|
|
6
|
-
pack: memory
|
|
7
|
-
visibility: internal
|
|
8
|
-
description: Chat-history orchestrator — routes to import (selective cross-session resume). Mining moved to /memory mine-session; raw-log inspection uses the host's native transcript view.
|
|
9
|
-
cluster: chat-history
|
|
10
|
-
routes_to: [chat-history-import]
|
|
11
|
-
type: orchestrator
|
|
12
|
-
suggestion:
|
|
13
|
-
eligible: true
|
|
14
|
-
trigger_description: "import a prior session into the current chat, resume a previous session, pull a prior session in verbatim"
|
|
15
|
-
trigger_context: "user wants to pull a prior session from the agents/runtime/.agent-chat-history log into the current chat verbatim and optionally resume it"
|
|
16
|
-
workspaces:
|
|
17
|
-
- agent-config-maintainer
|
|
18
|
-
packs:
|
|
19
|
-
- memory
|
|
20
|
-
---
|
|
21
|
-
|
|
22
|
-
<!-- cloud_safe: noop -->
|
|
23
|
-
|
|
24
|
-
# /chat-history
|
|
25
|
-
|
|
26
|
-
Top-level orchestrator for the `/chat-history` family. Writes and overflow
|
|
27
|
-
handling are driven entirely by platform hooks + `scripts/chat_history.ts`
|
|
28
|
-
internals (`road-to-chat-history-hook-only`); the surfaced sub-command is
|
|
29
|
-
read-only on the cross-host log (`agents/runtime/.agent-chat-history`).
|
|
30
|
-
Sessions coexist in one log file — each entry self-tags via the `s` field —
|
|
31
|
-
so there is no ownership layer to recover from.
|
|
32
|
-
|
|
33
|
-
## Sub-commands
|
|
34
|
-
|
|
35
|
-
| Sub-command | Routes to | Purpose |
|
|
36
|
-
|---|---|---|
|
|
37
|
-
| `/chat-history import` | `commands/chat-history/import.md` | List prior sessions, pick one, render its entries verbatim — selective cross-session import + resume |
|
|
38
|
-
|
|
39
|
-
**Consolidated elsewhere** (see `road-to-memory-pipeline-consolidation.md`):
|
|
40
|
-
|
|
41
|
-
- **Mining a session for learnings** — use
|
|
42
|
-
[`/memory mine-session --mode=proposals`](../memory/mine-session/command.md)
|
|
43
|
-
(the former `/chat-history learn`; now the single mining command, reading the
|
|
44
|
-
same cross-host log).
|
|
45
|
-
- **Inspecting the raw log** (size, entries, header) — use the host's native
|
|
46
|
-
transcript / session view; the bespoke `/chat-history show` was dropped as
|
|
47
|
-
redundant.
|
|
48
|
-
|
|
49
|
-
## Dispatch
|
|
50
|
-
|
|
51
|
-
1. Parse the user's argument: `/chat-history <sub-command> [args]`.
|
|
52
|
-
2. The only sub-command is `import`. Bare `/chat-history` (or an unknown
|
|
53
|
-
sub-command) → route to `import`.
|
|
54
|
-
3. Load `commands/chat-history/import.md` and follow its `## Steps` verbatim
|
|
55
|
-
with the remaining args.
|
|
56
|
-
|
|
57
|
-
## Rules
|
|
58
|
-
|
|
59
|
-
- **Do NOT commit, push, or open a PR** — `import` is read-only (it renders a
|
|
60
|
-
prior session into the current chat; it writes nothing).
|
|
61
|
-
- **Do NOT chain sub-commands.** One `/chat-history import` per turn.
|
|
62
|
-
- **`import` crosses the session boundary** — only run it when the user
|
|
63
|
-
explicitly asked for cross-session reading.
|