@thomasminh1995/depverdict 0.6.0-alpha.1

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.
Files changed (252) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +518 -0
  3. package/bin/depverdict.js +7 -0
  4. package/bin/upgradelens.js +7 -0
  5. package/docs/GR-01-Semantic-Grounding-Failure-Analysis.md +309 -0
  6. package/docs/GR-02-Versioned-Action-Evaluation-Criteria.md +187 -0
  7. package/docs/GR-03-Extractive-Contract-Safety-Experiment.md +242 -0
  8. package/docs/GR-04-Versioned-Production-Extractive-Contract.md +154 -0
  9. package/docs/IA-01-Repository-Usage-Discovery.md +122 -0
  10. package/docs/IA-02-Repository-Impact-Analysis.md +118 -0
  11. package/docs/IA-03-Repository-Impact-Evidence.md +160 -0
  12. package/docs/IA-04-CLI-Orchestration.md +235 -0
  13. package/docs/IA-05-Real-Provider-Validation.md +235 -0
  14. package/docs/IA-05-VinGrade-Validation.md +339 -0
  15. package/docs/MVP-01.md +48 -0
  16. package/docs/MVP-02-Architecture.md +536 -0
  17. package/docs/MVP-02-CLI-HTTP-Runtime.md +50 -0
  18. package/docs/MVP-02-HTTP-Lifecycle.md +37 -0
  19. package/docs/MVP-02-Knowledge-Manifest-Generation.md +75 -0
  20. package/docs/MVP-02-Knowledge-Manifest.md +279 -0
  21. package/docs/MVP-02-Knowledge-Research-Orchestration.md +62 -0
  22. package/docs/MVP-02-Knowledge-Store.md +87 -0
  23. package/docs/MVP-02-PyPI-Registry-Adapter.md +97 -0
  24. package/docs/MVP-02-Research-Planning.md +196 -0
  25. package/docs/MVP-02-Source-Provenance.md +81 -0
  26. package/docs/MVP-02-npm-Registry-Adapter.md +99 -0
  27. package/docs/RR-01-End-to-End-and-Real-Provider-Validation.md +393 -0
  28. package/docs/RR-01-RERUN-Extractive-Contract-Validation.md +566 -0
  29. package/docs/RR-02-Full-Product-Workflow-and-Developer-CLI-UX-Review.md +35 -0
  30. package/docs/RR02-FIX-01-Persistent-Qualification-Resolution.md +32 -0
  31. package/docs/RR02-FIX-02-Stage-aware-CLI-Progress-and-Heartbeat.md +28 -0
  32. package/docs/RR02-FIX-03-npm-Capture-Evidence-Exclusion.md +33 -0
  33. package/docs/RR02-FIX-03A-Complete-Package-Exclusion-and-Evidence-Commit.md +223 -0
  34. package/docs/RR02-FIX-04-Event-loop-safe-Heartbeat.md +393 -0
  35. package/docs/RR02-FIX-05-Materialize-Persisted-Qualification.md +207 -0
  36. package/docs/RR02-RERUN-CLI-Qualification-Progress-UX-and-Package-Validation.md +342 -0
  37. package/docs/VinGrade-MVP-02-Validation.md +480 -0
  38. package/docs/VinGrade-RC02-Live-Validation.md +273 -0
  39. package/docs/ai-capability-discovery.md +573 -0
  40. package/docs/ai-engineering-production-readiness.md +390 -0
  41. package/docs/ai-engineering-review.md +251 -0
  42. package/docs/ai-runtime-governance-discovery.md +754 -0
  43. package/docs/architecture-overview.md +78 -0
  44. package/docs/cli-progress.md +111 -0
  45. package/docs/decisions/diff-01-brand-distribution-identity.md +450 -0
  46. package/docs/decisions/diff-02-identity-compatibility-contract.md +274 -0
  47. package/docs/decisions/diff-03-repository-docs-community-migration.md +165 -0
  48. package/docs/decisions/diff-04-release-evidence-gap-acceptance.md +110 -0
  49. package/docs/discovery/mvp-05-ai-migration-planning-discovery.md +350 -0
  50. package/docs/gateway-runtime-discovery.md +614 -0
  51. package/docs/live-ai-validation.md +299 -0
  52. package/docs/migration-planning-qualification-resolution.md +99 -0
  53. package/docs/migrations/upgradelens-to-depverdict.md +97 -0
  54. package/docs/mp-r03-deterministic-upgrade-decision-architecture.md +135 -0
  55. package/docs/mp-r04-evidence-bounded-migration-handoff-architecture.md +116 -0
  56. package/docs/mp-r05-product-completion-and-decision-first-cli-architecture.md +162 -0
  57. package/docs/mvp-05-deterministic-context-runtime.md +127 -0
  58. package/docs/mvp-05-migration-checklist-contract.md +166 -0
  59. package/docs/mvp-05-migration-checklist-orchestration.md +105 -0
  60. package/docs/mvp-05-migration-evaluation-and-qualification.md +135 -0
  61. package/docs/mvp-05-provider-neutral-generator.md +79 -0
  62. package/docs/ollama-local-smoke-validation.md +156 -0
  63. package/docs/openai-compatible-runtime-discovery.md +789 -0
  64. package/docs/openrouter-one-dependency-validation.md +205 -0
  65. package/docs/oss-02-package-guard-hardening-architecture.md +131 -0
  66. package/docs/oss-04-public-ci-package-metadata-architecture.md +142 -0
  67. package/docs/package-content-policy.md +98 -0
  68. package/docs/releases/v0.5.0-technical-preview.md +114 -0
  69. package/docs/releases/v0.6.0-alpha.1-depverdict-preview.md +101 -0
  70. package/docs/reviews/diff-02-identity-contract-compatibility.md +413 -0
  71. package/docs/reviews/diff-03-repository-docs-community-migration.md +364 -0
  72. package/docs/reviews/diff-04-depverdict-distribution-identity-readiness-rereview.md +453 -0
  73. package/docs/reviews/diff-04-fix-post-rename-identity-release-remediation.md +310 -0
  74. package/docs/reviews/diff-05-final-preview-distribution-qualification.md +561 -0
  75. package/docs/reviews/mvp-05-final-product-value-workflow-rereview.md +471 -0
  76. package/docs/reviews/mvp-05-product-workflow-review.md +605 -0
  77. package/docs/reviews/oss-01-duplicate-artifact-investigation-cleanup.md +411 -0
  78. package/docs/reviews/oss-02-package-guard-hardening.md +303 -0
  79. package/docs/reviews/oss-03-community-scaffolding.md +378 -0
  80. package/docs/reviews/oss-04-public-ci-package-metadata.md +439 -0
  81. package/docs/reviews/oss-05-technical-preview-qualification.md +482 -0
  82. package/docs/reviews/upgradelens-vs-upgradedepdetective-source-comparison.md +355 -0
  83. package/docs/reviews/v0.5.0-pre-release-smoke.md +263 -0
  84. package/docs/reviews/v0.5.0-version-bump-release-verification.md +306 -0
  85. package/docs/runtime-contract-discovery.md +521 -0
  86. package/docs/structured-output-compatibility-report.md +100 -0
  87. package/docs/ts-fix-01-exact-duplicate-occurrence-target-selection-architecture.md +111 -0
  88. package/docs/version-analysis-architecture.md +827 -0
  89. package/eval/README.md +86 -0
  90. package/eval/datasets/generic/declared-constraint.json +59 -0
  91. package/eval/datasets/generic/evidence-conflict.json +73 -0
  92. package/eval/datasets/generic/major-breaking-release.json +66 -0
  93. package/eval/datasets/generic/missing-evidence.json +46 -0
  94. package/eval/datasets/generic/patch-release-low.json +59 -0
  95. package/eval/datasets/node/axios-patch-low.json +59 -0
  96. package/eval/datasets/node/react-major-breaking.json +66 -0
  97. package/eval/datasets/node/react-minor-compatibility.json +66 -0
  98. package/eval/datasets/python/fastapi-deprecation.json +66 -0
  99. package/eval/datasets/python/pydantic-major-breaking.json +66 -0
  100. package/eval/migration-planning/golden-dataset-v2.json +306 -0
  101. package/eval/migration-planning/golden-dataset.json +214 -0
  102. package/eval/schemas/expected-result.schema.json +88 -0
  103. package/eval/schemas/golden-case.schema.json +181 -0
  104. package/package.json +57 -0
  105. package/schemas/ai-scorecard.schema.json +132 -0
  106. package/schemas/benchmark-report.schema.json +189 -0
  107. package/schemas/benchmark.schema.json +55 -0
  108. package/schemas/capability-profile.schema.json +44 -0
  109. package/schemas/conformance-report.schema.json +150 -0
  110. package/schemas/deployment-profile.schema.json +64 -0
  111. package/schemas/evaluation-report.schema.json +158 -0
  112. package/schemas/knowledge-evidence-bundle.schema.json +150 -0
  113. package/schemas/knowledge-manifest.schema.json +548 -0
  114. package/schemas/metrics.schema.json +178 -0
  115. package/schemas/migration-checklist-extractive-candidate.schema.json +42 -0
  116. package/schemas/migration-checklist.schema.json +706 -0
  117. package/schemas/migration-evaluation-dataset-v2.schema.json +208 -0
  118. package/schemas/migration-evaluation-dataset.schema.json +204 -0
  119. package/schemas/migration-planning-qualification-record.schema.json +234 -0
  120. package/schemas/project-manifest.schema.json +308 -0
  121. package/schemas/qualification-record.schema.json +56 -0
  122. package/schemas/repository-impact-evidence.schema.json +232 -0
  123. package/schemas/repository-impact.schema.json +202 -0
  124. package/schemas/upgrade-decision.schema.json +273 -0
  125. package/schemas/usage-index.schema.json +179 -0
  126. package/schemas/version-analysis.schema.json +449 -0
  127. package/src/ai-runtime-debug.js +325 -0
  128. package/src/ai-runtime-error.js +42 -0
  129. package/src/ai-runtime.js +174 -0
  130. package/src/ai-scorecard.js +204 -0
  131. package/src/ai-version-analysis.js +484 -0
  132. package/src/artifact-root-compatibility.js +91 -0
  133. package/src/benchmark-report.js +111 -0
  134. package/src/benchmark-runner.js +191 -0
  135. package/src/canonical-json.js +69 -0
  136. package/src/cli.js +1299 -0
  137. package/src/conformance-report.js +158 -0
  138. package/src/conformance-runner.js +253 -0
  139. package/src/constants.js +73 -0
  140. package/src/cooperative-scheduler.js +79 -0
  141. package/src/dependencies.js +44 -0
  142. package/src/dependency-ai-context.js +625 -0
  143. package/src/detectors.js +253 -0
  144. package/src/discovery.js +234 -0
  145. package/src/ecosystem-version-adapter.js +294 -0
  146. package/src/environment-compatibility.js +77 -0
  147. package/src/evaluation-comparator.js +158 -0
  148. package/src/evaluation-report.js +76 -0
  149. package/src/evaluation-runner.js +248 -0
  150. package/src/evidence-source-adapter.js +472 -0
  151. package/src/files.js +89 -0
  152. package/src/governance-diagnostics.js +64 -0
  153. package/src/governance-loader.js +63 -0
  154. package/src/governance-metadata.js +346 -0
  155. package/src/governance-validator.js +360 -0
  156. package/src/http/bounded-fetch.js +278 -0
  157. package/src/http/cli-http-runtime.js +44 -0
  158. package/src/impact/input-loader.js +157 -0
  159. package/src/impact/matcher.js +40 -0
  160. package/src/impact/repository-impact.js +199 -0
  161. package/src/impact/runtime.js +24 -0
  162. package/src/impact/status.js +62 -0
  163. package/src/impact/writer.js +30 -0
  164. package/src/impact-evidence/input-loader.js +202 -0
  165. package/src/impact-evidence/repository-impact-evidence.js +234 -0
  166. package/src/impact-evidence/runtime.js +16 -0
  167. package/src/impact-evidence/writer.js +30 -0
  168. package/src/index.js +563 -0
  169. package/src/installed-version-baseline.js +196 -0
  170. package/src/knowledge-cache.js +324 -0
  171. package/src/knowledge-evidence-bundle.js +101 -0
  172. package/src/knowledge-evidence-producer.js +233 -0
  173. package/src/knowledge-manifest-builder.js +188 -0
  174. package/src/knowledge-manifest-writer.js +32 -0
  175. package/src/knowledge-manifest.js +255 -0
  176. package/src/knowledge-research.js +615 -0
  177. package/src/metrics-engine.js +205 -0
  178. package/src/migration-checklist/ai-candidate.js +320 -0
  179. package/src/migration-checklist/assembler.js +37 -0
  180. package/src/migration-checklist/context-runtime.js +828 -0
  181. package/src/migration-checklist/evaluation/action-criteria.js +244 -0
  182. package/src/migration-checklist/evaluation/comparator-v2.js +332 -0
  183. package/src/migration-checklist/evaluation/comparator.js +279 -0
  184. package/src/migration-checklist/evaluation/dataset-v2.js +227 -0
  185. package/src/migration-checklist/evaluation/dataset.js +336 -0
  186. package/src/migration-checklist/evaluation/extractive-fixtures-v2.js +148 -0
  187. package/src/migration-checklist/evaluation/metrics-v2.js +226 -0
  188. package/src/migration-checklist/evaluation/metrics.js +158 -0
  189. package/src/migration-checklist/evaluation/qualification-v2.js +321 -0
  190. package/src/migration-checklist/evaluation/qualification.js +239 -0
  191. package/src/migration-checklist/evaluation/runner-v2.js +294 -0
  192. package/src/migration-checklist/evaluation/runner.js +194 -0
  193. package/src/migration-checklist/evaluation/scorecard-v2.js +106 -0
  194. package/src/migration-checklist/evaluation/scorecard.js +86 -0
  195. package/src/migration-checklist/extractive-candidate.js +166 -0
  196. package/src/migration-checklist/extractive-prompt.js +62 -0
  197. package/src/migration-checklist/generator.js +702 -0
  198. package/src/migration-checklist/grounding-policy.js +117 -0
  199. package/src/migration-checklist/input-loader.js +613 -0
  200. package/src/migration-checklist/migration-checklist.js +635 -0
  201. package/src/migration-checklist/presentation.js +292 -0
  202. package/src/migration-checklist/progress.js +96 -0
  203. package/src/migration-checklist/prompt.js +83 -0
  204. package/src/migration-checklist/qualification-guard.js +462 -0
  205. package/src/migration-checklist/qualification-resolution.js +122 -0
  206. package/src/migration-checklist/qualification-store.js +225 -0
  207. package/src/migration-checklist/runtime.js +205 -0
  208. package/src/migration-checklist/verification.js +134 -0
  209. package/src/migration-checklist/writer.js +35 -0
  210. package/src/openai-compatible-provider.js +451 -0
  211. package/src/orchestration/failure-log.js +32 -0
  212. package/src/orchestration/pipeline.js +200 -0
  213. package/src/orchestration/progress-events.js +337 -0
  214. package/src/orchestration/progress-reporter.js +131 -0
  215. package/src/orchestration/text-writer.js +22 -0
  216. package/src/portable.js +13 -0
  217. package/src/product-completion.js +249 -0
  218. package/src/project-manifest-input.js +90 -0
  219. package/src/project-manifest.js +141 -0
  220. package/src/python-requirements.js +137 -0
  221. package/src/registry/npm-packument.js +256 -0
  222. package/src/registry/npm-registry-adapter.js +262 -0
  223. package/src/registry/pypi-project.js +300 -0
  224. package/src/registry/pypi-registry-adapter.js +235 -0
  225. package/src/registry/sanitize-registry-body.js +51 -0
  226. package/src/renderers/console.js +160 -0
  227. package/src/renderers/impact-presentation.js +278 -0
  228. package/src/renderers/markdown.js +172 -0
  229. package/src/research-plan.js +455 -0
  230. package/src/runtime-conformance.js +275 -0
  231. package/src/source-provenance.js +393 -0
  232. package/src/source-url.js +62 -0
  233. package/src/structured-output-schema.js +66 -0
  234. package/src/target-selector.js +306 -0
  235. package/src/upgrade-decision/input-loader.js +107 -0
  236. package/src/upgrade-decision/presentation.js +43 -0
  237. package/src/upgrade-decision/runtime.js +21 -0
  238. package/src/upgrade-decision/upgrade-decision.js +626 -0
  239. package/src/upgrade-decision/writer.js +30 -0
  240. package/src/usage/analyzer-registry.js +63 -0
  241. package/src/usage/coverage.js +116 -0
  242. package/src/usage/input-loader.js +139 -0
  243. package/src/usage/js/analyzer.js +240 -0
  244. package/src/usage/js/parser.js +21 -0
  245. package/src/usage/runtime.js +187 -0
  246. package/src/usage/scope.js +44 -0
  247. package/src/usage/source-files.js +50 -0
  248. package/src/usage/usage-index.js +217 -0
  249. package/src/usage/writer.js +31 -0
  250. package/src/version-analysis-loader.js +203 -0
  251. package/src/version-analysis-manifest.js +314 -0
  252. package/src/version-analysis-writer.js +30 -0
