@mjasnikovs/pi-task 0.38.29 → 0.38.30
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/dist/config/config.d.ts +70 -70
- package/dist/config/config.js +26 -35
- package/dist/config/extension-list.d.ts +6 -5
- package/dist/config/extension-list.js +3 -2
- package/dist/config/reasoning-args.d.ts +9 -7
- package/dist/config/reasoning-args.js +12 -10
- package/dist/config/reasoning.d.ts +44 -105
- package/dist/config/reasoning.js +27 -704
- package/dist/config/register.d.ts +34 -48
- package/dist/config/register.js +41 -51
- package/dist/config/tool-list.d.ts +16 -16
- package/dist/config/tool-list.js +1 -1
- package/dist/remote/bridge.d.ts +19 -10
- package/dist/remote/bridge.js +3 -2
- package/dist/remote/broadcast.js +3 -1
- package/dist/remote/events.js +12 -11
- package/dist/remote/history.d.ts +1 -1
- package/dist/remote/protocol.d.ts +6 -3
- package/dist/remote/protocol.js +2 -1
- package/dist/remote/push.d.ts +16 -16
- package/dist/remote/push.js +27 -27
- package/dist/remote/register.d.ts +3 -3
- package/dist/remote/register.js +17 -19
- package/dist/remote/server.d.ts +9 -8
- package/dist/remote/server.js +15 -14
- package/dist/remote/session-state.d.ts +5 -4
- package/dist/remote/session-state.js +8 -5
- package/dist/remote/sw.d.ts +7 -6
- package/dist/remote/sw.js +7 -6
- package/dist/remote/tailscale.d.ts +4 -2
- package/dist/remote/tailscale.js +4 -2
- package/dist/remote/ui-highlight.js +6 -5
- package/dist/remote/ui-render.js +4 -4
- package/dist/remote/ui-script.js +24 -24
- package/dist/remote/ui-styles.d.ts +1 -1
- package/dist/remote/ui-styles.js +10 -13
- package/dist/remote/ui-tools.js +9 -6
- package/dist/shared/child-extensions.d.ts +29 -17
- package/dist/shared/child-extensions.js +29 -17
- package/dist/shared/child-output.d.ts +30 -24
- package/dist/shared/child-output.js +25 -17
- package/dist/shared/child-process.d.ts +47 -40
- package/dist/shared/child-process.js +50 -59
- package/dist/shared/command-watchdog.d.ts +22 -16
- package/dist/shared/command-watchdog.js +28 -21
- package/dist/shared/fs-text.d.ts +16 -10
- package/dist/shared/fs-text.js +16 -10
- package/dist/shared/git-runner.d.ts +25 -25
- package/dist/shared/git-runner.js +25 -25
- package/dist/shared/leaked-tool-call.d.ts +17 -11
- package/dist/shared/leaked-tool-call.js +23 -15
- package/dist/shared/model-endpoint.d.ts +29 -16
- package/dist/shared/model-endpoint.js +33 -21
- package/dist/shared/pi-invocation.d.ts +7 -4
- package/dist/shared/pi-invocation.js +12 -7
- package/dist/shared/pkg-version.d.ts +13 -5
- package/dist/shared/pkg-version.js +13 -5
- package/dist/shared/reasoning-capability.d.ts +35 -24
- package/dist/shared/reasoning-capability.js +35 -24
- package/dist/shared/stream-watchdog.d.ts +60 -44
- package/dist/shared/stream-watchdog.js +62 -45
- package/dist/task/accept-debt.d.ts +41 -43
- package/dist/task/accept-debt.js +73 -65
- package/dist/task/api-synthesis.d.ts +24 -21
- package/dist/task/api-synthesis.js +32 -26
- package/dist/task/apis-contract.d.ts +32 -64
- package/dist/task/apis-contract.js +32 -64
- package/dist/task/artifact-closure.d.ts +27 -13
- package/dist/task/artifact-closure.js +95 -67
- package/dist/task/auto-commit.d.ts +46 -35
- package/dist/task/auto-commit.js +51 -38
- package/dist/task/auto-io.d.ts +45 -25
- package/dist/task/auto-io.js +57 -29
- package/dist/task/auto-orchestrator.d.ts +26 -24
- package/dist/task/auto-orchestrator.js +178 -162
- package/dist/task/auto-prompts.d.ts +36 -24
- package/dist/task/auto-prompts.js +40 -26
- package/dist/task/autofix-ledger.d.ts +27 -25
- package/dist/task/autofix-ledger.js +29 -26
- package/dist/task/batch-test-task.d.ts +20 -12
- package/dist/task/batch-test-task.js +67 -60
- package/dist/task/boot-probe.d.ts +60 -44
- package/dist/task/boot-probe.js +91 -72
- package/dist/task/cancel-input.d.ts +30 -16
- package/dist/task/cancel-input.js +20 -11
- package/dist/task/cancel-points.d.ts +27 -20
- package/dist/task/cancel-points.js +30 -22
- package/dist/task/child-runner.d.ts +46 -51
- package/dist/task/child-runner.js +48 -49
- package/dist/task/child-status.d.ts +23 -16
- package/dist/task/child-status.js +23 -16
- package/dist/task/clamp-output.js +12 -5
- package/dist/task/command-run.d.ts +31 -28
- package/dist/task/command-run.js +44 -35
- package/dist/task/command-shrink.d.ts +25 -18
- package/dist/task/command-shrink.js +37 -31
- package/dist/task/command-watchdog.d.ts +9 -6
- package/dist/task/command-watchdog.js +21 -15
- package/dist/task/context-attribution.d.ts +34 -26
- package/dist/task/context-attribution.js +34 -26
- package/dist/task/context-silence.d.ts +39 -29
- package/dist/task/context-silence.js +35 -25
- package/dist/task/context-usage.d.ts +16 -9
- package/dist/task/context-usage.js +16 -9
- package/dist/task/contracts.d.ts +8 -4
- package/dist/task/contracts.js +25 -17
- package/dist/task/coverage-loop.d.ts +22 -18
- package/dist/task/coverage-loop.js +35 -30
- package/dist/task/critique-probes.d.ts +13 -14
- package/dist/task/critique-probes.js +50 -39
- package/dist/task/debug-log.d.ts +13 -5
- package/dist/task/debug-log.js +32 -20
- package/dist/task/decompose-fidelity.d.ts +11 -9
- package/dist/task/decompose-fidelity.js +38 -33
- package/dist/task/decompose-granularity.d.ts +41 -38
- package/dist/task/decompose-granularity.js +41 -38
- package/dist/task/deep-render-check.d.ts +22 -14
- package/dist/task/deep-render-check.js +40 -31
- package/dist/task/dropped-input.d.ts +12 -7
- package/dist/task/dropped-input.js +5 -2
- package/dist/task/enforce-attribution.d.ts +38 -47
- package/dist/task/enforce-attribution.js +46 -52
- package/dist/task/enforce-guidelines.d.ts +31 -20
- package/dist/task/enforce-guidelines.js +32 -21
- package/dist/task/enrichment.d.ts +7 -2
- package/dist/task/enrichment.js +26 -14
- package/dist/task/env-notes.d.ts +16 -7
- package/dist/task/env-notes.js +48 -31
- package/dist/task/env-template-closure.d.ts +4 -4
- package/dist/task/env-template-closure.js +42 -34
- package/dist/task/external-context.d.ts +28 -21
- package/dist/task/external-context.js +17 -12
- package/dist/task/failure-classifier.d.ts +4 -5
- package/dist/task/failure-classifier.js +6 -7
- package/dist/task/file-inventory.d.ts +15 -11
- package/dist/task/file-inventory.js +25 -22
- package/dist/task/final-gate-fix.d.ts +74 -86
- package/dist/task/final-gate-fix.js +97 -116
- package/dist/task/final-gate-progress.d.ts +29 -46
- package/dist/task/final-gate-progress.js +40 -51
- package/dist/task/final-gate.d.ts +64 -97
- package/dist/task/final-gate.js +192 -199
- package/dist/task/fix-child.d.ts +21 -27
- package/dist/task/fix-child.js +21 -27
- package/dist/task/foreign-path.d.ts +6 -5
- package/dist/task/foreign-path.js +0 -0
- package/dist/task/frozen-conflict.d.ts +9 -10
- package/dist/task/frozen-conflict.js +61 -64
- package/dist/task/frozen-path-guard.d.ts +35 -14
- package/dist/task/frozen-path-guard.js +56 -39
- package/dist/task/gate-child.d.ts +27 -28
- package/dist/task/gate-child.js +36 -35
- package/dist/task/gate-deps.d.ts +34 -27
- package/dist/task/gate-deps.js +169 -159
- package/dist/task/gate-tally.d.ts +77 -80
- package/dist/task/gate-tally.js +65 -68
- package/dist/task/git-state-guard.d.ts +15 -11
- package/dist/task/git-state-guard.js +76 -66
- package/dist/task/impl-widget.d.ts +25 -16
- package/dist/task/impl-widget.js +27 -17
- package/dist/task/implementation-thinking.d.ts +33 -31
- package/dist/task/implementation-thinking.js +5 -6
- package/dist/task/implementation-turn.d.ts +34 -31
- package/dist/task/implementation-turn.js +29 -27
- package/dist/task/inline-markdown.d.ts +20 -7
- package/dist/task/inline-markdown.js +15 -6
- package/dist/task/launch-config-gap.js +25 -39
- package/dist/task/launch-contract.d.ts +18 -21
- package/dist/task/launch-contract.js +28 -30
- package/dist/task/launch-manifest.d.ts +6 -2
- package/dist/task/launch-manifest.js +35 -34
- package/dist/task/ledger.js +16 -14
- package/dist/task/lint-fix.d.ts +6 -8
- package/dist/task/lint-fix.js +67 -69
- package/dist/task/loop-detector.d.ts +9 -8
- package/dist/task/loop-detector.js +16 -12
- package/dist/task/mid-run-input.d.ts +17 -15
- package/dist/task/mid-run-input.js +17 -15
- package/dist/task/orchestrator.d.ts +24 -28
- package/dist/task/orchestrator.js +62 -64
- package/dist/task/orientation.d.ts +18 -23
- package/dist/task/orientation.js +24 -31
- package/dist/task/owned-freeze-conflict.d.ts +21 -20
- package/dist/task/owned-freeze-conflict.js +52 -85
- package/dist/task/owned-freeze-reassign.d.ts +40 -60
- package/dist/task/owned-freeze-reassign.js +41 -61
- package/dist/task/parsers.d.ts +4 -2
- package/dist/task/parsers.js +4 -4
- package/dist/task/phases.d.ts +41 -48
- package/dist/task/phases.js +179 -248
- package/dist/task/plan-io.d.ts +6 -7
- package/dist/task/plan-io.js +6 -7
- package/dist/task/plan-orchestrator.d.ts +10 -8
- package/dist/task/plan-orchestrator.js +14 -10
- package/dist/task/plan-prompts.d.ts +6 -5
- package/dist/task/plan-prompts.js +6 -5
- package/dist/task/plan-readonly.d.ts +4 -5
- package/dist/task/plan-readonly.js +4 -5
- package/dist/task/plan-rounds.d.ts +17 -29
- package/dist/task/plan-rounds.js +21 -34
- package/dist/task/plan-session.d.ts +58 -72
- package/dist/task/plan-session.js +61 -83
- package/dist/task/probe-gaming.d.ts +28 -27
- package/dist/task/probe-gaming.js +0 -0
- package/dist/task/prohibition-probe.d.ts +14 -16
- package/dist/task/prompts.d.ts +3 -4
- package/dist/task/prompts.js +17 -26
- package/dist/task/qa-transcript.d.ts +15 -22
- package/dist/task/qa-transcript.js +15 -21
- package/dist/task/question-box.d.ts +17 -13
- package/dist/task/question-box.js +19 -15
- package/dist/task/question-dedup.d.ts +6 -7
- package/dist/task/question-dedup.js +13 -14
- package/dist/task/question-dialog.d.ts +22 -32
- package/dist/task/question-dialog.js +22 -32
- package/dist/task/question-source.d.ts +18 -44
- package/dist/task/question-source.js +22 -51
- package/dist/task/refuted-constraint.d.ts +11 -31
- package/dist/task/refuted-constraint.js +27 -51
- package/dist/task/regenerable-artifacts.d.ts +12 -31
- package/dist/task/regenerable-artifacts.js +12 -31
- package/dist/task/render-check.d.ts +11 -22
- package/dist/task/render-check.js +33 -46
- package/dist/task/repo-health-check.d.ts +10 -14
- package/dist/task/repo-health-check.js +17 -23
- package/dist/task/requirements.d.ts +38 -71
- package/dist/task/requirements.js +78 -126
- package/dist/task/research-fanout-budget.d.ts +51 -88
- package/dist/task/research-fanout-budget.js +51 -88
- package/dist/task/research-worker.d.ts +29 -39
- package/dist/task/research-worker.js +37 -61
- package/dist/task/resume-gap.d.ts +14 -15
- package/dist/task/root-cause-repair.d.ts +9 -9
- package/dist/task/root-cause-repair.js +28 -40
- package/dist/task/run-bracket.d.ts +10 -13
- package/dist/task/run-end.d.ts +12 -22
- package/dist/task/run-end.js +8 -16
- package/dist/task/run-final-gate.d.ts +19 -21
- package/dist/task/run-final-gate.js +62 -80
- package/dist/task/runner-globs.d.ts +12 -13
- package/dist/task/runner-globs.js +12 -13
- package/dist/task/runner-resolve.d.ts +9 -9
- package/dist/task/runner-resolve.js +22 -23
- package/dist/task/script-escape.d.ts +10 -12
- package/dist/task/script-escape.js +13 -14
- package/dist/task/serve-entry.d.ts +1 -1
- package/dist/task/serve-entry.js +22 -25
- package/dist/task/service-blocks.js +4 -2
- package/dist/task/shipped-source.d.ts +11 -29
- package/dist/task/shipped-source.js +11 -29
- package/dist/task/skip-escape.js +10 -14
- package/dist/task/spec-urls.d.ts +26 -65
- package/dist/task/spec-urls.js +26 -65
- package/dist/task/spec-validation.d.ts +17 -20
- package/dist/task/spec-validation.js +17 -20
- package/dist/task/stall-detector.d.ts +23 -30
- package/dist/task/stall-detector.js +23 -30
- package/dist/task/stream-watchdog.d.ts +14 -12
- package/dist/task/stream-watchdog.js +14 -12
- package/dist/task/substitution-probe.d.ts +17 -20
- package/dist/task/substitution-probe.js +17 -20
- package/dist/task/task-gates.d.ts +36 -41
- package/dist/task/task-gates.js +95 -106
- package/dist/task/task-io.d.ts +4 -4
- package/dist/task/task-io.js +4 -4
- package/dist/task/task-parsers.js +4 -3
- package/dist/task/task-provenance.d.ts +2 -2
- package/dist/task/task-provenance.js +11 -13
- package/dist/task/task-types.d.ts +4 -3
- package/dist/task/terminal-outcome.d.ts +14 -16
- package/dist/task/terminal-outcome.js +12 -14
- package/dist/task/test-assembly.d.ts +13 -20
- package/dist/task/test-assembly.js +13 -20
- package/dist/task/timings.d.ts +5 -3
- package/dist/task/timings.js +5 -3
- package/dist/task/title-label.d.ts +9 -4
- package/dist/task/title-label.js +9 -4
- package/dist/task/type-only-answer.d.ts +44 -52
- package/dist/task/type-only-answer.js +44 -52
- package/dist/task/unfailable-command.d.ts +18 -24
- package/dist/task/unfailable-command.js +21 -27
- package/dist/task/unknown-routing.d.ts +10 -4
- package/dist/task/unknown-routing.js +10 -4
- package/dist/task/user-directives.d.ts +5 -8
- package/dist/task/user-directives.js +5 -8
- package/dist/task/verify-quality.d.ts +18 -22
- package/dist/task/verify-quality.js +45 -46
- package/dist/task/verify-reconcile.d.ts +15 -10
- package/dist/task/verify-reconcile.js +45 -43
- package/dist/task/verify-resolution.d.ts +24 -20
- package/dist/task/verify-resolution.js +51 -50
- package/dist/task/verify-work.d.ts +59 -66
- package/dist/task/verify-work.js +101 -138
- package/dist/task/widget.d.ts +15 -14
- package/dist/task/widget.js +22 -17
- package/dist/task/wiring-claims.d.ts +25 -32
- package/dist/task/wiring-claims.js +30 -35
- package/dist/task/write-guard.d.ts +39 -39
- package/dist/task/write-guard.js +48 -51
- package/dist/task/yolo.d.ts +34 -30
- package/dist/task/yolo.js +42 -37
- package/dist/workers/abstention.d.ts +21 -41
- package/dist/workers/abstention.js +27 -48
- package/dist/workers/brave-search.d.ts +4 -3
- package/dist/workers/brave-search.js +5 -2
- package/dist/workers/brave-warning.d.ts +7 -4
- package/dist/workers/brave-warning.js +19 -7
- package/dist/workers/ddg-search.d.ts +6 -6
- package/dist/workers/ddg-search.js +18 -12
- package/dist/workers/docs-cache.js +5 -2
- package/dist/workers/docs-chunk.d.ts +30 -37
- package/dist/workers/docs-chunk.js +37 -41
- package/dist/workers/docs-core.d.ts +28 -44
- package/dist/workers/docs-core.js +25 -44
- package/dist/workers/docs-index.js +4 -3
- package/dist/workers/docs-lookup.d.ts +15 -22
- package/dist/workers/docs-lookup.js +12 -21
- package/dist/workers/docs-project.d.ts +15 -9
- package/dist/workers/docs-project.js +17 -10
- package/dist/workers/docs-resolve.d.ts +19 -20
- package/dist/workers/docs-resolve.js +35 -32
- package/dist/workers/docs-retrieve.d.ts +5 -6
- package/dist/workers/docs-retrieve.js +18 -15
- package/dist/workers/exa-search.d.ts +9 -6
- package/dist/workers/exa-search.js +23 -12
- package/dist/workers/fetch-core.d.ts +13 -16
- package/dist/workers/fetch-core.js +23 -23
- package/dist/workers/focused-extractor.d.ts +12 -12
- package/dist/workers/focused-extractor.js +16 -19
- package/dist/workers/html-clean.js +24 -14
- package/dist/workers/http-request.d.ts +28 -20
- package/dist/workers/http-request.js +22 -17
- package/dist/workers/npm-version.d.ts +28 -11
- package/dist/workers/npm-version.js +24 -15
- package/dist/workers/phantom-imports.d.ts +15 -12
- package/dist/workers/phantom-imports.js +30 -24
- package/dist/workers/pi-worker-core.d.ts +69 -71
- package/dist/workers/pi-worker-core.js +100 -109
- package/dist/workers/pi-worker-docs.d.ts +24 -19
- package/dist/workers/pi-worker-docs.js +67 -76
- package/dist/workers/pi-worker-fetch.d.ts +7 -3
- package/dist/workers/pi-worker-fetch.js +27 -19
- package/dist/workers/pi-worker-search.js +12 -8
- package/dist/workers/pi-worker.d.ts +9 -4
- package/dist/workers/pi-worker.js +21 -14
- package/dist/workers/reasoning-warning.d.ts +18 -17
- package/dist/workers/reasoning-warning.js +22 -20
- package/dist/workers/research-cache.js +50 -78
- package/dist/workers/search-core.js +7 -5
- package/dist/workers/search-types.d.ts +10 -9
- package/dist/workers/search-types.js +9 -8
- package/dist/workers/session-hint.d.ts +13 -14
- package/dist/workers/session-hint.js +8 -9
- package/dist/workers/shared.d.ts +21 -25
- package/dist/workers/shared.js +0 -0
- package/dist/workers/single-read-extension.d.ts +14 -7
- package/dist/workers/single-read-extension.js +14 -7
- package/dist/workers/single-read-guard.d.ts +25 -28
- package/dist/workers/single-read-guard.js +32 -32
- package/dist/workers/typeonly-log.d.ts +12 -9
- package/dist/workers/typeonly-log.js +29 -33
- package/dist/workers/worker-channels.d.ts +15 -23
- package/dist/workers/worker-channels.js +15 -23
- package/dist/workers/worker-failure.d.ts +38 -46
- package/dist/workers/worker-failure.js +31 -39
- package/dist/workers/worker-kill.d.ts +25 -26
- package/dist/workers/worker-kill.js +16 -19
- package/dist/workers/worker-profiles.d.ts +43 -53
- package/dist/workers/worker-profiles.js +30 -38
- package/package.json +10 -8
|
@@ -1,27 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* test-assembly — deterministic detection of TEST-REBUILT PRODUCTION WIRING, feeding
|
|
3
|
-
* the verify gate's prompt
|
|
4
|
-
* runs 3, 4, 8).
|
|
3
|
+
* the verify gate's prompt. A recurring shape, not a one-off.
|
|
5
4
|
*
|
|
6
5
|
* The failure class: a test file re-constructs wiring that ALSO exists in production
|
|
7
6
|
* — it builds its own app assembly / its own entry point out of the same leaf modules
|
|
8
7
|
* the production entry composes, then tests THAT private copy. The copy can be wired
|
|
9
|
-
* differently from production and stay green while the shipped wiring is broken
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* runs 102/102 green — while the shipped upload path is dead because production mounts
|
|
13
|
-
* the same leaf at the wrong prefix. The verify child, judging "do the tests pass",
|
|
14
|
-
* saw green and counted the photos area verified. The seam the test was supposed to
|
|
15
|
-
* cover is exactly the seam it re-implemented away.
|
|
8
|
+
* differently from production and stay green while the shipped wiring is broken: the
|
|
9
|
+
* test mounts the same leaf at one prefix, production mounts it at another, and the
|
|
10
|
+
* seam the test was supposed to cover is the seam it re-implemented away.
|
|
16
11
|
*
|
|
17
12
|
* This is the VERIFY-SIDE complement of the generation-side wiring probe
|
|
18
|
-
* (wiring-claims.ts
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* bypass the real ASSEMBLY, which rule 3b's "did it import and call the module" check
|
|
24
|
-
* does not catch. This probe supplies the missing concrete fact.
|
|
13
|
+
* (wiring-claims.ts). Rule 3b already tells the child to spot-check that
|
|
14
|
+
* self-authored tests exercise the real artifact, but this shape slips past it:
|
|
15
|
+
* these tests DO import the real leaf modules — they just bypass the real ASSEMBLY,
|
|
16
|
+
* which "did it import and call the module" does not catch. This probe supplies the
|
|
17
|
+
* missing concrete fact.
|
|
25
18
|
*
|
|
26
19
|
* THE SIGNAL is pure import-graph SHAPE, zero stack/framework assumptions (no "app",
|
|
27
20
|
* no "route", no "mount", no language runtime): a test file T is flagged when there is
|
|
@@ -34,10 +27,10 @@
|
|
|
34
27
|
* shared-utility imports out: a test importing an api client + a schema module that
|
|
35
28
|
* every page also imports is NOT re-assembly (those utilities have many production
|
|
36
29
|
* importers); a test importing two route modules that only the server entry composes
|
|
37
|
-
* IS re-assembly.
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
30
|
+
* IS re-assembly. What that leaves clean, by construction: a test importing ONE
|
|
31
|
+
* leaf, a test importing utilities several production files also import, a test that
|
|
32
|
+
* imports the assembly itself, and a source-grepping test whose "imports" are quoted
|
|
33
|
+
* strings inside assertions.
|
|
41
34
|
*
|
|
42
35
|
* Findings are ADVISORY (probe+rule): they mandate the child to exercise the REAL
|
|
43
36
|
* shipped assembly directly before counting the area verified; they never auto-FAIL.
|
|
@@ -1,27 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* test-assembly — deterministic detection of TEST-REBUILT PRODUCTION WIRING, feeding
|
|
3
|
-
* the verify gate's prompt
|
|
4
|
-
* runs 3, 4, 8).
|
|
3
|
+
* the verify gate's prompt. A recurring shape, not a one-off.
|
|
5
4
|
*
|
|
6
5
|
* The failure class: a test file re-constructs wiring that ALSO exists in production
|
|
7
6
|
* — it builds its own app assembly / its own entry point out of the same leaf modules
|
|
8
7
|
* the production entry composes, then tests THAT private copy. The copy can be wired
|
|
9
|
-
* differently from production and stay green while the shipped wiring is broken
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* runs 102/102 green — while the shipped upload path is dead because production mounts
|
|
13
|
-
* the same leaf at the wrong prefix. The verify child, judging "do the tests pass",
|
|
14
|
-
* saw green and counted the photos area verified. The seam the test was supposed to
|
|
15
|
-
* cover is exactly the seam it re-implemented away.
|
|
8
|
+
* differently from production and stay green while the shipped wiring is broken: the
|
|
9
|
+
* test mounts the same leaf at one prefix, production mounts it at another, and the
|
|
10
|
+
* seam the test was supposed to cover is the seam it re-implemented away.
|
|
16
11
|
*
|
|
17
12
|
* This is the VERIFY-SIDE complement of the generation-side wiring probe
|
|
18
|
-
* (wiring-claims.ts
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* bypass the real ASSEMBLY, which rule 3b's "did it import and call the module" check
|
|
24
|
-
* does not catch. This probe supplies the missing concrete fact.
|
|
13
|
+
* (wiring-claims.ts). Rule 3b already tells the child to spot-check that
|
|
14
|
+
* self-authored tests exercise the real artifact, but this shape slips past it:
|
|
15
|
+
* these tests DO import the real leaf modules — they just bypass the real ASSEMBLY,
|
|
16
|
+
* which "did it import and call the module" does not catch. This probe supplies the
|
|
17
|
+
* missing concrete fact.
|
|
25
18
|
*
|
|
26
19
|
* THE SIGNAL is pure import-graph SHAPE, zero stack/framework assumptions (no "app",
|
|
27
20
|
* no "route", no "mount", no language runtime): a test file T is flagged when there is
|
|
@@ -34,10 +27,10 @@
|
|
|
34
27
|
* shared-utility imports out: a test importing an api client + a schema module that
|
|
35
28
|
* every page also imports is NOT re-assembly (those utilities have many production
|
|
36
29
|
* importers); a test importing two route modules that only the server entry composes
|
|
37
|
-
* IS re-assembly.
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
30
|
+
* IS re-assembly. What that leaves clean, by construction: a test importing ONE
|
|
31
|
+
* leaf, a test importing utilities several production files also import, a test that
|
|
32
|
+
* imports the assembly itself, and a source-grepping test whose "imports" are quoted
|
|
33
|
+
* strings inside assertions.
|
|
41
34
|
*
|
|
42
35
|
* Findings are ADVISORY (probe+rule): they mandate the child to exercise the REAL
|
|
43
36
|
* shipped assembly directly before counting the area verified; they never auto-FAIL.
|
package/dist/task/timings.d.ts
CHANGED
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
* Phase timing data — captures how long each pipeline phase took so we can
|
|
3
3
|
* spot regressions and target future speed improvements.
|
|
4
4
|
*
|
|
5
|
-
* Top-level entries are the five phases (refine, research, grill,
|
|
6
|
-
* critique). Each phase may attach optional sub-step children
|
|
7
|
-
*
|
|
5
|
+
* Top-level entries are the five phases of PHASE_ORDER (refine, research, grill,
|
|
6
|
+
* compose, critique). Each phase may attach optional sub-step children, recorded
|
|
7
|
+
* through `deps.recordSubStep`: research reports `workers` and `verify-tooling`,
|
|
8
|
+
* grill `gen` and `auto-answer`, critique `triage` and `rewrite`, and every phase
|
|
9
|
+
* child reports its own `<name> wait` / `<name> work` split.
|
|
8
10
|
*
|
|
9
11
|
* `formatTimings` produces the human-readable block we write to the
|
|
10
12
|
* `## phase timings` section of the TASK_NNNN.md file.
|
package/dist/task/timings.js
CHANGED
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
* Phase timing data — captures how long each pipeline phase took so we can
|
|
3
3
|
* spot regressions and target future speed improvements.
|
|
4
4
|
*
|
|
5
|
-
* Top-level entries are the five phases (refine, research, grill,
|
|
6
|
-
* critique). Each phase may attach optional sub-step children
|
|
7
|
-
*
|
|
5
|
+
* Top-level entries are the five phases of PHASE_ORDER (refine, research, grill,
|
|
6
|
+
* compose, critique). Each phase may attach optional sub-step children, recorded
|
|
7
|
+
* through `deps.recordSubStep`: research reports `workers` and `verify-tooling`,
|
|
8
|
+
* grill `gen` and `auto-answer`, critique `triage` and `rewrite`, and every phase
|
|
9
|
+
* child reports its own `<name> wait` / `<name> work` split.
|
|
8
10
|
*
|
|
9
11
|
* `formatTimings` produces the human-readable block we write to the
|
|
10
12
|
* `## phase timings` section of the TASK_NNNN.md file.
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Display-label compression.
|
|
3
3
|
*
|
|
4
4
|
* A refined GOAL paragraph becomes the stored `title`, which the pipeline reads
|
|
5
|
-
* in full — but
|
|
6
|
-
*
|
|
5
|
+
* in full — but a paragraph-long title makes the widget head and `/task list`
|
|
6
|
+
* unreadable. `compressTitle` spawns a tool-less local-model child
|
|
7
7
|
* to distill that title into a short, identifying label that we store ALONGSIDE
|
|
8
8
|
* (never replacing) the full title, purely for display. Every failure mode —
|
|
9
9
|
* model error, empty output, leaked tool call, abort, an over-long answer —
|
|
@@ -13,8 +13,13 @@
|
|
|
13
13
|
import type { PhaseDeps } from './child-runner.js';
|
|
14
14
|
/**
|
|
15
15
|
* Reduce a raw model completion to a single clean label line: first non-empty
|
|
16
|
-
* line,
|
|
17
|
-
* whitespace collapsed. Returns '' when nothing usable remains.
|
|
16
|
+
* line, a leading "label:" echo removed, then quotes/backticks stripped from the
|
|
17
|
+
* ends, then whitespace collapsed. Returns '' when nothing usable remains.
|
|
18
|
+
*
|
|
19
|
+
* The quote strip runs BEFORE the collapse, so it anchors on the raw line: a quote
|
|
20
|
+
* sitting next to leading or trailing whitespace survives (`"X" ` → `X"`). That
|
|
21
|
+
* only ever leaves one stray character in the label, and the label is display-only
|
|
22
|
+
* — `title` is what the pipeline reads.
|
|
18
23
|
*/
|
|
19
24
|
export declare function sanitizeLabel(raw: string): string;
|
|
20
25
|
/**
|
package/dist/task/title-label.js
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Display-label compression.
|
|
3
3
|
*
|
|
4
4
|
* A refined GOAL paragraph becomes the stored `title`, which the pipeline reads
|
|
5
|
-
* in full — but
|
|
6
|
-
*
|
|
5
|
+
* in full — but a paragraph-long title makes the widget head and `/task list`
|
|
6
|
+
* unreadable. `compressTitle` spawns a tool-less local-model child
|
|
7
7
|
* to distill that title into a short, identifying label that we store ALONGSIDE
|
|
8
8
|
* (never replacing) the full title, purely for display. Every failure mode —
|
|
9
9
|
* model error, empty output, leaked tool call, abort, an over-long answer —
|
|
@@ -15,8 +15,13 @@ import { LABEL_MAX, truncateLabel } from './parsers.js';
|
|
|
15
15
|
import { COMPRESS_LABEL_PROMPT } from './prompts.js';
|
|
16
16
|
/**
|
|
17
17
|
* Reduce a raw model completion to a single clean label line: first non-empty
|
|
18
|
-
* line,
|
|
19
|
-
* whitespace collapsed. Returns '' when nothing usable remains.
|
|
18
|
+
* line, a leading "label:" echo removed, then quotes/backticks stripped from the
|
|
19
|
+
* ends, then whitespace collapsed. Returns '' when nothing usable remains.
|
|
20
|
+
*
|
|
21
|
+
* The quote strip runs BEFORE the collapse, so it anchors on the raw line: a quote
|
|
22
|
+
* sitting next to leading or trailing whitespace survives (`"X" ` → `X"`). That
|
|
23
|
+
* only ever leaves one stray character in the label, and the label is display-only
|
|
24
|
+
* — `title` is what the pipeline reads.
|
|
20
25
|
*/
|
|
21
26
|
export function sanitizeLabel(raw) {
|
|
22
27
|
const firstLine = raw.split('\n').find(l => l.trim().length > 0) ?? '';
|
|
@@ -1,62 +1,54 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Deterministic detector for
|
|
3
|
-
*
|
|
2
|
+
* Deterministic detector for a pi-worker-docs answer that RESTATES a type signature
|
|
3
|
+
* or declaration for a USAGE question, without ever saying what the API DOES.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* The shape, in one example. Asked "hc factory function signature base url parameter
|
|
6
|
+
* types", a docs child answers that `hc` "accepts a generic type `T` extending
|
|
7
|
+
* `Hono`… and takes two parameters: `baseUrl` of type `Prefix`". Every clause is
|
|
8
|
+
* type-level: it names the parameter's TYPE, and `Prefix` is itself an opaque type
|
|
9
|
+
* variable, while saying nothing about what `baseUrl` MEANS — is it an origin, or a
|
|
10
|
+
* mount prefix? Escalation to search/fetch never fires, because the answer looks
|
|
11
|
+
* complete: it named the very parameter that was asked about. The caller then fills
|
|
12
|
+
* the semantic gap from memory, and a wrong guess about that one word can kill every
|
|
13
|
+
* request the client makes.
|
|
6
14
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* `options` of type `ClientRequestOptions`. It returns a
|
|
12
|
-
* `UnionToIntersection<Client<T, Prefix>>`."
|
|
15
|
+
* The lever: when a docs answer for a usage question is ONLY a signature restatement
|
|
16
|
+
* with no behavioural statement, treat it as UNANSWERED so the caller escalates
|
|
17
|
+
* (follow the `@see` pointer, fetch the spec-cited URL) instead of accepting a type
|
|
18
|
+
* as the answer.
|
|
13
19
|
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* The lever (PROMPT 2 DO item 1): when a docs answer for a usage question is ONLY a
|
|
22
|
-
* signature/declaration restatement with no behavioural statement, treat it as UNANSWERED so
|
|
23
|
-
* the caller escalates (follow the `@see` pointer / fetch the spec-cited URL) instead of
|
|
24
|
-
* accepting a type as the answer.
|
|
25
|
-
*
|
|
26
|
-
* ── PRECISION/RECALL TRADEOFF (chosen deliberately; documented per the task) ────────────────
|
|
27
|
-
* A FALSE POSITIVE here (flagging a real answer as type-only) forces a needless escalation:
|
|
28
|
-
* wall-clock cost against PROMPT 2 invariant 1, which caps added child spawns. A false
|
|
29
|
-
* NEGATIVE (missing a type-only answer) merely leaves the pre-existing bug unfixed for that
|
|
30
|
-
* one borderline case. So this detector is tuned for HIGH PRECISION on real answers, accepting
|
|
31
|
-
* low recall — "better to miss a borderline type-only answer than to flag a real one." Three
|
|
32
|
-
* independent gates must ALL hold before an answer is called type-only; any one failing clears
|
|
33
|
-
* it. Calibrated against the run-15 corpus: of the 149 valid (non-"unclear") pi-worker-docs
|
|
34
|
-
* answers, this rule flags EXACTLY ONE — the recorded `hc` case — and clears the other 148,
|
|
35
|
-
* including every legitimate signature answer to an explicit "give me the type/signature"
|
|
36
|
-
* question (bun.password.hash, toBuffer, BuildOutput, …). See type-only-answer.test.ts.
|
|
20
|
+
* ── PRECISION OVER RECALL, deliberately ─────────────────────────────────────────
|
|
21
|
+
* A FALSE POSITIVE (flagging a real answer as type-only) forces a needless
|
|
22
|
+
* escalation and costs a child spawn. A false NEGATIVE merely leaves one borderline
|
|
23
|
+
* answer un-escalated. So three independent gates must ALL hold before an answer is
|
|
24
|
+
* called type-only, and any one failing clears it. That is what keeps a legitimate
|
|
25
|
+
* signature answer to an explicit "give me the type" question out.
|
|
37
26
|
*
|
|
38
27
|
* THE THREE GATES (all required):
|
|
39
|
-
* 1. USAGE QUESTION. The question must seek usage/semantics — "how", "use",
|
|
40
|
-
* "example", "call", "rpc", "mean"
|
|
41
|
-
* sought ("base url"). A question
|
|
42
|
-
*
|
|
43
|
-
* query is signature-shaped but names "base
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
28
|
+
* 1. USAGE QUESTION. The question must seek usage/semantics — "how", "use",
|
|
29
|
+
* "work", "chain", "example", "call", "rpc", "mean" — or name a usage concept
|
|
30
|
+
* whose meaning is being sought ("base url"). A question asking only for a
|
|
31
|
+
* TYPE / SIGNATURE / DEFINITION is legitimately answered by a signature, so it
|
|
32
|
+
* is NOT gated in. (The `hc` query above is signature-shaped but names "base
|
|
33
|
+
* url", the concept whose meaning was needed.)
|
|
34
|
+
* 2. NO BEHAVIOURAL CONTENT IN PROSE. The answer must contain no statement of what
|
|
35
|
+
* the API DOES: no usage verb ("use/call/pass/import"), no runtime-effect verb
|
|
36
|
+
* ("executes/prepends/enables/wraps"), no concrete example, no semantic meaning
|
|
37
|
+
* ("means/represents/so pass"), no concrete default VALUE or range ("default of
|
|
38
|
+
* 80", "from 1 to 100"). Any one clears. This scan runs over `proseOf(answer)`,
|
|
39
|
+
* NOT the raw answer: a verb that is really a method name inside a declaration
|
|
40
|
+
* ("methods route(url, handler) and use(...handlers)") is an identifier, not
|
|
41
|
+
* behaviour, and must not clear the answer.
|
|
42
|
+
* 3. SIGNATURE RESTATEMENT. The answer must actually be a declaration restatement —
|
|
43
|
+
* "of type", "takes N parameters", "accepts", "returns a…", "extends",
|
|
44
|
+
* "interface", "declare const/function". Without this it is not type-only, it
|
|
45
|
+
* is just terse prose.
|
|
54
46
|
*
|
|
55
|
-
* An explicit "unclear from this package/page" is NOT type-only — it is the HONEST
|
|
56
|
-
*
|
|
57
|
-
*
|
|
47
|
+
* An explicit "unclear from this package/page" is NOT type-only — it is the HONEST
|
|
48
|
+
* non-answer, and it is cleared here with a distinct reason so the caller routes it
|
|
49
|
+
* through the existing unclear channel instead.
|
|
58
50
|
*
|
|
59
|
-
* Pure and side-effect free; unit-tested in type-only-answer.test.ts against real
|
|
51
|
+
* Pure and side-effect free; unit-tested in type-only-answer.test.ts against real text.
|
|
60
52
|
*/
|
|
61
53
|
/** The verdict, with a human-readable reason for logging and for the escalation channel. */
|
|
62
54
|
export interface TypeOnlyVerdict {
|
|
@@ -73,7 +65,7 @@ export interface TypeOnlyVerdict {
|
|
|
73
65
|
* declaration. Without this, a bare type-only answer like
|
|
74
66
|
* "It has methods route(url, handler) and use(...handlers)."
|
|
75
67
|
* is wrongly cleared, because `use(...handlers)` matches /\buse\b/ and `handler` matches
|
|
76
|
-
* /handle
|
|
68
|
+
* /handle/. So before scanning for behaviour we remove:
|
|
77
69
|
* - `name(args)` call fragments, whose args are identifiers, not prose (this is what
|
|
78
70
|
* carries the method-name verbs);
|
|
79
71
|
* - `declare const|function|module|class|namespace …` declaration lines.
|
|
@@ -1,62 +1,54 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Deterministic detector for
|
|
3
|
-
*
|
|
2
|
+
* Deterministic detector for a pi-worker-docs answer that RESTATES a type signature
|
|
3
|
+
* or declaration for a USAGE question, without ever saying what the API DOES.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* The shape, in one example. Asked "hc factory function signature base url parameter
|
|
6
|
+
* types", a docs child answers that `hc` "accepts a generic type `T` extending
|
|
7
|
+
* `Hono`… and takes two parameters: `baseUrl` of type `Prefix`". Every clause is
|
|
8
|
+
* type-level: it names the parameter's TYPE, and `Prefix` is itself an opaque type
|
|
9
|
+
* variable, while saying nothing about what `baseUrl` MEANS — is it an origin, or a
|
|
10
|
+
* mount prefix? Escalation to search/fetch never fires, because the answer looks
|
|
11
|
+
* complete: it named the very parameter that was asked about. The caller then fills
|
|
12
|
+
* the semantic gap from memory, and a wrong guess about that one word can kill every
|
|
13
|
+
* request the client makes.
|
|
6
14
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* `options` of type `ClientRequestOptions`. It returns a
|
|
12
|
-
* `UnionToIntersection<Client<T, Prefix>>`."
|
|
15
|
+
* The lever: when a docs answer for a usage question is ONLY a signature restatement
|
|
16
|
+
* with no behavioural statement, treat it as UNANSWERED so the caller escalates
|
|
17
|
+
* (follow the `@see` pointer, fetch the spec-cited URL) instead of accepting a type
|
|
18
|
+
* as the answer.
|
|
13
19
|
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* The lever (PROMPT 2 DO item 1): when a docs answer for a usage question is ONLY a
|
|
22
|
-
* signature/declaration restatement with no behavioural statement, treat it as UNANSWERED so
|
|
23
|
-
* the caller escalates (follow the `@see` pointer / fetch the spec-cited URL) instead of
|
|
24
|
-
* accepting a type as the answer.
|
|
25
|
-
*
|
|
26
|
-
* ── PRECISION/RECALL TRADEOFF (chosen deliberately; documented per the task) ────────────────
|
|
27
|
-
* A FALSE POSITIVE here (flagging a real answer as type-only) forces a needless escalation:
|
|
28
|
-
* wall-clock cost against PROMPT 2 invariant 1, which caps added child spawns. A false
|
|
29
|
-
* NEGATIVE (missing a type-only answer) merely leaves the pre-existing bug unfixed for that
|
|
30
|
-
* one borderline case. So this detector is tuned for HIGH PRECISION on real answers, accepting
|
|
31
|
-
* low recall — "better to miss a borderline type-only answer than to flag a real one." Three
|
|
32
|
-
* independent gates must ALL hold before an answer is called type-only; any one failing clears
|
|
33
|
-
* it. Calibrated against the run-15 corpus: of the 149 valid (non-"unclear") pi-worker-docs
|
|
34
|
-
* answers, this rule flags EXACTLY ONE — the recorded `hc` case — and clears the other 148,
|
|
35
|
-
* including every legitimate signature answer to an explicit "give me the type/signature"
|
|
36
|
-
* question (bun.password.hash, toBuffer, BuildOutput, …). See type-only-answer.test.ts.
|
|
20
|
+
* ── PRECISION OVER RECALL, deliberately ─────────────────────────────────────────
|
|
21
|
+
* A FALSE POSITIVE (flagging a real answer as type-only) forces a needless
|
|
22
|
+
* escalation and costs a child spawn. A false NEGATIVE merely leaves one borderline
|
|
23
|
+
* answer un-escalated. So three independent gates must ALL hold before an answer is
|
|
24
|
+
* called type-only, and any one failing clears it. That is what keeps a legitimate
|
|
25
|
+
* signature answer to an explicit "give me the type" question out.
|
|
37
26
|
*
|
|
38
27
|
* THE THREE GATES (all required):
|
|
39
|
-
* 1. USAGE QUESTION. The question must seek usage/semantics — "how", "use",
|
|
40
|
-
* "example", "call", "rpc", "mean"
|
|
41
|
-
* sought ("base url"). A question
|
|
42
|
-
*
|
|
43
|
-
* query is signature-shaped but names "base
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
28
|
+
* 1. USAGE QUESTION. The question must seek usage/semantics — "how", "use",
|
|
29
|
+
* "work", "chain", "example", "call", "rpc", "mean" — or name a usage concept
|
|
30
|
+
* whose meaning is being sought ("base url"). A question asking only for a
|
|
31
|
+
* TYPE / SIGNATURE / DEFINITION is legitimately answered by a signature, so it
|
|
32
|
+
* is NOT gated in. (The `hc` query above is signature-shaped but names "base
|
|
33
|
+
* url", the concept whose meaning was needed.)
|
|
34
|
+
* 2. NO BEHAVIOURAL CONTENT IN PROSE. The answer must contain no statement of what
|
|
35
|
+
* the API DOES: no usage verb ("use/call/pass/import"), no runtime-effect verb
|
|
36
|
+
* ("executes/prepends/enables/wraps"), no concrete example, no semantic meaning
|
|
37
|
+
* ("means/represents/so pass"), no concrete default VALUE or range ("default of
|
|
38
|
+
* 80", "from 1 to 100"). Any one clears. This scan runs over `proseOf(answer)`,
|
|
39
|
+
* NOT the raw answer: a verb that is really a method name inside a declaration
|
|
40
|
+
* ("methods route(url, handler) and use(...handlers)") is an identifier, not
|
|
41
|
+
* behaviour, and must not clear the answer.
|
|
42
|
+
* 3. SIGNATURE RESTATEMENT. The answer must actually be a declaration restatement —
|
|
43
|
+
* "of type", "takes N parameters", "accepts", "returns a…", "extends",
|
|
44
|
+
* "interface", "declare const/function". Without this it is not type-only, it
|
|
45
|
+
* is just terse prose.
|
|
54
46
|
*
|
|
55
|
-
* An explicit "unclear from this package/page" is NOT type-only — it is the HONEST
|
|
56
|
-
*
|
|
57
|
-
*
|
|
47
|
+
* An explicit "unclear from this package/page" is NOT type-only — it is the HONEST
|
|
48
|
+
* non-answer, and it is cleared here with a distinct reason so the caller routes it
|
|
49
|
+
* through the existing unclear channel instead.
|
|
58
50
|
*
|
|
59
|
-
* Pure and side-effect free; unit-tested in type-only-answer.test.ts against real
|
|
51
|
+
* Pure and side-effect free; unit-tested in type-only-answer.test.ts against real text.
|
|
60
52
|
*/
|
|
61
53
|
import { isAbstention } from '../workers/abstention.js';
|
|
62
54
|
/**
|
|
@@ -181,7 +173,7 @@ function firstMatch(text, patterns) {
|
|
|
181
173
|
* declaration. Without this, a bare type-only answer like
|
|
182
174
|
* "It has methods route(url, handler) and use(...handlers)."
|
|
183
175
|
* is wrongly cleared, because `use(...handlers)` matches /\buse\b/ and `handler` matches
|
|
184
|
-
* /handle
|
|
176
|
+
* /handle/. So before scanning for behaviour we remove:
|
|
185
177
|
* - `name(args)` call fragments, whose args are identifiers, not prose (this is what
|
|
186
178
|
* carries the method-name verbs);
|
|
187
179
|
* - `declare const|function|module|class|namespace …` declaration lines.
|
|
@@ -1,40 +1,34 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* unfailable-command — is this shell command's exit status DESTROYED by its own
|
|
3
|
-
* construction?
|
|
3
|
+
* construction?
|
|
4
4
|
*
|
|
5
5
|
* WHY THIS EXISTS. `recheckAcceptDebts` may auto-close an accepted debt on exactly
|
|
6
6
|
* one piece of evidence: the debt named a VERIFY command, that command was re-run,
|
|
7
|
-
* and it exited ZERO (accept-debt.ts
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* anything. Sixteen stored-eligible VERIFY lines in the corpus on this box cannot
|
|
11
|
-
* exit non-zero no matter what the tree contains:
|
|
7
|
+
* and it exited ZERO (accept-debt.ts). Filtering the stored command on length and
|
|
8
|
+
* control characters alone never asks whether a ZERO exit could mean anything. Three
|
|
9
|
+
* shapes make it meaningless:
|
|
12
10
|
*
|
|
13
|
-
* C `test -f "$SO_LIB" && echo "PASS: …" || echo "FAIL: …"`
|
|
14
|
-
*
|
|
15
|
-
* A `bun -e "console.assert(…)"`
|
|
16
|
-
*
|
|
17
|
-
* B `npx tsc --noEmit 2>&1 | tail -5; test $? -eq 0 && …`
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* IAR1 (CMake / C++ / OBS plugin — no database, no frontend, no HTTP server)
|
|
21
|
-
* carries 11 of the 16; one of its tasks is SEVEN consecutive `test -f … && echo
|
|
22
|
-
* "PASS" || echo "FAIL"` lines standing in for a build verification.
|
|
11
|
+
* C `test -f "$SO_LIB" && echo "PASS: …" || echo "FAIL: …"` ← both branches
|
|
12
|
+
* that can run LAST are echoes, so the status is echo's: 0.
|
|
13
|
+
* A `bun -e "console.assert(…)"` ← `console.assert` prints and continues; the
|
|
14
|
+
* process still exits 0, in bun and in node alike.
|
|
15
|
+
* B `npx tsc --noEmit 2>&1 | tail -5; test $? -eq 0 && …` ← `$?` is tail's
|
|
16
|
+
* status, not tsc's.
|
|
23
17
|
*
|
|
24
18
|
* THE VERDICT IS A REFUSAL, NOT A CLAIM. An unfailable command is not stored, so
|
|
25
19
|
* the debt stays OPEN and surfaced — the strictly smaller claim. Nothing here can
|
|
26
20
|
* close a debt, fail a gate, or edit a spec.
|
|
27
21
|
*
|
|
28
22
|
* DECIDED ON SHELL SHAPE, NEVER ON THE VERB. `grep -q …` and `ctest …` set a real
|
|
29
|
-
* status and are untouched; `test -f X || { echo …; exit 1; }` exits non-zero and
|
|
30
|
-
*
|
|
31
|
-
*
|
|
23
|
+
* status and are untouched; `test -f X || { echo …; exit 1; }` exits non-zero and is
|
|
24
|
+
* untouched. A rule keyed on command NAMES would have to know every checker that
|
|
25
|
+
* exists, and would still miss the shape — the same mistake command-shrink's guard
|
|
26
|
+
* made by comparing names.
|
|
32
27
|
*
|
|
33
|
-
* OUT OF SCOPE BY DESIGN: bare `|| true`. skip-escape.ts
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
* keep doing so.
|
|
28
|
+
* OUT OF SCOPE BY DESIGN: bare `|| true`. As skip-escape.ts explains, most `||`
|
|
29
|
+
* uses are teardown, setup or a negative test rather than an escape, so a blanket
|
|
30
|
+
* rule would be almost all false positives. `rm -rf build || true` classifies
|
|
31
|
+
* CAN-FAIL here and must keep doing so.
|
|
38
32
|
*
|
|
39
33
|
* THREE OUTCOMES, and `unknown` is a first-class answer: a shape this cannot
|
|
40
34
|
* decide is never guessed at, it is left alone (which is today's behaviour).
|
|
@@ -1,40 +1,34 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* unfailable-command — is this shell command's exit status DESTROYED by its own
|
|
3
|
-
* construction?
|
|
3
|
+
* construction?
|
|
4
4
|
*
|
|
5
5
|
* WHY THIS EXISTS. `recheckAcceptDebts` may auto-close an accepted debt on exactly
|
|
6
6
|
* one piece of evidence: the debt named a VERIFY command, that command was re-run,
|
|
7
|
-
* and it exited ZERO (accept-debt.ts
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* anything. Sixteen stored-eligible VERIFY lines in the corpus on this box cannot
|
|
11
|
-
* exit non-zero no matter what the tree contains:
|
|
7
|
+
* and it exited ZERO (accept-debt.ts). Filtering the stored command on length and
|
|
8
|
+
* control characters alone never asks whether a ZERO exit could mean anything. Three
|
|
9
|
+
* shapes make it meaningless:
|
|
12
10
|
*
|
|
13
|
-
* C `test -f "$SO_LIB" && echo "PASS: …" || echo "FAIL: …"`
|
|
14
|
-
*
|
|
15
|
-
* A `bun -e "console.assert(…)"`
|
|
16
|
-
*
|
|
17
|
-
* B `npx tsc --noEmit 2>&1 | tail -5; test $? -eq 0 && …`
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* IAR1 (CMake / C++ / OBS plugin — no database, no frontend, no HTTP server)
|
|
21
|
-
* carries 11 of the 16; one of its tasks is SEVEN consecutive `test -f … && echo
|
|
22
|
-
* "PASS" || echo "FAIL"` lines standing in for a build verification.
|
|
11
|
+
* C `test -f "$SO_LIB" && echo "PASS: …" || echo "FAIL: …"` ← both branches
|
|
12
|
+
* that can run LAST are echoes, so the status is echo's: 0.
|
|
13
|
+
* A `bun -e "console.assert(…)"` ← `console.assert` prints and continues; the
|
|
14
|
+
* process still exits 0, in bun and in node alike.
|
|
15
|
+
* B `npx tsc --noEmit 2>&1 | tail -5; test $? -eq 0 && …` ← `$?` is tail's
|
|
16
|
+
* status, not tsc's.
|
|
23
17
|
*
|
|
24
18
|
* THE VERDICT IS A REFUSAL, NOT A CLAIM. An unfailable command is not stored, so
|
|
25
19
|
* the debt stays OPEN and surfaced — the strictly smaller claim. Nothing here can
|
|
26
20
|
* close a debt, fail a gate, or edit a spec.
|
|
27
21
|
*
|
|
28
22
|
* DECIDED ON SHELL SHAPE, NEVER ON THE VERB. `grep -q …` and `ctest …` set a real
|
|
29
|
-
* status and are untouched; `test -f X || { echo …; exit 1; }` exits non-zero and
|
|
30
|
-
*
|
|
31
|
-
*
|
|
23
|
+
* status and are untouched; `test -f X || { echo …; exit 1; }` exits non-zero and is
|
|
24
|
+
* untouched. A rule keyed on command NAMES would have to know every checker that
|
|
25
|
+
* exists, and would still miss the shape — the same mistake command-shrink's guard
|
|
26
|
+
* made by comparing names.
|
|
32
27
|
*
|
|
33
|
-
* OUT OF SCOPE BY DESIGN: bare `|| true`. skip-escape.ts
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
* keep doing so.
|
|
28
|
+
* OUT OF SCOPE BY DESIGN: bare `|| true`. As skip-escape.ts explains, most `||`
|
|
29
|
+
* uses are teardown, setup or a negative test rather than an escape, so a blanket
|
|
30
|
+
* rule would be almost all false positives. `rm -rf build || true` classifies
|
|
31
|
+
* CAN-FAIL here and must keep doing so.
|
|
38
32
|
*
|
|
39
33
|
* THREE OUTCOMES, and `unknown` is a first-class answer: a shape this cannot
|
|
40
34
|
* decide is never guessed at, it is left alone (which is today's behaviour).
|
|
@@ -125,8 +119,8 @@ function hasPipeline(seg) {
|
|
|
125
119
|
* EVERY remaining operator: `&&` skips what follows when the status is non-zero,
|
|
126
120
|
* `||` skips it when the status is zero. A chain that mixes the two after `c_i`
|
|
127
121
|
* therefore always runs on past it. For `A && B || C`: A is never terminal (the
|
|
128
|
-
* `||` picks C up after A fails), B is terminal when it succeeds, C is
|
|
129
|
-
* so the status is always an echo's
|
|
122
|
+
* `||` picks C up after A fails), B is terminal when it succeeds, and C is
|
|
123
|
+
* terminal — so if B and C are both echoes the status is always an echo's.
|
|
130
124
|
*/
|
|
131
125
|
function terminalIndices(ops, n) {
|
|
132
126
|
const out = [];
|
|
@@ -167,7 +161,7 @@ function isPureEcho(cmd) {
|
|
|
167
161
|
return !splitTopLevel(cmd, ['>>', '>']).ops.length;
|
|
168
162
|
}
|
|
169
163
|
/**
|
|
170
|
-
* RULE A — a `console.assert` check.
|
|
164
|
+
* RULE A — a `console.assert` check. Run it yourself in either runtime:
|
|
171
165
|
*
|
|
172
166
|
* $ bun -e "console.assert(1===2,'X'); console.log('end')"; echo $? → 0
|
|
173
167
|
* $ node -e "console.assert(1===2,'X'); console.log('end')"; echo $? → 0
|