sillyspec 3.27.12 → 3.28.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/sillyspec-execute/SKILL.md +214 -214
- package/.claude/skills/sillyspec-plan/SKILL.md +156 -156
- package/.claude/skills/sillyspec-quick/SKILL.md +116 -116
- package/package.json +1 -1
- package/src/agent-session-log.js +77 -10
- package/src/archive-delta.js +419 -0
- package/src/config-schema.js +2 -2
- package/src/contract-matrix.js +15 -2
- package/src/design-facts.js +354 -0
- package/src/docs-check.js +79 -8
- package/src/doctor-diagnostics.js +75 -3
- package/src/endpoint-baseline.js +109 -0
- package/src/endpoint-extractor.js +100 -24
- package/src/git-helper.js +31 -0
- package/src/index.js +248 -8
- package/src/machine-interface.js +63 -0
- package/src/modules.js +41 -12
- package/src/progress/change-registry.js +20 -0
- package/src/progress/consistency-doctor.js +124 -5
- package/src/progress/stage-machine.js +118 -2
- package/src/progress.js +6 -0
- package/src/quicklog.js +51 -0
- package/src/run/command.js +71 -2
- package/src/run/complete-handlers.js +84 -7
- package/src/run/complete.js +58 -5
- package/src/run/gates.js +333 -2
- package/src/run/prompt.js +70 -0
- package/src/run/quick-audit.js +98 -0
- package/src/run/scan-profile.js +98 -6
- package/src/run/shared.js +66 -1
- package/src/run/stage.js +25 -12
- package/src/scan-diff.js +54 -1
- package/src/scan-facts.js +173 -0
- package/src/scan-postcheck.js +110 -3
- package/src/spec-sync.js +210 -16
- package/src/stage-review.js +62 -3
- package/src/stages/archive.js +5 -5
- package/src/stages/brainstorm.js +10 -10
- package/src/stages/execute.js +21 -15
- package/src/stages/plan-postcheck.js +194 -1
- package/src/stages/plan.js +6 -2
- package/src/stages/scan.js +44 -102
- package/src/stages/verify.js +9 -7
- package/src/sync.js +122 -4
- package/src/task-review.js +51 -4
- package/src/taskcard.js +8 -1
- package/src/verify-postcheck.js +670 -10
- package/src/verify-probes.js +92 -10
- package/src/workflow.js +30 -0
- package/templates/agents-instruction.md +1 -1
- package/templates/prompts/taskcard-rules.md +5 -0
- package/templates/workflows/scan-docs.yaml +6 -0
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-archive/SKILL.md +0 -87
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-auto/SKILL.md +0 -93
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-brainstorm/SKILL.md +0 -114
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-commit/SKILL.md +0 -67
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-continue/SKILL.md +0 -47
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-doctor/SKILL.md +0 -76
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-execute/SKILL.md +0 -214
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-explore/SKILL.md +0 -102
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-export/SKILL.md +0 -57
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-init/SKILL.md +0 -177
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-knowledge/SKILL.md +0 -270
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-plan/SKILL.md +0 -156
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-quick/SKILL.md +0 -116
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-resume/SKILL.md +0 -70
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-scan/SKILL.md +0 -79
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-state/SKILL.md +0 -64
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-status/SKILL.md +0 -54
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-verify/SKILL.md +0 -87
- package/.claude/worktrees/sillyspec-data-model-research/.claude/skills/sillyspec-workspace/SKILL.md +0 -175
- package/.claude/worktrees/sillyspec-data-model-research/.gitattributes +0 -2
- package/.claude/worktrees/sillyspec-data-model-research/.husky/pre-push +0 -20
- package/.claude/worktrees/sillyspec-data-model-research/README.md +0 -203
- package/.claude/worktrees/sillyspec-data-model-research/SKILL.md +0 -91
- package/.claude/worktrees/sillyspec-data-model-research/bin/sillyspec.js +0 -2
- package/.claude/worktrees/sillyspec-data-model-research/logo.jpg +0 -0
- package/.claude/worktrees/sillyspec-data-model-research/package-lock.json +0 -977
- package/.claude/worktrees/sillyspec-data-model-research/package.json +0 -39
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/dist/assets/index-Bq_Z2hne.js +0 -7446
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/dist/assets/index-O2W5RV4z.css +0 -1
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/dist/favicon.jpg +0 -0
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/dist/index.html +0 -16
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/dist/logo.jpg +0 -0
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/dist/prototype-dashboard.html +0 -836
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/dist/prototype-overview.html +0 -256
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/package.json +0 -25
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/server/executor.js +0 -95
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/server/index.js +0 -679
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/server/parser.js +0 -526
- package/.claude/worktrees/sillyspec-data-model-research/packages/dashboard/server/watcher.js +0 -357
- package/.claude/worktrees/sillyspec-data-model-research/src/agent-session-log.js +0 -803
- package/.claude/worktrees/sillyspec-data-model-research/src/change-list.js +0 -290
- package/.claude/worktrees/sillyspec-data-model-research/src/change-risk-profile.js +0 -270
- package/.claude/worktrees/sillyspec-data-model-research/src/check-primitives.js +0 -65
- package/.claude/worktrees/sillyspec-data-model-research/src/classify-change.js +0 -109
- package/.claude/worktrees/sillyspec-data-model-research/src/commit-suggest.js +0 -202
- package/.claude/worktrees/sillyspec-data-model-research/src/config-cat.js +0 -88
- package/.claude/worktrees/sillyspec-data-model-research/src/config-schema.js +0 -328
- package/.claude/worktrees/sillyspec-data-model-research/src/constants.js +0 -97
- package/.claude/worktrees/sillyspec-data-model-research/src/contract-matrix.js +0 -480
- package/.claude/worktrees/sillyspec-data-model-research/src/datetime.js +0 -20
- package/.claude/worktrees/sillyspec-data-model-research/src/db-engine.js +0 -55
- package/.claude/worktrees/sillyspec-data-model-research/src/db.js +0 -381
- package/.claude/worktrees/sillyspec-data-model-research/src/decision-distill.js +0 -517
- package/.claude/worktrees/sillyspec-data-model-research/src/dispatch/backends/local-agent.js +0 -155
- package/.claude/worktrees/sillyspec-data-model-research/src/dispatch/backends/sillyhub-mcp.js +0 -245
- package/.claude/worktrees/sillyspec-data-model-research/src/dispatch/probe.js +0 -246
- package/.claude/worktrees/sillyspec-data-model-research/src/dispatch/strategy.js +0 -121
- package/.claude/worktrees/sillyspec-data-model-research/src/docs-check.js +0 -825
- package/.claude/worktrees/sillyspec-data-model-research/src/docs-debt.js +0 -393
- package/.claude/worktrees/sillyspec-data-model-research/src/docs-gate.js +0 -107
- package/.claude/worktrees/sillyspec-data-model-research/src/doctor-diagnostics.js +0 -1099
- package/.claude/worktrees/sillyspec-data-model-research/src/endpoint-extractor.js +0 -420
- package/.claude/worktrees/sillyspec-data-model-research/src/foreign-declared.js +0 -78
- package/.claude/worktrees/sillyspec-data-model-research/src/fs-atomic.js +0 -73
- package/.claude/worktrees/sillyspec-data-model-research/src/git-helper.js +0 -150
- package/.claude/worktrees/sillyspec-data-model-research/src/hooks/claude-pre-tool-use.cjs +0 -130
- package/.claude/worktrees/sillyspec-data-model-research/src/hooks/worktree-guard.js +0 -892
- package/.claude/worktrees/sillyspec-data-model-research/src/index.js +0 -2798
- package/.claude/worktrees/sillyspec-data-model-research/src/init.js +0 -626
- package/.claude/worktrees/sillyspec-data-model-research/src/knowledge-match.js +0 -231
- package/.claude/worktrees/sillyspec-data-model-research/src/local-detect.js +0 -128
- package/.claude/worktrees/sillyspec-data-model-research/src/local-register.js +0 -104
- package/.claude/worktrees/sillyspec-data-model-research/src/machine-interface.js +0 -543
- package/.claude/worktrees/sillyspec-data-model-research/src/migrate.js +0 -127
- package/.claude/worktrees/sillyspec-data-model-research/src/module-impact.js +0 -166
- package/.claude/worktrees/sillyspec-data-model-research/src/module-resolve.js +0 -222
- package/.claude/worktrees/sillyspec-data-model-research/src/modules.js +0 -580
- package/.claude/worktrees/sillyspec-data-model-research/src/progress/change-registry.js +0 -336
- package/.claude/worktrees/sillyspec-data-model-research/src/progress/consistency-doctor.js +0 -355
- package/.claude/worktrees/sillyspec-data-model-research/src/progress/shared.js +0 -36
- package/.claude/worktrees/sillyspec-data-model-research/src/progress/stage-machine.js +0 -594
- package/.claude/worktrees/sillyspec-data-model-research/src/progress/step-store.js +0 -265
- package/.claude/worktrees/sillyspec-data-model-research/src/progress.js +0 -1304
- package/.claude/worktrees/sillyspec-data-model-research/src/quick-recommend.js +0 -115
- package/.claude/worktrees/sillyspec-data-model-research/src/quicklog.js +0 -852
- package/.claude/worktrees/sillyspec-data-model-research/src/review-tier.js +0 -77
- package/.claude/worktrees/sillyspec-data-model-research/src/run/command.js +0 -1595
- package/.claude/worktrees/sillyspec-data-model-research/src/run/complete-handlers.js +0 -1552
- package/.claude/worktrees/sillyspec-data-model-research/src/run/complete.js +0 -1259
- package/.claude/worktrees/sillyspec-data-model-research/src/run/concurrent-detect.js +0 -156
- package/.claude/worktrees/sillyspec-data-model-research/src/run/gates.js +0 -1084
- package/.claude/worktrees/sillyspec-data-model-research/src/run/multi-repo-context.js +0 -208
- package/.claude/worktrees/sillyspec-data-model-research/src/run/next.js +0 -128
- package/.claude/worktrees/sillyspec-data-model-research/src/run/prompt.js +0 -843
- package/.claude/worktrees/sillyspec-data-model-research/src/run/quick-audit.js +0 -186
- package/.claude/worktrees/sillyspec-data-model-research/src/run/scan-profile.js +0 -269
- package/.claude/worktrees/sillyspec-data-model-research/src/run/shared.js +0 -1562
- package/.claude/worktrees/sillyspec-data-model-research/src/run/stage.js +0 -584
- package/.claude/worktrees/sillyspec-data-model-research/src/run.js +0 -23
- package/.claude/worktrees/sillyspec-data-model-research/src/scan-diff.js +0 -388
- package/.claude/worktrees/sillyspec-data-model-research/src/scan-postcheck.js +0 -512
- package/.claude/worktrees/sillyspec-data-model-research/src/scan-staleness.js +0 -95
- package/.claude/worktrees/sillyspec-data-model-research/src/setup.js +0 -414
- package/.claude/worktrees/sillyspec-data-model-research/src/sillyhub-mcp/client.js +0 -597
- package/.claude/worktrees/sillyspec-data-model-research/src/sillyhub-mcp/config.js +0 -62
- package/.claude/worktrees/sillyspec-data-model-research/src/spec-dir-typo.js +0 -50
- package/.claude/worktrees/sillyspec-data-model-research/src/spec-sync.js +0 -358
- package/.claude/worktrees/sillyspec-data-model-research/src/stage-contract-engine.js +0 -171
- package/.claude/worktrees/sillyspec-data-model-research/src/stage-contract-spec.js +0 -550
- package/.claude/worktrees/sillyspec-data-model-research/src/stage-contract.js +0 -889
- package/.claude/worktrees/sillyspec-data-model-research/src/stage-review.js +0 -597
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/archive.js +0 -199
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/brainstorm-auto.js +0 -236
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/brainstorm.js +0 -617
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/cmd-existence.js +0 -145
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/doctor.js +0 -540
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/execute.js +0 -1275
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/explore.js +0 -43
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/index.js +0 -29
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/knowledge.js +0 -514
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/plan-postcheck.js +0 -1344
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/plan.js +0 -650
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/quick.js +0 -167
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/scan.js +0 -608
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/status.js +0 -64
- package/.claude/worktrees/sillyspec-data-model-research/src/stages/verify.js +0 -246
- package/.claude/worktrees/sillyspec-data-model-research/src/sync.js +0 -1470
- package/.claude/worktrees/sillyspec-data-model-research/src/task-review.js +0 -1498
- package/.claude/worktrees/sillyspec-data-model-research/src/taskcard.js +0 -210
- package/.claude/worktrees/sillyspec-data-model-research/src/verify-postcheck.js +0 -1718
- package/.claude/worktrees/sillyspec-data-model-research/src/verify-probes.js +0 -277
- package/.claude/worktrees/sillyspec-data-model-research/src/version.js +0 -19
- package/.claude/worktrees/sillyspec-data-model-research/src/workflow.js +0 -600
- package/.claude/worktrees/sillyspec-data-model-research/src/workspace.js +0 -125
- package/.claude/worktrees/sillyspec-data-model-research/src/worktree-apply.js +0 -1446
- package/.claude/worktrees/sillyspec-data-model-research/src/worktree-deps.js +0 -576
- package/.claude/worktrees/sillyspec-data-model-research/src/worktree.js +0 -1715
- package/.claude/worktrees/sillyspec-data-model-research/templates/claude-instruction.md +0 -23
- package/.claude/worktrees/sillyspec-data-model-research/templates/prompts/taskcard-rules.md +0 -28
- package/.claude/worktrees/sillyspec-data-model-research/templates/prompts/testcase-design.md +0 -12
- package/.claude/worktrees/sillyspec-data-model-research/templates/prompts/verify-probes.md +0 -32
- package/.claude/worktrees/sillyspec-data-model-research/templates/workflows/archive-impact.yaml +0 -79
- package/.claude/worktrees/sillyspec-data-model-research/templates/workflows/scan-docs.yaml +0 -132
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-archive/SKILL.md +0 -87
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-auto/SKILL.md +0 -93
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-brainstorm/SKILL.md +0 -114
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-commit/SKILL.md +0 -67
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-continue/SKILL.md +0 -47
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-doctor/SKILL.md +0 -76
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-execute/SKILL.md +0 -214
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-explore/SKILL.md +0 -102
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-export/SKILL.md +0 -57
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-init/SKILL.md +0 -177
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-knowledge/SKILL.md +0 -270
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-plan/SKILL.md +0 -156
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-propose/SKILL.md +0 -87
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-quick/SKILL.md +0 -116
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-resume/SKILL.md +0 -70
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-scan/SKILL.md +0 -79
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-state/SKILL.md +0 -64
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-status/SKILL.md +0 -54
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-verify/SKILL.md +0 -87
- package/.worktrees/2c37b1d7/.claude/skills/sillyspec-workspace/SKILL.md +0 -175
- package/.worktrees/2c37b1d7/.claude/skills/verify-per-user/SKILL.md +0 -6
- package/.worktrees/2c37b1d7/.gitattributes +0 -2
- package/.worktrees/2c37b1d7/.husky/pre-push +0 -20
- package/.worktrees/2c37b1d7/README.md +0 -203
- package/.worktrees/2c37b1d7/SKILL.md +0 -91
- package/.worktrees/2c37b1d7/architecture-analysis.md +0 -448
- package/.worktrees/2c37b1d7/bin/sillyspec.js +0 -2
- package/.worktrees/2c37b1d7/eval/README.md +0 -86
- package/.worktrees/2c37b1d7/eval/eval.config.json +0 -28
- package/.worktrees/2c37b1d7/eval/lib/adapters/cli.mjs +0 -63
- package/.worktrees/2c37b1d7/eval/lib/adapters/dryrun.mjs +0 -27
- package/.worktrees/2c37b1d7/eval/lib/config.mjs +0 -82
- package/.worktrees/2c37b1d7/eval/lib/db.mjs +0 -76
- package/.worktrees/2c37b1d7/eval/lib/report.mjs +0 -120
- package/.worktrees/2c37b1d7/eval/lib/runner.mjs +0 -157
- package/.worktrees/2c37b1d7/eval/lib/tasks.mjs +0 -73
- package/.worktrees/2c37b1d7/eval/lib/util.mjs +0 -107
- package/.worktrees/2c37b1d7/eval/lib/workdir.mjs +0 -30
- package/.worktrees/2c37b1d7/eval/run.mjs +0 -83
- package/.worktrees/2c37b1d7/eval/tasks/001-slugify/files/package.json +0 -6
- package/.worktrees/2c37b1d7/eval/tasks/001-slugify/solution/src/slugify.mjs +0 -26
- package/.worktrees/2c37b1d7/eval/tasks/001-slugify/task.json +0 -6
- package/.worktrees/2c37b1d7/eval/tasks/001-slugify/verify.mjs +0 -28
- package/.worktrees/2c37b1d7/eval/tasks/002-each-day/files/package.json +0 -6
- package/.worktrees/2c37b1d7/eval/tasks/002-each-day/files/src/dates.mjs +0 -4
- package/.worktrees/2c37b1d7/eval/tasks/002-each-day/solution/src/dates.mjs +0 -30
- package/.worktrees/2c37b1d7/eval/tasks/002-each-day/task.json +0 -6
- package/.worktrees/2c37b1d7/eval/tasks/002-each-day/verify.mjs +0 -31
- package/.worktrees/2c37b1d7/eval/tasks/003-word-report/files/data/notes.txt +0 -5
- package/.worktrees/2c37b1d7/eval/tasks/003-word-report/files/package.json +0 -6
- package/.worktrees/2c37b1d7/eval/tasks/003-word-report/solution/bin/report.mjs +0 -36
- package/.worktrees/2c37b1d7/eval/tasks/003-word-report/task.json +0 -6
- package/.worktrees/2c37b1d7/eval/tasks/003-word-report/verify.mjs +0 -38
- package/.worktrees/2c37b1d7/logo.jpg +0 -0
- package/.worktrees/2c37b1d7/package-lock.json +0 -977
- package/.worktrees/2c37b1d7/package.json +0 -41
- package/.worktrees/2c37b1d7/packages/dashboard/dist/assets/index-Bq_Z2hne.js +0 -7446
- package/.worktrees/2c37b1d7/packages/dashboard/dist/assets/index-O2W5RV4z.css +0 -1
- package/.worktrees/2c37b1d7/packages/dashboard/dist/favicon.jpg +0 -0
- package/.worktrees/2c37b1d7/packages/dashboard/dist/index.html +0 -16
- package/.worktrees/2c37b1d7/packages/dashboard/dist/logo.jpg +0 -0
- package/.worktrees/2c37b1d7/packages/dashboard/dist/prototype-dashboard.html +0 -836
- package/.worktrees/2c37b1d7/packages/dashboard/dist/prototype-overview.html +0 -256
- package/.worktrees/2c37b1d7/packages/dashboard/package.json +0 -25
- package/.worktrees/2c37b1d7/packages/dashboard/server/executor.js +0 -95
- package/.worktrees/2c37b1d7/packages/dashboard/server/index.js +0 -679
- package/.worktrees/2c37b1d7/packages/dashboard/server/parser.js +0 -526
- package/.worktrees/2c37b1d7/packages/dashboard/server/watcher.js +0 -357
- package/.worktrees/2c37b1d7/src/agent-session-log.js +0 -803
- package/.worktrees/2c37b1d7/src/change-list.js +0 -290
- package/.worktrees/2c37b1d7/src/change-risk-profile.js +0 -339
- package/.worktrees/2c37b1d7/src/check-primitives.js +0 -65
- package/.worktrees/2c37b1d7/src/classify-change.js +0 -109
- package/.worktrees/2c37b1d7/src/commit-suggest.js +0 -202
- package/.worktrees/2c37b1d7/src/config-cat.js +0 -88
- package/.worktrees/2c37b1d7/src/config-schema.js +0 -328
- package/.worktrees/2c37b1d7/src/constants.js +0 -97
- package/.worktrees/2c37b1d7/src/contract-matrix.js +0 -533
- package/.worktrees/2c37b1d7/src/datetime.js +0 -20
- package/.worktrees/2c37b1d7/src/db-engine.js +0 -55
- package/.worktrees/2c37b1d7/src/db.js +0 -381
- package/.worktrees/2c37b1d7/src/decision-distill.js +0 -517
- package/.worktrees/2c37b1d7/src/dispatch/backends/local-agent.js +0 -155
- package/.worktrees/2c37b1d7/src/dispatch/backends/sillyhub-mcp.js +0 -245
- package/.worktrees/2c37b1d7/src/dispatch/probe.js +0 -246
- package/.worktrees/2c37b1d7/src/dispatch/strategy.js +0 -121
- package/.worktrees/2c37b1d7/src/docs-check.js +0 -825
- package/.worktrees/2c37b1d7/src/docs-debt.js +0 -393
- package/.worktrees/2c37b1d7/src/docs-gate.js +0 -107
- package/.worktrees/2c37b1d7/src/doctor-diagnostics.js +0 -1099
- package/.worktrees/2c37b1d7/src/endpoint-extractor.js +0 -409
- package/.worktrees/2c37b1d7/src/foreign-declared.js +0 -155
- package/.worktrees/2c37b1d7/src/fs-atomic.js +0 -73
- package/.worktrees/2c37b1d7/src/git-helper.js +0 -150
- package/.worktrees/2c37b1d7/src/hooks/claude-pre-tool-use.cjs +0 -130
- package/.worktrees/2c37b1d7/src/hooks/worktree-guard.js +0 -892
- package/.worktrees/2c37b1d7/src/index.js +0 -2854
- package/.worktrees/2c37b1d7/src/init.js +0 -626
- package/.worktrees/2c37b1d7/src/knowledge-match.js +0 -231
- package/.worktrees/2c37b1d7/src/local-detect.js +0 -128
- package/.worktrees/2c37b1d7/src/local-register.js +0 -104
- package/.worktrees/2c37b1d7/src/machine-interface.js +0 -543
- package/.worktrees/2c37b1d7/src/migrate.js +0 -127
- package/.worktrees/2c37b1d7/src/module-impact.js +0 -166
- package/.worktrees/2c37b1d7/src/module-resolve.js +0 -222
- package/.worktrees/2c37b1d7/src/modules.js +0 -580
- package/.worktrees/2c37b1d7/src/plan-adopt-waves.js +0 -126
- package/.worktrees/2c37b1d7/src/progress/change-registry.js +0 -336
- package/.worktrees/2c37b1d7/src/progress/consistency-doctor.js +0 -355
- package/.worktrees/2c37b1d7/src/progress/shared.js +0 -36
- package/.worktrees/2c37b1d7/src/progress/stage-machine.js +0 -594
- package/.worktrees/2c37b1d7/src/progress/step-store.js +0 -265
- package/.worktrees/2c37b1d7/src/progress.js +0 -1304
- package/.worktrees/2c37b1d7/src/quick-recommend.js +0 -115
- package/.worktrees/2c37b1d7/src/quicklog.js +0 -883
- package/.worktrees/2c37b1d7/src/review-tier.js +0 -77
- package/.worktrees/2c37b1d7/src/run/command.js +0 -1641
- package/.worktrees/2c37b1d7/src/run/complete-handlers.js +0 -1552
- package/.worktrees/2c37b1d7/src/run/complete.js +0 -1259
- package/.worktrees/2c37b1d7/src/run/concurrent-detect.js +0 -156
- package/.worktrees/2c37b1d7/src/run/gates.js +0 -1111
- package/.worktrees/2c37b1d7/src/run/multi-repo-context.js +0 -208
- package/.worktrees/2c37b1d7/src/run/next.js +0 -128
- package/.worktrees/2c37b1d7/src/run/prompt.js +0 -843
- package/.worktrees/2c37b1d7/src/run/quick-audit.js +0 -186
- package/.worktrees/2c37b1d7/src/run/scan-profile.js +0 -269
- package/.worktrees/2c37b1d7/src/run/shared.js +0 -1562
- package/.worktrees/2c37b1d7/src/run/stage.js +0 -587
- package/.worktrees/2c37b1d7/src/run.js +0 -23
- package/.worktrees/2c37b1d7/src/scan-diff.js +0 -388
- package/.worktrees/2c37b1d7/src/scan-postcheck.js +0 -524
- package/.worktrees/2c37b1d7/src/scan-staleness.js +0 -95
- package/.worktrees/2c37b1d7/src/setup.js +0 -414
- package/.worktrees/2c37b1d7/src/sillyhub-mcp/client.js +0 -597
- package/.worktrees/2c37b1d7/src/sillyhub-mcp/config.js +0 -62
- package/.worktrees/2c37b1d7/src/spec-dir-typo.js +0 -50
- package/.worktrees/2c37b1d7/src/spec-sync.js +0 -358
- package/.worktrees/2c37b1d7/src/stage-contract-engine.js +0 -171
- package/.worktrees/2c37b1d7/src/stage-contract-spec.js +0 -551
- package/.worktrees/2c37b1d7/src/stage-contract.js +0 -948
- package/.worktrees/2c37b1d7/src/stage-review.js +0 -597
- package/.worktrees/2c37b1d7/src/stages/archive.js +0 -199
- package/.worktrees/2c37b1d7/src/stages/brainstorm-auto.js +0 -285
- package/.worktrees/2c37b1d7/src/stages/brainstorm.js +0 -624
- package/.worktrees/2c37b1d7/src/stages/cmd-existence.js +0 -145
- package/.worktrees/2c37b1d7/src/stages/doctor.js +0 -540
- package/.worktrees/2c37b1d7/src/stages/execute.js +0 -1277
- package/.worktrees/2c37b1d7/src/stages/explore.js +0 -43
- package/.worktrees/2c37b1d7/src/stages/index.js +0 -29
- package/.worktrees/2c37b1d7/src/stages/knowledge.js +0 -514
- package/.worktrees/2c37b1d7/src/stages/plan-postcheck.js +0 -1398
- package/.worktrees/2c37b1d7/src/stages/plan.js +0 -655
- package/.worktrees/2c37b1d7/src/stages/quick.js +0 -167
- package/.worktrees/2c37b1d7/src/stages/scan.js +0 -608
- package/.worktrees/2c37b1d7/src/stages/status.js +0 -64
- package/.worktrees/2c37b1d7/src/stages/verify.js +0 -246
- package/.worktrees/2c37b1d7/src/sync.js +0 -1470
- package/.worktrees/2c37b1d7/src/task-review.js +0 -1498
- package/.worktrees/2c37b1d7/src/taskcard-placeholders.js +0 -21
- package/.worktrees/2c37b1d7/src/taskcard.js +0 -250
- package/.worktrees/2c37b1d7/src/verify-postcheck.js +0 -1718
- package/.worktrees/2c37b1d7/src/verify-probes.js +0 -327
- package/.worktrees/2c37b1d7/src/version.js +0 -19
- package/.worktrees/2c37b1d7/src/workflow.js +0 -600
- package/.worktrees/2c37b1d7/src/workspace.js +0 -125
- package/.worktrees/2c37b1d7/src/worktree-apply.js +0 -1611
- package/.worktrees/2c37b1d7/src/worktree-deps.js +0 -668
- package/.worktrees/2c37b1d7/src/worktree.js +0 -1849
- package/.worktrees/2c37b1d7/templates/claude-instruction.md +0 -23
- package/.worktrees/2c37b1d7/templates/prompts/taskcard-rules.md +0 -29
- package/.worktrees/2c37b1d7/templates/prompts/testcase-design.md +0 -12
- package/.worktrees/2c37b1d7/templates/prompts/verify-probes.md +0 -32
- package/.worktrees/2c37b1d7/templates/workflows/archive-impact.yaml +0 -79
- package/.worktrees/2c37b1d7/templates/workflows/scan-docs.yaml +0 -132
- package/.worktrees/542c4415/.claude/skills/sillyspec-archive/SKILL.md +0 -87
- package/.worktrees/542c4415/.claude/skills/sillyspec-auto/SKILL.md +0 -93
- package/.worktrees/542c4415/.claude/skills/sillyspec-brainstorm/SKILL.md +0 -114
- package/.worktrees/542c4415/.claude/skills/sillyspec-commit/SKILL.md +0 -67
- package/.worktrees/542c4415/.claude/skills/sillyspec-continue/SKILL.md +0 -47
- package/.worktrees/542c4415/.claude/skills/sillyspec-doctor/SKILL.md +0 -76
- package/.worktrees/542c4415/.claude/skills/sillyspec-execute/SKILL.md +0 -214
- package/.worktrees/542c4415/.claude/skills/sillyspec-explore/SKILL.md +0 -102
- package/.worktrees/542c4415/.claude/skills/sillyspec-export/SKILL.md +0 -57
- package/.worktrees/542c4415/.claude/skills/sillyspec-init/SKILL.md +0 -177
- package/.worktrees/542c4415/.claude/skills/sillyspec-knowledge/SKILL.md +0 -270
- package/.worktrees/542c4415/.claude/skills/sillyspec-plan/SKILL.md +0 -156
- package/.worktrees/542c4415/.claude/skills/sillyspec-quick/SKILL.md +0 -116
- package/.worktrees/542c4415/.claude/skills/sillyspec-resume/SKILL.md +0 -70
- package/.worktrees/542c4415/.claude/skills/sillyspec-scan/SKILL.md +0 -79
- package/.worktrees/542c4415/.claude/skills/sillyspec-state/SKILL.md +0 -64
- package/.worktrees/542c4415/.claude/skills/sillyspec-status/SKILL.md +0 -54
- package/.worktrees/542c4415/.claude/skills/sillyspec-verify/SKILL.md +0 -87
- package/.worktrees/542c4415/.claude/skills/sillyspec-workspace/SKILL.md +0 -175
- package/.worktrees/542c4415/.gitattributes +0 -2
- package/.worktrees/542c4415/.husky/pre-push +0 -20
- package/.worktrees/542c4415/README.md +0 -203
- package/.worktrees/542c4415/SKILL.md +0 -91
- package/.worktrees/542c4415/architecture-analysis.md +0 -448
- package/.worktrees/542c4415/bin/sillyspec.js +0 -2
- package/.worktrees/542c4415/eval/README.md +0 -86
- package/.worktrees/542c4415/eval/eval.config.json +0 -28
- package/.worktrees/542c4415/eval/lib/adapters/cli.mjs +0 -63
- package/.worktrees/542c4415/eval/lib/adapters/dryrun.mjs +0 -27
- package/.worktrees/542c4415/eval/lib/config.mjs +0 -82
- package/.worktrees/542c4415/eval/lib/db.mjs +0 -76
- package/.worktrees/542c4415/eval/lib/report.mjs +0 -120
- package/.worktrees/542c4415/eval/lib/runner.mjs +0 -157
- package/.worktrees/542c4415/eval/lib/tasks.mjs +0 -73
- package/.worktrees/542c4415/eval/lib/util.mjs +0 -107
- package/.worktrees/542c4415/eval/lib/workdir.mjs +0 -30
- package/.worktrees/542c4415/eval/run.mjs +0 -83
- package/.worktrees/542c4415/eval/tasks/001-slugify/files/package.json +0 -6
- package/.worktrees/542c4415/eval/tasks/001-slugify/solution/src/slugify.mjs +0 -26
- package/.worktrees/542c4415/eval/tasks/001-slugify/task.json +0 -6
- package/.worktrees/542c4415/eval/tasks/001-slugify/verify.mjs +0 -28
- package/.worktrees/542c4415/eval/tasks/002-each-day/files/package.json +0 -6
- package/.worktrees/542c4415/eval/tasks/002-each-day/files/src/dates.mjs +0 -4
- package/.worktrees/542c4415/eval/tasks/002-each-day/solution/src/dates.mjs +0 -30
- package/.worktrees/542c4415/eval/tasks/002-each-day/task.json +0 -6
- package/.worktrees/542c4415/eval/tasks/002-each-day/verify.mjs +0 -31
- package/.worktrees/542c4415/eval/tasks/003-word-report/files/data/notes.txt +0 -5
- package/.worktrees/542c4415/eval/tasks/003-word-report/files/package.json +0 -6
- package/.worktrees/542c4415/eval/tasks/003-word-report/solution/bin/report.mjs +0 -36
- package/.worktrees/542c4415/eval/tasks/003-word-report/task.json +0 -6
- package/.worktrees/542c4415/eval/tasks/003-word-report/verify.mjs +0 -38
- package/.worktrees/542c4415/logo.jpg +0 -0
- package/.worktrees/542c4415/package-lock.json +0 -977
- package/.worktrees/542c4415/package.json +0 -41
- package/.worktrees/542c4415/packages/dashboard/dist/assets/index-Bq_Z2hne.js +0 -7446
- package/.worktrees/542c4415/packages/dashboard/dist/assets/index-O2W5RV4z.css +0 -1
- package/.worktrees/542c4415/packages/dashboard/dist/favicon.jpg +0 -0
- package/.worktrees/542c4415/packages/dashboard/dist/index.html +0 -16
- package/.worktrees/542c4415/packages/dashboard/dist/logo.jpg +0 -0
- package/.worktrees/542c4415/packages/dashboard/dist/prototype-dashboard.html +0 -836
- package/.worktrees/542c4415/packages/dashboard/dist/prototype-overview.html +0 -256
- package/.worktrees/542c4415/packages/dashboard/package.json +0 -25
- package/.worktrees/542c4415/packages/dashboard/server/executor.js +0 -95
- package/.worktrees/542c4415/packages/dashboard/server/index.js +0 -679
- package/.worktrees/542c4415/packages/dashboard/server/parser.js +0 -526
- package/.worktrees/542c4415/packages/dashboard/server/watcher.js +0 -357
- package/.worktrees/542c4415/src/agent-session-log.js +0 -803
- package/.worktrees/542c4415/src/change-list.js +0 -290
- package/.worktrees/542c4415/src/change-risk-profile.js +0 -339
- package/.worktrees/542c4415/src/check-primitives.js +0 -65
- package/.worktrees/542c4415/src/classify-change.js +0 -109
- package/.worktrees/542c4415/src/commit-suggest.js +0 -202
- package/.worktrees/542c4415/src/config-cat.js +0 -88
- package/.worktrees/542c4415/src/config-schema.js +0 -328
- package/.worktrees/542c4415/src/constants.js +0 -97
- package/.worktrees/542c4415/src/contract-matrix.js +0 -533
- package/.worktrees/542c4415/src/datetime.js +0 -20
- package/.worktrees/542c4415/src/db-engine.js +0 -55
- package/.worktrees/542c4415/src/db.js +0 -381
- package/.worktrees/542c4415/src/decision-distill.js +0 -517
- package/.worktrees/542c4415/src/dispatch/backends/local-agent.js +0 -155
- package/.worktrees/542c4415/src/dispatch/backends/sillyhub-mcp.js +0 -245
- package/.worktrees/542c4415/src/dispatch/probe.js +0 -246
- package/.worktrees/542c4415/src/dispatch/strategy.js +0 -121
- package/.worktrees/542c4415/src/docs-check.js +0 -825
- package/.worktrees/542c4415/src/docs-debt.js +0 -393
- package/.worktrees/542c4415/src/docs-gate.js +0 -107
- package/.worktrees/542c4415/src/doctor-diagnostics.js +0 -1099
- package/.worktrees/542c4415/src/endpoint-extractor.js +0 -409
- package/.worktrees/542c4415/src/foreign-declared.js +0 -155
- package/.worktrees/542c4415/src/fs-atomic.js +0 -73
- package/.worktrees/542c4415/src/git-helper.js +0 -150
- package/.worktrees/542c4415/src/hooks/claude-pre-tool-use.cjs +0 -130
- package/.worktrees/542c4415/src/hooks/worktree-guard.js +0 -892
- package/.worktrees/542c4415/src/index.js +0 -2854
- package/.worktrees/542c4415/src/init.js +0 -626
- package/.worktrees/542c4415/src/knowledge-match.js +0 -231
- package/.worktrees/542c4415/src/local-detect.js +0 -128
- package/.worktrees/542c4415/src/local-register.js +0 -104
- package/.worktrees/542c4415/src/machine-interface.js +0 -543
- package/.worktrees/542c4415/src/migrate.js +0 -127
- package/.worktrees/542c4415/src/module-impact.js +0 -166
- package/.worktrees/542c4415/src/module-resolve.js +0 -222
- package/.worktrees/542c4415/src/modules.js +0 -580
- package/.worktrees/542c4415/src/plan-adopt-waves.js +0 -126
- package/.worktrees/542c4415/src/progress/change-registry.js +0 -336
- package/.worktrees/542c4415/src/progress/consistency-doctor.js +0 -355
- package/.worktrees/542c4415/src/progress/shared.js +0 -36
- package/.worktrees/542c4415/src/progress/stage-machine.js +0 -594
- package/.worktrees/542c4415/src/progress/step-store.js +0 -265
- package/.worktrees/542c4415/src/progress.js +0 -1304
- package/.worktrees/542c4415/src/quick-recommend.js +0 -115
- package/.worktrees/542c4415/src/quicklog.js +0 -883
- package/.worktrees/542c4415/src/review-tier.js +0 -77
- package/.worktrees/542c4415/src/run/command.js +0 -1641
- package/.worktrees/542c4415/src/run/complete-handlers.js +0 -1552
- package/.worktrees/542c4415/src/run/complete.js +0 -1259
- package/.worktrees/542c4415/src/run/concurrent-detect.js +0 -156
- package/.worktrees/542c4415/src/run/gates.js +0 -1111
- package/.worktrees/542c4415/src/run/multi-repo-context.js +0 -208
- package/.worktrees/542c4415/src/run/next.js +0 -128
- package/.worktrees/542c4415/src/run/prompt.js +0 -843
- package/.worktrees/542c4415/src/run/quick-audit.js +0 -186
- package/.worktrees/542c4415/src/run/scan-profile.js +0 -269
- package/.worktrees/542c4415/src/run/shared.js +0 -1562
- package/.worktrees/542c4415/src/run/stage.js +0 -587
- package/.worktrees/542c4415/src/run.js +0 -23
- package/.worktrees/542c4415/src/scan-diff.js +0 -388
- package/.worktrees/542c4415/src/scan-postcheck.js +0 -524
- package/.worktrees/542c4415/src/scan-staleness.js +0 -95
- package/.worktrees/542c4415/src/setup.js +0 -414
- package/.worktrees/542c4415/src/sillyhub-mcp/client.js +0 -597
- package/.worktrees/542c4415/src/sillyhub-mcp/config.js +0 -62
- package/.worktrees/542c4415/src/spec-dir-typo.js +0 -50
- package/.worktrees/542c4415/src/spec-sync.js +0 -358
- package/.worktrees/542c4415/src/stage-contract-engine.js +0 -171
- package/.worktrees/542c4415/src/stage-contract-spec.js +0 -551
- package/.worktrees/542c4415/src/stage-contract.js +0 -948
- package/.worktrees/542c4415/src/stage-review.js +0 -597
- package/.worktrees/542c4415/src/stages/archive.js +0 -199
- package/.worktrees/542c4415/src/stages/brainstorm-auto.js +0 -285
- package/.worktrees/542c4415/src/stages/brainstorm.js +0 -624
- package/.worktrees/542c4415/src/stages/cmd-existence.js +0 -145
- package/.worktrees/542c4415/src/stages/doctor.js +0 -540
- package/.worktrees/542c4415/src/stages/execute.js +0 -1277
- package/.worktrees/542c4415/src/stages/explore.js +0 -43
- package/.worktrees/542c4415/src/stages/index.js +0 -29
- package/.worktrees/542c4415/src/stages/knowledge.js +0 -514
- package/.worktrees/542c4415/src/stages/plan-postcheck.js +0 -1398
- package/.worktrees/542c4415/src/stages/plan.js +0 -655
- package/.worktrees/542c4415/src/stages/quick.js +0 -167
- package/.worktrees/542c4415/src/stages/scan.js +0 -608
- package/.worktrees/542c4415/src/stages/status.js +0 -64
- package/.worktrees/542c4415/src/stages/verify.js +0 -246
- package/.worktrees/542c4415/src/sync.js +0 -1470
- package/.worktrees/542c4415/src/task-review.js +0 -1498
- package/.worktrees/542c4415/src/taskcard-placeholders.js +0 -21
- package/.worktrees/542c4415/src/taskcard.js +0 -250
- package/.worktrees/542c4415/src/verify-postcheck.js +0 -1718
- package/.worktrees/542c4415/src/verify-probes.js +0 -327
- package/.worktrees/542c4415/src/version.js +0 -19
- package/.worktrees/542c4415/src/workflow.js +0 -600
- package/.worktrees/542c4415/src/workspace.js +0 -125
- package/.worktrees/542c4415/src/worktree-apply.js +0 -1611
- package/.worktrees/542c4415/src/worktree-deps.js +0 -668
- package/.worktrees/542c4415/src/worktree.js +0 -1849
- package/.worktrees/542c4415/templates/claude-instruction.md +0 -23
- package/.worktrees/542c4415/templates/prompts/taskcard-rules.md +0 -29
- package/.worktrees/542c4415/templates/prompts/testcase-design.md +0 -12
- package/.worktrees/542c4415/templates/prompts/verify-probes.md +0 -32
- package/.worktrees/542c4415/templates/workflows/archive-impact.yaml +0 -79
- package/.worktrees/542c4415/templates/workflows/scan-docs.yaml +0 -132
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-archive/SKILL.md +0 -87
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-auto/SKILL.md +0 -93
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-brainstorm/SKILL.md +0 -114
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-commit/SKILL.md +0 -67
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-continue/SKILL.md +0 -47
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-doctor/SKILL.md +0 -76
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-execute/SKILL.md +0 -214
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-explore/SKILL.md +0 -102
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-export/SKILL.md +0 -57
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-init/SKILL.md +0 -177
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-knowledge/SKILL.md +0 -270
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-plan/SKILL.md +0 -156
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-propose/SKILL.md +0 -87
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-quick/SKILL.md +0 -116
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-resume/SKILL.md +0 -70
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-scan/SKILL.md +0 -79
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-state/SKILL.md +0 -64
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-status/SKILL.md +0 -54
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-verify/SKILL.md +0 -87
- package/.worktrees/8d2d0392/.claude/skills/sillyspec-workspace/SKILL.md +0 -175
- package/.worktrees/8d2d0392/.claude/skills/verify-per-user/SKILL.md +0 -6
- package/.worktrees/8d2d0392/.gitattributes +0 -2
- package/.worktrees/8d2d0392/.husky/pre-push +0 -20
- package/.worktrees/8d2d0392/README.md +0 -203
- package/.worktrees/8d2d0392/SKILL.md +0 -91
- package/.worktrees/8d2d0392/architecture-analysis.md +0 -448
- package/.worktrees/8d2d0392/bin/sillyspec.js +0 -2
- package/.worktrees/8d2d0392/eval/README.md +0 -86
- package/.worktrees/8d2d0392/eval/eval.config.json +0 -28
- package/.worktrees/8d2d0392/eval/lib/adapters/cli.mjs +0 -63
- package/.worktrees/8d2d0392/eval/lib/adapters/dryrun.mjs +0 -27
- package/.worktrees/8d2d0392/eval/lib/config.mjs +0 -82
- package/.worktrees/8d2d0392/eval/lib/db.mjs +0 -76
- package/.worktrees/8d2d0392/eval/lib/report.mjs +0 -120
- package/.worktrees/8d2d0392/eval/lib/runner.mjs +0 -157
- package/.worktrees/8d2d0392/eval/lib/tasks.mjs +0 -73
- package/.worktrees/8d2d0392/eval/lib/util.mjs +0 -107
- package/.worktrees/8d2d0392/eval/lib/workdir.mjs +0 -30
- package/.worktrees/8d2d0392/eval/run.mjs +0 -83
- package/.worktrees/8d2d0392/eval/tasks/001-slugify/files/package.json +0 -6
- package/.worktrees/8d2d0392/eval/tasks/001-slugify/solution/src/slugify.mjs +0 -26
- package/.worktrees/8d2d0392/eval/tasks/001-slugify/task.json +0 -6
- package/.worktrees/8d2d0392/eval/tasks/001-slugify/verify.mjs +0 -28
- package/.worktrees/8d2d0392/eval/tasks/002-each-day/files/package.json +0 -6
- package/.worktrees/8d2d0392/eval/tasks/002-each-day/files/src/dates.mjs +0 -4
- package/.worktrees/8d2d0392/eval/tasks/002-each-day/solution/src/dates.mjs +0 -30
- package/.worktrees/8d2d0392/eval/tasks/002-each-day/task.json +0 -6
- package/.worktrees/8d2d0392/eval/tasks/002-each-day/verify.mjs +0 -31
- package/.worktrees/8d2d0392/eval/tasks/003-word-report/files/data/notes.txt +0 -5
- package/.worktrees/8d2d0392/eval/tasks/003-word-report/files/package.json +0 -6
- package/.worktrees/8d2d0392/eval/tasks/003-word-report/solution/bin/report.mjs +0 -36
- package/.worktrees/8d2d0392/eval/tasks/003-word-report/task.json +0 -6
- package/.worktrees/8d2d0392/eval/tasks/003-word-report/verify.mjs +0 -38
- package/.worktrees/8d2d0392/logo.jpg +0 -0
- package/.worktrees/8d2d0392/package-lock.json +0 -977
- package/.worktrees/8d2d0392/package.json +0 -41
- package/.worktrees/8d2d0392/packages/dashboard/dist/assets/index-Bq_Z2hne.js +0 -7446
- package/.worktrees/8d2d0392/packages/dashboard/dist/assets/index-O2W5RV4z.css +0 -1
- package/.worktrees/8d2d0392/packages/dashboard/dist/favicon.jpg +0 -0
- package/.worktrees/8d2d0392/packages/dashboard/dist/index.html +0 -16
- package/.worktrees/8d2d0392/packages/dashboard/dist/logo.jpg +0 -0
- package/.worktrees/8d2d0392/packages/dashboard/dist/prototype-dashboard.html +0 -836
- package/.worktrees/8d2d0392/packages/dashboard/dist/prototype-overview.html +0 -256
- package/.worktrees/8d2d0392/packages/dashboard/package.json +0 -25
- package/.worktrees/8d2d0392/packages/dashboard/server/executor.js +0 -95
- package/.worktrees/8d2d0392/packages/dashboard/server/index.js +0 -679
- package/.worktrees/8d2d0392/packages/dashboard/server/parser.js +0 -526
- package/.worktrees/8d2d0392/packages/dashboard/server/watcher.js +0 -357
- package/.worktrees/8d2d0392/src/agent-session-log.js +0 -803
- package/.worktrees/8d2d0392/src/change-list.js +0 -290
- package/.worktrees/8d2d0392/src/change-risk-profile.js +0 -339
- package/.worktrees/8d2d0392/src/check-primitives.js +0 -65
- package/.worktrees/8d2d0392/src/classify-change.js +0 -109
- package/.worktrees/8d2d0392/src/commit-suggest.js +0 -202
- package/.worktrees/8d2d0392/src/config-cat.js +0 -88
- package/.worktrees/8d2d0392/src/config-schema.js +0 -328
- package/.worktrees/8d2d0392/src/constants.js +0 -97
- package/.worktrees/8d2d0392/src/contract-matrix.js +0 -533
- package/.worktrees/8d2d0392/src/datetime.js +0 -20
- package/.worktrees/8d2d0392/src/db-engine.js +0 -55
- package/.worktrees/8d2d0392/src/db.js +0 -381
- package/.worktrees/8d2d0392/src/decision-distill.js +0 -517
- package/.worktrees/8d2d0392/src/dispatch/backends/local-agent.js +0 -155
- package/.worktrees/8d2d0392/src/dispatch/backends/sillyhub-mcp.js +0 -245
- package/.worktrees/8d2d0392/src/dispatch/probe.js +0 -246
- package/.worktrees/8d2d0392/src/dispatch/strategy.js +0 -121
- package/.worktrees/8d2d0392/src/docs-check.js +0 -825
- package/.worktrees/8d2d0392/src/docs-debt.js +0 -393
- package/.worktrees/8d2d0392/src/docs-gate.js +0 -107
- package/.worktrees/8d2d0392/src/doctor-diagnostics.js +0 -1099
- package/.worktrees/8d2d0392/src/endpoint-extractor.js +0 -409
- package/.worktrees/8d2d0392/src/foreign-declared.js +0 -78
- package/.worktrees/8d2d0392/src/fs-atomic.js +0 -73
- package/.worktrees/8d2d0392/src/git-helper.js +0 -150
- package/.worktrees/8d2d0392/src/hooks/claude-pre-tool-use.cjs +0 -130
- package/.worktrees/8d2d0392/src/hooks/worktree-guard.js +0 -892
- package/.worktrees/8d2d0392/src/index.js +0 -2854
- package/.worktrees/8d2d0392/src/init.js +0 -626
- package/.worktrees/8d2d0392/src/knowledge-match.js +0 -231
- package/.worktrees/8d2d0392/src/local-detect.js +0 -128
- package/.worktrees/8d2d0392/src/local-register.js +0 -104
- package/.worktrees/8d2d0392/src/machine-interface.js +0 -543
- package/.worktrees/8d2d0392/src/migrate.js +0 -127
- package/.worktrees/8d2d0392/src/module-impact.js +0 -166
- package/.worktrees/8d2d0392/src/module-resolve.js +0 -222
- package/.worktrees/8d2d0392/src/modules.js +0 -580
- package/.worktrees/8d2d0392/src/plan-adopt-waves.js +0 -126
- package/.worktrees/8d2d0392/src/progress/change-registry.js +0 -336
- package/.worktrees/8d2d0392/src/progress/consistency-doctor.js +0 -355
- package/.worktrees/8d2d0392/src/progress/shared.js +0 -36
- package/.worktrees/8d2d0392/src/progress/stage-machine.js +0 -594
- package/.worktrees/8d2d0392/src/progress/step-store.js +0 -265
- package/.worktrees/8d2d0392/src/progress.js +0 -1304
- package/.worktrees/8d2d0392/src/quick-recommend.js +0 -115
- package/.worktrees/8d2d0392/src/quicklog.js +0 -883
- package/.worktrees/8d2d0392/src/review-tier.js +0 -77
- package/.worktrees/8d2d0392/src/run/command.js +0 -1641
- package/.worktrees/8d2d0392/src/run/complete-handlers.js +0 -1552
- package/.worktrees/8d2d0392/src/run/complete.js +0 -1259
- package/.worktrees/8d2d0392/src/run/concurrent-detect.js +0 -156
- package/.worktrees/8d2d0392/src/run/gates.js +0 -1094
- package/.worktrees/8d2d0392/src/run/multi-repo-context.js +0 -208
- package/.worktrees/8d2d0392/src/run/next.js +0 -128
- package/.worktrees/8d2d0392/src/run/prompt.js +0 -843
- package/.worktrees/8d2d0392/src/run/quick-audit.js +0 -186
- package/.worktrees/8d2d0392/src/run/scan-profile.js +0 -269
- package/.worktrees/8d2d0392/src/run/shared.js +0 -1562
- package/.worktrees/8d2d0392/src/run/stage.js +0 -587
- package/.worktrees/8d2d0392/src/run.js +0 -23
- package/.worktrees/8d2d0392/src/scan-diff.js +0 -388
- package/.worktrees/8d2d0392/src/scan-postcheck.js +0 -524
- package/.worktrees/8d2d0392/src/scan-staleness.js +0 -95
- package/.worktrees/8d2d0392/src/setup.js +0 -414
- package/.worktrees/8d2d0392/src/sillyhub-mcp/client.js +0 -597
- package/.worktrees/8d2d0392/src/sillyhub-mcp/config.js +0 -62
- package/.worktrees/8d2d0392/src/spec-dir-typo.js +0 -50
- package/.worktrees/8d2d0392/src/spec-sync.js +0 -358
- package/.worktrees/8d2d0392/src/stage-contract-engine.js +0 -171
- package/.worktrees/8d2d0392/src/stage-contract-spec.js +0 -551
- package/.worktrees/8d2d0392/src/stage-contract.js +0 -948
- package/.worktrees/8d2d0392/src/stage-review.js +0 -597
- package/.worktrees/8d2d0392/src/stages/archive.js +0 -199
- package/.worktrees/8d2d0392/src/stages/brainstorm-auto.js +0 -285
- package/.worktrees/8d2d0392/src/stages/brainstorm.js +0 -624
- package/.worktrees/8d2d0392/src/stages/cmd-existence.js +0 -145
- package/.worktrees/8d2d0392/src/stages/doctor.js +0 -540
- package/.worktrees/8d2d0392/src/stages/execute.js +0 -1277
- package/.worktrees/8d2d0392/src/stages/explore.js +0 -43
- package/.worktrees/8d2d0392/src/stages/index.js +0 -29
- package/.worktrees/8d2d0392/src/stages/knowledge.js +0 -514
- package/.worktrees/8d2d0392/src/stages/plan-postcheck.js +0 -1398
- package/.worktrees/8d2d0392/src/stages/plan.js +0 -651
- package/.worktrees/8d2d0392/src/stages/quick.js +0 -167
- package/.worktrees/8d2d0392/src/stages/scan.js +0 -608
- package/.worktrees/8d2d0392/src/stages/status.js +0 -64
- package/.worktrees/8d2d0392/src/stages/verify.js +0 -246
- package/.worktrees/8d2d0392/src/sync.js +0 -1470
- package/.worktrees/8d2d0392/src/task-review.js +0 -1498
- package/.worktrees/8d2d0392/src/taskcard-placeholders.js +0 -21
- package/.worktrees/8d2d0392/src/taskcard.js +0 -217
- package/.worktrees/8d2d0392/src/verify-postcheck.js +0 -1718
- package/.worktrees/8d2d0392/src/verify-probes.js +0 -327
- package/.worktrees/8d2d0392/src/version.js +0 -19
- package/.worktrees/8d2d0392/src/workflow.js +0 -600
- package/.worktrees/8d2d0392/src/workspace.js +0 -125
- package/.worktrees/8d2d0392/src/worktree-apply.js +0 -1611
- package/.worktrees/8d2d0392/src/worktree-deps.js +0 -576
- package/.worktrees/8d2d0392/src/worktree.js +0 -1838
- package/.worktrees/8d2d0392/templates/claude-instruction.md +0 -23
- package/.worktrees/8d2d0392/templates/prompts/taskcard-rules.md +0 -29
- package/.worktrees/8d2d0392/templates/prompts/testcase-design.md +0 -12
- package/.worktrees/8d2d0392/templates/prompts/verify-probes.md +0 -32
- package/.worktrees/8d2d0392/templates/workflows/archive-impact.yaml +0 -79
- package/.worktrees/8d2d0392/templates/workflows/scan-docs.yaml +0 -132
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-archive/SKILL.md +0 -87
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-auto/SKILL.md +0 -93
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-brainstorm/SKILL.md +0 -114
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-commit/SKILL.md +0 -67
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-continue/SKILL.md +0 -47
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-doctor/SKILL.md +0 -76
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-execute/SKILL.md +0 -214
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-explore/SKILL.md +0 -102
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-export/SKILL.md +0 -57
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-init/SKILL.md +0 -177
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-knowledge/SKILL.md +0 -270
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-plan/SKILL.md +0 -156
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-quick/SKILL.md +0 -116
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-resume/SKILL.md +0 -70
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-scan/SKILL.md +0 -79
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-state/SKILL.md +0 -64
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-status/SKILL.md +0 -54
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-verify/SKILL.md +0 -87
- package/.worktrees/c1eae35e/.claude/skills/sillyspec-workspace/SKILL.md +0 -175
- package/.worktrees/c1eae35e/.gitattributes +0 -2
- package/.worktrees/c1eae35e/.husky/pre-push +0 -20
- package/.worktrees/c1eae35e/README.md +0 -203
- package/.worktrees/c1eae35e/SKILL.md +0 -91
- package/.worktrees/c1eae35e/architecture-analysis.md +0 -448
- package/.worktrees/c1eae35e/bin/sillyspec.js +0 -2
- package/.worktrees/c1eae35e/eval/README.md +0 -86
- package/.worktrees/c1eae35e/eval/eval.config.json +0 -28
- package/.worktrees/c1eae35e/eval/lib/adapters/cli.mjs +0 -63
- package/.worktrees/c1eae35e/eval/lib/adapters/dryrun.mjs +0 -27
- package/.worktrees/c1eae35e/eval/lib/config.mjs +0 -82
- package/.worktrees/c1eae35e/eval/lib/db.mjs +0 -76
- package/.worktrees/c1eae35e/eval/lib/report.mjs +0 -120
- package/.worktrees/c1eae35e/eval/lib/runner.mjs +0 -157
- package/.worktrees/c1eae35e/eval/lib/tasks.mjs +0 -73
- package/.worktrees/c1eae35e/eval/lib/util.mjs +0 -107
- package/.worktrees/c1eae35e/eval/lib/workdir.mjs +0 -30
- package/.worktrees/c1eae35e/eval/run.mjs +0 -83
- package/.worktrees/c1eae35e/eval/tasks/001-slugify/files/package.json +0 -6
- package/.worktrees/c1eae35e/eval/tasks/001-slugify/solution/src/slugify.mjs +0 -26
- package/.worktrees/c1eae35e/eval/tasks/001-slugify/task.json +0 -6
- package/.worktrees/c1eae35e/eval/tasks/001-slugify/verify.mjs +0 -28
- package/.worktrees/c1eae35e/eval/tasks/002-each-day/files/package.json +0 -6
- package/.worktrees/c1eae35e/eval/tasks/002-each-day/files/src/dates.mjs +0 -4
- package/.worktrees/c1eae35e/eval/tasks/002-each-day/solution/src/dates.mjs +0 -30
- package/.worktrees/c1eae35e/eval/tasks/002-each-day/task.json +0 -6
- package/.worktrees/c1eae35e/eval/tasks/002-each-day/verify.mjs +0 -31
- package/.worktrees/c1eae35e/eval/tasks/003-word-report/files/data/notes.txt +0 -5
- package/.worktrees/c1eae35e/eval/tasks/003-word-report/files/package.json +0 -6
- package/.worktrees/c1eae35e/eval/tasks/003-word-report/solution/bin/report.mjs +0 -36
- package/.worktrees/c1eae35e/eval/tasks/003-word-report/task.json +0 -6
- package/.worktrees/c1eae35e/eval/tasks/003-word-report/verify.mjs +0 -38
- package/.worktrees/c1eae35e/logo.jpg +0 -0
- package/.worktrees/c1eae35e/package-lock.json +0 -977
- package/.worktrees/c1eae35e/package.json +0 -41
- package/.worktrees/c1eae35e/packages/dashboard/dist/assets/index-Bq_Z2hne.js +0 -7446
- package/.worktrees/c1eae35e/packages/dashboard/dist/assets/index-O2W5RV4z.css +0 -1
- package/.worktrees/c1eae35e/packages/dashboard/dist/favicon.jpg +0 -0
- package/.worktrees/c1eae35e/packages/dashboard/dist/index.html +0 -16
- package/.worktrees/c1eae35e/packages/dashboard/dist/logo.jpg +0 -0
- package/.worktrees/c1eae35e/packages/dashboard/dist/prototype-dashboard.html +0 -836
- package/.worktrees/c1eae35e/packages/dashboard/dist/prototype-overview.html +0 -256
- package/.worktrees/c1eae35e/packages/dashboard/package.json +0 -25
- package/.worktrees/c1eae35e/packages/dashboard/server/executor.js +0 -95
- package/.worktrees/c1eae35e/packages/dashboard/server/index.js +0 -679
- package/.worktrees/c1eae35e/packages/dashboard/server/parser.js +0 -526
- package/.worktrees/c1eae35e/packages/dashboard/server/watcher.js +0 -357
- package/.worktrees/c1eae35e/src/agent-session-log.js +0 -803
- package/.worktrees/c1eae35e/src/change-list.js +0 -290
- package/.worktrees/c1eae35e/src/change-risk-profile.js +0 -339
- package/.worktrees/c1eae35e/src/check-primitives.js +0 -65
- package/.worktrees/c1eae35e/src/classify-change.js +0 -109
- package/.worktrees/c1eae35e/src/commit-suggest.js +0 -202
- package/.worktrees/c1eae35e/src/config-cat.js +0 -88
- package/.worktrees/c1eae35e/src/config-schema.js +0 -328
- package/.worktrees/c1eae35e/src/constants.js +0 -97
- package/.worktrees/c1eae35e/src/contract-matrix.js +0 -533
- package/.worktrees/c1eae35e/src/datetime.js +0 -20
- package/.worktrees/c1eae35e/src/db-engine.js +0 -55
- package/.worktrees/c1eae35e/src/db.js +0 -381
- package/.worktrees/c1eae35e/src/decision-distill.js +0 -517
- package/.worktrees/c1eae35e/src/dispatch/backends/local-agent.js +0 -155
- package/.worktrees/c1eae35e/src/dispatch/backends/sillyhub-mcp.js +0 -245
- package/.worktrees/c1eae35e/src/dispatch/probe.js +0 -246
- package/.worktrees/c1eae35e/src/dispatch/strategy.js +0 -121
- package/.worktrees/c1eae35e/src/docs-check.js +0 -825
- package/.worktrees/c1eae35e/src/docs-debt.js +0 -393
- package/.worktrees/c1eae35e/src/docs-gate.js +0 -107
- package/.worktrees/c1eae35e/src/doctor-diagnostics.js +0 -1099
- package/.worktrees/c1eae35e/src/endpoint-extractor.js +0 -409
- package/.worktrees/c1eae35e/src/foreign-declared.js +0 -155
- package/.worktrees/c1eae35e/src/fs-atomic.js +0 -73
- package/.worktrees/c1eae35e/src/git-helper.js +0 -150
- package/.worktrees/c1eae35e/src/hooks/claude-pre-tool-use.cjs +0 -130
- package/.worktrees/c1eae35e/src/hooks/worktree-guard.js +0 -892
- package/.worktrees/c1eae35e/src/index.js +0 -2854
- package/.worktrees/c1eae35e/src/init.js +0 -626
- package/.worktrees/c1eae35e/src/knowledge-match.js +0 -231
- package/.worktrees/c1eae35e/src/local-detect.js +0 -128
- package/.worktrees/c1eae35e/src/local-register.js +0 -104
- package/.worktrees/c1eae35e/src/machine-interface.js +0 -543
- package/.worktrees/c1eae35e/src/migrate.js +0 -127
- package/.worktrees/c1eae35e/src/module-impact.js +0 -166
- package/.worktrees/c1eae35e/src/module-resolve.js +0 -222
- package/.worktrees/c1eae35e/src/modules.js +0 -580
- package/.worktrees/c1eae35e/src/plan-adopt-waves.js +0 -126
- package/.worktrees/c1eae35e/src/progress/change-registry.js +0 -336
- package/.worktrees/c1eae35e/src/progress/consistency-doctor.js +0 -355
- package/.worktrees/c1eae35e/src/progress/shared.js +0 -36
- package/.worktrees/c1eae35e/src/progress/stage-machine.js +0 -594
- package/.worktrees/c1eae35e/src/progress/step-store.js +0 -265
- package/.worktrees/c1eae35e/src/progress.js +0 -1304
- package/.worktrees/c1eae35e/src/quick-recommend.js +0 -115
- package/.worktrees/c1eae35e/src/quicklog.js +0 -883
- package/.worktrees/c1eae35e/src/review-tier.js +0 -77
- package/.worktrees/c1eae35e/src/run/command.js +0 -1641
- package/.worktrees/c1eae35e/src/run/complete-handlers.js +0 -1552
- package/.worktrees/c1eae35e/src/run/complete.js +0 -1259
- package/.worktrees/c1eae35e/src/run/concurrent-detect.js +0 -156
- package/.worktrees/c1eae35e/src/run/gates.js +0 -1111
- package/.worktrees/c1eae35e/src/run/multi-repo-context.js +0 -208
- package/.worktrees/c1eae35e/src/run/next.js +0 -128
- package/.worktrees/c1eae35e/src/run/prompt.js +0 -843
- package/.worktrees/c1eae35e/src/run/quick-audit.js +0 -186
- package/.worktrees/c1eae35e/src/run/scan-profile.js +0 -269
- package/.worktrees/c1eae35e/src/run/shared.js +0 -1562
- package/.worktrees/c1eae35e/src/run/stage.js +0 -587
- package/.worktrees/c1eae35e/src/run.js +0 -23
- package/.worktrees/c1eae35e/src/scan-diff.js +0 -388
- package/.worktrees/c1eae35e/src/scan-postcheck.js +0 -524
- package/.worktrees/c1eae35e/src/scan-staleness.js +0 -95
- package/.worktrees/c1eae35e/src/setup.js +0 -414
- package/.worktrees/c1eae35e/src/sillyhub-mcp/client.js +0 -597
- package/.worktrees/c1eae35e/src/sillyhub-mcp/config.js +0 -62
- package/.worktrees/c1eae35e/src/spec-dir-typo.js +0 -50
- package/.worktrees/c1eae35e/src/spec-sync.js +0 -358
- package/.worktrees/c1eae35e/src/stage-contract-engine.js +0 -171
- package/.worktrees/c1eae35e/src/stage-contract-spec.js +0 -551
- package/.worktrees/c1eae35e/src/stage-contract.js +0 -948
- package/.worktrees/c1eae35e/src/stage-review.js +0 -597
- package/.worktrees/c1eae35e/src/stages/archive.js +0 -199
- package/.worktrees/c1eae35e/src/stages/brainstorm-auto.js +0 -285
- package/.worktrees/c1eae35e/src/stages/brainstorm.js +0 -624
- package/.worktrees/c1eae35e/src/stages/cmd-existence.js +0 -145
- package/.worktrees/c1eae35e/src/stages/doctor.js +0 -540
- package/.worktrees/c1eae35e/src/stages/execute.js +0 -1277
- package/.worktrees/c1eae35e/src/stages/explore.js +0 -43
- package/.worktrees/c1eae35e/src/stages/index.js +0 -29
- package/.worktrees/c1eae35e/src/stages/knowledge.js +0 -514
- package/.worktrees/c1eae35e/src/stages/plan-postcheck.js +0 -1398
- package/.worktrees/c1eae35e/src/stages/plan.js +0 -655
- package/.worktrees/c1eae35e/src/stages/quick.js +0 -167
- package/.worktrees/c1eae35e/src/stages/scan.js +0 -608
- package/.worktrees/c1eae35e/src/stages/status.js +0 -64
- package/.worktrees/c1eae35e/src/stages/verify.js +0 -246
- package/.worktrees/c1eae35e/src/sync.js +0 -1470
- package/.worktrees/c1eae35e/src/task-review.js +0 -1498
- package/.worktrees/c1eae35e/src/taskcard-placeholders.js +0 -21
- package/.worktrees/c1eae35e/src/taskcard.js +0 -250
- package/.worktrees/c1eae35e/src/verify-postcheck.js +0 -1718
- package/.worktrees/c1eae35e/src/verify-probes.js +0 -327
- package/.worktrees/c1eae35e/src/version.js +0 -19
- package/.worktrees/c1eae35e/src/workflow.js +0 -600
- package/.worktrees/c1eae35e/src/workspace.js +0 -125
- package/.worktrees/c1eae35e/src/worktree-apply.js +0 -1611
- package/.worktrees/c1eae35e/src/worktree-deps.js +0 -668
- package/.worktrees/c1eae35e/src/worktree.js +0 -1849
- package/.worktrees/c1eae35e/templates/claude-instruction.md +0 -23
- package/.worktrees/c1eae35e/templates/prompts/taskcard-rules.md +0 -29
- package/.worktrees/c1eae35e/templates/prompts/testcase-design.md +0 -12
- package/.worktrees/c1eae35e/templates/prompts/verify-probes.md +0 -32
- package/.worktrees/c1eae35e/templates/workflows/archive-impact.yaml +0 -79
- package/.worktrees/c1eae35e/templates/workflows/scan-docs.yaml +0 -132
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-archive/SKILL.md +0 -87
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-auto/SKILL.md +0 -93
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-brainstorm/SKILL.md +0 -114
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-commit/SKILL.md +0 -67
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-continue/SKILL.md +0 -47
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-doctor/SKILL.md +0 -76
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-execute/SKILL.md +0 -214
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-explore/SKILL.md +0 -102
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-export/SKILL.md +0 -57
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-init/SKILL.md +0 -177
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-knowledge/SKILL.md +0 -270
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-plan/SKILL.md +0 -156
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-propose/SKILL.md +0 -87
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-quick/SKILL.md +0 -116
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-resume/SKILL.md +0 -70
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-scan/SKILL.md +0 -79
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-state/SKILL.md +0 -64
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-status/SKILL.md +0 -54
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-verify/SKILL.md +0 -87
- package/.worktrees/dafc71ad/.claude/skills/sillyspec-workspace/SKILL.md +0 -175
- package/.worktrees/dafc71ad/.gitattributes +0 -2
- package/.worktrees/dafc71ad/.husky/pre-push +0 -20
- package/.worktrees/dafc71ad/README.md +0 -203
- package/.worktrees/dafc71ad/SKILL.md +0 -91
- package/.worktrees/dafc71ad/analysis.md +0 -366
- package/.worktrees/dafc71ad/architecture-analysis.md +0 -448
- package/.worktrees/dafc71ad/bin/sillyspec.js +0 -2
- package/.worktrees/dafc71ad/eval/README.md +0 -86
- package/.worktrees/dafc71ad/eval/eval.config.json +0 -28
- package/.worktrees/dafc71ad/eval/lib/adapters/cli.mjs +0 -63
- package/.worktrees/dafc71ad/eval/lib/adapters/dryrun.mjs +0 -27
- package/.worktrees/dafc71ad/eval/lib/config.mjs +0 -82
- package/.worktrees/dafc71ad/eval/lib/db.mjs +0 -76
- package/.worktrees/dafc71ad/eval/lib/report.mjs +0 -120
- package/.worktrees/dafc71ad/eval/lib/runner.mjs +0 -157
- package/.worktrees/dafc71ad/eval/lib/tasks.mjs +0 -73
- package/.worktrees/dafc71ad/eval/lib/util.mjs +0 -107
- package/.worktrees/dafc71ad/eval/lib/workdir.mjs +0 -30
- package/.worktrees/dafc71ad/eval/run.mjs +0 -83
- package/.worktrees/dafc71ad/eval/tasks/001-slugify/files/package.json +0 -6
- package/.worktrees/dafc71ad/eval/tasks/001-slugify/solution/src/slugify.mjs +0 -26
- package/.worktrees/dafc71ad/eval/tasks/001-slugify/task.json +0 -6
- package/.worktrees/dafc71ad/eval/tasks/001-slugify/verify.mjs +0 -28
- package/.worktrees/dafc71ad/eval/tasks/002-each-day/files/package.json +0 -6
- package/.worktrees/dafc71ad/eval/tasks/002-each-day/files/src/dates.mjs +0 -4
- package/.worktrees/dafc71ad/eval/tasks/002-each-day/solution/src/dates.mjs +0 -30
- package/.worktrees/dafc71ad/eval/tasks/002-each-day/task.json +0 -6
- package/.worktrees/dafc71ad/eval/tasks/002-each-day/verify.mjs +0 -31
- package/.worktrees/dafc71ad/eval/tasks/003-word-report/files/data/notes.txt +0 -5
- package/.worktrees/dafc71ad/eval/tasks/003-word-report/files/package.json +0 -6
- package/.worktrees/dafc71ad/eval/tasks/003-word-report/solution/bin/report.mjs +0 -36
- package/.worktrees/dafc71ad/eval/tasks/003-word-report/task.json +0 -6
- package/.worktrees/dafc71ad/eval/tasks/003-word-report/verify.mjs +0 -38
- package/.worktrees/dafc71ad/logo.jpg +0 -0
- package/.worktrees/dafc71ad/package-lock.json +0 -977
- package/.worktrees/dafc71ad/package.json +0 -41
- package/.worktrees/dafc71ad/packages/dashboard/dist/assets/index-Bq_Z2hne.js +0 -7446
- package/.worktrees/dafc71ad/packages/dashboard/dist/assets/index-O2W5RV4z.css +0 -1
- package/.worktrees/dafc71ad/packages/dashboard/dist/favicon.jpg +0 -0
- package/.worktrees/dafc71ad/packages/dashboard/dist/index.html +0 -16
- package/.worktrees/dafc71ad/packages/dashboard/dist/logo.jpg +0 -0
- package/.worktrees/dafc71ad/packages/dashboard/dist/prototype-dashboard.html +0 -836
- package/.worktrees/dafc71ad/packages/dashboard/dist/prototype-overview.html +0 -256
- package/.worktrees/dafc71ad/packages/dashboard/package.json +0 -25
- package/.worktrees/dafc71ad/packages/dashboard/server/executor.js +0 -95
- package/.worktrees/dafc71ad/packages/dashboard/server/index.js +0 -679
- package/.worktrees/dafc71ad/packages/dashboard/server/parser.js +0 -526
- package/.worktrees/dafc71ad/packages/dashboard/server/watcher.js +0 -357
- package/.worktrees/dafc71ad/src/agent-session-log.js +0 -803
- package/.worktrees/dafc71ad/src/change-list.js +0 -290
- package/.worktrees/dafc71ad/src/change-risk-profile.js +0 -339
- package/.worktrees/dafc71ad/src/check-primitives.js +0 -65
- package/.worktrees/dafc71ad/src/classify-change.js +0 -109
- package/.worktrees/dafc71ad/src/commit-suggest.js +0 -202
- package/.worktrees/dafc71ad/src/config-cat.js +0 -88
- package/.worktrees/dafc71ad/src/config-schema.js +0 -328
- package/.worktrees/dafc71ad/src/constants.js +0 -97
- package/.worktrees/dafc71ad/src/contract-matrix.js +0 -533
- package/.worktrees/dafc71ad/src/datetime.js +0 -20
- package/.worktrees/dafc71ad/src/db-engine.js +0 -55
- package/.worktrees/dafc71ad/src/db.js +0 -381
- package/.worktrees/dafc71ad/src/decision-distill.js +0 -517
- package/.worktrees/dafc71ad/src/dispatch/backends/local-agent.js +0 -155
- package/.worktrees/dafc71ad/src/dispatch/backends/sillyhub-mcp.js +0 -245
- package/.worktrees/dafc71ad/src/dispatch/probe.js +0 -246
- package/.worktrees/dafc71ad/src/dispatch/strategy.js +0 -121
- package/.worktrees/dafc71ad/src/docs-check.js +0 -825
- package/.worktrees/dafc71ad/src/docs-debt.js +0 -393
- package/.worktrees/dafc71ad/src/docs-gate.js +0 -107
- package/.worktrees/dafc71ad/src/doctor-diagnostics.js +0 -1099
- package/.worktrees/dafc71ad/src/endpoint-extractor.js +0 -409
- package/.worktrees/dafc71ad/src/foreign-declared.js +0 -155
- package/.worktrees/dafc71ad/src/fs-atomic.js +0 -73
- package/.worktrees/dafc71ad/src/git-helper.js +0 -150
- package/.worktrees/dafc71ad/src/hooks/claude-pre-tool-use.cjs +0 -130
- package/.worktrees/dafc71ad/src/hooks/worktree-guard.js +0 -892
- package/.worktrees/dafc71ad/src/index.js +0 -2854
- package/.worktrees/dafc71ad/src/init.js +0 -626
- package/.worktrees/dafc71ad/src/knowledge-match.js +0 -231
- package/.worktrees/dafc71ad/src/local-detect.js +0 -128
- package/.worktrees/dafc71ad/src/local-register.js +0 -104
- package/.worktrees/dafc71ad/src/machine-interface.js +0 -543
- package/.worktrees/dafc71ad/src/migrate.js +0 -127
- package/.worktrees/dafc71ad/src/module-impact.js +0 -166
- package/.worktrees/dafc71ad/src/module-resolve.js +0 -222
- package/.worktrees/dafc71ad/src/modules.js +0 -580
- package/.worktrees/dafc71ad/src/plan-adopt-waves.js +0 -126
- package/.worktrees/dafc71ad/src/progress/change-registry.js +0 -336
- package/.worktrees/dafc71ad/src/progress/consistency-doctor.js +0 -355
- package/.worktrees/dafc71ad/src/progress/shared.js +0 -36
- package/.worktrees/dafc71ad/src/progress/stage-machine.js +0 -594
- package/.worktrees/dafc71ad/src/progress/step-store.js +0 -265
- package/.worktrees/dafc71ad/src/progress.js +0 -1304
- package/.worktrees/dafc71ad/src/quick-recommend.js +0 -115
- package/.worktrees/dafc71ad/src/quicklog.js +0 -883
- package/.worktrees/dafc71ad/src/review-tier.js +0 -77
- package/.worktrees/dafc71ad/src/run/command.js +0 -1641
- package/.worktrees/dafc71ad/src/run/complete-handlers.js +0 -1552
- package/.worktrees/dafc71ad/src/run/complete.js +0 -1259
- package/.worktrees/dafc71ad/src/run/concurrent-detect.js +0 -156
- package/.worktrees/dafc71ad/src/run/gates.js +0 -1111
- package/.worktrees/dafc71ad/src/run/multi-repo-context.js +0 -208
- package/.worktrees/dafc71ad/src/run/next.js +0 -128
- package/.worktrees/dafc71ad/src/run/prompt.js +0 -843
- package/.worktrees/dafc71ad/src/run/quick-audit.js +0 -186
- package/.worktrees/dafc71ad/src/run/scan-profile.js +0 -269
- package/.worktrees/dafc71ad/src/run/shared.js +0 -1562
- package/.worktrees/dafc71ad/src/run/stage.js +0 -587
- package/.worktrees/dafc71ad/src/run.js +0 -23
- package/.worktrees/dafc71ad/src/scan-diff.js +0 -388
- package/.worktrees/dafc71ad/src/scan-postcheck.js +0 -524
- package/.worktrees/dafc71ad/src/scan-staleness.js +0 -95
- package/.worktrees/dafc71ad/src/setup.js +0 -414
- package/.worktrees/dafc71ad/src/sillyhub-mcp/client.js +0 -597
- package/.worktrees/dafc71ad/src/sillyhub-mcp/config.js +0 -62
- package/.worktrees/dafc71ad/src/spec-dir-typo.js +0 -50
- package/.worktrees/dafc71ad/src/spec-sync.js +0 -358
- package/.worktrees/dafc71ad/src/stage-contract-engine.js +0 -171
- package/.worktrees/dafc71ad/src/stage-contract-spec.js +0 -551
- package/.worktrees/dafc71ad/src/stage-contract.js +0 -948
- package/.worktrees/dafc71ad/src/stage-review.js +0 -597
- package/.worktrees/dafc71ad/src/stages/archive.js +0 -199
- package/.worktrees/dafc71ad/src/stages/brainstorm-auto.js +0 -285
- package/.worktrees/dafc71ad/src/stages/brainstorm.js +0 -624
- package/.worktrees/dafc71ad/src/stages/cmd-existence.js +0 -145
- package/.worktrees/dafc71ad/src/stages/doctor.js +0 -540
- package/.worktrees/dafc71ad/src/stages/execute.js +0 -1277
- package/.worktrees/dafc71ad/src/stages/explore.js +0 -43
- package/.worktrees/dafc71ad/src/stages/index.js +0 -29
- package/.worktrees/dafc71ad/src/stages/knowledge.js +0 -514
- package/.worktrees/dafc71ad/src/stages/plan-postcheck.js +0 -1398
- package/.worktrees/dafc71ad/src/stages/plan.js +0 -655
- package/.worktrees/dafc71ad/src/stages/quick.js +0 -167
- package/.worktrees/dafc71ad/src/stages/scan.js +0 -608
- package/.worktrees/dafc71ad/src/stages/status.js +0 -64
- package/.worktrees/dafc71ad/src/stages/verify.js +0 -246
- package/.worktrees/dafc71ad/src/sync.js +0 -1470
- package/.worktrees/dafc71ad/src/task-review.js +0 -1498
- package/.worktrees/dafc71ad/src/taskcard-placeholders.js +0 -21
- package/.worktrees/dafc71ad/src/taskcard.js +0 -250
- package/.worktrees/dafc71ad/src/verify-postcheck.js +0 -1718
- package/.worktrees/dafc71ad/src/verify-probes.js +0 -327
- package/.worktrees/dafc71ad/src/version.js +0 -19
- package/.worktrees/dafc71ad/src/workflow.js +0 -600
- package/.worktrees/dafc71ad/src/workspace.js +0 -125
- package/.worktrees/dafc71ad/src/worktree-apply.js +0 -1611
- package/.worktrees/dafc71ad/src/worktree-deps.js +0 -668
- package/.worktrees/dafc71ad/src/worktree.js +0 -1849
- package/.worktrees/dafc71ad/templates/claude-instruction.md +0 -23
- package/.worktrees/dafc71ad/templates/prompts/taskcard-rules.md +0 -29
- package/.worktrees/dafc71ad/templates/prompts/testcase-design.md +0 -12
- package/.worktrees/dafc71ad/templates/prompts/verify-probes.md +0 -32
- package/.worktrees/dafc71ad/templates/workflows/archive-impact.yaml +0 -79
- package/.worktrees/dafc71ad/templates/workflows/scan-docs.yaml +0 -132
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-archive/SKILL.md +0 -87
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-auto/SKILL.md +0 -93
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-brainstorm/SKILL.md +0 -114
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-commit/SKILL.md +0 -67
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-continue/SKILL.md +0 -47
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-doctor/SKILL.md +0 -76
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-execute/SKILL.md +0 -214
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-explore/SKILL.md +0 -102
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-export/SKILL.md +0 -57
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-init/SKILL.md +0 -177
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-knowledge/SKILL.md +0 -270
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-plan/SKILL.md +0 -156
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-propose/SKILL.md +0 -87
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-quick/SKILL.md +0 -116
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-resume/SKILL.md +0 -70
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-scan/SKILL.md +0 -79
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-state/SKILL.md +0 -64
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-status/SKILL.md +0 -54
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-verify/SKILL.md +0 -87
- package/.worktrees/e58fcc4c/.claude/skills/sillyspec-workspace/SKILL.md +0 -175
- package/.worktrees/e58fcc4c/.gitattributes +0 -2
- package/.worktrees/e58fcc4c/.husky/pre-push +0 -20
- package/.worktrees/e58fcc4c/README.md +0 -203
- package/.worktrees/e58fcc4c/SKILL.md +0 -91
- package/.worktrees/e58fcc4c/architecture-analysis.md +0 -503
- package/.worktrees/e58fcc4c/bin/sillyspec.js +0 -2
- package/.worktrees/e58fcc4c/eval/README.md +0 -86
- package/.worktrees/e58fcc4c/eval/eval.config.json +0 -28
- package/.worktrees/e58fcc4c/eval/lib/adapters/cli.mjs +0 -63
- package/.worktrees/e58fcc4c/eval/lib/adapters/dryrun.mjs +0 -27
- package/.worktrees/e58fcc4c/eval/lib/config.mjs +0 -82
- package/.worktrees/e58fcc4c/eval/lib/db.mjs +0 -76
- package/.worktrees/e58fcc4c/eval/lib/report.mjs +0 -120
- package/.worktrees/e58fcc4c/eval/lib/runner.mjs +0 -157
- package/.worktrees/e58fcc4c/eval/lib/tasks.mjs +0 -73
- package/.worktrees/e58fcc4c/eval/lib/util.mjs +0 -107
- package/.worktrees/e58fcc4c/eval/lib/workdir.mjs +0 -30
- package/.worktrees/e58fcc4c/eval/run.mjs +0 -83
- package/.worktrees/e58fcc4c/eval/tasks/001-slugify/files/package.json +0 -6
- package/.worktrees/e58fcc4c/eval/tasks/001-slugify/solution/src/slugify.mjs +0 -26
- package/.worktrees/e58fcc4c/eval/tasks/001-slugify/task.json +0 -6
- package/.worktrees/e58fcc4c/eval/tasks/001-slugify/verify.mjs +0 -28
- package/.worktrees/e58fcc4c/eval/tasks/002-each-day/files/package.json +0 -6
- package/.worktrees/e58fcc4c/eval/tasks/002-each-day/files/src/dates.mjs +0 -4
- package/.worktrees/e58fcc4c/eval/tasks/002-each-day/solution/src/dates.mjs +0 -30
- package/.worktrees/e58fcc4c/eval/tasks/002-each-day/task.json +0 -6
- package/.worktrees/e58fcc4c/eval/tasks/002-each-day/verify.mjs +0 -31
- package/.worktrees/e58fcc4c/eval/tasks/003-word-report/files/data/notes.txt +0 -5
- package/.worktrees/e58fcc4c/eval/tasks/003-word-report/files/package.json +0 -6
- package/.worktrees/e58fcc4c/eval/tasks/003-word-report/solution/bin/report.mjs +0 -36
- package/.worktrees/e58fcc4c/eval/tasks/003-word-report/task.json +0 -6
- package/.worktrees/e58fcc4c/eval/tasks/003-word-report/verify.mjs +0 -38
- package/.worktrees/e58fcc4c/logo.jpg +0 -0
- package/.worktrees/e58fcc4c/package-lock.json +0 -977
- package/.worktrees/e58fcc4c/package.json +0 -41
- package/.worktrees/e58fcc4c/packages/dashboard/dist/assets/index-Bq_Z2hne.js +0 -7446
- package/.worktrees/e58fcc4c/packages/dashboard/dist/assets/index-O2W5RV4z.css +0 -1
- package/.worktrees/e58fcc4c/packages/dashboard/dist/favicon.jpg +0 -0
- package/.worktrees/e58fcc4c/packages/dashboard/dist/index.html +0 -16
- package/.worktrees/e58fcc4c/packages/dashboard/dist/logo.jpg +0 -0
- package/.worktrees/e58fcc4c/packages/dashboard/dist/prototype-dashboard.html +0 -836
- package/.worktrees/e58fcc4c/packages/dashboard/dist/prototype-overview.html +0 -256
- package/.worktrees/e58fcc4c/packages/dashboard/package.json +0 -25
- package/.worktrees/e58fcc4c/packages/dashboard/server/executor.js +0 -95
- package/.worktrees/e58fcc4c/packages/dashboard/server/index.js +0 -679
- package/.worktrees/e58fcc4c/packages/dashboard/server/parser.js +0 -526
- package/.worktrees/e58fcc4c/packages/dashboard/server/watcher.js +0 -357
- package/.worktrees/e58fcc4c/src/agent-session-log.js +0 -803
- package/.worktrees/e58fcc4c/src/change-list.js +0 -290
- package/.worktrees/e58fcc4c/src/change-risk-profile.js +0 -339
- package/.worktrees/e58fcc4c/src/check-primitives.js +0 -65
- package/.worktrees/e58fcc4c/src/classify-change.js +0 -109
- package/.worktrees/e58fcc4c/src/commit-suggest.js +0 -202
- package/.worktrees/e58fcc4c/src/config-cat.js +0 -88
- package/.worktrees/e58fcc4c/src/config-schema.js +0 -328
- package/.worktrees/e58fcc4c/src/constants.js +0 -97
- package/.worktrees/e58fcc4c/src/contract-matrix.js +0 -533
- package/.worktrees/e58fcc4c/src/datetime.js +0 -20
- package/.worktrees/e58fcc4c/src/db-engine.js +0 -55
- package/.worktrees/e58fcc4c/src/db.js +0 -381
- package/.worktrees/e58fcc4c/src/decision-distill.js +0 -517
- package/.worktrees/e58fcc4c/src/dispatch/backends/local-agent.js +0 -155
- package/.worktrees/e58fcc4c/src/dispatch/backends/sillyhub-mcp.js +0 -245
- package/.worktrees/e58fcc4c/src/dispatch/probe.js +0 -246
- package/.worktrees/e58fcc4c/src/dispatch/strategy.js +0 -121
- package/.worktrees/e58fcc4c/src/docs-check.js +0 -825
- package/.worktrees/e58fcc4c/src/docs-debt.js +0 -393
- package/.worktrees/e58fcc4c/src/docs-gate.js +0 -107
- package/.worktrees/e58fcc4c/src/doctor-diagnostics.js +0 -1099
- package/.worktrees/e58fcc4c/src/endpoint-extractor.js +0 -409
- package/.worktrees/e58fcc4c/src/foreign-declared.js +0 -155
- package/.worktrees/e58fcc4c/src/fs-atomic.js +0 -73
- package/.worktrees/e58fcc4c/src/git-helper.js +0 -150
- package/.worktrees/e58fcc4c/src/hooks/claude-pre-tool-use.cjs +0 -130
- package/.worktrees/e58fcc4c/src/hooks/worktree-guard.js +0 -892
- package/.worktrees/e58fcc4c/src/index.js +0 -2854
- package/.worktrees/e58fcc4c/src/init.js +0 -626
- package/.worktrees/e58fcc4c/src/knowledge-match.js +0 -231
- package/.worktrees/e58fcc4c/src/local-detect.js +0 -128
- package/.worktrees/e58fcc4c/src/local-register.js +0 -104
- package/.worktrees/e58fcc4c/src/machine-interface.js +0 -543
- package/.worktrees/e58fcc4c/src/migrate.js +0 -127
- package/.worktrees/e58fcc4c/src/module-impact.js +0 -166
- package/.worktrees/e58fcc4c/src/module-resolve.js +0 -222
- package/.worktrees/e58fcc4c/src/modules.js +0 -580
- package/.worktrees/e58fcc4c/src/plan-adopt-waves.js +0 -126
- package/.worktrees/e58fcc4c/src/progress/change-registry.js +0 -336
- package/.worktrees/e58fcc4c/src/progress/consistency-doctor.js +0 -355
- package/.worktrees/e58fcc4c/src/progress/shared.js +0 -36
- package/.worktrees/e58fcc4c/src/progress/stage-machine.js +0 -594
- package/.worktrees/e58fcc4c/src/progress/step-store.js +0 -265
- package/.worktrees/e58fcc4c/src/progress.js +0 -1304
- package/.worktrees/e58fcc4c/src/quick-recommend.js +0 -115
- package/.worktrees/e58fcc4c/src/quicklog.js +0 -883
- package/.worktrees/e58fcc4c/src/review-tier.js +0 -77
- package/.worktrees/e58fcc4c/src/run/command.js +0 -1641
- package/.worktrees/e58fcc4c/src/run/complete-handlers.js +0 -1552
- package/.worktrees/e58fcc4c/src/run/complete.js +0 -1259
- package/.worktrees/e58fcc4c/src/run/concurrent-detect.js +0 -156
- package/.worktrees/e58fcc4c/src/run/gates.js +0 -1111
- package/.worktrees/e58fcc4c/src/run/multi-repo-context.js +0 -208
- package/.worktrees/e58fcc4c/src/run/next.js +0 -128
- package/.worktrees/e58fcc4c/src/run/prompt.js +0 -843
- package/.worktrees/e58fcc4c/src/run/quick-audit.js +0 -186
- package/.worktrees/e58fcc4c/src/run/scan-profile.js +0 -269
- package/.worktrees/e58fcc4c/src/run/shared.js +0 -1562
- package/.worktrees/e58fcc4c/src/run/stage.js +0 -587
- package/.worktrees/e58fcc4c/src/run.js +0 -23
- package/.worktrees/e58fcc4c/src/scan-diff.js +0 -388
- package/.worktrees/e58fcc4c/src/scan-postcheck.js +0 -524
- package/.worktrees/e58fcc4c/src/scan-staleness.js +0 -95
- package/.worktrees/e58fcc4c/src/setup.js +0 -414
- package/.worktrees/e58fcc4c/src/sillyhub-mcp/client.js +0 -597
- package/.worktrees/e58fcc4c/src/sillyhub-mcp/config.js +0 -62
- package/.worktrees/e58fcc4c/src/spec-dir-typo.js +0 -50
- package/.worktrees/e58fcc4c/src/spec-sync.js +0 -358
- package/.worktrees/e58fcc4c/src/stage-contract-engine.js +0 -171
- package/.worktrees/e58fcc4c/src/stage-contract-spec.js +0 -551
- package/.worktrees/e58fcc4c/src/stage-contract.js +0 -948
- package/.worktrees/e58fcc4c/src/stage-review.js +0 -597
- package/.worktrees/e58fcc4c/src/stages/archive.js +0 -199
- package/.worktrees/e58fcc4c/src/stages/brainstorm-auto.js +0 -285
- package/.worktrees/e58fcc4c/src/stages/brainstorm.js +0 -624
- package/.worktrees/e58fcc4c/src/stages/cmd-existence.js +0 -145
- package/.worktrees/e58fcc4c/src/stages/doctor.js +0 -540
- package/.worktrees/e58fcc4c/src/stages/execute.js +0 -1277
- package/.worktrees/e58fcc4c/src/stages/explore.js +0 -43
- package/.worktrees/e58fcc4c/src/stages/index.js +0 -29
- package/.worktrees/e58fcc4c/src/stages/knowledge.js +0 -514
- package/.worktrees/e58fcc4c/src/stages/plan-postcheck.js +0 -1398
- package/.worktrees/e58fcc4c/src/stages/plan.js +0 -655
- package/.worktrees/e58fcc4c/src/stages/quick.js +0 -167
- package/.worktrees/e58fcc4c/src/stages/scan.js +0 -608
- package/.worktrees/e58fcc4c/src/stages/status.js +0 -64
- package/.worktrees/e58fcc4c/src/stages/verify.js +0 -246
- package/.worktrees/e58fcc4c/src/sync.js +0 -1470
- package/.worktrees/e58fcc4c/src/task-review.js +0 -1498
- package/.worktrees/e58fcc4c/src/taskcard-placeholders.js +0 -21
- package/.worktrees/e58fcc4c/src/taskcard.js +0 -250
- package/.worktrees/e58fcc4c/src/verify-postcheck.js +0 -1718
- package/.worktrees/e58fcc4c/src/verify-probes.js +0 -327
- package/.worktrees/e58fcc4c/src/version.js +0 -19
- package/.worktrees/e58fcc4c/src/workflow.js +0 -600
- package/.worktrees/e58fcc4c/src/workspace.js +0 -125
- package/.worktrees/e58fcc4c/src/worktree-apply.js +0 -1611
- package/.worktrees/e58fcc4c/src/worktree-deps.js +0 -668
- package/.worktrees/e58fcc4c/src/worktree.js +0 -1849
- package/.worktrees/e58fcc4c/templates/claude-instruction.md +0 -23
- package/.worktrees/e58fcc4c/templates/prompts/taskcard-rules.md +0 -29
- package/.worktrees/e58fcc4c/templates/prompts/testcase-design.md +0 -12
- package/.worktrees/e58fcc4c/templates/prompts/verify-probes.md +0 -32
- package/.worktrees/e58fcc4c/templates/workflows/archive-impact.yaml +0 -79
- package/.worktrees/e58fcc4c/templates/workflows/scan-docs.yaml +0 -132
package/src/verify-postcheck.js
CHANGED
|
@@ -29,6 +29,13 @@ import { join } from 'path'
|
|
|
29
29
|
import { verifyApiParity } from './contract-matrix.js'
|
|
30
30
|
import { parseFileChangeListDetailed, pathMatches } from './change-list.js'
|
|
31
31
|
import { filterDeliverableFiles } from './worktree-apply.js'
|
|
32
|
+
// target_files 声明侧解析(Wave 1 已落地):依赖链已核实无环——plan-postcheck 不反向依赖本模块,
|
|
33
|
+
// 且本模块已经 worktree-apply.js:21 间接依赖 plan-postcheck,此处改直连不引入新环(task-04)
|
|
34
|
+
import { parseTargetFiles, parseRepo } from './stages/plan-postcheck.js'
|
|
35
|
+
// 探针重跑(P3b task-02 一致性抽查):依赖方向已核实无环——verify-probes 只依赖
|
|
36
|
+
// fs/path/git-helper/change-list/plan-postcheck/contract-matrix/foreign-declared/run-shared,
|
|
37
|
+
// 不反向依赖本模块,此处直连不引入循环
|
|
38
|
+
import { runVerifyProbes } from './verify-probes.js'
|
|
32
39
|
|
|
33
40
|
// 测试命令最长执行时间;超时视为失败(防止 CLI 被挂起的测试卡死)
|
|
34
41
|
const TEST_TIMEOUT_MS = Number(process.env.SILLYSPEC_TEST_TIMEOUT_MS) || 10 * 60 * 1000
|
|
@@ -613,6 +620,31 @@ const SUMMARY_LINE_RE = /(={2,}.*={2,}|^\s*\d+\s+(failed|passed|skipped|pending)
|
|
|
613
620
|
// 与失败信号(× 行 / FAIL 横幅 / 汇总计数)无关,全部剔除。
|
|
614
621
|
const CONSOLE_CAPTURE_RE = /^\s*(?:stdout|stderr)\s*\|/
|
|
615
622
|
const ENV_NOISE_RE = /not\s+implemented\s*:/i
|
|
623
|
+
// 报表行(vitest/jest 测试运行器自身输出,非被捕获的 console 内容):失败结果标记行
|
|
624
|
+
// (×✕✗✘ 前缀 / FAIL 文件行)、❯ 文件摘要行、⎯ 分节分隔行——用作捕获块的结束边界。
|
|
625
|
+
const REPORT_LINE_RE = /^\s*(?:[×✕✗✘]|FAIL\b|❯|⎯)/
|
|
626
|
+
// Python/pytest 警告噪声(坑 verify-pytest-warnings-noise,2026-09-01 实证):pytest 把
|
|
627
|
+
// warnings summary 打印成「测试 id 行 + `<路径>:<行号>: <XxxWarning>: 消息` 归因行 + 缩进
|
|
628
|
+
// 源码展示行」。归因行的**文件路径**常含 exception/error 子串(starlette `_exception_handler.py`
|
|
629
|
+
// 是 FastAPI 全家桶标配,路径即命中 /exception/i)——整块被判失败行,backend 全量实测真实
|
|
630
|
+
// 1 个守卫失败被上百行 DeprecationWarning 噪声淹没、只能人工分模块定位。warning 不是失败
|
|
631
|
+
// 信号:① 区段级整段剔(区段头 → 下一 pytest 区段头);② 行级剔(截断 tail 看不到区段头时
|
|
632
|
+
// 兜底:归因/分组/Node 警告行 + 其上下文的 id/源码展示行)。真实失败的归因行(如
|
|
633
|
+
// `file.py:42: AssertionError`)非 *Warning 类名,形态可分、不受影响。
|
|
634
|
+
// 区段头:`============================== warnings summary ===============================`
|
|
635
|
+
const PY_WARNINGS_SECTION_RE = /^\s*=+.*warnings summary.*=+\s*$/i
|
|
636
|
+
// pytest 任意区段分隔头(`==== short test summary info ====` / `==== 3 failed, 300 passed in 12s ====`)
|
|
637
|
+
const PY_SECTION_RE = /^\s*=+.*=+\s*$/
|
|
638
|
+
// warning 归因行:`C:\...\file.py:59: DeprecationWarning: ...` / `file.py:7: UserWarning: ...`
|
|
639
|
+
// (盘符/相对路径两形态;截断前缀 … 是普通非冒号字符,[^:\r\n] 天然兼容)
|
|
640
|
+
const PY_WARNING_ATTR_RE = /^\s*(?:[A-Za-z]:)?(?:[^:\r\n]*[\\/])?[^:\r\n]*:\d+:\s+\w*Warning:/
|
|
641
|
+
// 分组归因行:`tests/test_x.py: 13 warnings`
|
|
642
|
+
const PY_WARNING_GROUP_RE = /^\s*(?:[A-Za-z]:)?[^:\r\n]*:\s*\d+\s+warnings?\b/i
|
|
643
|
+
// Node 进程警告行:`(node:1234) [DEP0040] DeprecationWarning: ...`
|
|
644
|
+
const NODE_WARNING_RE = /^\s*\(node:\d+\)\s*(?:\[[^\]]*\]\s*)?\w*Warning:/
|
|
645
|
+
// pytest 测试 id 行(`path/to/test.py::TestClass::test_x`,无空格)——warnings summary 内
|
|
646
|
+
// 逐条 warning 的归属头;只在 warning 上下文激活时剔(正常输出里的 id 行不动)
|
|
647
|
+
const PY_TEST_ID_RE = /^\S+::\S+$/
|
|
616
648
|
// 通过行(行首标记,剥 ANSI 后判定):vitest/jest/mocha 的 ✓√✔ 前缀行 + jest 的 PASS 文件行。
|
|
617
649
|
// 坑 verify-known-failures-pass-line-false-positive:FAILED/error:/exception 是子串匹配,
|
|
618
650
|
// 通过行用例名恰含这些字样(如「✓ … 超时后 syncStatus=failed」)会被误判失败行——
|
|
@@ -630,15 +662,42 @@ const ANSI_RE = /\x1b\[[0-9;]*[A-Za-z]/g
|
|
|
630
662
|
*/
|
|
631
663
|
export function partitionFailures(output, knownFailures) {
|
|
632
664
|
const lines = String(output || '').split(/\r?\n/)
|
|
633
|
-
// 分类在剥 ANSI 后的行上做,返回保留原文(remaining 展示给 agent
|
|
634
|
-
|
|
635
|
-
|
|
665
|
+
// 分类在剥 ANSI 后的行上做,返回保留原文(remaining 展示给 agent 时不变形)。
|
|
666
|
+
// 捕获块状态机(坑 verify-console-capture-block-noise,2026-08-31 daemon 套件 ~710 行实证):
|
|
667
|
+
// vitest 把测试内 console 输出捕获为 `stdout|`/`stderr|` 横幅 + 后续内容行——旧逻辑只剔
|
|
668
|
+
// 横幅行本身,内容行(通过用例的结构化日志,常含 error:/failed 字样)仍中子串匹配成假
|
|
669
|
+
// 失败行。块以横幅开始,直到下一报表行(通过/失败标记、FAIL 文件行、❯ 文件摘要、⎯ 分节
|
|
670
|
+
// 符、汇总行)结束;块内内容行一律剔除。真实失败恒有 ×/FAIL 报表行(先结束块、照常参与
|
|
671
|
+
// 分类),失败检出不受影响;检测不到失败行时 judgeWithKnownFailures 仍 fail-safe 判 failed。
|
|
672
|
+
const failureLines = []
|
|
673
|
+
let inCapture = false
|
|
674
|
+
// pytest warnings summary 区段态:区段头开区、下一 pytest 区段头收区,区段内容整段剔
|
|
675
|
+
let inPyWarnings = false
|
|
676
|
+
// warning 上下文态(行级兜底):命中归因/分组/Node 警告行后,紧随的缩进源码展示行、
|
|
677
|
+
// pytest 测试 id 行与组间空行同属该 warning 展示块,一并剔;报表行/其他内容行终结上下文。
|
|
678
|
+
let pyWarnCtx = false
|
|
679
|
+
for (const l of lines) {
|
|
636
680
|
const bare = l.replace(ANSI_RE, '')
|
|
637
|
-
if (
|
|
638
|
-
if (
|
|
639
|
-
if (
|
|
640
|
-
|
|
641
|
-
|
|
681
|
+
if (CONSOLE_CAPTURE_RE.test(bare)) { inCapture = true; pyWarnCtx = false; continue }
|
|
682
|
+
if (PY_WARNINGS_SECTION_RE.test(bare)) { inPyWarnings = true; pyWarnCtx = true; continue }
|
|
683
|
+
if (inPyWarnings) {
|
|
684
|
+
if (PY_SECTION_RE.test(bare)) inPyWarnings = false // 下一区段头(short test summary info 等)收区
|
|
685
|
+
continue // 区段内容(测试 id / 归因 / 源码展示行):warning 噪声,非失败信号
|
|
686
|
+
}
|
|
687
|
+
const isReportLine = PASS_LINE_RE.test(bare) || REPORT_LINE_RE.test(bare) || SUMMARY_LINE_RE.test(bare)
|
|
688
|
+
if (inCapture && !isReportLine) continue // 捕获块内容行:console 噪声,非失败信号
|
|
689
|
+
if (isReportLine) inCapture = false
|
|
690
|
+
// ── Python/pytest 警告行级剔除(截断 tail 无区段头时的兜底)──
|
|
691
|
+
if (PY_WARNING_ATTR_RE.test(bare) || PY_WARNING_GROUP_RE.test(bare) || NODE_WARNING_RE.test(bare)) { pyWarnCtx = true; continue }
|
|
692
|
+
if (pyWarnCtx) {
|
|
693
|
+
if (isReportLine) pyWarnCtx = false // 报表行(含 short summary 区段头)终结 warning 上下文
|
|
694
|
+
else if (PY_TEST_ID_RE.test(bare) || /^\s{2,}\S/.test(bare) || bare.trim() === '') continue // 同块源码展示 / 测试 id / 组间空行
|
|
695
|
+
else pyWarnCtx = false
|
|
696
|
+
}
|
|
697
|
+
if (PASS_LINE_RE.test(bare)) continue
|
|
698
|
+
if (ENV_NOISE_RE.test(bare)) continue
|
|
699
|
+
if (PER_TEST_FAIL_RE.test(bare) && !SUMMARY_LINE_RE.test(bare)) failureLines.push(l)
|
|
700
|
+
}
|
|
642
701
|
const pats = (knownFailures || []).map(p => String(p).toLowerCase()).filter(Boolean)
|
|
643
702
|
const exempted = []
|
|
644
703
|
const remaining = []
|
|
@@ -864,17 +923,26 @@ export function resolveVerifyChangedFiles(cwd, changeName, ctx = null, opts = {}
|
|
|
864
923
|
// (排除 .sillyspec/ 运行时产物)。opt-in(默认关):d drafts 有自己的并入点,避免双并。
|
|
865
924
|
if (includeWorkingTree && mainFiles !== null) {
|
|
866
925
|
try {
|
|
867
|
-
|
|
926
|
+
// P1 修复(2026-09-07):metaPath 吃 opts.specBase——此前硬编码 join(cwd,'.sillyspec'),
|
|
927
|
+
// 平台模式(specRoot 与 source_root 分离)下 worktree meta 静默读不到 → 形态 A 并入失效 → ②类假红。
|
|
928
|
+
// 与下方 resolveMainChangedFiles 的 specBase 兜底同口径。
|
|
929
|
+
const metaPath = join(opts.specBase || join(cwd, '.sillyspec'), '.runtime', 'worktrees', changeName, 'meta.json')
|
|
868
930
|
if (changeName && existsSync(metaPath)) {
|
|
869
931
|
const meta = JSON.parse(readFileSync(metaPath, 'utf8'))
|
|
870
932
|
const wtGitDir = (meta.worktreePath && meta.mode !== 'in-place-fallback' && existsSync(meta.worktreePath))
|
|
871
933
|
? meta.worktreePath
|
|
872
934
|
: cwd
|
|
873
935
|
const wtStatus = gitQuiet(wtGitDir, ['status', '--porcelain', '--untracked-files=all'], { timeout: 30000, trim: false })
|
|
936
|
+
// P1 修复(2026-09-07):过滤器改 filterDeliverableFiles 口径(worktree-apply.js 同款)——
|
|
937
|
+
// 此前 `.sillyspec/` 一刀切把 docs 交付物也滤掉,声明了模块文档的 task 在形态 A 下落②类假红
|
|
938
|
+
// (子代理默认不 commit,形态 A 是常态)。保留 .sillyspec/docs/**(交付物),只排运行时/进度面。
|
|
874
939
|
const wtFiles = String(wtStatus || '').split('\n')
|
|
875
940
|
.map(l => l.slice(3).trim().split(' -> ').pop() || '')
|
|
876
941
|
.map(p => p.replace(/^"|"$/g, '').replace(/\\/g, '/'))
|
|
877
|
-
.filter(p => p && p !== '.sillyspec' &&
|
|
942
|
+
.filter(p => p && p !== '.sillyspec' &&
|
|
943
|
+
!p.startsWith('.sillyspec/changes/') &&
|
|
944
|
+
!p.startsWith('.sillyspec/.runtime/') &&
|
|
945
|
+
!p.startsWith('.sillyspec/quicklog/'))
|
|
878
946
|
if (wtFiles.length > 0) {
|
|
879
947
|
mainFiles = [...new Set([...(mainFiles || []), ...wtFiles])]
|
|
880
948
|
}
|
|
@@ -1768,3 +1836,595 @@ export function printVerifyRequiredEvidenceCheck(result) {
|
|
|
1768
1836
|
if (result.unacknowledged.length > 20) console.warn(` …还有 ${result.unacknowledged.length - 20} 个`)
|
|
1769
1837
|
console.warn(' 提示:execute 标记的 cannot_verify 任务需在 verify-result.md 逐条给 evidence 结论(satisfied/missing/partial)。CLI 仅查任务被提及,是否真满足由你诚实判定。')
|
|
1770
1838
|
}
|
|
1839
|
+
|
|
1840
|
+
// ── plan target_files 声明 ↔ 实际改动 机器对账(task-04 / design 总体方案 Wave 2)──
|
|
1841
|
+
//
|
|
1842
|
+
// 背景:execute 的 scope creep 此前只有 symbol-impact 试图抓,「计划落空」(声明没做)更是
|
|
1843
|
+
// 全盲区——review.json changedFiles 是 agent 手写不能当事实源。本节让 CLI 用 git 三源口径
|
|
1844
|
+
// 亲自取 actual,与 plan 阶段的 target_files 意图声明做三类差集(①交集✓ ②声明没做=ERROR
|
|
1845
|
+
// ③做了没声明=WARNING)。纯函数导出,gates.js verify 块接线是 task-05 的 scope(本文件不
|
|
1846
|
+
// 聚合调用,与 runVerifyTestCheck 同构:导出消费、阻断语义归接线方)。
|
|
1847
|
+
|
|
1848
|
+
/**
|
|
1849
|
+
* 对账路径归一:剥 ./ 前缀、反斜杠归一正斜杠。actual 三源(diff / status / pathspec 文件)
|
|
1850
|
+
* 与声明侧(parseTargetFiles 已归一)统一走此口径后做集合比较——任一侧漏归一都会令同一路径
|
|
1851
|
+
* 字面失配,②③两类差集全成噪音。
|
|
1852
|
+
*/
|
|
1853
|
+
function normalizeReconcilePath(p) {
|
|
1854
|
+
return String(p || '').trim().replace(/^\.\//, '').replace(/\\/g, '/')
|
|
1855
|
+
}
|
|
1856
|
+
|
|
1857
|
+
/**
|
|
1858
|
+
* review.json changedFiles 条目归一(尽力归因专用):task-review.js changedFiles 交叉比对
|
|
1859
|
+
* 的同款结构化剥法(坑 changedfiles-annotation-suffix-mismatch,2026-08-22 实证:agent 手写
|
|
1860
|
+
* changedFiles 带「src/a.js(新增)」注记后缀 / // 行内注释,裸 exact match 恒失配)——只剥
|
|
1861
|
+
* 路径尾部的注记形态,注记本身不参与匹配。
|
|
1862
|
+
*/
|
|
1863
|
+
function normalizeReviewChangedFile(p) {
|
|
1864
|
+
return String(p || '')
|
|
1865
|
+
.replace(/^\.\//, '')
|
|
1866
|
+
.replace(/[((][^(())]*[))]\s*$/, '') // 尾部(注记)/(note)——中段括号(路径段)不动
|
|
1867
|
+
.replace(/\s+(\/\/|#).*$/, '') // 空格后的 // 或 # 注释
|
|
1868
|
+
.trim()
|
|
1869
|
+
.replace(/\\/g, '/')
|
|
1870
|
+
}
|
|
1871
|
+
|
|
1872
|
+
/**
|
|
1873
|
+
* 声明侧收集:读 change 下全部 task 卡(tasks/task-NN.md)的 target_files 并集。
|
|
1874
|
+
*
|
|
1875
|
+
* - 跨仓卡(frontmatter 有 repo: 键)剔除:其 target_files 相对声明仓根,主仓 actual 永远
|
|
1876
|
+
* 对不上账,不剔除会全落②类假红(D-004;与 plan 侧 validateTargetFiles 同口径剔除+提示)。
|
|
1877
|
+
* - 无声明卡(missing=true,存量卡)计不进 declarations——全部卡无声明由调用方判 skipped,
|
|
1878
|
+
* 不在收集器内造第三种状态(与 parseTargetFiles 的缺失口径对齐)。
|
|
1879
|
+
* - task 标识:frontmatter id 优先(与 review.json task 字段对齐),缺省文件名 stem——
|
|
1880
|
+
* ②类差集逐条报 task-NN + path,标识错位会让用户找不到对应的卡。
|
|
1881
|
+
*
|
|
1882
|
+
* @returns {{ cardCount: number, declarations: Array<{task:string, path:string, isNew:boolean, raw:string, invalid:string|null}>, crossRepoCards: string[], noDeclarationCount: number }}
|
|
1883
|
+
*/
|
|
1884
|
+
function collectDeclaredTargetFiles(specBase, changeName) {
|
|
1885
|
+
const out = { cardCount: 0, declarations: [], crossRepoCards: [], noDeclarationCount: 0 }
|
|
1886
|
+
const tasksDir = join(specBase, 'changes', changeName, 'tasks')
|
|
1887
|
+
if (!existsSync(tasksDir)) return out
|
|
1888
|
+
// task-NN.md 过滤 + 排序:与 plan-postcheck / task-review 的枚举口径一致,输出确定性
|
|
1889
|
+
const taskFiles = readdirSync(tasksDir).filter(f => /^task-\d+\.md$/.test(f)).sort()
|
|
1890
|
+
out.cardCount = taskFiles.length
|
|
1891
|
+
for (const file of taskFiles) {
|
|
1892
|
+
let content = ''
|
|
1893
|
+
try { content = readFileSync(join(tasksDir, file), 'utf8') } catch { continue /* 单卡读失败不炸整体对账 */ }
|
|
1894
|
+
const fm = content.match(/^---\n([\s\S]*?)\n---/)?.[1] || ''
|
|
1895
|
+
const task = (fm.match(/^id:\s*(.+)/m)?.[1] || '').trim() || file.replace(/\.md$/, '')
|
|
1896
|
+
const repo = parseRepo(content)
|
|
1897
|
+
if (repo) { out.crossRepoCards.push(`${task}(repo: ${repo})`); continue }
|
|
1898
|
+
const { entries, missing } = parseTargetFiles(content)
|
|
1899
|
+
if (missing) { out.noDeclarationCount++; continue }
|
|
1900
|
+
for (const e of entries) {
|
|
1901
|
+
// invalid(glob/目录前缀等非法形态)条目照常进声明集:plan 侧 gate 已在 plan 时点报过
|
|
1902
|
+
// ERROR,verify 时点它对不上账属事实——落②类是真问题(改声明或补工作),静默剔除反而
|
|
1903
|
+
// 给「写个 glob 蒙混过对账」留后门
|
|
1904
|
+
out.declarations.push({ task, path: e.path, isNew: e.isNew, raw: e.raw, invalid: e.invalid })
|
|
1905
|
+
}
|
|
1906
|
+
}
|
|
1907
|
+
return out
|
|
1908
|
+
}
|
|
1909
|
+
|
|
1910
|
+
/**
|
|
1911
|
+
* 解析 `git status --porcelain` 输出为文件路径列表(形态 B 的 untracked 捕获源)。
|
|
1912
|
+
* 与本文件 resolveVerifyChangedFiles:926-929 的 worktree status 解析同款:slice(3) 剥 XY 状态
|
|
1913
|
+
* 列、rename 取 -> 后新路径、剥包裹引号、反斜杠归一。
|
|
1914
|
+
*/
|
|
1915
|
+
function parsePorcelainFilePaths(raw) {
|
|
1916
|
+
return String(raw || '').split('\n')
|
|
1917
|
+
.map(l => l.slice(3).trim())
|
|
1918
|
+
.map(p => (p.includes(' -> ') ? p.slice(p.lastIndexOf(' -> ') + 4) : p).trim())
|
|
1919
|
+
.map(p => p.replace(/^"|"$/g, ''))
|
|
1920
|
+
.map(p => p.replace(/\\/g, '/'))
|
|
1921
|
+
.filter(Boolean)
|
|
1922
|
+
}
|
|
1923
|
+
|
|
1924
|
+
/**
|
|
1925
|
+
* actual 侧解析:三源并集,覆盖 worktree 生命周期两形态(R-03:口径封装单一函数,形态判定
|
|
1926
|
+
* 不外泄)。返回带 sources 明细(诊断可见性:③类误报时先看用了哪个源)。
|
|
1927
|
+
*
|
|
1928
|
+
* 形态判定:meta.json 是 worktree 活性的唯一权威(与 resolveVerifyChangedFiles /
|
|
1929
|
+
* checkExecuteCodeEvidence / task-review 同源)——
|
|
1930
|
+
* - 形态 A(meta 存在,worktree 存活):复用 resolveVerifyChangedFiles(cwd, changeName,
|
|
1931
|
+
* null, { includeWorkingTree: true })。ctx 显式传 null(D-004):跨仓 diff 不并入——
|
|
1932
|
+
* 跨仓卡已从声明侧剔除,actual 若并入跨仓文件会全落③类噪音(对齐 runVerifyTestCheck
|
|
1933
|
+
* :1067-1068 不传 ctx 的先例)。includeWorkingTree 定死 true(R-04):子代理默认不
|
|
1934
|
+
* commit,真实改动与 NEW 文件全在 worktree working-tree,漏并入 → ②类假红。
|
|
1935
|
+
* - 形态 B(meta 已删,post-apply——apply 成功即 cleanup 删 meta):resolveVerifyChangedFiles
|
|
1936
|
+
* 的 meta 锚点分支失效,自取三源——
|
|
1937
|
+
* B1 主仓 git diff --name-only <mergeBase>:mergeBase 锚 sillyspec/<change> 分支
|
|
1938
|
+
* merge-base(run/prompt.js:753-783 先例:主仓 HEAD 随并行 session 推进,拿 HEAD 当
|
|
1939
|
+
* 基点会把别人的演进误判为本变更改动)。分支不存在(cleanup 删分支 / in-place 无
|
|
1940
|
+
* 分支)→ 显式省略该源,B2∪B3 已覆盖标准流。git diff <commit> 对比 commit..工作树,
|
|
1941
|
+
* 含 apply 后未 commit 的 tracked 改动。
|
|
1942
|
+
* B2 主仓 git status --porcelain --untracked-files=all:git apply --3way 不暂存新文件
|
|
1943
|
+
* (worktree-apply.js:1105),NEW 文件 untracked 只有此源可见(R-05,两形态无假
|
|
1944
|
+
* missing 的关键)。捕入的并行会话 WIP 先经 splitOwnVsForeignDiffFiles 剔除(坑
|
|
1945
|
+
* verify-reconcile-foreign-wip,调用先例本文件 resolveMainChangedFiles:1004)——
|
|
1946
|
+
* 他者显式声明的文件不是本变更的 actual;无主文件保留(fail-closed)。
|
|
1947
|
+
* B3 兜底读 .sillyspec/.runtime/apply-pathspec-<change>.txt(worktree-apply.js:1145
|
|
1948
|
+
* apply 成功时落盘的本变更精确清单,每行一个路径):主仓已 commit(B1/B2 双空)时
|
|
1949
|
+
* 唯一的本变更文件来源(contract-matrix.js:440 同款兜底先例)。
|
|
1950
|
+
*
|
|
1951
|
+
* 降级(fail-soft 不误红):git 全部不可用(形态 A diff 链整体 null / 形态 B 锚定 diff 未得
|
|
1952
|
+
* 且 status 失败)→ ok=false——actual 覆盖面不完整时算②类必产假红,宁可整体 WARNING 跳过。
|
|
1953
|
+
* B3 pathspec 不参与「不降级」判定:它是 apply 时点的快照,不含 apply 后的任何漂移,救不了
|
|
1954
|
+
* 覆盖面。
|
|
1955
|
+
*
|
|
1956
|
+
* 统一收尾:filterDeliverableFiles 过滤基建产物(.sillyspec/changes|.runtime|quicklog、
|
|
1957
|
+
* meta.json——流程产物不算 scope creep)+ 去重排序(输出确定性)。
|
|
1958
|
+
*
|
|
1959
|
+
* @returns {{ ok: boolean, form: 'worktree'|'post-apply', files: string[], sources: string[], foreignExcluded: number, degradedReason: string|null }}
|
|
1960
|
+
*/
|
|
1961
|
+
function resolveReconcileActualFiles({ cwd, specBase, runtimeRoot, changeName }) {
|
|
1962
|
+
const metaPath = join(specBase, '.runtime', 'worktrees', changeName, 'meta.json')
|
|
1963
|
+
const form = existsSync(metaPath) ? 'worktree' : 'post-apply'
|
|
1964
|
+
const sources = []
|
|
1965
|
+
const union = new Set()
|
|
1966
|
+
let foreignExcluded = 0
|
|
1967
|
+
|
|
1968
|
+
if (form === 'worktree') {
|
|
1969
|
+
// —— 形态 A:worktree 存活,整链复用(锚点优先级 baselineCommit>actualBaseHash>baseHash、
|
|
1970
|
+
// working-tree 并入、fail-open 均为该函数既有语义,不另造口径)——
|
|
1971
|
+
const files = resolveVerifyChangedFiles(cwd, changeName, null, { includeWorkingTree: true, specBase })
|
|
1972
|
+
if (files === null) {
|
|
1973
|
+
return { ok: false, form, files: [], sources, foreignExcluded,
|
|
1974
|
+
degradedReason: 'worktree 锚点 diff 与主仓 fallback 均失败(git 不可用 / 非仓库)' }
|
|
1975
|
+
}
|
|
1976
|
+
sources.push('worktree:diff-base..HEAD', 'worktree:status-porcelain(uncommitted)')
|
|
1977
|
+
for (const f of files) union.add(normalizeReconcilePath(f))
|
|
1978
|
+
} else {
|
|
1979
|
+
// —— 形态 B:post-apply 自取三源 ——
|
|
1980
|
+
let diffOk = false
|
|
1981
|
+
let statusOk = false
|
|
1982
|
+
// B1 merge-base 锚定 diff(分支/merge-base 不可得时静默省略该源,不算 git 失败)
|
|
1983
|
+
const branch = 'sillyspec/' + changeName
|
|
1984
|
+
const branchHash = gitQuiet(cwd, ['rev-parse', '--verify', '--quiet', branch + '^{commit}'], { timeout: 30 * 1000 })
|
|
1985
|
+
if (typeof branchHash === 'string' && branchHash.trim()) {
|
|
1986
|
+
// 形态 B 定义下 meta 已删,baseBranch 无从读 → 缺省 'main'(run/prompt.js:764 同缺省);
|
|
1987
|
+
// 主分支叫 master 等仓库 merge-base 失败 → 与分支不存在同处置(省略该源)
|
|
1988
|
+
const mergeBase = gitQuiet(cwd, ['merge-base', 'main', branch], { timeout: 30 * 1000 })
|
|
1989
|
+
if (typeof mergeBase === 'string' && mergeBase.trim()) {
|
|
1990
|
+
const files = runGitDiffNameOnly(cwd, mergeBase.trim())
|
|
1991
|
+
if (files !== null) {
|
|
1992
|
+
diffOk = true
|
|
1993
|
+
sources.push('main:diff-merge-base')
|
|
1994
|
+
for (const f of files) union.add(normalizeReconcilePath(f))
|
|
1995
|
+
}
|
|
1996
|
+
}
|
|
1997
|
+
}
|
|
1998
|
+
// B2 status porcelain(untracked 全量,含 --untracked-files=all 防整目录折叠漏文件)
|
|
1999
|
+
const statusRaw = gitQuiet(cwd, ['status', '--porcelain', '--untracked-files=all'], { timeout: 30 * 1000, trim: false })
|
|
2000
|
+
if (statusRaw !== null) {
|
|
2001
|
+
statusOk = true
|
|
2002
|
+
sources.push('main:status-porcelain(untracked-all)')
|
|
2003
|
+
let files = parsePorcelainFilePaths(statusRaw)
|
|
2004
|
+
if (files.length > 0) {
|
|
2005
|
+
const { own, foreign } = splitOwnVsForeignDiffFiles(cwd, changeName, files, { specBase })
|
|
2006
|
+
if (foreign.length > 0) foreignExcluded = foreign.length
|
|
2007
|
+
files = own
|
|
2008
|
+
}
|
|
2009
|
+
for (const f of files) union.add(normalizeReconcilePath(f))
|
|
2010
|
+
}
|
|
2011
|
+
// B3 apply-pathspec 兜底(存在则并入,读取失败静默忽略——前两源不受影响)
|
|
2012
|
+
const pathspecFile = join(runtimeRoot, `apply-pathspec-${changeName}.txt`)
|
|
2013
|
+
if (existsSync(pathspecFile)) {
|
|
2014
|
+
try {
|
|
2015
|
+
const lines = readFileSync(pathspecFile, 'utf8').split('\n').map(l => l.trim()).filter(Boolean).map(normalizeReconcilePath)
|
|
2016
|
+
if (lines.length > 0) {
|
|
2017
|
+
sources.push('apply-pathspec')
|
|
2018
|
+
for (const f of lines) union.add(f)
|
|
2019
|
+
}
|
|
2020
|
+
} catch { /* 兜底源失败 → 忽略 */ }
|
|
2021
|
+
}
|
|
2022
|
+
if (!diffOk && !statusOk) {
|
|
2023
|
+
return { ok: false, form, files: [], sources, foreignExcluded,
|
|
2024
|
+
degradedReason: 'merge-base 锚定 diff 未得且主仓 status 失败(git 不可用 / 非仓库 / 无锚点分支)' }
|
|
2025
|
+
}
|
|
2026
|
+
}
|
|
2027
|
+
|
|
2028
|
+
const files = [...new Set(filterDeliverableFiles([...union]).filter(Boolean))].sort()
|
|
2029
|
+
return { ok: true, form, files, sources, foreignExcluded, degradedReason: null }
|
|
2030
|
+
}
|
|
2031
|
+
|
|
2032
|
+
/**
|
|
2033
|
+
* ③类尽力归因(仅报告不门禁,D-002 方案 B 否决后的附注保留):扫 execute-runs 下 review.json
|
|
2034
|
+
* 的 changedFiles,命中该文件的 task 即疑似作者。
|
|
2035
|
+
*
|
|
2036
|
+
* - 归属过滤:run 目录带 change 戳且不等值 → 他变更的 run 跳过(task-NN 跨变更同名,混扫必
|
|
2037
|
+
* 错归因;无戳旧 run 保留——向后兼容,task-review.js resolveLatestExecuteRunIdWithTasks 同款)。
|
|
2038
|
+
* - runId 形如 exec-YYYY-MM-DD-HHMMSS:字典序倒序 = 新 run 优先(review 以最新执行为准)。
|
|
2039
|
+
* - changedFiles 是 agent 手写(注记/相对路径常态),归一后 exact match、首个命中即止——
|
|
2040
|
+
* 归因只是③类报告的附注,错比漏代价低,不追求穷举。
|
|
2041
|
+
*
|
|
2042
|
+
* @param {string} runtimeRoot .sillyspec/.runtime
|
|
2043
|
+
* @param {string} changeName
|
|
2044
|
+
* @param {string[]} paths 待归因的③类路径(git 口径的干净路径)
|
|
2045
|
+
* @returns {Map<string, string>} normalized(path) → taskId
|
|
2046
|
+
*/
|
|
2047
|
+
function attributeSuspectTasks(runtimeRoot, changeName, paths) {
|
|
2048
|
+
const map = new Map()
|
|
2049
|
+
if (!runtimeRoot || paths.length === 0) return map
|
|
2050
|
+
const wantSet = new Set(paths.map(p => normalizeReviewChangedFile(p)))
|
|
2051
|
+
const runsDir = join(runtimeRoot, 'execute-runs')
|
|
2052
|
+
let runDirs
|
|
2053
|
+
try {
|
|
2054
|
+
runDirs = readdirSync(runsDir, { withFileTypes: true }).filter(e => e.isDirectory()).map(e => e.name).sort().reverse()
|
|
2055
|
+
} catch { return map /* 无 execute-runs(未走 execute 评审)→ 无从归因,空 Map */ }
|
|
2056
|
+
for (const run of runDirs) {
|
|
2057
|
+
try {
|
|
2058
|
+
const stamp = readFileSync(join(runsDir, run, 'change'), 'utf8').trim()
|
|
2059
|
+
if (stamp && stamp !== changeName) continue
|
|
2060
|
+
} catch { /* 无戳旧 run:保留扫描(向后兼容) */ }
|
|
2061
|
+
let taskDirs
|
|
2062
|
+
try {
|
|
2063
|
+
taskDirs = readdirSync(join(runsDir, run, 'tasks'), { withFileTypes: true }).filter(e => e.isDirectory()).map(e => e.name).sort()
|
|
2064
|
+
} catch { continue /* 该 run 无 tasks/ */ }
|
|
2065
|
+
for (const t of taskDirs) {
|
|
2066
|
+
let review
|
|
2067
|
+
try { review = JSON.parse(readFileSync(join(runsDir, run, 'tasks', t, 'review.json'), 'utf8')) } catch { continue }
|
|
2068
|
+
if (!review || typeof review !== 'object') continue
|
|
2069
|
+
const taskId = (typeof review.task === 'string' && review.task.trim()) || t
|
|
2070
|
+
for (const cf of Array.isArray(review.changedFiles) ? review.changedFiles : []) {
|
|
2071
|
+
const n = normalizeReviewChangedFile(cf)
|
|
2072
|
+
if (n && wantSet.has(n) && !map.has(n)) map.set(n, taskId)
|
|
2073
|
+
}
|
|
2074
|
+
}
|
|
2075
|
+
}
|
|
2076
|
+
return map
|
|
2077
|
+
}
|
|
2078
|
+
|
|
2079
|
+
/**
|
|
2080
|
+
* plan target_files 声明 ↔ 实际改动 机器对账(task-04;接线 gates.js verify 块是 task-05 的
|
|
2081
|
+
* scope——②类 status='missing_declared' 为 ERROR 阻断语义、③类 'undeclared' 为 WARNING、
|
|
2082
|
+
* 'skipped'/'degraded' 为 WARNING 不误红,均由接线方兑现,本函数只产差集事实)。
|
|
2083
|
+
*
|
|
2084
|
+
* 纯函数风格(与 runVerifyTestCheck 同构导出):只读 git/fs,不落盘、不改既有导出语义。
|
|
2085
|
+
* actual 三源口径见 resolveReconcileActualFiles;声明侧见 collectDeclaredTargetFiles。
|
|
2086
|
+
*
|
|
2087
|
+
* @param {object} opts
|
|
2088
|
+
* @param {string} opts.cwd - 主仓根(git 调用根)
|
|
2089
|
+
* @param {string|null} [opts.specBase] - .sillyspec 根(缺省 join(cwd,'.sillyspec');平台模式传 specRoot)
|
|
2090
|
+
* @param {string|null} [opts.changeName] - 变更名(quick 等无关联场景缺省 → skipped)
|
|
2091
|
+
* @param {string|null} [opts.runtimeRoot] - 运行时根(缺省 join(specBase,'.runtime');平台模式
|
|
2092
|
+
* 与 specBase 分离时传 resolveRuntimeRoot 结果)
|
|
2093
|
+
* @returns {{
|
|
2094
|
+
* status: 'ok'|'missing_declared'|'undeclared'|'skipped'|'degraded',
|
|
2095
|
+
* matched: string[], // ①交集(唯一路径排序)
|
|
2096
|
+
* missing: Array<{task: string, path: string, isNew?: boolean}>, // ②声明没做(isNew 标 NEW: 声明,剥前缀 path)
|
|
2097
|
+
* undeclared: Array<{path: string, suspectTask?: string}>, // ③做了没声明(suspectTask=review.json 尽力归因)
|
|
2098
|
+
* skipReason: string|null, // skipped/degraded 的原因(其余状态为 null)
|
|
2099
|
+
* notes: string[], // 跨仓卡剔除 / 并行 WIP 剔除等提示(additive)
|
|
2100
|
+
* form: 'worktree'|'post-apply'|null, // actual 形态(skipped 无 actual 时为 null;additive)
|
|
2101
|
+
* sources: string[], // actual 实际用到的源(诊断可见性;additive)
|
|
2102
|
+
* }}
|
|
2103
|
+
*/
|
|
2104
|
+
export function reconcileTargetFiles({ cwd, specBase = null, changeName = null, runtimeRoot = null }) {
|
|
2105
|
+
const matched = []
|
|
2106
|
+
const missing = []
|
|
2107
|
+
const undeclared = []
|
|
2108
|
+
const notes = []
|
|
2109
|
+
|
|
2110
|
+
if (!changeName) {
|
|
2111
|
+
return { status: 'skipped', matched, missing, undeclared,
|
|
2112
|
+
skipReason: '无 changeName(quick 等无关联变更场景),target_files 对账跳过', notes, form: null, sources: [] }
|
|
2113
|
+
}
|
|
2114
|
+
const sb = specBase || join(cwd, '.sillyspec')
|
|
2115
|
+
const rt = runtimeRoot || join(sb, '.runtime')
|
|
2116
|
+
|
|
2117
|
+
// —— 声明侧 ——
|
|
2118
|
+
const decl = collectDeclaredTargetFiles(sb, changeName)
|
|
2119
|
+
for (const label of decl.crossRepoCards) {
|
|
2120
|
+
notes.push(`跨仓 task 卡 ${label} 已剔除——跨仓对账不在本变更范围(D-004),其声明留待后续分期`)
|
|
2121
|
+
}
|
|
2122
|
+
if (decl.cardCount === 0) {
|
|
2123
|
+
return { status: 'skipped', matched, missing, undeclared,
|
|
2124
|
+
skipReason: `变更 ${changeName} 无 task 卡(tasks/ 缺失或为空),target_files 对账跳过`, notes, form: null, sources: [] }
|
|
2125
|
+
}
|
|
2126
|
+
if (decl.declarations.length === 0) {
|
|
2127
|
+
// 存量零红门禁:全部卡无声明 / 全部跨仓 → WARNING 语义跳过,不产生 missing/undeclared
|
|
2128
|
+
const reason = decl.noDeclarationCount === 0
|
|
2129
|
+
? `本变更 task 卡全部为跨仓卡(${decl.crossRepoCards.length} 张),主仓 target_files 对账跳过`
|
|
2130
|
+
: `所有 task 卡均未声明 target_files(${decl.noDeclarationCount}/${decl.cardCount} 张无声明` +
|
|
2131
|
+
`${decl.crossRepoCards.length > 0 ? `,另 ${decl.crossRepoCards.length} 张跨仓卡已剔除` : ''})` +
|
|
2132
|
+
`——存量卡可忽略;新卡请补:每条为仓根相对精确文件路径,不存在的文件加 NEW: 前缀`
|
|
2133
|
+
return { status: 'skipped', matched, missing, undeclared, skipReason: reason, notes, form: null, sources: [] }
|
|
2134
|
+
}
|
|
2135
|
+
|
|
2136
|
+
// —— actual 侧(三源并集,两形态)——
|
|
2137
|
+
const actual = resolveReconcileActualFiles({ cwd, specBase: sb, runtimeRoot: rt, changeName })
|
|
2138
|
+
if (actual.foreignExcluded > 0) {
|
|
2139
|
+
notes.push(`主仓 status 捕入的 ${actual.foreignExcluded} 个并行会话声明文件已剔除(不参与本变更对账)`)
|
|
2140
|
+
}
|
|
2141
|
+
if (!actual.ok) {
|
|
2142
|
+
// 降级(fail-soft 不误红):git 全部不可用 → actual 不可得,不产生 missing/undeclared
|
|
2143
|
+
return { status: 'degraded', matched, missing, undeclared,
|
|
2144
|
+
skipReason: `git 全部不可用,actual 不可得,对账降级跳过——${actual.degradedReason}`,
|
|
2145
|
+
notes, form: actual.form, sources: actual.sources }
|
|
2146
|
+
}
|
|
2147
|
+
|
|
2148
|
+
// —— 三类差集 ——
|
|
2149
|
+
const actualSet = new Set(actual.files)
|
|
2150
|
+
const declaredPaths = [...new Set(decl.declarations.map(d => d.path))].sort()
|
|
2151
|
+
const declaredSet = new Set(declaredPaths)
|
|
2152
|
+
// ①交集(计数进 evidence):唯一路径口径(多卡声明同文件只计一次)
|
|
2153
|
+
for (const path of declaredPaths) {
|
|
2154
|
+
if (actualSet.has(path)) matched.push(path)
|
|
2155
|
+
}
|
|
2156
|
+
// ②声明没做(计划落空,ERROR):逐卡逐条报 task-NN + path;NEW: 声明的取剥前缀 path、带
|
|
2157
|
+
// isNew 标(“新建文件没建”与“存量文件没动”的修复指引不同)
|
|
2158
|
+
for (const d of decl.declarations) {
|
|
2159
|
+
if (!actualSet.has(d.path)) {
|
|
2160
|
+
missing.push(d.isNew ? { task: d.task, path: d.path, isNew: true } : { task: d.task, path: d.path })
|
|
2161
|
+
}
|
|
2162
|
+
}
|
|
2163
|
+
// ③做了没声明(scope creep,WARNING):actual − 声明集;suspectTask 尽力归因仅报告(D-002)
|
|
2164
|
+
const suspect = attributeSuspectTasks(rt, changeName, actual.files.filter(p => !declaredSet.has(p)))
|
|
2165
|
+
for (const path of actual.files) {
|
|
2166
|
+
if (declaredSet.has(path)) continue
|
|
2167
|
+
const s = suspect.get(normalizeReviewChangedFile(path))
|
|
2168
|
+
undeclared.push(s ? { path, suspectTask: s } : { path })
|
|
2169
|
+
}
|
|
2170
|
+
|
|
2171
|
+
// 状态聚合:②在场即 ERROR 态优先(gates 阻断语义靠它兑现);仅③ → WARNING 态
|
|
2172
|
+
const status = missing.length > 0 ? 'missing_declared' : (undeclared.length > 0 ? 'undeclared' : 'ok')
|
|
2173
|
+
return { status, matched, missing, undeclared, skipReason: null, notes, form: actual.form, sources: actual.sources }
|
|
2174
|
+
}
|
|
2175
|
+
|
|
2176
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
2177
|
+
// P3b task-02:verify-result.md 探针预填段一致性抽查(D-002@v1 方案A 正文基准 + D-003@v1
|
|
2178
|
+
// G2/G8 锚点规格与判别子;接线 gates.js verify 块是 task-03 的 scope)
|
|
2179
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
2180
|
+
|
|
2181
|
+
/**
|
|
2182
|
+
* 正文预填段锚点正则(导出供 round-trip 测试锁定,R-01):与 src/verify-probes.js
|
|
2183
|
+
* renderVerifyProbesReport 的渲染形态逐条同源(行号为 2026-09-07 P3b 基线,渲染改版须
|
|
2184
|
+
* 同步更新此处)。统一锚定行首 ^——正文散文行内出现同形片段不算命中(G8 紧锚)。
|
|
2185
|
+
*/
|
|
2186
|
+
|
|
2187
|
+
/** probe1 命中行:`- ⚠️ \`${file}:${line}\` ${content}`(renderVerifyProbesReport :226;
|
|
2188
|
+
* `:\d+` 收尾反引号前的行号段是它与探针 3/6 同形 ⚠️ 行的区分点) */
|
|
2189
|
+
export const PROBE1_HIT_LINE_RE = /^- ⚠️ `[^`]+:\d+`/
|
|
2190
|
+
|
|
2191
|
+
/** probe3 hasTest 行:`- ✅ task-N: 模块目录(…)找到 N 个测试文件(…)`(:245) */
|
|
2192
|
+
export const PROBE3_HASTEST_LINE_RE = /^- ✅ task-\d+: .*找到 \d+ 个测试文件/
|
|
2193
|
+
|
|
2194
|
+
/** probe5 summary 锚行(:259——summary 恒渲染为子节首条 `- ` 行;四个前缀形态覆盖
|
|
2195
|
+
* verifyApiParity 的 pass/fail/无根三态 summary 与 summary 为 falsy 的兜底渲染。G2:锚行
|
|
2196
|
+
* 存在性而非 backend/frontend 计数——总数在 FAIL 形态不进渲染文本) */
|
|
2197
|
+
export const PROBE5_SUMMARY_LINE_RE =
|
|
2198
|
+
/^- (?:✅ API parity check passed:|❌ API parity check failed:|No scan root for parity check|backend \d+ 端点 \/ frontend \d+ 调用)/
|
|
2199
|
+
|
|
2200
|
+
/** probe5 contract gap 表格行:`| ❌ missing | METHOD path | — | file:line |`(:271,
|
|
2201
|
+
* fail 形态锚 missing 数) */
|
|
2202
|
+
export const PROBE5_MISSING_ROW_RE = /^\| ❌ missing \|/
|
|
2203
|
+
|
|
2204
|
+
/** probe6 删除条目行:`- <verdict> \`${path}\`(git 状态 D)`(:288;verdict 三态前缀与
|
|
2205
|
+
* runVerifyProbes 的 ✅ 合规 / ❌ 高风险 / ⚠️ 未声明删除同源,`(git 状态` 尾缀把它与
|
|
2206
|
+
* unavailable 行 / 无删除行 / ℹ️ note 行天然区分——后三者均无「反引号路径+状态尾缀」形态) */
|
|
2207
|
+
export const PROBE6_DELETION_LINE_RE = /^- (?:✅ 合规|❌ 高风险|⚠️ 未声明删除)[^`]* `[^`]+`(git 状态/
|
|
2208
|
+
|
|
2209
|
+
/**
|
|
2210
|
+
* `#### 探针 N` 子节定界(G8/R-05):子节 = 标题行起、下一任意 markdown 标题(下一探针
|
|
2211
|
+
* 子节 / `##` 章 / `#` 题)前止。探针 2/4 的 agent 补写内容天然落在本子节定界之外,其
|
|
2212
|
+
* `- ⚠️` 同形散文不进 1/3/5/6 的锚点计数。
|
|
2213
|
+
* @param {string} text verify-result.md 全文(CRLF 归一内部处理)
|
|
2214
|
+
* @returns {Object<string, string[]>} 探针号(字符串)→ 子节正文行数组(不含自身标题行;
|
|
2215
|
+
* 子节缺失则无该键;同名子节重复出现时合并计数——重复本身就会撞出 mismatch)
|
|
2216
|
+
*/
|
|
2217
|
+
function extractProbeSubsections(text) {
|
|
2218
|
+
const sections = {}
|
|
2219
|
+
let current = null
|
|
2220
|
+
for (const line of normalizeLineEndings(String(text || '')).split('\n')) {
|
|
2221
|
+
const m = line.match(/^#### 探针 (\d+)[::]/)
|
|
2222
|
+
if (m) {
|
|
2223
|
+
current = m[1]
|
|
2224
|
+
if (!sections[current]) sections[current] = []
|
|
2225
|
+
continue
|
|
2226
|
+
}
|
|
2227
|
+
if (current === null) continue
|
|
2228
|
+
if (/^#{1,6}\s/.test(line)) { current = null; continue }
|
|
2229
|
+
sections[current].push(line)
|
|
2230
|
+
}
|
|
2231
|
+
return sections
|
|
2232
|
+
}
|
|
2233
|
+
|
|
2234
|
+
/**
|
|
2235
|
+
* 解析 verify-result.md 正文预填段锚点指标(checkProbeConsistency 的 doc 侧取数)。
|
|
2236
|
+
* 导出供渲染→解析 round-trip 测试直接消费(R-01)。
|
|
2237
|
+
* @param {string} text verify-result.md 全文
|
|
2238
|
+
* @returns {{
|
|
2239
|
+
* subsections: { probe1: boolean, probe3: boolean, probe5: boolean, probe6: boolean, any: boolean },
|
|
2240
|
+
* probe1Hits: number, // probe1 命中行计数(对比 probe1.matches.length)
|
|
2241
|
+
* probe3HasTest: number, // probe3 hasTest 行计数(对比 tasks.filter(hasTest).length)
|
|
2242
|
+
* probe5SummaryPresent: boolean, // probe5 summary 锚行存在性(pass 形态锚)
|
|
2243
|
+
* probe5Missing: number, // `| ❌ missing |` 行计数(fail 形态锚,对比 missingBackend.length)
|
|
2244
|
+
* probe6Deletions: number, // probe6 删除条目行计数(对比 deletions.length)
|
|
2245
|
+
* }}
|
|
2246
|
+
*/
|
|
2247
|
+
export function parseProbePrefillAnchors(text) {
|
|
2248
|
+
const sections = extractProbeSubsections(text)
|
|
2249
|
+
const count = (lines, re) => lines.reduce((n, l) => n + (re.test(l) ? 1 : 0), 0)
|
|
2250
|
+
const s1 = sections['1'] || []
|
|
2251
|
+
const s3 = sections['3'] || []
|
|
2252
|
+
const s5 = sections['5'] || []
|
|
2253
|
+
const s6 = sections['6'] || []
|
|
2254
|
+
return {
|
|
2255
|
+
subsections: {
|
|
2256
|
+
probe1: '1' in sections,
|
|
2257
|
+
probe3: '3' in sections,
|
|
2258
|
+
probe5: '5' in sections,
|
|
2259
|
+
probe6: '6' in sections,
|
|
2260
|
+
any: Object.keys(sections).length > 0,
|
|
2261
|
+
},
|
|
2262
|
+
probe1Hits: count(s1, PROBE1_HIT_LINE_RE),
|
|
2263
|
+
probe3HasTest: count(s3, PROBE3_HASTEST_LINE_RE),
|
|
2264
|
+
probe5SummaryPresent: count(s5, PROBE5_SUMMARY_LINE_RE) > 0,
|
|
2265
|
+
probe5Missing: count(s5, PROBE5_MISSING_ROW_RE),
|
|
2266
|
+
probe6Deletions: count(s6, PROBE6_DELETION_LINE_RE),
|
|
2267
|
+
}
|
|
2268
|
+
}
|
|
2269
|
+
|
|
2270
|
+
/**
|
|
2271
|
+
* 读 <changeDir>/verify-facts.json(verify-probes --init 落盘的机器底稿,task-01)。缺失 /
|
|
2272
|
+
* 不可解析 / 非对象 → null。注意:facts 只是审计参照与判别子证据,防篡改对比基准是正文。
|
|
2273
|
+
*/
|
|
2274
|
+
function readVerifyFacts(changeDir) {
|
|
2275
|
+
const factsPath = join(changeDir, 'verify-facts.json')
|
|
2276
|
+
if (!existsSync(factsPath)) return null
|
|
2277
|
+
try {
|
|
2278
|
+
const parsed = JSON.parse(readFileSync(factsPath, 'utf8'))
|
|
2279
|
+
return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : null
|
|
2280
|
+
} catch { return null }
|
|
2281
|
+
}
|
|
2282
|
+
|
|
2283
|
+
/**
|
|
2284
|
+
* init 快照后 HEAD 是否前进(R-06):facts.generatedAt 之后 `git log --oneline` 非空 → true。
|
|
2285
|
+
* facts 缺失 / generatedAt 非法 / git 失败 → false——子案判定跳过 = 不降级,probe6 不符维持
|
|
2286
|
+
* ERROR(fail-closed 侧:无法证实「环境漂移」就按「疑似篡改」报)。
|
|
2287
|
+
*/
|
|
2288
|
+
function detectHeadAdvanceSinceFacts(cwd, facts) {
|
|
2289
|
+
const generatedAt = facts && typeof facts.generatedAt === 'string' ? facts.generatedAt.trim() : ''
|
|
2290
|
+
if (!generatedAt) return false
|
|
2291
|
+
const out = gitQuiet(cwd, ['log', '--oneline', `--since=${generatedAt}`], { timeout: 30 * 1000 })
|
|
2292
|
+
if (out === null) return false
|
|
2293
|
+
return out.trim().length > 0
|
|
2294
|
+
}
|
|
2295
|
+
|
|
2296
|
+
/**
|
|
2297
|
+
* verify-result.md 探针预填段一致性抽查(P3b task-02;D-002@v1 方案A——对比基准是**正文**
|
|
2298
|
+
* 预填段而非 verify-facts.json,删底稿绕不过防护)。
|
|
2299
|
+
*
|
|
2300
|
+
* 纯函数风格(与 reconcileTargetFiles 同构导出):只读 git/fs、重跑只读探针,不落盘、不改
|
|
2301
|
+
* 既有导出语义。流程:
|
|
2302
|
+
* 1. verify-result.md 不存在 → skip(未走 --init 的存量/quick 场景);
|
|
2303
|
+
* 2. 判别子(D-003):任一 `#### 探针` 子节在场 = 新格式报告,进入逐探针对账;全部子节
|
|
2304
|
+
* 缺失时——facts 在场 → ERROR(agent 删除预填段);facts 也不在场 → skip(存量旧报告,
|
|
2305
|
+
* 零红门禁)。残余(正文预填段+facts 同时删)降级 skip——防护弱化非绕过,如实声明;
|
|
2306
|
+
* 3. 重跑 runVerifyProbes(specDir 显式传 sb——平台/主仓根口径由调用方给定,不走 cwd 祖先
|
|
2307
|
+
* 推断与 worktree 漂移锚定);异常 → degraded(fail-soft 不误红);
|
|
2308
|
+
* 4. 分级对账(D-002):
|
|
2309
|
+
* - probe1 命中数不符 / probe6 删除数不符 = ERROR(probe1 对比排除 worktreeHits 维度
|
|
2310
|
+
* ——worktree 存活态与 init 时刻可能不同,R-02;probe6 重跑不可用(非仓库/git 失败)时
|
|
2311
|
+
* 当前删除数无意义,跳过该维度不误红);
|
|
2312
|
+
* - HEAD 前进子案(R-06):facts.generatedAt 之后有新 commit 时 probe6 的 `git diff HEAD`
|
|
2313
|
+
* 口径整体漂移 → 该 mismatch 降 WARNING 提示重跑 --init;
|
|
2314
|
+
* - probe3 hasTest 数 / probe5 锚(summary 行存在性 + missing 行数)不符 = WARNING
|
|
2315
|
+
* (测试文件布局与 parity 扫描根环境敏感)。
|
|
2316
|
+
*
|
|
2317
|
+
* 接线约定(task-03,gates.js):status='mismatch' 且 severity='error' → 阻断回滚;
|
|
2318
|
+
* 'mismatch'+'warning' → 放行告警(envelope probe_consistency_drift);'skipped'/'degraded' →
|
|
2319
|
+
* 放行提示(envelope probe_consistency_skipped);'ok' → 静默。ERROR 级 mismatch 的信封 code
|
|
2320
|
+
* 为 probe_consistency_mismatch。
|
|
2321
|
+
*
|
|
2322
|
+
* @param {object} opts
|
|
2323
|
+
* @param {string} opts.cwd - 主仓根(git 调用根,与 runVerifyProbes 同参)
|
|
2324
|
+
* @param {string|null} [opts.specBase] - .sillyspec 根(缺省 join(cwd,'.sillyspec');平台模式
|
|
2325
|
+
* 传 specRoot——changeDir/报告/facts 的定位基准,P3a reconcileTargetFiles 同款兜底)
|
|
2326
|
+
* @param {string|null} [opts.changeName] - 变更名(quick 等无关联场景缺省 → skipped)
|
|
2327
|
+
* @param {string|null} [opts.runtimeRoot] - 运行时根(缺省 join(specBase,'.runtime');平台模式
|
|
2328
|
+
* 与 specBase 分离时传 resolveRuntimeRoot 结果。取根口径与 P3a 一致——本检查的锚点产物
|
|
2329
|
+
* (verify-result.md/verify-facts.json)均在 changeDir,此参为 gates 统一传参的签名对齐预留)
|
|
2330
|
+
* @returns {{
|
|
2331
|
+
* status: 'ok'|'mismatch'|'skipped'|'degraded',
|
|
2332
|
+
* severity: 'error'|'warning'|null, // mismatch 时 = mismatches 内最高级;其余状态恒 null
|
|
2333
|
+
* mismatches: Array<{probe: string, expected: *, actual: *, severity: 'error'|'warning', note: string}>,
|
|
2334
|
+
* // expected = 当前重跑指标(应然),actual = 正文锚点解析值(agent 可篡改侧)
|
|
2335
|
+
* skipReason: string|null,
|
|
2336
|
+
* subsections: {probe1: boolean, probe3: boolean, probe5: boolean, probe6: boolean, any: boolean}|null,
|
|
2337
|
+
* // 诊断(additive):探针子节在场性;报告未读到的早期 skip 为 null
|
|
2338
|
+
* }}
|
|
2339
|
+
*/
|
|
2340
|
+
export function checkProbeConsistency({ cwd, specBase = null, changeName = null, runtimeRoot = null }) {
|
|
2341
|
+
if (!changeName) {
|
|
2342
|
+
return { status: 'skipped', severity: null, mismatches: [],
|
|
2343
|
+
skipReason: '无 changeName(quick 等无关联变更场景),探针一致性抽查跳过', subsections: null }
|
|
2344
|
+
}
|
|
2345
|
+
const sb = specBase || join(cwd, '.sillyspec')
|
|
2346
|
+
const changeDir = join(sb, 'changes', changeName)
|
|
2347
|
+
const reportPath = join(changeDir, 'verify-result.md')
|
|
2348
|
+
|
|
2349
|
+
if (!existsSync(reportPath)) {
|
|
2350
|
+
return { status: 'skipped', severity: null, mismatches: [],
|
|
2351
|
+
skipReason: `verify-result.md 不存在(${reportPath}),探针一致性抽查跳过`, subsections: null }
|
|
2352
|
+
}
|
|
2353
|
+
let reportText
|
|
2354
|
+
try {
|
|
2355
|
+
reportText = readFileSync(reportPath, 'utf8')
|
|
2356
|
+
} catch (err) {
|
|
2357
|
+
return { status: 'skipped', severity: null, mismatches: [],
|
|
2358
|
+
skipReason: `verify-result.md 读取失败(${err && err.message ? err.message : err}),探针一致性抽查跳过`, subsections: null }
|
|
2359
|
+
}
|
|
2360
|
+
|
|
2361
|
+
const anchors = parseProbePrefillAnchors(reportText)
|
|
2362
|
+
const finish = (status, severity, mismatches, skipReason) =>
|
|
2363
|
+
({ status, severity, mismatches, skipReason, subsections: anchors.subsections })
|
|
2364
|
+
|
|
2365
|
+
// —— 判别子(D-003):全部 `#### 探针` 子节缺失时不进入逐探针对账 ——
|
|
2366
|
+
if (!anchors.subsections.any) {
|
|
2367
|
+
if (readVerifyFacts(changeDir)) {
|
|
2368
|
+
return finish('mismatch', 'error', [{
|
|
2369
|
+
probe: 'prefill', expected: '#### 探针 预填子节在场', actual: '全部缺失', severity: 'error',
|
|
2370
|
+
note: 'verify-facts.json 在场而正文探针子节全缺——疑似 agent 删除机械预填段(对比基准是正文,删 facts.json 绕不过防护)',
|
|
2371
|
+
}], null)
|
|
2372
|
+
}
|
|
2373
|
+
return finish('skipped', null, [],
|
|
2374
|
+
'verify-result.md 无 #### 探针 子节且无 verify-facts.json(存量旧格式报告),探针一致性抽查跳过')
|
|
2375
|
+
}
|
|
2376
|
+
|
|
2377
|
+
// —— 重跑探针取当前指标(specDir 显式传 sb:根口径由调用方给定,不做祖先推断/漂移锚定) ——
|
|
2378
|
+
let current
|
|
2379
|
+
try {
|
|
2380
|
+
current = runVerifyProbes({ cwd, changeName, specDir: sb })
|
|
2381
|
+
} catch (err) {
|
|
2382
|
+
return finish('degraded', null, [],
|
|
2383
|
+
`探针重跑异常(${err && err.message ? err.message : err}),一致性抽查降级跳过(fail-soft 不误红)`)
|
|
2384
|
+
}
|
|
2385
|
+
|
|
2386
|
+
const mismatches = []
|
|
2387
|
+
|
|
2388
|
+
// probe1 命中数(ERROR;worktreeHits/skippedFiles 环境维度不参与对比,R-02)
|
|
2389
|
+
const curProbe1Hits = (((current.probe1 || {}).matches) || []).length
|
|
2390
|
+
if (anchors.probe1Hits !== curProbe1Hits) {
|
|
2391
|
+
mismatches.push({ probe: 'probe1', expected: curProbe1Hits, actual: anchors.probe1Hits, severity: 'error',
|
|
2392
|
+
note: '未实现标记命中数与重跑不符——正文预填段疑似被篡改(worktree 存活态等环境维度不参与对比)' })
|
|
2393
|
+
}
|
|
2394
|
+
|
|
2395
|
+
// probe6 删除数(ERROR;重跑不可用时跳过——非仓库/git 失败下当前删除数无意义,对照不成立)
|
|
2396
|
+
const curProbe6 = current.probe6 || {}
|
|
2397
|
+
const curProbe6Deletions = (curProbe6.deletions || []).length
|
|
2398
|
+
if (!curProbe6.unavailable && anchors.probe6Deletions !== curProbe6Deletions) {
|
|
2399
|
+
const advanced = detectHeadAdvanceSinceFacts(cwd, readVerifyFacts(changeDir))
|
|
2400
|
+
mismatches.push({
|
|
2401
|
+
probe: 'probe6', expected: curProbe6Deletions, actual: anchors.probe6Deletions,
|
|
2402
|
+
severity: advanced ? 'warning' : 'error',
|
|
2403
|
+
note: advanced
|
|
2404
|
+
? 'init 快照(verify-facts.json generatedAt)之后 HEAD 前进,probe6 以 HEAD 为锚整体漂移——请重跑 verify-probes --init 刷新预填(降 WARNING,R-06)'
|
|
2405
|
+
: '删除对账条目数与重跑不符——正文预填段疑似被篡改',
|
|
2406
|
+
})
|
|
2407
|
+
}
|
|
2408
|
+
|
|
2409
|
+
// probe3 hasTest 数(WARNING——测试文件布局环境敏感)
|
|
2410
|
+
const curProbe3HasTest = ((((current.probe3 || {}).tasks) || []).filter(t => t && t.hasTest)).length
|
|
2411
|
+
if (anchors.probe3HasTest !== curProbe3HasTest) {
|
|
2412
|
+
mismatches.push({ probe: 'probe3', expected: curProbe3HasTest, actual: anchors.probe3HasTest, severity: 'warning',
|
|
2413
|
+
note: 'hasTest 任务数与重跑不符(探针3 对测试文件布局环境敏感,WARNING 不阻断)' })
|
|
2414
|
+
}
|
|
2415
|
+
|
|
2416
|
+
// probe5 锚(WARNING——G2:summary 行存在性 + missing 行数;backend/frontend 总数不作锚)
|
|
2417
|
+
const curProbe5Missing = ((((current.probe5 || {}).missingBackend) || [])).length
|
|
2418
|
+
if (!anchors.probe5SummaryPresent) {
|
|
2419
|
+
mismatches.push({ probe: 'probe5', expected: 'summary 锚行在场', actual: '缺失', severity: 'warning',
|
|
2420
|
+
note: '探针5 summary 锚行缺失——正文预填段疑似被删改(锚行存在性口径,非计数口径)' })
|
|
2421
|
+
}
|
|
2422
|
+
if (anchors.probe5Missing !== curProbe5Missing) {
|
|
2423
|
+
mismatches.push({ probe: 'probe5', expected: curProbe5Missing, actual: anchors.probe5Missing, severity: 'warning',
|
|
2424
|
+
note: 'contract gap(missing backend)行数与重跑不符(探针5 扫描根/缓存口径环境敏感,WARNING 不阻断)' })
|
|
2425
|
+
}
|
|
2426
|
+
|
|
2427
|
+
if (mismatches.length === 0) return finish('ok', null, [], null)
|
|
2428
|
+
const severity = mismatches.some(m => m.severity === 'error') ? 'error' : 'warning'
|
|
2429
|
+
return finish('mismatch', severity, mismatches, null)
|
|
2430
|
+
}
|