@@ -0,0 +1,33 @@
1
+ # RR02-FIX-03 — npm Capture Evidence Exclusion and Package Content Guard
2
+
3
+ ## Historical decision
4
+
5
+ Reported verdict: **`READY_TO_RESUME_RR02_RERUN`**.
6
+
7
+ Commit `e0c05b6` added an actual-tarball package-content guard, guard tests,
8
+ and `npm run check:package` wiring. The guard correctly recognizes known and
9
+ future `docs/*-cli-captures` paths, capture helpers, and required public
10
+ assets.
11
+
12
+ That verdict did not survive validation against committed HEAD. The stopped
13
+ RR02-RERUN proved that the commit omitted:
14
+
15
+ - the effective `!docs/*-cli-captures` package exclusion;
16
+ - `docs/migration-planning-qualification-resolution.md`;
17
+ - `docs/package-content-policy.md`;
18
+ - the remediation reports needed by rerun preflight.
19
+
20
+ The clean committed tarball therefore failed its own guard. Creating the
21
+ stopped-run manifest also made that manifest package-eligible, directly
22
+ demonstrating that the missing exclusion was not a theoretical defect.
23
+
24
+ RR02-FIX-03A exists to complete and validate the intended remediation in one
25
+ scoped commit. This report preserves the original historical verdict while
26
+ recording why it was superseded by `NO_GO_PACKAGE_OR_REGRESSION`.
27
+
28
+ ## Evidence status
29
+
30
+ The original FIX-03 capture output was not present at RR02-FIX-03A baseline.
31
+ It is not fabricated. The committed guard implementation, stopped rerun
32
+ report/manifest, and FIX-03A clean package evidence provide the authoritative
33
+ reconciliation.
@@ -0,0 +1,223 @@
1
+ # RR02-FIX-03A — Complete Package Exclusion and Validation Evidence Commit
2
+
3
+ ## 1. Root Cause
4
+
5
+ RR02-FIX-03 committed the actual-tarball guard and npm wiring but did not
6
+ commit the matching `package.json.files` exclusion, two assets required by the
7
+ guard, or its release-history reports. The implementation was validated from
8
+ a dirty snapshot rather than the authoritative committed snapshot.
9
+
10
+ Consequently, clean HEAD `e0c05b62536b76315c9d19dbe38a48f98b19b3c8`
11
+ failed its own package guard. Adding the stopped-run manifest made that
12
+ repository-only evidence package-eligible and proved that exclusion was not
13
+ effective.
14
+
15
+ ## 2. Baseline HEAD and Three-state Inventory
16
+
17
+ - Branch: `feat/mvp-05-evidence-migration-checklist`
18
+ - Baseline HEAD: `e0c05b62536b76315c9d19dbe38a48f98b19b3c8`
19
+ - Subject: `fix: package content guard`
20
+ - Index: empty; no pre-existing staged user changes
21
+ - Tracked modifications: none
22
+ - Untracked task evidence: stopped RR02-RERUN report and empty manifest
23
+ - Unrelated user changes: none
24
+
25
+ | Required item | Working tree | Git index | HEAD | Action |
26
+ | --- | --- | --- | --- | --- |
27
+ | package capture exclusion | `MISSING` | `MISSING` | `MISSING` | add exact negation |
28
+ | actual-tarball guard | `PRESENT_MATCHING` | `MISSING` | `PRESENT_MATCHING` | retain and add FIX-03A exact prefix |
29
+ | guard tests/wiring | `PRESENT_MATCHING` | `MISSING` | `PRESENT_MATCHING` | retain and update exact-tree assertion |
30
+ | qualification resolution doc | `MISSING` | `MISSING` | `MISSING` | restore from current implementation |
31
+ | package content policy | `MISSING` | `MISSING` | `MISSING` | restore from actual package contract |
32
+ | FIX-01 report/evidence | `MISSING` | `MISSING` | `MISSING` | restore report; do not fabricate captures |
33
+ | FIX-02 report/evidence | `MISSING` | `MISSING` | `MISSING` | restore report; retain tracked progress contract |
34
+ | FIX-03 report/evidence | `MISSING` | `MISSING` | `MISSING` | restore reconciled historical report |
35
+ | stopped RR02-RERUN report/manifest | `UNTRACKED` | `MISSING` | `MISSING` | preserve and commit |
36
+
37
+ Historical binary capture trees were not in the working tree, index, commits,
38
+ or local report paths at baseline. They were not recreated from memory. The
39
+ restored reports explicitly preserve their original verdicts and this evidence
40
+ limitation.
41
+
42
+ ## 3. Implementation Summary
43
+
44
+ - Added path-specific `!docs/*-cli-captures` npm exclusion.
45
+ - Extended the guard's reviewed exact-prefix inventory through FIX-03A while
46
+ retaining its future naming-convention rule.
47
+ - Added qualification-resolution and package-content user documentation that
48
+ matches the current runtime.
49
+ - Restored the RR-02, FIX-01, FIX-02, and FIX-03 release decision chain.
50
+ - Preserved the stopped RR02-RERUN report and manifest.
51
+ - Added three sanitized clean-install CLI capture bundles for version, help,
52
+ and default offline analysis.
53
+ - Changed no `src/**` production file, schema, dataset, qualification record,
54
+ progress semantics, migration behavior, or version.
55
+
56
+ ## 4. Scoped Commit Inventory
57
+
58
+ | Category | Files staged | Files committed | Validation |
59
+ | --- | ---: | ---: | --- |
60
+ | Package config/guard | 3 | 3 | guard tests and actual tarball |
61
+ | Required user docs | 2 | 2 | required-path assertions |
62
+ | Remediation reports | 5 | 5 | historical verdict review |
63
+ | CLI capture evidence | 20 | 20 | manifest/privacy/PNG validation |
64
+ | Validation report | 1 | 1 | staged scope and Markdown review |
65
+ | Unrelated files | 0 | 0 | three-state status review |
66
+
67
+ The reviewed total is 31 files. The capture category consists of the stopped
68
+ manifest plus 19 FIX-03A capture files.
69
+
70
+ ## 5. Package Exclusion and Required Assets
71
+
72
+ The package includes user-facing `docs` and then excludes only direct-child
73
+ `docs/*-cli-captures`. Actual tar inspection finds zero capture paths and zero
74
+ capture helpers while retaining:
75
+
76
+ - `docs/cli-progress.md`;
77
+ - `docs/migration-planning-qualification-resolution.md`;
78
+ - `docs/package-content-policy.md`;
79
+ - both Migration Planning datasets;
80
+ - the qualification-record and extractive-candidate schemas;
81
+ - executable and public runtime entry points.
82
+
83
+ The guard still fails on an injected forbidden capture path and on a missing
84
+ required asset. Required docs were not removed from the guard to obtain a
85
+ pass.
86
+
87
+ ## 6. Working-tree Validation
88
+
89
+ | Gate | Result |
90
+ | --- | --- |
91
+ | Package guard focused tests | 7 passed, 0 failed |
92
+ | Actual-tarball package guard | passed; 0 captures; 15 required assets |
93
+ | Qualification/progress/orchestration | 27 passed, 0 failed |
94
+ | MP regression set | 107 passed, 0 failed |
95
+ | Full suite, serial | 537 passed, 0 failed, 1 sandbox-only skip |
96
+ | Isolated package install | passed; 12 packages installed offline |
97
+ | Packaged public import | passed |
98
+ | Captured packaged CLI | version/help/default analyze exited 0 |
99
+ | Default analyze | 7/7 stages; no Migration Checklist |
100
+ | Capture manifest | 3/3 entries complete |
101
+ | Secret/absolute-path/ANSI scan | passed |
102
+ | PNG metadata | 3 files; no metadata |
103
+
104
+ The default concurrent `npm test` mode was run twice and each run exposed the
105
+ same existing resource-sensitive timeout: the HTTP lifecycle child was killed
106
+ at approximately three seconds while 536 tests passed and one sandbox test was
107
+ skipped. The exact failing test passed alone and the complete repository suite
108
+ passed with `--test-concurrency=1`. No production or test timeout was changed
109
+ in this packaging-only task.
110
+
111
+ ## 7. Staged-snapshot Validation
112
+
113
+ The exact Git index was exported with `git checkout-index` into an isolated
114
+ temporary directory. It did not read unstaged repository files. The staged
115
+ snapshot passed focused guard tests, actual-tarball checking, package entry
116
+ assertions, isolated install, packaged public import and smoke equivalence,
117
+ focused qualification/progress regressions, the full serial suite, privacy
118
+ checks, and whitespace checks.
119
+
120
+ Capture files exist in the staged snapshot and remain absent from its tarball.
121
+
122
+ ## 8. Commit Result
123
+
124
+ Subject: `fix: complete package evidence exclusion`
125
+
126
+ The authoritative SHA is the Git commit containing this report. A file cannot
127
+ contain the cryptographic SHA of the commit that contains that same file
128
+ without changing the commit object; the exact SHA is therefore recorded in
129
+ the post-commit task handoff. No amend or second bookkeeping commit is used.
130
+
131
+ ## 9. Post-commit HEAD Validation
132
+
133
+ Post-commit validation is performed after this report becomes immutable in the
134
+ single authorized commit. The handoff records the exact commit SHA, final
135
+ tarball sizes and digests, clean-snapshot checks, and final worktree status.
136
+
137
+ The committed tree is required to match the already validated index byte for
138
+ byte. A clean archive of that HEAD must pass the guard, fresh pack, entry
139
+ assertions, isolated install, package smoke equivalence, focused regressions,
140
+ full serial suite, final dry run, privacy scan, and scope checks before the
141
+ task verdict can be released.
142
+
143
+ ## 10. CLI Capture Evidence
144
+
145
+ `docs/rr02-fix-03a-cli-captures/manifest.json` contains one entry per direct
146
+ UpgradeLens CLI invocation used for package smoke:
147
+
148
+ 1. packaged `--version`;
149
+ 2. packaged `--help`;
150
+ 3. packaged default `analyze <fixture> --offline --progress plain`.
151
+
152
+ Each bundle contains command, constrained environment, raw and clean
153
+ transcripts, metadata, exit code, and final-screen PNG. All three invocations
154
+ used the clean-installed tarball, exited zero, made zero provider requests,
155
+ and contain no private path. The public import smoke is an application API
156
+ check, not a CLI invocation.
157
+
158
+ ## 11. Before/After Tarball Comparison
159
+
160
+ | Metric | Failing baseline HEAD | Completed working tree before this report |
161
+ | --- | ---: | ---: |
162
+ | Files | 197 | 204 |
163
+ | Compressed bytes | 471,310 | 478,775 |
164
+ | Unpacked bytes | 1,881,500 | 1,903,779 |
165
+ | npm SHA-1 | `76eadf38bf7c50ebd9c4a90397789fb7075f1336` | `f9e6ee764cd47dc71e86a57fa66c29375b35250f` |
166
+ | SHA-256 | `04e737d90630674f7a6633b196c1d6a00a33ebd7876a25410301902a0590db70` | `f3f18ef80ec196e8dec38e3358feddf028e9a2bdae14d5971f7da7b5716c06c9` |
167
+ | Required docs missing | 2 | 0 |
168
+ | Capture entries | exclusion ineffective | 0 |
169
+
170
+ Adding this package-visible completion report changes final package byte
171
+ metrics without changing the content-policy result. Final committed metrics
172
+ are recorded after the commit in the task handoff.
173
+
174
+ ## 12. Regression and Privacy Results
175
+
176
+ No real provider, registry network, requalification, VinGrade mutation, raw
177
+ provider payload, credential, authorization material, private endpoint, or
178
+ hidden reasoning was used. Reports and captures passed secret-pattern,
179
+ machine-path, ANSI/control, relative-link, and PNG metadata scans.
180
+
181
+ `git diff --check`, staged `git diff --cached --check`, forbidden-path scans,
182
+ and generated-artifact checks cover Markdown whitespace, tarballs,
183
+ `node_modules`, caches, and temporary directories.
184
+
185
+ ## 13. Remaining Worktree State
186
+
187
+ The expected post-commit state is clean because both baseline untracked files
188
+ are intentionally included in the reviewed scope and there were no unrelated
189
+ changes. Final `git status --short`, index status, and untracked inventory are
190
+ reported from post-commit HEAD rather than predicted here.
191
+
192
+ ## 14. Compatibility and Scope Confirmation
193
+
194
+ The remediation is package-boundary and documentation-only. It preserves the
195
+ public runtime version and exports, Node requirement, CLI defaults, sequential
196
+ pipeline, qualification precedence, fail-closed behavior, progress contract,
197
+ Impact/Evidence logic, Extractive Contract, and Migration Checklist
198
+ experimental status.
199
+
200
+ No AI call, provider call, internet research, source migration, version bump,
201
+ push, tag, publish, or release is part of this task.
202
+
203
+ ## 15. Remaining Risks
204
+
205
+ - Historical RR-02/FIX-01/FIX-02/FIX-03 screenshots were never committed and
206
+ cannot be recovered faithfully; the reports disclose this rather than
207
+ manufacturing evidence.
208
+ - The concurrent full-suite lifecycle test has a three-second child timeout
209
+ that is resource-sensitive under full parallel load. It passes in isolation
210
+ and the entire suite passes serially. Any timeout/concurrency redesign is a
211
+ separate test-infrastructure task.
212
+ - Final commit SHA and post-commit tarball digest are temporal results and must
213
+ be retained with this report's release handoff.
214
+
215
+ ## 16. Next Decision
216
+
217
+ Verdict, contingent on the recorded post-commit clean-HEAD gates:
218
+ **`READY_TO_RESUME_RR02_RERUN_FROM_COMMITTED_HEAD`**.
219
+
220
+ Resume RR02-RERUN at RERUN-001 from the new commit, build a fresh tarball,
221
+ recheck qualification identity without requalification when it has not
222
+ drifted, capture every new product invocation, and keep Migration Checklist
223
+ experimental. Do not reuse the FIX-03A validation tarball.
@@ -0,0 +1,393 @@
1
+ # RR02-FIX-04 — Event-loop-safe Heartbeat for CPU-bound Discovery and Usage
2
+
3
+ ## 1. Root Cause
4
+
5
+ The progress runtime already scheduled an unref'd five-second heartbeat, but
6
+ Project Discovery and Repository Usage Discovery could execute long sequential
7
+ scan/parse chains without a macrotask boundary. Promise continuations and
8
+ synchronous parsing did not guarantee that the Node.js timer phase could run.
9
+
10
+ ```text
11
+ stage adapter
12
+
13
+ recursive directory traversal
14
+
15
+ file selection
16
+
17
+ read one file
18
+
19
+ synchronous parse/analyze
20
+
21
+ aggregate deterministic records
22
+
23
+ sort / validate / atomic write
24
+ ```
25
+
26
+ The stage adapter checked cancellation only before and after the complete
27
+ runtime. A due heartbeat and the first `SIGINT` could therefore remain pending
28
+ until the scan returned.
29
+
30
+ The progress timer, renderer, lifecycle version, heartbeat interval, stage
31
+ order, and business runtimes were not the root cause.
32
+
33
+ ## 2. Pre-fix Starvation Evidence
34
+
35
+ RR02-RERUN recorded a packaged Repository Usage Discovery stage that remained
36
+ quiet from 0.0 seconds until its 8.4-second completion activity. No `WAITING`
37
+ or `STAGE_HEARTBEAT` occurred.
38
+
39
+ A controlled pre-fix pipeline reproduction executed 24 synchronous per-file
40
+ CPU units with a real ten-millisecond heartbeat timer and no I/O boundary. It
41
+ exited 1 with:
42
+
43
+ ```text
44
+ ["RUN_STARTED","STAGE_SCHEDULED","STAGE_STARTED","STAGE_ACTIVITY",
45
+ "STAGE_COMPLETED","RUN_COMPLETED"]
46
+ PRE_FIX_STARVATION_REPRODUCED: heartbeat timer did not run before terminal event
47
+ ```
48
+
49
+ This reproduction used the actual Node.js event loop. It did not use a fake
50
+ clock to make a timer callback run while work remained synchronous.
51
+
52
+ ## 3. Implementation Summary
53
+
54
+ The remediation adds one internal operation-local cooperative scheduler:
55
+
56
+ - production yield: `setImmediate`;
57
+ - deterministic hybrid policy: 64 completed units or 50 milliseconds since
58
+ the prior yield, whichever occurs first;
59
+ - injected monotonic clock and yield implementation for tests;
60
+ - abort checks before every boundary and after every actual yield;
61
+ - immutable metrics snapshot for controlled test/benchmark observation;
62
+ - no global mutable state and no dependency;
63
+ - no public package export.
64
+
65
+ Project Discovery and Repository Usage Discovery create the scheduler and pass
66
+ it through their traversal and processing loops. The CLI stage adapters now
67
+ pass their existing `AbortSignal` into both runtimes.
68
+
69
+ No scanner emits or renders heartbeat text. Heartbeats remain owned by the
70
+ existing orchestration progress runtime.
71
+
72
+ ## 4. Cooperative Scheduling Contract
73
+
74
+ A scheduler boundary means one unit is completely processed. The scheduler:
75
+
76
+ 1. checks the caller signal;
77
+ 2. counts the completed unit;
78
+ 3. returns immediately when neither policy limit is due;
79
+ 4. otherwise awaits one `setImmediate`;
80
+ 5. resets its local budget;
81
+ 6. checks the caller signal again.
82
+
83
+ `enabled: false` retains abort checks but performs no yield. Different batch
84
+ sizes and enabled/disabled modes were used to prove exact output equivalence.
85
+
86
+ The 50-millisecond value is a boundary budget, not a preemptive deadline. A
87
+ single synchronous unit can exceed it and is allowed to finish atomically
88
+ before yielding.
89
+
90
+ The implementation does not use `setTimeout` sleeps, `process.nextTick`,
91
+ microtask-only yields, `Atomics.wait`, Worker Threads, child processes, scanner
92
+ parallelism, or direct scanner heartbeats.
93
+
94
+ ## 5. Yield Boundaries and Cancellation
95
+
96
+ Safe yield/check boundaries:
97
+
98
+ - after one directory entry is fully handled;
99
+ - after one manifest group is inspected;
100
+ - after one pnpm workspace input is handled;
101
+ - after one workspace relationship unit is complete;
102
+ - after one Usage dependency scope is indexed;
103
+ - after one source file is skipped, read, parsed/analyzed, and aggregated.
104
+
105
+ No yield occurs:
106
+
107
+ - inside Babel parser state;
108
+ - between usage record construction and aggregation;
109
+ - inside a sort comparator;
110
+ - during schema/invariant validation;
111
+ - after an atomic artifact writer begins publication.
112
+
113
+ On cancellation, the boundary throws `AbortError` with
114
+ `code=ANALYSIS_CANCELLED`. The existing pipeline emits one cancelled current
115
+ stage, skips later stages, disposes its heartbeat timer, emits no success
116
+ summary, and returns 130. The stage writer is never reached, so no partial
117
+ Usage Index is published.
118
+
119
+ The packaged cancellation capture delivered `SIGINT` after the Usage start
120
+ event, emitted `STAGE CANCELLED id=usageDiscovery` at 0.1 seconds, returned
121
+ 130, and left `usage-index.json` absent.
122
+
123
+ ## 6. Determinism and Artifact Equivalence
124
+
125
+ The representative fixture contained 501 project manifests and 4,000
126
+ JavaScript source files. All clocks were fixed and lineage digests used the
127
+ exact serialized upstream bytes.
128
+
129
+ | Artifact | Yield disabled hash/result | Yield enabled hash/result | Equivalent |
130
+ | --- | --- | --- | --- |
131
+ | Project Manifest | `sha256:eb2aadff4190362c89c6201a98c5feafcb0197383e3d24802ab7af019945dece` | `sha256:eb2aadff4190362c89c6201a98c5feafcb0197383e3d24802ab7af019945dece` | Yes, exact JSON bytes |
132
+ | Usage Index | `sha256:200df004f8c8872b3fc8727691f9f852d562fdbe143ffa0743d32e76d94c1e4b` | `sha256:200df004f8c8872b3fc8727691f9f852d562fdbe143ffa0743d32e76d94c1e4b` | Yes, exact JSON bytes |
133
+ | Repository Impact | `sha256:6daf4e107005d6054d5fd993b81972d42cc1181c1ca636824412d5bfc3eded12` | `sha256:6daf4e107005d6054d5fd993b81972d42cc1181c1ca636824412d5bfc3eded12` | Yes, exact JSON bytes |
134
+ | Impact Evidence | `sha256:ae5ab31daa5efa5b47c5d6c958fc2e7c214e71deb5cdda2470151168001f8cb7` | `sha256:ae5ab31daa5efa5b47c5d6c958fc2e7c214e71deb5cdda2470151168001f8cb7` | Yes, exact JSON bytes |
135
+
136
+ Different batch sizes of 1, 5, and 7 also produced byte-identical Discovery
137
+ and Usage artifacts. Existing exclusion, symlink, maximum-depth, analyzer,
138
+ warning, stable ordering, ID, digest, and lineage tests pass.
139
+
140
+ No provider, network, or filesystem scan scope was added. Discovery and Usage
141
+ provider call counts remain zero.
142
+
143
+ ## 7. Heartbeat Evidence
144
+
145
+ The fresh packaged CLI used the production five-second quiet threshold.
146
+
147
+ TTY auto mode:
148
+
149
+ ```text
150
+ ↳ Repository Usage Discovery — Scanning supported source files [0.0s]
151
+ … Repository Usage Discovery — Scanning supported source files [5.0s]
152
+ … Repository Usage Discovery — Scanning supported source files [10.0s]
153
+ … Repository Usage Discovery — Scanning supported source files [15.0s]
154
+ ↳ Repository Usage Discovery — Writing Repository Usage Index [19.4s]
155
+ ✓ Repository Usage Discovery completed [19.4s]
156
+ ```
157
+
158
+ Plain/non-TTY mode:
159
+
160
+ ```text
161
+ [5.0s] STAGE HEARTBEAT id=usageDiscovery detail="Scanning supported source files"
162
+ [10.0s] STAGE HEARTBEAT id=usageDiscovery detail="Scanning supported source files"
163
+ [15.0s] STAGE HEARTBEAT id=usageDiscovery detail="Scanning supported source files"
164
+ [17.1s] STAGE COMPLETE id=usageDiscovery label="Repository Usage Discovery"
165
+ ```
166
+
167
+ No Usage heartbeat occurred after terminal state. The short 0.7-second default
168
+ run emitted no heartbeat noise and did not schedule Migration Checklist.
169
+
170
+ | Scenario | Duration | Yield count | Max quiet interval | Heartbeats | Cancellation latency | Artifact equivalent | Capture |
171
+ | --- | ---: | ---: | ---: | ---: | ---: | --- | --- |
172
+ | Controlled Discovery, 501 manifests | 88.465 ms median | 102 | 50 ms boundary budget | N/A | N/A | Yes | Test/benchmark |
173
+ | Controlled Usage, 4,000 files | 541.933 ms median | 141 | 50 ms boundary budget | 0, below threshold | N/A | Yes | Test/benchmark |
174
+ | Packaged TTY Usage | 19.4 s | Not persisted by design | 5.0 s observed | 3 | N/A | Same validated artifact contract | [capture](rr02-fix-04-cli-captures/001-packaged-default-tty-long-heartbeat/03-heartbeat.png) |
175
+ | Packaged plain Usage | 17.1 s | Not persisted by design | 5.0 s observed | 3 | N/A | Same validated artifact contract | [capture](rr02-fix-04-cli-captures/002-packaged-plain-nontty-long-heartbeat/03-heartbeat.png) |
176
+ | Packaged Usage cancellation | 0.1 s in stage | Not persisted by design | 0.1 s | 0 | Approximately 0.1 s | No partial artifact | [capture](rr02-fix-04-cli-captures/003-packaged-usage-cancellation/final-screen.png) |
177
+ | Packaged short default | 0.7 s total | Not persisted by design | Below threshold | 0 | N/A | Yes | [capture](rr02-fix-04-cli-captures/004-packaged-default-short-no-heartbeat/final-screen.png) |
178
+
179
+ ## 8. Performance Before/After
180
+
181
+ Five alternating enabled/disabled samples were measured after warm-up. Medians
182
+ avoid the filesystem-cache bias seen when disabled mode always ran first.
183
+
184
+ | Runtime | Yield disabled median | Yield enabled median | Relative overhead | Units | Yields |
185
+ | --- | ---: | ---: | ---: | ---: | ---: |
186
+ | Project Discovery | 86.700 ms | 88.465 ms | +2.04% | 6,506 | 102 |
187
+ | Repository Usage Discovery | 541.499 ms | 541.933 ms | +0.08% | 9,004 | 141 |
188
+
189
+ The policy therefore has bounded low overhead on the representative fixture.
190
+ No zero-overhead claim is made.
191
+
192
+ The supported source sample in this repository parsed 169 files in 169.498 ms.
193
+ The slowest individual synchronous parse was 14.656 ms. No real supported
194
+ single-file fixture approached the five-second threshold.
195
+
196
+ ## 9. Files Changed
197
+
198
+ Production/runtime:
199
+
200
+ - `src/cooperative-scheduler.js`;
201
+ - `src/files.js`;
202
+ - `src/discovery.js`;
203
+ - `src/usage/source-files.js`;
204
+ - `src/usage/runtime.js`;
205
+ - `src/cli.js`.
206
+
207
+ Tests and documentation:
208
+
209
+ - `test/cooperative-scheduling.test.js`;
210
+ - `docs/cli-progress.md`;
211
+ - this completion report;
212
+ - `docs/rr02-fix-04-cli-captures/**`.
213
+
214
+ The dirty RR02-RERUN report and capture evidence already present at task start
215
+ remain historical evidence. FIX-04 did not revise its verdict.
216
+
217
+ ## 10. Regression Coverage
218
+
219
+ Final focused results:
220
+
221
+ - scheduler, Discovery, Usage, progress, orchestration, Impact, and Evidence:
222
+ 56 passed, 0 failed;
223
+ - cooperative scheduling file alone: 8 passed, 0 failed;
224
+ - qualification/progress/orchestration: 27 passed, 0 failed;
225
+ - MP-01 through MP-05 group: 107 passed, 0 failed;
226
+ - Extractive Contract experiment/production: 21 passed, 0 failed;
227
+ - duplicate occurrence reconciliation cases passed inside the MP context
228
+ regression;
229
+ - package content guard: passed.
230
+
231
+ Coverage includes a real Node event-loop test, deterministic injected
232
+ scheduler, abort before/after yield, scheduler error propagation, every-file
233
+ processing, enabled/disabled/different-batch equivalence, cancellation without
234
+ partial output, no duplicate terminal event, no post-terminal heartbeat,
235
+ callback isolation, downstream hash equality, and unchanged default stage
236
+ selection.
237
+
238
+ ## 11. Packaged CLI Capture Evidence
239
+
240
+ A fresh worktree tarball, not an RR02-FIX-03, RR02-FIX-03A, or RR02-RERUN
241
+ tarball, was installed and used for all product scenarios.
242
+
243
+ Capture manifest:
244
+
245
+ `docs/rr02-fix-04-cli-captures/manifest.json`
246
+
247
+ The manifest represents five scenarios and 13 screenshots:
248
+
249
+ 1. exact replay of the initial no-dependency calibration after write-first
250
+ capture was enabled;
251
+ 2. default TTY auto long heartbeat;
252
+ 3. plain/non-TTY long heartbeat;
253
+ 4. Usage cancellation;
254
+ 5. short default/no-noise analysis.
255
+
256
+ The initial calibration process completed before the first harness version
257
+ persisted its in-memory transcript. No transcript was fabricated. Its exact
258
+ command and workload were replayed with write-first capture; the replay
259
+ observed a 9.3-second Usage stage and a correct five-second heartbeat. The two
260
+ separate long proof scenarios remain the acceptance evidence.
261
+
262
+ Every persisted entry has command, environment, raw/clean transcript,
263
+ metadata, final screen, and exit code. Both long runs additionally have
264
+ `01-start.png`, `02-before-heartbeat.png`, `03-heartbeat.png`, and
265
+ `04-final.png`.
266
+
267
+ ## 12. Package and Privacy Validation
268
+
269
+ Fresh tarball:
270
+
271
+ - identity: `upgradelens@0.4.0`;
272
+ - files: 206;
273
+ - compressed size: 485,962 bytes;
274
+ - unpacked size: 1,924,523 bytes;
275
+ - npm SHA-1: `18cbe2f81b50bd9ac5b6e65d55475d90a62ed1de`;
276
+ - SHA-256:
277
+ `56dc6da33a18392b8dfe6e5409db4e92cb85f4cac49a15cc50d50ff8166fdfa6`;
278
+ - cooperative scheduler source present;
279
+ - capture evidence entries: 0;
280
+ - required assets: 15/15;
281
+ - clean offline install: 12 exact local packages installed;
282
+ - packaged public import: passed;
283
+ - `npm pack --dry-run --json`: passed.
284
+
285
+ After this completion report was added, the final worktree dry-run contained
286
+ 207 files, remained at zero capture-evidence entries, retained 15/15 required
287
+ assets, and passed. The installed validation tarball identity above remains
288
+ the 206-file artifact actually exercised by the packaged CLI captures.
289
+
290
+ The first isolated-cache install attempt correctly failed `ENOTCACHED`.
291
+ Validation then packed the already-installed exact dependency versions into
292
+ local tarballs and completed a fresh install with `--offline`; no registry or
293
+ provider request was made.
294
+
295
+ Capture validation:
296
+
297
+ - manifest: 5 entries;
298
+ - raw transcripts: 5;
299
+ - clean transcripts: 5;
300
+ - screenshots: 13;
301
+ - missing final screens: 0;
302
+ - deterministic final-screen replay: passed;
303
+ - plain/non-TTY ANSI and cursor scan: passed;
304
+ - clean transcript control-character scan: passed;
305
+ - private path, endpoint, credential, and secret scan: passed;
306
+ - PNG metadata scan: 13 passed;
307
+ - real-provider requests: 0.
308
+
309
+ ## 13. Canonical/Serial Test Results
310
+
311
+ The first canonical parallel `npm run check` run produced:
312
+
313
+ - 546 total;
314
+ - 544 passed;
315
+ - 1 failed;
316
+ - 1 sandbox-only skip.
317
+
318
+ The failure was the existing `http-lifecycle-cli.test.js` child-process
319
+ deadline: the harness sent `SIGKILL`. No FIX-04 test failed. Lifecycle timeout
320
+ and test infrastructure were not changed.
321
+
322
+ A second canonical parallel `npm run check`, run with the machine idle,
323
+ produced:
324
+
325
+ - 546 total;
326
+ - 545 passed;
327
+ - 0 failed;
328
+ - 1 sandbox-only skip;
329
+ - package guard passed.
330
+
331
+ The separate serial suite produced:
332
+
333
+ - 546 total;
334
+ - 545 passed;
335
+ - 0 failed;
336
+ - 1 sandbox-only skip.
337
+
338
+ The serial pass is not used as a silent replacement for the first parallel
339
+ failure. Both parallel results and the serial result are retained. The skip is
340
+ the known local-loopback sandbox limitation.
341
+
342
+ ## 14. Compatibility and Scope Confirmation
343
+
344
+ - lifecycle contract remains `1.0.0`;
345
+ - production heartbeat interval remains 5,000 ms;
346
+ - stage order and stop/cancel semantics are unchanged;
347
+ - no provider retry, timeout, identity, qualification, dataset, comparator,
348
+ policy, threshold, schema, or Extractive Contract behavior changed;
349
+ - no scanner parallelism, Worker Thread, child-process heartbeat, network
350
+ call, provider call, or dependency was added;
351
+ - Project Manifest, Usage Index, Impact, Evidence, warnings, ordering, IDs,
352
+ digests, and lineage remain deterministic;
353
+ - package version remains `0.4.0`;
354
+ - Migration Checklist remains experimental, opt-in, and absent from default
355
+ analysis;
356
+ - the Medium 80-column plain-detail truncation was not changed because it is
357
+ outside the narrow heartbeat remediation;
358
+ - no commit, push, tag, publish, or release was performed.
359
+
360
+ ## 15. Remaining Risks
361
+
362
+ 1. Babel parsing remains synchronous within one file. Cancellation and a due
363
+ heartbeat can run only after that parse completes. Current supported-source
364
+ evidence has a 14.656-ms maximum, so there is no demonstrated single-file
365
+ blocker.
366
+ 2. The 50-ms scheduler budget is evaluated at safe completed-unit boundaries;
367
+ it is not preemptive.
368
+ 3. The HTTP lifecycle child timeout remains load-sensitive in parallel runs.
369
+ It passed the canonical rerun and serial run, but the first canonical
370
+ failure remains technical debt. FIX-04 intentionally did not change it.
371
+ 4. Plain progress detail may still truncate at an 80-column TTY. This remains
372
+ a non-blocking Medium follow-up.
373
+
374
+ ## 16. Next Decision
375
+
376
+ **Verdict:
377
+ `READY_TO_RESUME_RR02_RERUN_FROM_RERUN_001`.**
378
+
379
+ The packaged heartbeat defect is fixed, cancellation is responsive at safe
380
+ boundaries, artifacts are exact-hash equivalent, performance overhead is
381
+ bounded, the canonical rerun and serial suite pass, and capture/package/privacy
382
+ gates pass.
383
+
384
+ RR02-RERUN must:
385
+
386
+ - create a new fresh tarball rather than reuse the FIX-04 tarball;
387
+ - restart from `RERUN-001`;
388
+ - inspect qualification identity again without reconstructing it from prose;
389
+ - require the persisted real-provider record for qualification scenarios;
390
+ - capture every new CLI invocation;
391
+ - keep Migration Checklist experimental.
392
+
393
+ FIX-04 does not start that rerun.