@hominis/fireforge 0.46.0 → 0.46.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 (606) hide show
  1. package/CHANGELOG.md +381 -498
  2. package/dist/bin/fireforge.d.ts +1 -1
  3. package/dist/bin/fireforge.js +17 -17
  4. package/dist/build-info.json +4 -4
  5. package/dist/src/cli-usage-error.d.ts +9 -9
  6. package/dist/src/cli-usage-error.js +12 -12
  7. package/dist/src/cli.d.ts +3 -2
  8. package/dist/src/cli.js +29 -28
  9. package/dist/src/commands/bootstrap-checks.js +2 -1
  10. package/dist/src/commands/bootstrap.js +2 -2
  11. package/dist/src/commands/build.js +12 -11
  12. package/dist/src/commands/config.js +9 -9
  13. package/dist/src/commands/destructive-decision.d.ts +4 -4
  14. package/dist/src/commands/destructive-decision.js +4 -4
  15. package/dist/src/commands/discard.js +5 -5
  16. package/dist/src/commands/doctor-check-core.d.ts +4 -4
  17. package/dist/src/commands/doctor-external-toolchains.js +2 -2
  18. package/dist/src/commands/doctor-furnace-config-sync.d.ts +2 -2
  19. package/dist/src/commands/doctor-furnace-config-sync.js +20 -20
  20. package/dist/src/commands/doctor-furnace-jar.d.ts +1 -1
  21. package/dist/src/commands/doctor-furnace-jar.js +1 -1
  22. package/dist/src/commands/doctor-furnace.js +22 -22
  23. package/dist/src/commands/doctor-orphaned-harness.d.ts +10 -11
  24. package/dist/src/commands/doctor-orphaned-harness.js +10 -11
  25. package/dist/src/commands/doctor-patch-manifest.d.ts +2 -1
  26. package/dist/src/commands/doctor-patch-manifest.js +7 -6
  27. package/dist/src/commands/doctor-post-rebase-audit.js +2 -2
  28. package/dist/src/commands/doctor-source-pin.d.ts +12 -12
  29. package/dist/src/commands/doctor-source-pin.js +14 -14
  30. package/dist/src/commands/doctor-working-tree.d.ts +3 -3
  31. package/dist/src/commands/doctor-working-tree.js +3 -3
  32. package/dist/src/commands/doctor.d.ts +2 -2
  33. package/dist/src/commands/doctor.js +9 -9
  34. package/dist/src/commands/download.js +15 -13
  35. package/dist/src/commands/export-all.js +8 -8
  36. package/dist/src/commands/export-flow.d.ts +5 -5
  37. package/dist/src/commands/export-flow.js +14 -14
  38. package/dist/src/commands/export-placement-conflicts.d.ts +3 -3
  39. package/dist/src/commands/export-placement-conflicts.js +9 -9
  40. package/dist/src/commands/export-placement-gate.d.ts +2 -2
  41. package/dist/src/commands/export-placement-gate.js +5 -5
  42. package/dist/src/commands/export-placement-policy.d.ts +1 -1
  43. package/dist/src/commands/export-placement-policy.js +1 -1
  44. package/dist/src/commands/export-shared.d.ts +10 -10
  45. package/dist/src/commands/export-shared.js +13 -13
  46. package/dist/src/commands/export.js +4 -4
  47. package/dist/src/commands/furnace/apply.js +16 -16
  48. package/dist/src/commands/furnace/chrome-doc-remove.d.ts +1 -1
  49. package/dist/src/commands/furnace/chrome-doc-remove.js +1 -1
  50. package/dist/src/commands/furnace/chrome-doc-templates.d.ts +14 -14
  51. package/dist/src/commands/furnace/chrome-doc-templates.js +17 -17
  52. package/dist/src/commands/furnace/chrome-doc-tests.d.ts +2 -2
  53. package/dist/src/commands/furnace/chrome-doc-tests.js +4 -4
  54. package/dist/src/commands/furnace/chrome-doc.d.ts +8 -8
  55. package/dist/src/commands/furnace/chrome-doc.js +18 -18
  56. package/dist/src/commands/furnace/create-browser-test.d.ts +1 -1
  57. package/dist/src/commands/furnace/create-browser-test.js +4 -4
  58. package/dist/src/commands/furnace/create-dry-run.d.ts +4 -4
  59. package/dist/src/commands/furnace/create-dry-run.js +4 -4
  60. package/dist/src/commands/furnace/create-features.d.ts +2 -2
  61. package/dist/src/commands/furnace/create-features.js +2 -2
  62. package/dist/src/commands/furnace/create-mochikit.d.ts +4 -4
  63. package/dist/src/commands/furnace/create-mochikit.js +7 -7
  64. package/dist/src/commands/furnace/create-templates.d.ts +14 -14
  65. package/dist/src/commands/furnace/create-templates.js +18 -18
  66. package/dist/src/commands/furnace/create-xpcshell.d.ts +5 -5
  67. package/dist/src/commands/furnace/create-xpcshell.js +8 -8
  68. package/dist/src/commands/furnace/create.d.ts +1 -1
  69. package/dist/src/commands/furnace/create.js +10 -10
  70. package/dist/src/commands/furnace/deploy.js +4 -4
  71. package/dist/src/commands/furnace/diff.js +7 -7
  72. package/dist/src/commands/furnace/index.js +1 -1
  73. package/dist/src/commands/furnace/init.js +15 -15
  74. package/dist/src/commands/furnace/list.js +2 -2
  75. package/dist/src/commands/furnace/override.d.ts +1 -1
  76. package/dist/src/commands/furnace/override.js +15 -15
  77. package/dist/src/commands/furnace/preview.js +17 -17
  78. package/dist/src/commands/furnace/refresh.js +6 -6
  79. package/dist/src/commands/furnace/remove-mutations.d.ts +3 -3
  80. package/dist/src/commands/furnace/remove-mutations.js +19 -18
  81. package/dist/src/commands/furnace/remove-state.d.ts +1 -1
  82. package/dist/src/commands/furnace/remove-state.js +1 -1
  83. package/dist/src/commands/furnace/remove.js +2 -2
  84. package/dist/src/commands/furnace/rename-browser-test.js +9 -8
  85. package/dist/src/commands/furnace/rename-xpcshell.d.ts +2 -2
  86. package/dist/src/commands/furnace/rename-xpcshell.js +3 -3
  87. package/dist/src/commands/furnace/rename.js +9 -9
  88. package/dist/src/commands/furnace/scan.js +3 -3
  89. package/dist/src/commands/furnace/status.js +7 -7
  90. package/dist/src/commands/furnace/sync.js +6 -6
  91. package/dist/src/commands/furnace/test-file-name.d.ts +2 -2
  92. package/dist/src/commands/furnace/test-file-name.js +2 -2
  93. package/dist/src/commands/furnace/validate.js +11 -12
  94. package/dist/src/commands/import.js +20 -20
  95. package/dist/src/commands/lint-per-patch.js +8 -8
  96. package/dist/src/commands/lint-per-run-checkjs.d.ts +12 -13
  97. package/dist/src/commands/lint-per-run-checkjs.js +14 -15
  98. package/dist/src/commands/lint-report.d.ts +3 -3
  99. package/dist/src/commands/lint-report.js +4 -4
  100. package/dist/src/commands/lint.d.ts +3 -3
  101. package/dist/src/commands/lint.js +35 -35
  102. package/dist/src/commands/manifest.d.ts +4 -4
  103. package/dist/src/commands/package.js +2 -2
  104. package/dist/src/commands/patch/compact.d.ts +2 -2
  105. package/dist/src/commands/patch/compact.js +8 -8
  106. package/dist/src/commands/patch/delete.d.ts +1 -1
  107. package/dist/src/commands/patch/delete.js +8 -8
  108. package/dist/src/commands/patch/lint-ignore.d.ts +3 -4
  109. package/dist/src/commands/patch/lint-ignore.js +14 -15
  110. package/dist/src/commands/patch/move-files-create.d.ts +2 -2
  111. package/dist/src/commands/patch/move-files-create.js +5 -5
  112. package/dist/src/commands/patch/move-files-into.d.ts +2 -2
  113. package/dist/src/commands/patch/move-files-into.js +3 -3
  114. package/dist/src/commands/patch/move-files.js +1 -1
  115. package/dist/src/commands/patch/patch-context.d.ts +1 -1
  116. package/dist/src/commands/patch/rename.d.ts +4 -4
  117. package/dist/src/commands/patch/rename.js +8 -8
  118. package/dist/src/commands/patch/reorder.js +10 -10
  119. package/dist/src/commands/patch/split-plan.d.ts +3 -3
  120. package/dist/src/commands/patch/split-plan.js +6 -5
  121. package/dist/src/commands/patch/split.d.ts +2 -2
  122. package/dist/src/commands/patch/split.js +5 -5
  123. package/dist/src/commands/patch/staged-dependency-validate.d.ts +1 -1
  124. package/dist/src/commands/patch/staged-dependency-validate.js +3 -3
  125. package/dist/src/commands/patch/staged-dependency.d.ts +1 -1
  126. package/dist/src/commands/patch/staged-dependency.js +6 -6
  127. package/dist/src/commands/patch/tier.d.ts +2 -2
  128. package/dist/src/commands/patch/tier.js +5 -5
  129. package/dist/src/commands/patch-rename-map.d.ts +1 -1
  130. package/dist/src/commands/patch-rename-map.js +1 -1
  131. package/dist/src/commands/pending-resolution.d.ts +5 -5
  132. package/dist/src/commands/pending-resolution.js +5 -5
  133. package/dist/src/commands/re-export-adjacent.d.ts +3 -3
  134. package/dist/src/commands/re-export-adjacent.js +8 -8
  135. package/dist/src/commands/re-export-bulk-scan.d.ts +3 -3
  136. package/dist/src/commands/re-export-bulk-scan.js +17 -17
  137. package/dist/src/commands/re-export-drift.d.ts +10 -10
  138. package/dist/src/commands/re-export-drift.js +29 -29
  139. package/dist/src/commands/re-export-files.js +14 -15
  140. package/dist/src/commands/re-export-lint.d.ts +26 -26
  141. package/dist/src/commands/re-export-lint.js +27 -27
  142. package/dist/src/commands/re-export-options.d.ts +1 -1
  143. package/dist/src/commands/re-export-options.js +1 -1
  144. package/dist/src/commands/re-export-register.d.ts +1 -1
  145. package/dist/src/commands/re-export-register.js +1 -1
  146. package/dist/src/commands/re-export-scan.d.ts +1 -1
  147. package/dist/src/commands/re-export-scan.js +7 -7
  148. package/dist/src/commands/re-export-single.d.ts +1 -1
  149. package/dist/src/commands/re-export-single.js +20 -20
  150. package/dist/src/commands/re-export.js +7 -6
  151. package/dist/src/commands/rebase/abort.js +6 -6
  152. package/dist/src/commands/rebase/continue.js +8 -7
  153. package/dist/src/commands/rebase/index.d.ts +1 -1
  154. package/dist/src/commands/rebase/index.js +3 -3
  155. package/dist/src/commands/rebase/patch-loop.js +18 -17
  156. package/dist/src/commands/register.js +5 -5
  157. package/dist/src/commands/reset.js +1 -1
  158. package/dist/src/commands/resolve.d.ts +2 -2
  159. package/dist/src/commands/resolve.js +3 -3
  160. package/dist/src/commands/run.js +26 -26
  161. package/dist/src/commands/setup-support.js +4 -4
  162. package/dist/src/commands/setup.js +1 -1
  163. package/dist/src/commands/source.js +1 -1
  164. package/dist/src/commands/status-check.d.ts +3 -3
  165. package/dist/src/commands/status-check.js +4 -4
  166. package/dist/src/commands/status-json.d.ts +14 -13
  167. package/dist/src/commands/status-json.js +9 -8
  168. package/dist/src/commands/status-output.d.ts +3 -3
  169. package/dist/src/commands/status-output.js +3 -3
  170. package/dist/src/commands/status-ownership.d.ts +3 -3
  171. package/dist/src/commands/status-ownership.js +3 -3
  172. package/dist/src/commands/status.js +22 -22
  173. package/dist/src/commands/test-build-phase.d.ts +1 -1
  174. package/dist/src/commands/test-build-phase.js +17 -17
  175. package/dist/src/commands/test-diagnose.d.ts +1 -1
  176. package/dist/src/commands/test-diagnose.js +20 -20
  177. package/dist/src/commands/test-modes.d.ts +2 -2
  178. package/dist/src/commands/test-modes.js +4 -4
  179. package/dist/src/commands/test-run.d.ts +11 -11
  180. package/dist/src/commands/test-run.js +15 -15
  181. package/dist/src/commands/test-stale-gate.d.ts +12 -12
  182. package/dist/src/commands/test-stale-gate.js +13 -13
  183. package/dist/src/commands/test-verdict.d.ts +6 -6
  184. package/dist/src/commands/test-verdict.js +11 -11
  185. package/dist/src/commands/test.d.ts +3 -3
  186. package/dist/src/commands/test.js +36 -36
  187. package/dist/src/commands/token-coverage.js +3 -3
  188. package/dist/src/commands/token-list.js +5 -5
  189. package/dist/src/commands/token.js +9 -9
  190. package/dist/src/commands/tree.js +19 -19
  191. package/dist/src/commands/typecheck.d.ts +6 -6
  192. package/dist/src/commands/typecheck.js +7 -7
  193. package/dist/src/commands/verify.d.ts +3 -3
  194. package/dist/src/commands/verify.js +10 -10
  195. package/dist/src/commands/watch.js +11 -11
  196. package/dist/src/commands/wire.js +13 -13
  197. package/dist/src/core/ast-utils.d.ts +7 -7
  198. package/dist/src/core/ast-utils.js +8 -8
  199. package/dist/src/core/branding.d.ts +5 -5
  200. package/dist/src/core/branding.js +3 -3
  201. package/dist/src/core/browser-wire.d.ts +1 -1
  202. package/dist/src/core/browser-wire.js +4 -4
  203. package/dist/src/core/build-audit-platform.d.ts +6 -6
  204. package/dist/src/core/build-audit-platform.js +26 -26
  205. package/dist/src/core/build-audit-registration.d.ts +5 -5
  206. package/dist/src/core/build-audit-registration.js +7 -7
  207. package/dist/src/core/build-audit-resolve.d.ts +5 -5
  208. package/dist/src/core/build-audit-resolve.js +6 -6
  209. package/dist/src/core/build-audit-skip.d.ts +8 -8
  210. package/dist/src/core/build-audit-skip.js +12 -12
  211. package/dist/src/core/build-audit-transforms.d.ts +2 -2
  212. package/dist/src/core/build-audit-transforms.js +3 -3
  213. package/dist/src/core/build-audit.d.ts +8 -8
  214. package/dist/src/core/build-audit.js +39 -37
  215. package/dist/src/core/build-baseline-types.d.ts +19 -18
  216. package/dist/src/core/build-baseline-types.js +1 -1
  217. package/dist/src/core/build-baseline.d.ts +8 -8
  218. package/dist/src/core/build-baseline.js +14 -14
  219. package/dist/src/core/build-jar-escalation.d.ts +8 -8
  220. package/dist/src/core/build-jar-escalation.js +15 -15
  221. package/dist/src/core/build-overwrite-guard.d.ts +4 -4
  222. package/dist/src/core/build-overwrite-guard.js +13 -13
  223. package/dist/src/core/build-prepare.d.ts +4 -4
  224. package/dist/src/core/build-prepare.js +16 -15
  225. package/dist/src/core/config-mutate.js +4 -4
  226. package/dist/src/core/config-state.js +2 -2
  227. package/dist/src/core/config-validate-build-audit.js +3 -3
  228. package/dist/src/core/config-validate-file-size.d.ts +1 -1
  229. package/dist/src/core/config-validate-file-size.js +2 -2
  230. package/dist/src/core/config-validate.js +8 -9
  231. package/dist/src/core/config.d.ts +10 -10
  232. package/dist/src/core/config.js +10 -10
  233. package/dist/src/core/coverage-extend.d.ts +16 -16
  234. package/dist/src/core/coverage-extend.js +16 -16
  235. package/dist/src/core/destructive.d.ts +14 -14
  236. package/dist/src/core/destructive.js +9 -9
  237. package/dist/src/core/diff-hunks.d.ts +2 -2
  238. package/dist/src/core/diff-hunks.js +7 -7
  239. package/dist/src/core/discard-baseline.d.ts +10 -10
  240. package/dist/src/core/discard-baseline.js +15 -16
  241. package/dist/src/core/display-state.d.ts +11 -11
  242. package/dist/src/core/display-state.js +12 -12
  243. package/dist/src/core/engine-changes.d.ts +2 -2
  244. package/dist/src/core/engine-changes.js +2 -2
  245. package/dist/src/core/engine-precondition.d.ts +4 -4
  246. package/dist/src/core/engine-precondition.js +2 -2
  247. package/dist/src/core/engine-session-lock.d.ts +18 -18
  248. package/dist/src/core/engine-session-lock.js +37 -37
  249. package/dist/src/core/export-moved-code-shape.d.ts +7 -7
  250. package/dist/src/core/export-moved-code-shape.js +8 -8
  251. package/dist/src/core/file-lock-owner.d.ts +11 -11
  252. package/dist/src/core/file-lock-owner.js +18 -18
  253. package/dist/src/core/file-lock.d.ts +12 -12
  254. package/dist/src/core/file-lock.js +52 -39
  255. package/dist/src/core/firefox-cache.d.ts +1 -1
  256. package/dist/src/core/firefox-cache.js +10 -10
  257. package/dist/src/core/firefox-download.d.ts +3 -3
  258. package/dist/src/core/firefox-download.js +6 -6
  259. package/dist/src/core/firefox-extract.d.ts +2 -2
  260. package/dist/src/core/firefox-extract.js +13 -13
  261. package/dist/src/core/firefox.d.ts +5 -5
  262. package/dist/src/core/firefox.js +8 -8
  263. package/dist/src/core/furnace-apply-dry-run.js +1 -1
  264. package/dist/src/core/furnace-apply-ftl.d.ts +5 -5
  265. package/dist/src/core/furnace-apply-ftl.js +8 -8
  266. package/dist/src/core/furnace-apply-helpers.d.ts +9 -9
  267. package/dist/src/core/furnace-apply-helpers.js +21 -21
  268. package/dist/src/core/furnace-apply-output.js +1 -1
  269. package/dist/src/core/furnace-apply-overwrite-warn.d.ts +9 -9
  270. package/dist/src/core/furnace-apply-overwrite-warn.js +9 -9
  271. package/dist/src/core/furnace-apply-undeploy-actions.d.ts +1 -1
  272. package/dist/src/core/furnace-apply-undeploy-actions.js +1 -1
  273. package/dist/src/core/furnace-apply.d.ts +3 -3
  274. package/dist/src/core/furnace-apply.js +22 -21
  275. package/dist/src/core/furnace-checksum-utils.d.ts +5 -5
  276. package/dist/src/core/furnace-checksum-utils.js +5 -5
  277. package/dist/src/core/furnace-config-custom.d.ts +1 -1
  278. package/dist/src/core/furnace-config-custom.js +2 -2
  279. package/dist/src/core/furnace-config-order.js +1 -1
  280. package/dist/src/core/furnace-config-tokens.d.ts +3 -3
  281. package/dist/src/core/furnace-config-tokens.js +3 -3
  282. package/dist/src/core/furnace-config-validate.js +2 -2
  283. package/dist/src/core/furnace-config.d.ts +4 -4
  284. package/dist/src/core/furnace-config.js +18 -18
  285. package/dist/src/core/furnace-constants.d.ts +6 -6
  286. package/dist/src/core/furnace-constants.js +6 -6
  287. package/dist/src/core/furnace-css-fragments.d.ts +6 -6
  288. package/dist/src/core/furnace-css-fragments.js +11 -11
  289. package/dist/src/core/furnace-dir-entry.d.ts +1 -1
  290. package/dist/src/core/furnace-dir-entry.js +1 -1
  291. package/dist/src/core/furnace-jsconfig.d.ts +7 -7
  292. package/dist/src/core/furnace-jsconfig.js +22 -20
  293. package/dist/src/core/furnace-operation.d.ts +21 -20
  294. package/dist/src/core/furnace-operation.js +36 -34
  295. package/dist/src/core/furnace-precondition.d.ts +10 -10
  296. package/dist/src/core/furnace-precondition.js +8 -8
  297. package/dist/src/core/furnace-refresh.js +2 -2
  298. package/dist/src/core/furnace-registration-ast.d.ts +2 -2
  299. package/dist/src/core/furnace-registration-ast.js +9 -9
  300. package/dist/src/core/furnace-registration-remove.d.ts +4 -4
  301. package/dist/src/core/furnace-registration-remove.js +6 -6
  302. package/dist/src/core/furnace-registration-validate.d.ts +2 -2
  303. package/dist/src/core/furnace-registration-validate.js +2 -2
  304. package/dist/src/core/furnace-registration.d.ts +5 -5
  305. package/dist/src/core/furnace-registration.js +7 -7
  306. package/dist/src/core/furnace-rollback.d.ts +1 -1
  307. package/dist/src/core/furnace-rollback.js +5 -5
  308. package/dist/src/core/furnace-stale-export.d.ts +17 -16
  309. package/dist/src/core/furnace-stale-export.js +16 -15
  310. package/dist/src/core/furnace-staleness.d.ts +2 -2
  311. package/dist/src/core/furnace-staleness.js +2 -2
  312. package/dist/src/core/furnace-state-persist.d.ts +10 -10
  313. package/dist/src/core/furnace-state-persist.js +10 -10
  314. package/dist/src/core/furnace-step-errors.d.ts +6 -6
  315. package/dist/src/core/furnace-step-errors.js +6 -6
  316. package/dist/src/core/furnace-validate-accessibility.js +14 -14
  317. package/dist/src/core/furnace-validate-compatibility.js +9 -9
  318. package/dist/src/core/furnace-validate-registration.d.ts +2 -2
  319. package/dist/src/core/furnace-validate-registration.js +13 -13
  320. package/dist/src/core/furnace-validate-structure.d.ts +1 -1
  321. package/dist/src/core/furnace-validate-structure.js +4 -4
  322. package/dist/src/core/furnace-validate.js +9 -9
  323. package/dist/src/core/furnace-version-drift.d.ts +5 -5
  324. package/dist/src/core/furnace-version-drift.js +5 -5
  325. package/dist/src/core/git-base.d.ts +4 -4
  326. package/dist/src/core/git-base.js +9 -9
  327. package/dist/src/core/git-diff-new-file.d.ts +4 -4
  328. package/dist/src/core/git-diff-new-file.js +8 -8
  329. package/dist/src/core/git-diff.d.ts +4 -4
  330. package/dist/src/core/git-diff.js +35 -34
  331. package/dist/src/core/git-file-ops.d.ts +6 -6
  332. package/dist/src/core/git-file-ops.js +7 -7
  333. package/dist/src/core/git-readonly-index.d.ts +12 -12
  334. package/dist/src/core/git-readonly-index.js +12 -12
  335. package/dist/src/core/git-status.d.ts +4 -4
  336. package/dist/src/core/git-status.js +4 -4
  337. package/dist/src/core/git.d.ts +3 -3
  338. package/dist/src/core/git.js +14 -14
  339. package/dist/src/core/harness-orphans.d.ts +17 -17
  340. package/dist/src/core/harness-orphans.js +20 -20
  341. package/dist/src/core/history-log.d.ts +3 -3
  342. package/dist/src/core/history-log.js +3 -3
  343. package/dist/src/core/license-headers.d.ts +19 -18
  344. package/dist/src/core/license-headers.js +29 -28
  345. package/dist/src/core/mach-build-artifacts.d.ts +21 -21
  346. package/dist/src/core/mach-build-artifacts.js +23 -23
  347. package/dist/src/core/mach-error-hints.d.ts +5 -5
  348. package/dist/src/core/mach-error-hints.js +13 -13
  349. package/dist/src/core/mach-known-noise-filter.d.ts +41 -38
  350. package/dist/src/core/mach-known-noise-filter.js +53 -50
  351. package/dist/src/core/mach-mozconfig.d.ts +6 -6
  352. package/dist/src/core/mach-mozconfig.js +15 -15
  353. package/dist/src/core/mach-python.d.ts +2 -1
  354. package/dist/src/core/mach-python.js +4 -3
  355. package/dist/src/core/mach-resource-shim.d.ts +12 -12
  356. package/dist/src/core/mach-resource-shim.js +20 -20
  357. package/dist/src/core/mach.d.ts +23 -23
  358. package/dist/src/core/mach.js +36 -36
  359. package/dist/src/core/marionette-port.d.ts +15 -13
  360. package/dist/src/core/marionette-port.js +34 -31
  361. package/dist/src/core/marionette-preflight.d.ts +6 -6
  362. package/dist/src/core/marionette-preflight.js +23 -23
  363. package/dist/src/core/markdown-table.d.ts +9 -9
  364. package/dist/src/core/markdown-table.js +14 -14
  365. package/dist/src/core/mochitest-server-port.d.ts +8 -8
  366. package/dist/src/core/mochitest-server-port.js +14 -14
  367. package/dist/src/core/module-resolution-preflight.d.ts +8 -8
  368. package/dist/src/core/module-resolution-preflight.js +11 -11
  369. package/dist/src/core/moz-manifest-helpers.d.ts +7 -7
  370. package/dist/src/core/moz-manifest-helpers.js +7 -7
  371. package/dist/src/core/moz-manifest-register.d.ts +1 -1
  372. package/dist/src/core/moz-manifest-register.js +2 -2
  373. package/dist/src/core/moz-manifest-rules.js +11 -11
  374. package/dist/src/core/moz-manifest-tokenizers.js +1 -1
  375. package/dist/src/core/ownership-table.d.ts +5 -5
  376. package/dist/src/core/ownership-table.js +7 -7
  377. package/dist/src/core/parser-fallback.d.ts +3 -3
  378. package/dist/src/core/parser-fallback.js +3 -3
  379. package/dist/src/core/patch-apply-fuzz.d.ts +5 -5
  380. package/dist/src/core/patch-apply-fuzz.js +9 -9
  381. package/dist/src/core/patch-apply.d.ts +9 -9
  382. package/dist/src/core/patch-apply.js +30 -30
  383. package/dist/src/core/patch-export-update.d.ts +4 -4
  384. package/dist/src/core/patch-export-update.js +3 -3
  385. package/dist/src/core/patch-export.d.ts +10 -10
  386. package/dist/src/core/patch-export.js +13 -13
  387. package/dist/src/core/patch-identifier-suggest.d.ts +1 -1
  388. package/dist/src/core/patch-identifier-suggest.js +4 -4
  389. package/dist/src/core/patch-lint-binary.d.ts +7 -7
  390. package/dist/src/core/patch-lint-cache.d.ts +2 -2
  391. package/dist/src/core/patch-lint-cache.js +13 -13
  392. package/dist/src/core/patch-lint-checkjs.d.ts +26 -26
  393. package/dist/src/core/patch-lint-checkjs.js +42 -41
  394. package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +8 -9
  395. package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -11
  396. package/dist/src/core/patch-lint-creators.d.ts +3 -3
  397. package/dist/src/core/patch-lint-creators.js +3 -3
  398. package/dist/src/core/patch-lint-cross.d.ts +13 -13
  399. package/dist/src/core/patch-lint-cross.js +21 -21
  400. package/dist/src/core/patch-lint-css.d.ts +1 -1
  401. package/dist/src/core/patch-lint-css.js +5 -5
  402. package/dist/src/core/patch-lint-diff-tag.d.ts +5 -5
  403. package/dist/src/core/patch-lint-diff-tag.js +5 -5
  404. package/dist/src/core/patch-lint-diff.d.ts +4 -4
  405. package/dist/src/core/patch-lint-diff.js +4 -4
  406. package/dist/src/core/patch-lint-file-size.d.ts +3 -3
  407. package/dist/src/core/patch-lint-file-size.js +3 -3
  408. package/dist/src/core/patch-lint-forward-registration.d.ts +4 -4
  409. package/dist/src/core/patch-lint-forward-registration.js +12 -12
  410. package/dist/src/core/patch-lint-jsdoc.d.ts +2 -2
  411. package/dist/src/core/patch-lint-jsdoc.js +11 -11
  412. package/dist/src/core/patch-lint-module-registration.d.ts +1 -1
  413. package/dist/src/core/patch-lint-module-registration.js +1 -1
  414. package/dist/src/core/patch-lint-mozbuild.d.ts +1 -1
  415. package/dist/src/core/patch-lint-mozbuild.js +10 -10
  416. package/dist/src/core/patch-lint-observer.d.ts +3 -3
  417. package/dist/src/core/patch-lint-observer.js +7 -7
  418. package/dist/src/core/patch-lint-ownership.d.ts +6 -6
  419. package/dist/src/core/patch-lint-ownership.js +6 -6
  420. package/dist/src/core/patch-lint-prettier.d.ts +6 -6
  421. package/dist/src/core/patch-lint-prettier.js +6 -6
  422. package/dist/src/core/patch-lint-queue-types.d.ts +1 -1
  423. package/dist/src/core/patch-lint-queue-types.js +1 -1
  424. package/dist/src/core/patch-lint-staged-registration.d.ts +2 -2
  425. package/dist/src/core/patch-lint-staged-registration.js +6 -6
  426. package/dist/src/core/patch-lint-unmanaged-companion.d.ts +23 -23
  427. package/dist/src/core/patch-lint-unmanaged-companion.js +26 -26
  428. package/dist/src/core/patch-lint.d.ts +27 -26
  429. package/dist/src/core/patch-lint.js +48 -46
  430. package/dist/src/core/patch-lock.d.ts +1 -1
  431. package/dist/src/core/patch-lock.js +8 -8
  432. package/dist/src/core/patch-manifest-consistency.d.ts +7 -7
  433. package/dist/src/core/patch-manifest-consistency.js +16 -17
  434. package/dist/src/core/patch-manifest-files-affected.d.ts +1 -1
  435. package/dist/src/core/patch-manifest-files-affected.js +3 -3
  436. package/dist/src/core/patch-manifest-io.d.ts +14 -14
  437. package/dist/src/core/patch-manifest-io.js +27 -27
  438. package/dist/src/core/patch-manifest-query.d.ts +1 -1
  439. package/dist/src/core/patch-manifest-query.js +4 -4
  440. package/dist/src/core/patch-manifest-resolve.d.ts +5 -5
  441. package/dist/src/core/patch-manifest-resolve.js +7 -7
  442. package/dist/src/core/patch-manifest-validate.js +3 -3
  443. package/dist/src/core/patch-manifest.d.ts +2 -2
  444. package/dist/src/core/patch-manifest.js +2 -2
  445. package/dist/src/core/patch-parse.d.ts +14 -14
  446. package/dist/src/core/patch-parse.js +16 -16
  447. package/dist/src/core/patch-registration-refs.d.ts +4 -4
  448. package/dist/src/core/patch-registration-refs.js +7 -7
  449. package/dist/src/core/patch-transform.d.ts +8 -8
  450. package/dist/src/core/patch-transform.js +13 -13
  451. package/dist/src/core/process-cpu-time.d.ts +1 -1
  452. package/dist/src/core/process-cpu-time.js +5 -5
  453. package/dist/src/core/rebase-session.d.ts +7 -7
  454. package/dist/src/core/rebase-session.js +8 -8
  455. package/dist/src/core/register-result.d.ts +1 -1
  456. package/dist/src/core/register-result.js +1 -1
  457. package/dist/src/core/register-scaffold.d.ts +2 -2
  458. package/dist/src/core/register-scaffold.js +3 -3
  459. package/dist/src/core/register-shared-css.d.ts +3 -3
  460. package/dist/src/core/register-shared-css.js +4 -4
  461. package/dist/src/core/register-xpcshell-test.d.ts +2 -2
  462. package/dist/src/core/register-xpcshell-test.js +2 -2
  463. package/dist/src/core/run-log-redact.d.ts +12 -12
  464. package/dist/src/core/run-log-redact.js +16 -16
  465. package/dist/src/core/run-log.d.ts +9 -9
  466. package/dist/src/core/run-log.js +14 -14
  467. package/dist/src/core/shared-ftl.d.ts +2 -2
  468. package/dist/src/core/shared-ftl.js +6 -6
  469. package/dist/src/core/signal-critical.d.ts +2 -2
  470. package/dist/src/core/signal-critical.js +2 -2
  471. package/dist/src/core/smoke-patterns.d.ts +5 -5
  472. package/dist/src/core/smoke-patterns.js +9 -9
  473. package/dist/src/core/state-file.d.ts +3 -3
  474. package/dist/src/core/status-binary.d.ts +8 -8
  475. package/dist/src/core/status-binary.js +12 -12
  476. package/dist/src/core/status-classify.d.ts +17 -17
  477. package/dist/src/core/status-classify.js +11 -11
  478. package/dist/src/core/test-changed-prefs.d.ts +12 -12
  479. package/dist/src/core/test-changed-prefs.js +15 -15
  480. package/dist/src/core/test-harness-crash.d.ts +39 -39
  481. package/dist/src/core/test-harness-crash.js +67 -67
  482. package/dist/src/core/test-harness-output.d.ts +7 -7
  483. package/dist/src/core/test-harness-output.js +7 -7
  484. package/dist/src/core/test-harness-verdict-notes.d.ts +13 -14
  485. package/dist/src/core/test-harness-verdict-notes.js +4 -4
  486. package/dist/src/core/test-path-scope.d.ts +8 -8
  487. package/dist/src/core/test-path-scope.js +11 -11
  488. package/dist/src/core/test-stale-check.d.ts +22 -21
  489. package/dist/src/core/test-stale-check.js +29 -28
  490. package/dist/src/core/test-stale-symlink.d.ts +1 -1
  491. package/dist/src/core/test-stale-symlink.js +1 -1
  492. package/dist/src/core/test-stall-triage.d.ts +9 -9
  493. package/dist/src/core/test-stall-triage.js +22 -22
  494. package/dist/src/core/token-category.d.ts +4 -4
  495. package/dist/src/core/token-category.js +13 -12
  496. package/dist/src/core/token-coverage.js +4 -5
  497. package/dist/src/core/token-dark-mode.d.ts +9 -9
  498. package/dist/src/core/token-dark-mode.js +11 -11
  499. package/dist/src/core/token-docs.d.ts +1 -1
  500. package/dist/src/core/token-inventory.d.ts +6 -6
  501. package/dist/src/core/token-inventory.js +7 -7
  502. package/dist/src/core/token-manager.d.ts +3 -3
  503. package/dist/src/core/token-manager.js +21 -21
  504. package/dist/src/core/token-scaffold.d.ts +4 -4
  505. package/dist/src/core/token-scaffold.js +4 -4
  506. package/dist/src/core/token-variant.d.ts +14 -14
  507. package/dist/src/core/token-variant.js +32 -32
  508. package/dist/src/core/toolchain-preflight.d.ts +15 -15
  509. package/dist/src/core/toolchain-preflight.js +22 -22
  510. package/dist/src/core/tree-cow.d.ts +3 -3
  511. package/dist/src/core/tree-cow.js +6 -6
  512. package/dist/src/core/tree-guard.d.ts +3 -3
  513. package/dist/src/core/tree-guard.js +23 -23
  514. package/dist/src/core/tree-store.d.ts +15 -15
  515. package/dist/src/core/tree-store.js +35 -33
  516. package/dist/src/core/typecheck-shim.d.ts +16 -15
  517. package/dist/src/core/typecheck-shim.js +26 -25
  518. package/dist/src/core/typecheck.d.ts +12 -12
  519. package/dist/src/core/typecheck.js +31 -31
  520. package/dist/src/core/wire-destroy.d.ts +2 -2
  521. package/dist/src/core/wire-destroy.js +5 -5
  522. package/dist/src/core/wire-dom-fragment.d.ts +3 -3
  523. package/dist/src/core/wire-dom-fragment.js +6 -6
  524. package/dist/src/core/wire-init.d.ts +2 -2
  525. package/dist/src/core/wire-init.js +7 -7
  526. package/dist/src/core/wire-subscript.d.ts +1 -1
  527. package/dist/src/core/wire-subscript.js +3 -3
  528. package/dist/src/core/wire-utils.d.ts +9 -9
  529. package/dist/src/core/wire-utils.js +11 -11
  530. package/dist/src/core/xpcshell-appdir.d.ts +20 -20
  531. package/dist/src/core/xpcshell-appdir.js +26 -26
  532. package/dist/src/core/xpcshell-profile-dir.d.ts +3 -3
  533. package/dist/src/core/xpcshell-profile-dir.js +7 -7
  534. package/dist/src/errors/base.d.ts +22 -21
  535. package/dist/src/errors/base.js +22 -21
  536. package/dist/src/errors/build.d.ts +6 -6
  537. package/dist/src/errors/build.js +6 -6
  538. package/dist/src/errors/codes.d.ts +10 -10
  539. package/dist/src/errors/codes.js +10 -10
  540. package/dist/src/errors/furnace.d.ts +2 -2
  541. package/dist/src/errors/git.d.ts +1 -1
  542. package/dist/src/errors/git.js +1 -1
  543. package/dist/src/errors/patch.d.ts +3 -3
  544. package/dist/src/errors/patch.js +3 -3
  545. package/dist/src/errors/rebase.d.ts +1 -1
  546. package/dist/src/errors/rebase.js +1 -1
  547. package/dist/src/errors/run.d.ts +1 -1
  548. package/dist/src/errors/run.js +1 -1
  549. package/dist/src/index.d.ts +4 -4
  550. package/dist/src/index.js +4 -4
  551. package/dist/src/types/commands/options.d.ts +86 -85
  552. package/dist/src/types/commands/patches.d.ts +19 -19
  553. package/dist/src/types/commands/project.d.ts +3 -3
  554. package/dist/src/types/config.d.ts +24 -23
  555. package/dist/src/types/furnace.d.ts +17 -17
  556. package/dist/src/types/json.d.ts +3 -3
  557. package/dist/src/types/json.js +2 -2
  558. package/dist/src/types/typecheck.d.ts +3 -3
  559. package/dist/src/utils/assert.d.ts +1 -1
  560. package/dist/src/utils/assert.js +6 -6
  561. package/dist/src/utils/build-info.d.ts +5 -5
  562. package/dist/src/utils/build-info.js +6 -6
  563. package/dist/src/utils/child-env.d.ts +5 -5
  564. package/dist/src/utils/child-env.js +5 -5
  565. package/dist/src/utils/concurrency.d.ts +2 -2
  566. package/dist/src/utils/concurrency.js +2 -2
  567. package/dist/src/utils/elapsed.js +1 -1
  568. package/dist/src/utils/errors.d.ts +8 -8
  569. package/dist/src/utils/errors.js +8 -8
  570. package/dist/src/utils/fs.d.ts +1 -1
  571. package/dist/src/utils/fs.js +8 -8
  572. package/dist/src/utils/line-dispatch.d.ts +3 -3
  573. package/dist/src/utils/line-dispatch.js +5 -5
  574. package/dist/src/utils/logger.d.ts +4 -4
  575. package/dist/src/utils/logger.js +11 -11
  576. package/dist/src/utils/machine-output.js +2 -2
  577. package/dist/src/utils/options.d.ts +13 -13
  578. package/dist/src/utils/options.js +20 -20
  579. package/dist/src/utils/package-root.js +2 -2
  580. package/dist/src/utils/paths.d.ts +4 -4
  581. package/dist/src/utils/paths.js +4 -4
  582. package/dist/src/utils/process-group.d.ts +8 -8
  583. package/dist/src/utils/process-group.js +19 -19
  584. package/dist/src/utils/process.d.ts +34 -33
  585. package/dist/src/utils/process.js +20 -19
  586. package/dist/src/utils/ps-duration.d.ts +4 -4
  587. package/dist/src/utils/ps-duration.js +6 -6
  588. package/dist/src/utils/regex.d.ts +4 -4
  589. package/dist/src/utils/regex.js +7 -7
  590. package/dist/src/utils/sleep.d.ts +7 -7
  591. package/dist/src/utils/sleep.js +7 -7
  592. package/dist/src/utils/stdio-drain.d.ts +7 -7
  593. package/dist/src/utils/stdio-drain.js +8 -8
  594. package/dist/src/utils/validation.d.ts +11 -12
  595. package/dist/src/utils/validation.js +20 -21
  596. package/docs/README.md +2 -2
  597. package/docs/configuration.md +120 -114
  598. package/docs/exit-codes.md +63 -58
  599. package/docs/furnace.md +20 -19
  600. package/docs/lifecycle-invariants.md +412 -251
  601. package/docs/machine-output.md +33 -32
  602. package/docs/patch-workflow.md +48 -45
  603. package/docs/run-logs.md +62 -58
  604. package/docs/testing.md +101 -101
  605. package/docs/verification-trees.md +23 -22
  606. package/package.json +2 -2
@@ -9,13 +9,13 @@ export interface EngineSessionLockOptions {
9
9
  waitLockSeconds?: number | undefined;
10
10
  }
11
11
  /**
12
- * Formats the notice printed when the wait budget is EXTENDED because the
12
+ * Formats the notice printed when the wait budget is extended because the
13
13
  * queue advanced.
14
14
  *
15
- * Exported for direct unit testing. It names both figures — the requested
16
- * budget and the one now in force — because the whole point is that the two
17
- * have diverged, and an operator comparing the elapsed time against the
18
- * number they typed would otherwise conclude the timeout is broken.
15
+ * Exported for direct unit testing. It names both figures, the requested
16
+ * budget and the one now in force, because they have diverged and an
17
+ * operator comparing the elapsed time against the number they typed would
18
+ * otherwise conclude the timeout is broken.
19
19
  */
20
20
  export declare function formatWaitExtendedLine(ahead: number, budgetMs: number, requestedMs: number): string;
21
21
  /**
@@ -24,8 +24,8 @@ export declare function formatWaitExtendedLine(ahead: number, budgetMs: number,
24
24
  */
25
25
  export declare function withEngineSessionLock<T>(projectRoot: string, command: string, operation: () => Promise<T>, options?: EngineSessionLockOptions): Promise<T>;
26
26
  /**
27
- * Inspects the project's engine-session lock without acquiring it —
28
- * backing `fireforge status --lock`.
27
+ * Inspects the project's engine-session lock without acquiring it, backing
28
+ * `fireforge status --lock`.
29
29
  *
30
30
  * @param projectRoot - Project root containing `.fireforge/`
31
31
  * @returns Holder identity, hold duration, and queue depth
@@ -52,7 +52,7 @@ export declare function snapshotEngineGeneration(engineDir: string): Promise<str
52
52
  */
53
53
  export declare function isIndexLockError(error: unknown): boolean;
54
54
  /**
55
- * True when a generation token records a failed probe — i.e. nothing was
55
+ * True when a generation token records a failed probe, i.e. nothing was
56
56
  * measured, so the token must never be compared (or hashed) as if it
57
57
  * described the engine's state.
58
58
  */
@@ -62,8 +62,8 @@ export declare function unavailableGenerationReason(token: string): string;
62
62
  /**
63
63
  * Describes what moved between two generation tokens, in operator terms.
64
64
  *
65
- * The refusal used to say only THAT the engine changed, which left the
66
- * operator to reconstruct the writer by hand — `find -newermt` against the
65
+ * The refusal used to say only that the engine changed, which left the
66
+ * operator to reconstruct the writer by hand: `find -newermt` against the
67
67
  * run window, minus the objdir, minus git's own bookkeeping. Everything
68
68
  * needed to answer it is already in the two tokens, so the refusal answers
69
69
  * it. Pure and total: an unparseable token yields an empty list rather than
@@ -72,7 +72,7 @@ export declare function unavailableGenerationReason(token: string): string;
72
72
  *
73
73
  * @param before - Token captured before the run
74
74
  * @param after - Token captured after the run
75
- * @returns Human-readable lines describing the delta; empty when nothing
75
+ * @returns Human-readable lines describing the delta. Empty when nothing
76
76
  * could be attributed
77
77
  */
78
78
  export declare function describeEngineGenerationDelta(before: string, after: string): string[];
@@ -80,25 +80,25 @@ export declare function describeEngineGenerationDelta(before: string, after: str
80
80
  * Throws when the engine's generation token differs from `before`, i.e. the
81
81
  * engine was mutated by another writer while a test run was in flight.
82
82
  *
83
- * **An unmeasurable engine warns rather than throws.** `engine/` is not
84
- * always a git checkout — `fireforge download` extracts a source tarball —
83
+ * An unmeasurable engine warns rather than throws. `engine/` is not
84
+ * always a git checkout (`fireforge download` extracts a source tarball),
85
85
  * so a failed probe is a legitimate state and must not fail the run.
86
86
  *
87
- * What it must also not do is pass *silently*. A failure token compared for
87
+ * It must also not pass silently. A failure token compared for
88
88
  * equality like any other would let a git failure that reproduces across
89
89
  * both probes (unreadable `.git`, a permissions problem, a corrupt index)
90
90
  * take the `after === before` early return and bless a verdict the guard
91
- * never verified. Two *differing* failure messages are worse still: they
91
+ * never verified. Two differing failure messages are worse still: they
92
92
  * fall through to the mutation branch and report a spurious
93
93
  * "engine/ changed". Hence the prefix comparison rather than a token
94
- * comparison — the token embeds the error message, and two genuine failures
94
+ * comparison: the token embeds the error message, and two genuine failures
95
95
  * rarely phrase it identically.
96
96
  *
97
- * The tolerance is deliberately limited to a probe that failed *both* times:
97
+ * The tolerance is limited to a probe that failed both times:
98
98
  * that is the steady state of a non-git `engine/`, and it warns. A one-sided
99
99
  * transition is not that state. An `engine/` that was measurable and then
100
100
  * was not means the second probe measured nothing about a checkout that
101
- * demonstrably had something to measure; the reverse means there was never a
101
+ * demonstrably had something to measure. The reverse means there was never a
102
102
  * baseline to compare against. Neither verdict can be trusted, so both throw.
103
103
  */
104
104
  export declare function assertEngineGenerationUnchanged(engineDir: string, before: string): Promise<void>;
@@ -18,7 +18,7 @@ const MAX_WAIT_LOCK_MS = 3600 * 1000;
18
18
  /**
19
19
  * Formats the periodic operator-facing waiting line printed while `--wait-lock`
20
20
  * polls a contended engine session lock. The holder identification comes from
21
- * the lock's owner-metadata lines (`command=…`, `started=…`); an unreadable
21
+ * the lock's owner-metadata lines (`command=…`, `started=…`). An unreadable
22
22
  * owner file degrades to the anonymous form.
23
23
  */
24
24
  function formatWaitProgressLine(waitedMs, timeoutMs, holder, queue) {
@@ -37,13 +37,13 @@ function formatWaitProgressLine(waitedMs, timeoutMs, holder, queue) {
37
37
  return `Waiting for the FireForge engine lock held by PID ${holder.pid}${details} — ${progress}.${position}`;
38
38
  }
39
39
  /**
40
- * Formats the notice printed when the wait budget is EXTENDED because the
40
+ * Formats the notice printed when the wait budget is extended because the
41
41
  * queue advanced.
42
42
  *
43
- * Exported for direct unit testing. It names both figures — the requested
44
- * budget and the one now in force — because the whole point is that the two
45
- * have diverged, and an operator comparing the elapsed time against the
46
- * number they typed would otherwise conclude the timeout is broken.
43
+ * Exported for direct unit testing. It names both figures, the requested
44
+ * budget and the one now in force, because they have diverged and an
45
+ * operator comparing the elapsed time against the number they typed would
46
+ * otherwise conclude the timeout is broken.
47
47
  */
48
48
  export function formatWaitExtendedLine(ahead, budgetMs, requestedMs) {
49
49
  const position = ahead === 0 ? 'you are now next' : `${ahead} still ahead of you`;
@@ -57,11 +57,11 @@ export function formatWaitExtendedLine(ahead, budgetMs, requestedMs) {
57
57
  * one engine-mutating FireForge command touches `engine/` at a time.
58
58
  */
59
59
  export async function withEngineSessionLock(projectRoot, command, operation, options = {}) {
60
- // The lock is bypassed under test by default, and that is deliberate: the
60
+ // The lock is bypassed under test by default, on purpose: the
61
61
  // suite runs many engine-mutating commands in-process, which would either
62
62
  // serialise on this lock or deadlock outright.
63
63
  // `FIREFORGE_ENABLE_ENGINE_SESSION_LOCK_IN_TEST=1` lets the lock's own
64
- // tests opt back in. Do not delete this branch — it is the reason the
64
+ // tests opt back in. Do not delete this branch. It is the reason the
65
65
  // suite completes.
66
66
  if (process.env['FIREFORGE_ENABLE_ENGINE_SESSION_LOCK_IN_TEST'] !== '1' &&
67
67
  (process.env['NODE_ENV'] === 'test' || process.env['VITEST'] !== undefined)) {
@@ -78,30 +78,30 @@ export async function withEngineSessionLock(projectRoot, command, operation, opt
78
78
  onWaitProgress: ({ waitedMs, timeoutMs, holder, queue }) => {
79
79
  info(formatWaitProgressLine(waitedMs, timeoutMs, holder, queue));
80
80
  },
81
- // Say it out loud. An extension is the moment the budget the
81
+ // Announce it. An extension is the moment the budget the
82
82
  // operator asked for stops being the budget in force, and a wait
83
83
  // that silently outlives its own stated timeout is
84
- // indistinguishable from a broken one — which is how a downstream
84
+ // indistinguishable from a broken one, which is how a downstream
85
85
  // fork read it.
86
86
  onWaitExtended: ({ ahead, budgetMs }) => {
87
87
  info(formatWaitExtendedLine(ahead, budgetMs, waitLockSeconds * 1000));
88
88
  },
89
89
  // A budget that expires one position from the head pays the whole
90
- // wait for nothing. While the queue is still MOVING the wait is
91
- // working, so each advance renews the budget — up to a hard
92
- // ceiling, so a pathological queue cannot wait forever. The
93
- // no-flag fail-fast path deliberately gets none of this.
90
+ // wait for nothing. While the queue is still moving the wait is
91
+ // working, so each advance renews the budget, up to a hard
92
+ // ceiling so a pathological queue cannot wait forever. The
93
+ // no-flag fail-fast path gets none of this.
94
94
  extendWhileAdvancing: {
95
95
  maxWaitMs: Math.min(waitLockSeconds * 1000 * WAIT_EXTENSION_FACTOR, MAX_WAIT_LOCK_MS),
96
96
  },
97
97
  }
98
98
  : {}),
99
99
  ownerMetadata: [`command=${command}`, `started=${new Date().toISOString()}`],
100
- // Reason first, remedy second — the no-flag default waits
100
+ // Reason first, remedy second: the no-flag default waits
101
101
  // only ~1 s, so contention is the common case and `--wait-lock` is the
102
102
  // genuine remedy. withFileLock appends the holder identification from
103
103
  // the lock's owner metadata. The leading sentence is a message contract
104
- // (pinned by engine-session-lock tests); extend, don't reword.
104
+ // (pinned by engine-session-lock tests). Extend, don't reword.
105
105
  onTimeoutMessage: `Another FireForge engine-mutating command is already running. ` +
106
106
  `Wait for it to finish, then retry \`${command}\` — or pass --wait-lock [seconds] ` +
107
107
  `to wait for the lock (bare --wait-lock waits up to 60 seconds). ` +
@@ -110,8 +110,8 @@ export async function withEngineSessionLock(projectRoot, command, operation, opt
110
110
  });
111
111
  }
112
112
  /**
113
- * Inspects the project's engine-session lock without acquiring it —
114
- * backing `fireforge status --lock`.
113
+ * Inspects the project's engine-session lock without acquiring it, backing
114
+ * `fireforge status --lock`.
115
115
  *
116
116
  * @param projectRoot - Project root containing `.fireforge/`
117
117
  * @returns Holder identity, hold duration, and queue depth
@@ -139,11 +139,11 @@ export function formatEngineSessionLockStatus(snapshot, holderCpuSeconds) {
139
139
  `Engine session lock: ${identity}, for ${elapsed}.`,
140
140
  `Queue depth: ${snapshot.queueDepth} waiter(s).`,
141
141
  ];
142
- // Liveness answers "does the process exist"; it does not answer "is it
142
+ // Liveness answers "does the process exist". It does not answer "is it
143
143
  // getting anywhere". A holder alive for minutes having used a fraction of
144
144
  // a second of CPU is the shape of a wedged command, and every waiter
145
145
  // behind it inherits the stall. Stated as an observation with its own
146
- // caveat — a holder blocked on I/O is also idle, and this must not be read
146
+ // caveat: a holder blocked on I/O is also idle, and this must not be read
147
147
  // as licence to kill anything.
148
148
  if (holder?.alive === true && holderCpuSeconds !== undefined) {
149
149
  const cpu = `${holderCpuSeconds.toFixed(1)}s`;
@@ -175,11 +175,11 @@ export async function snapshotEngineGeneration(engineDir) {
175
175
  }
176
176
  catch (error) {
177
177
  lastError = error;
178
- // A contended `.git/index.lock` is TRANSIENT, not a state: some other
178
+ // A contended `.git/index.lock` is transient, not a state: some other
179
179
  // writer held the index for the instant we looked. Treating it as
180
180
  // "unmeasurable" turns a perfectly good suite into
181
181
  // `FAIL reason=inconclusive` on a one-sided probe failure. Anything
182
- // else — an unreadable `.git`, a non-git `engine/` — is a real state
182
+ // else (an unreadable `.git`, a non-git `engine/`) is a real state
183
183
  // and is reported immediately.
184
184
  if (!isIndexLockError(error) || attempt === GENERATION_PROBE_ATTEMPTS - 1)
185
185
  break;
@@ -202,7 +202,7 @@ export function isIndexLockError(error) {
202
202
  return /index\.lock/i.test(message);
203
203
  }
204
204
  /**
205
- * True when a generation token records a failed probe — i.e. nothing was
205
+ * True when a generation token records a failed probe, i.e. nothing was
206
206
  * measured, so the token must never be compared (or hashed) as if it
207
207
  * described the engine's state.
208
208
  */
@@ -228,9 +228,9 @@ function splitGenerationToken(token) {
228
228
  /**
229
229
  * Parses `git status --porcelain=v1 -z` into `XY path` records.
230
230
  *
231
- * The rename/copy shape is the trap: `R`/`C` entries are followed by a
232
- * SECOND NUL-separated field carrying the original path, and consuming only
233
- * one desynchronises every record after it — turning a one-file rename into
231
+ * The rename/copy shape needs care: `R`/`C` entries are followed by a
232
+ * second NUL-separated field carrying the original path, and consuming only
233
+ * one desynchronises every record after it, turning a one-file rename into
234
234
  * a report that the whole tree moved. Both fields are consumed and the
235
235
  * record renders as `orig -> new`.
236
236
  */
@@ -239,7 +239,7 @@ function parsePorcelainRecords(body) {
239
239
  const records = [];
240
240
  for (let i = 0; i < fields.length; i++) {
241
241
  const field = fields[i] ?? '';
242
- // `XY ` — two status characters and a space — then the path.
242
+ // `XY `, two status characters and a space, then the path.
243
243
  if (field.length < 4)
244
244
  continue;
245
245
  const status = field.slice(0, 2);
@@ -257,8 +257,8 @@ function parsePorcelainRecords(body) {
257
257
  /**
258
258
  * Describes what moved between two generation tokens, in operator terms.
259
259
  *
260
- * The refusal used to say only THAT the engine changed, which left the
261
- * operator to reconstruct the writer by hand — `find -newermt` against the
260
+ * The refusal used to say only that the engine changed, which left the
261
+ * operator to reconstruct the writer by hand: `find -newermt` against the
262
262
  * run window, minus the objdir, minus git's own bookkeeping. Everything
263
263
  * needed to answer it is already in the two tokens, so the refusal answers
264
264
  * it. Pure and total: an unparseable token yields an empty list rather than
@@ -267,7 +267,7 @@ function parsePorcelainRecords(body) {
267
267
  *
268
268
  * @param before - Token captured before the run
269
269
  * @param after - Token captured after the run
270
- * @returns Human-readable lines describing the delta; empty when nothing
270
+ * @returns Human-readable lines describing the delta. Empty when nothing
271
271
  * could be attributed
272
272
  */
273
273
  export function describeEngineGenerationDelta(before, after) {
@@ -296,25 +296,25 @@ export function describeEngineGenerationDelta(before, after) {
296
296
  * Throws when the engine's generation token differs from `before`, i.e. the
297
297
  * engine was mutated by another writer while a test run was in flight.
298
298
  *
299
- * **An unmeasurable engine warns rather than throws.** `engine/` is not
300
- * always a git checkout — `fireforge download` extracts a source tarball —
299
+ * An unmeasurable engine warns rather than throws. `engine/` is not
300
+ * always a git checkout (`fireforge download` extracts a source tarball),
301
301
  * so a failed probe is a legitimate state and must not fail the run.
302
302
  *
303
- * What it must also not do is pass *silently*. A failure token compared for
303
+ * It must also not pass silently. A failure token compared for
304
304
  * equality like any other would let a git failure that reproduces across
305
305
  * both probes (unreadable `.git`, a permissions problem, a corrupt index)
306
306
  * take the `after === before` early return and bless a verdict the guard
307
- * never verified. Two *differing* failure messages are worse still: they
307
+ * never verified. Two differing failure messages are worse still: they
308
308
  * fall through to the mutation branch and report a spurious
309
309
  * "engine/ changed". Hence the prefix comparison rather than a token
310
- * comparison — the token embeds the error message, and two genuine failures
310
+ * comparison: the token embeds the error message, and two genuine failures
311
311
  * rarely phrase it identically.
312
312
  *
313
- * The tolerance is deliberately limited to a probe that failed *both* times:
313
+ * The tolerance is limited to a probe that failed both times:
314
314
  * that is the steady state of a non-git `engine/`, and it warns. A one-sided
315
315
  * transition is not that state. An `engine/` that was measurable and then
316
316
  * was not means the second probe measured nothing about a checkout that
317
- * demonstrably had something to measure; the reverse means there was never a
317
+ * demonstrably had something to measure. The reverse means there was never a
318
318
  * baseline to compare against. Neither verdict can be trusted, so both throw.
319
319
  */
320
320
  export async function assertEngineGenerationUnchanged(engineDir, before) {
@@ -2,23 +2,23 @@
2
2
  * Detects the new-file-plus-moved-code slice shape and names the working
3
3
  * sequence through it.
4
4
  *
5
- * A slice that ADDS new files and MOVES lines into them from an existing
5
+ * A slice that adds new files and moves lines into them from an existing
6
6
  * patch has no path through the two refusal flags:
7
7
  *
8
8
  * - `re-export --refuse-adjacent-unmanaged` refuses while the new files are
9
- * still unmanaged; and
9
+ * still unmanaged, and
10
10
  * - exporting the new files as their own patch fails cross-patch lint,
11
- * because at the projected placement the OLD patch still contains the
11
+ * because at the projected placement the old patch still contains the
12
12
  * moved code.
13
13
  *
14
14
  * Each guard is individually correct. Together they dead-end, and the way out
15
- * is non-obvious: adopt the new files into the OLD patch first
15
+ * is non-obvious: adopt the new files into the old patch first
16
16
  * (`re-export --scan --scan-file`), then split them out into a patch of their
17
17
  * own (`patch move-files --create --order N`).
18
18
  *
19
- * This module recognises the shape from evidence FireForge already has — the
19
+ * This module recognises the shape from evidence FireForge already has (the
20
20
  * pending diff's new-file content versus the added lines the existing patches
21
- * carry — so the refusal can name the sequence instead of leaving the
21
+ * carry), so the refusal can name the sequence instead of leaving the
22
22
  * operator to derive it.
23
23
  */
24
24
  /** One existing patch that already carries lines the new files would add. */
@@ -37,7 +37,7 @@ export interface MovedCodeQueueEntry {
37
37
  }
38
38
  /**
39
39
  * Finds existing patches that still carry substantive lines the pending
40
- * diff's NEW files would add — the fingerprint of code moved out of an
40
+ * diff's new files would add, the fingerprint of code moved out of an
41
41
  * existing patch into a new file.
42
42
  *
43
43
  * Pure. Overlaps are returned strongest-first so the message names the
@@ -3,23 +3,23 @@
3
3
  * Detects the new-file-plus-moved-code slice shape and names the working
4
4
  * sequence through it.
5
5
  *
6
- * A slice that ADDS new files and MOVES lines into them from an existing
6
+ * A slice that adds new files and moves lines into them from an existing
7
7
  * patch has no path through the two refusal flags:
8
8
  *
9
9
  * - `re-export --refuse-adjacent-unmanaged` refuses while the new files are
10
- * still unmanaged; and
10
+ * still unmanaged, and
11
11
  * - exporting the new files as their own patch fails cross-patch lint,
12
- * because at the projected placement the OLD patch still contains the
12
+ * because at the projected placement the old patch still contains the
13
13
  * moved code.
14
14
  *
15
15
  * Each guard is individually correct. Together they dead-end, and the way out
16
- * is non-obvious: adopt the new files into the OLD patch first
16
+ * is non-obvious: adopt the new files into the old patch first
17
17
  * (`re-export --scan --scan-file`), then split them out into a patch of their
18
18
  * own (`patch move-files --create --order N`).
19
19
  *
20
- * This module recognises the shape from evidence FireForge already has — the
20
+ * This module recognises the shape from evidence FireForge already has (the
21
21
  * pending diff's new-file content versus the added lines the existing patches
22
- * carry — so the refusal can name the sequence instead of leaving the
22
+ * carry), so the refusal can name the sequence instead of leaving the
23
23
  * operator to derive it.
24
24
  */
25
25
  import { extractAddedLinesPerFile } from './patch-lint-diff.js';
@@ -42,7 +42,7 @@ function isSubstantiveLine(line) {
42
42
  const MOVED_CODE_LINE_THRESHOLD = 3;
43
43
  /**
44
44
  * Finds existing patches that still carry substantive lines the pending
45
- * diff's NEW files would add — the fingerprint of code moved out of an
45
+ * diff's new files would add, the fingerprint of code moved out of an
46
46
  * existing patch into a new file.
47
47
  *
48
48
  * Pure. Overlaps are returned strongest-first so the message names the
@@ -108,7 +108,7 @@ export function formatAdoptThenSplitRemedy(overlaps, newPatchName, insertionOrde
108
108
  return [];
109
109
  const fileArgs = strongest.files.map((file) => `--scan-file ${file}`).join(' ');
110
110
  const moveArgs = strongest.files.map((file) => `--file ${file}`).join(' ');
111
- // `patch move-files --create` takes the new patch's NAME, not a
111
+ // `patch move-files --create` takes the new patch's name, not a
112
112
  // filename: strip the order prefix and the `.patch` suffix so the
113
113
  // suggested command is copy-pasteable.
114
114
  const suggestedName = newPatchName.replace(/^\d+-/, '').replace(/\.patch$/, '');
@@ -2,7 +2,7 @@
2
2
  * Filename of a lock directory's owner record, relative to the lock dir.
3
3
  *
4
4
  * Re-exported by `file-lock.ts` so external readers (`tree-store.ts`) share
5
- * the constant instead of re-spelling `'pid'`; the file *format* is
5
+ * the constant instead of re-spelling `'pid'`. The file format is
6
6
  * documented on {@link readLockOwner}.
7
7
  */
8
8
  export declare const LOCK_PID_FILE = "pid";
@@ -12,8 +12,8 @@ export declare const LOCK_PID_FILE = "pid";
12
12
  * `token` is the per-acquisition UUID written on line 2 of the PID file,
13
13
  * `acquiredAtMs` the wall-clock time the record was written (diagnostic),
14
14
  * and `startTick` the writer's boot-relative start tick (liveness). Records
15
- * from releases before a field was introduced parse with it `undefined`;
16
- * readers must treat that as "unknown", never as a mismatch.
15
+ * from releases before a field was introduced parse with it `undefined`.
16
+ * Readers must treat that as "unknown", never as a mismatch.
17
17
  */
18
18
  export type LockOwner = {
19
19
  present: false;
@@ -34,7 +34,7 @@ export type LockOwner = {
34
34
  * age-only staleness heuristic).
35
35
  *
36
36
  * File format note: external readers do `parseInt(content.trim(), 10)`,
37
- * which parses the leading digits of a multi-line file — so the token and
37
+ * which parses the leading digits of a multi-line file, so the token and
38
38
  * mechanical lines stay compatible.
39
39
  *
40
40
  * @param lockPath - Lock directory whose owner record to read
@@ -46,8 +46,8 @@ export declare function readLockOwner(lockPath: string): Promise<LockOwner>;
46
46
  * time, own start tick, diagnostic metadata) into a lock directory it has
47
47
  * just created, and reads the record back to prove it landed.
48
48
  *
49
- * The write is FATAL. It used to be best-effort, on the theory that stale
50
- * recovery would fall back to the age heuristic — but that heuristic reaps
49
+ * The write is fatal. It used to be best-effort, on the theory that stale
50
+ * recovery would fall back to the age heuristic, but that heuristic reaps
51
51
  * any owner-less lock after five minutes, and the build lock legitimately
52
52
  * holds for hours. A holder whose record failed to write was therefore
53
53
  * reaped mid-build and a second process entered the critical section. On
@@ -67,14 +67,14 @@ export declare function writeLockOwner(lockPath: string, token: string, ownerMet
67
67
  * Linux only: field 22 of `/proc/<pid>/stat`, in USER_HZ since boot.
68
68
  * Elsewhere (macOS, Windows) obtaining a start time means spawning
69
69
  * `ps`/`wmic` per probe, which is not worth paying on every poll of a
70
- * contended lock — those platforms return `undefined` and liveness stays
70
+ * contended lock. Those platforms return `undefined` and liveness stays
71
71
  * PID-only.
72
72
  *
73
- * Deliberately NOT converted to wall-clock time via `/proc/stat` `btime`:
73
+ * Not converted to wall-clock time via `/proc/stat` `btime`, on purpose:
74
74
  * on current kernels `btime` is derived from the realtime clock and moves
75
75
  * with every clock step, so a wall-clock comparison against a recorded
76
76
  * acquisition time misjudges a live holder as a reused PID after NTP steps
77
- * the clock forward — and reaps a lock that is in use.
77
+ * the clock forward, and reaps a lock that is in use.
78
78
  *
79
79
  * @param pid - Process to look up
80
80
  * @param procRoot - procfs mount, overridable for tests
@@ -82,10 +82,10 @@ export declare function writeLockOwner(lockPath: string, token: string, ownerMet
82
82
  */
83
83
  export declare function readProcessStartTick(pid: number, procRoot?: string): number | undefined;
84
84
  /**
85
- * Whether the process named by a lock's owner record is the SAME process
85
+ * Whether the process named by a lock's owner record is the same process
86
86
  * that acquired the lock, not merely a live process wearing its PID.
87
87
  *
88
- * `isProcessAlive` answers "does this PID exist"; after a holder crashes,
88
+ * `isProcessAlive` answers "does this PID exist". After a holder crashes,
89
89
  * the kernel may hand its PID to a long-lived daemon, and a PID-only check
90
90
  * then honours the dead lock until the waiter's timeout. Where the record
91
91
  * carries the writer's start tick and the candidate's own tick is cheaply
@@ -1,6 +1,6 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
2
  /**
3
- * Owner record of a `withFileLock` directory: the file that says WHICH
3
+ * Owner record of a `withFileLock` directory: the file that says which
4
4
  * process holds the lock, so stale recovery can tell a dead holder from a
5
5
  * slow one and release can refuse to remove a lock it no longer owns.
6
6
  *
@@ -18,7 +18,7 @@ import { sleep } from '../utils/sleep.js';
18
18
  * Filename of a lock directory's owner record, relative to the lock dir.
19
19
  *
20
20
  * Re-exported by `file-lock.ts` so external readers (`tree-store.ts`) share
21
- * the constant instead of re-spelling `'pid'`; the file *format* is
21
+ * the constant instead of re-spelling `'pid'`. The file format is
22
22
  * documented on {@link readLockOwner}.
23
23
  */
24
24
  export const LOCK_PID_FILE = 'pid';
@@ -26,8 +26,8 @@ export const LOCK_PID_FILE = 'pid';
26
26
  * Prefix of the mechanical owner-record line that carries the acquisition
27
27
  * wall time. It lives among the metadata lines (line 3 onward) so older
28
28
  * readers, which treat everything past line 2 as free-form diagnostics,
29
- * still parse the record; the current reader lifts it out of `metadata`.
30
- * Diagnostic only — see {@link START_TICK_PREFIX} for the liveness field.
29
+ * still parse the record. The current reader lifts it out of `metadata`.
30
+ * Diagnostic only. See {@link START_TICK_PREFIX} for the liveness field.
31
31
  */
32
32
  const ACQUIRED_AT_PREFIX = 'acquired-at-ms=';
33
33
  /**
@@ -41,11 +41,11 @@ const ACQUIRED_AT_PREFIX = 'acquired-at-ms=';
41
41
  */
42
42
  const START_TICK_PREFIX = 'start-tick=';
43
43
  /**
44
- * How many times the post-write read-back is retried when the READ itself
44
+ * How many times the post-write read-back is retried when the read itself
45
45
  * errors (not when the record is absent or differs). An on-access scanner
46
46
  * on Windows briefly holding the just-written file (`EBUSY`), or a FUSE
47
47
  * mount's momentary `EIO`, must not be indistinguishable from "the record
48
- * never landed" — that verdict releases a lock this process has correctly
48
+ * never landed": that verdict releases a lock this process has correctly
49
49
  * acquired and aborts the run before it starts.
50
50
  */
51
51
  const READ_BACK_ATTEMPTS = 5;
@@ -100,7 +100,7 @@ function parseLockOwnerRecord(pidContent) {
100
100
  * age-only staleness heuristic).
101
101
  *
102
102
  * File format note: external readers do `parseInt(content.trim(), 10)`,
103
- * which parses the leading digits of a multi-line file — so the token and
103
+ * which parses the leading digits of a multi-line file, so the token and
104
104
  * mechanical lines stay compatible.
105
105
  *
106
106
  * @param lockPath - Lock directory whose owner record to read
@@ -113,14 +113,14 @@ export async function readLockOwner(lockPath) {
113
113
  return owner;
114
114
  }
115
115
  catch {
116
- // PID file missing or unreadable — treat as absent.
116
+ // PID file missing or unreadable. Treat as absent.
117
117
  }
118
118
  return { present: false };
119
119
  }
120
120
  /**
121
- * Reads the just-written record back, retrying a READ ERROR a few times
121
+ * Reads the just-written record back, retrying a read error a few times
122
122
  * before giving up. A missing or malformed record is returned as-is (the
123
- * caller treats it as a failed write); only errno-level failures retry.
123
+ * caller treats it as a failed write). Only errno-level failures retry.
124
124
  */
125
125
  async function readBackLockOwner(lockPath) {
126
126
  let lastError;
@@ -141,8 +141,8 @@ async function readBackLockOwner(lockPath) {
141
141
  * time, own start tick, diagnostic metadata) into a lock directory it has
142
142
  * just created, and reads the record back to prove it landed.
143
143
  *
144
- * The write is FATAL. It used to be best-effort, on the theory that stale
145
- * recovery would fall back to the age heuristic — but that heuristic reaps
144
+ * The write is fatal. It used to be best-effort, on the theory that stale
145
+ * recovery would fall back to the age heuristic, but that heuristic reaps
146
146
  * any owner-less lock after five minutes, and the build lock legitimately
147
147
  * holds for hours. A holder whose record failed to write was therefore
148
148
  * reaped mid-build and a second process entered the critical section. On
@@ -196,14 +196,14 @@ export async function writeLockOwner(lockPath, token, ownerMetadata) {
196
196
  * Linux only: field 22 of `/proc/<pid>/stat`, in USER_HZ since boot.
197
197
  * Elsewhere (macOS, Windows) obtaining a start time means spawning
198
198
  * `ps`/`wmic` per probe, which is not worth paying on every poll of a
199
- * contended lock — those platforms return `undefined` and liveness stays
199
+ * contended lock. Those platforms return `undefined` and liveness stays
200
200
  * PID-only.
201
201
  *
202
- * Deliberately NOT converted to wall-clock time via `/proc/stat` `btime`:
202
+ * Not converted to wall-clock time via `/proc/stat` `btime`, on purpose:
203
203
  * on current kernels `btime` is derived from the realtime clock and moves
204
204
  * with every clock step, so a wall-clock comparison against a recorded
205
205
  * acquisition time misjudges a live holder as a reused PID after NTP steps
206
- * the clock forward — and reaps a lock that is in use.
206
+ * the clock forward, and reaps a lock that is in use.
207
207
  *
208
208
  * @param pid - Process to look up
209
209
  * @param procRoot - procfs mount, overridable for tests
@@ -213,7 +213,7 @@ export function readProcessStartTick(pid, procRoot = '/proc') {
213
213
  try {
214
214
  const stat = readFileSync(join(procRoot, String(pid), 'stat'), 'utf-8');
215
215
  // `comm` (field 2) is parenthesised and may itself contain spaces or
216
- // parentheses, so split only what follows the LAST closing paren:
216
+ // parentheses, so split only what follows the last closing paren:
217
217
  // field 3 (state) is then index 0 and field 22 (starttime) index 19.
218
218
  const startTick = Number.parseInt(stat
219
219
  .slice(stat.lastIndexOf(')') + 1)
@@ -226,10 +226,10 @@ export function readProcessStartTick(pid, procRoot = '/proc') {
226
226
  }
227
227
  }
228
228
  /**
229
- * Whether the process named by a lock's owner record is the SAME process
229
+ * Whether the process named by a lock's owner record is the same process
230
230
  * that acquired the lock, not merely a live process wearing its PID.
231
231
  *
232
- * `isProcessAlive` answers "does this PID exist"; after a holder crashes,
232
+ * `isProcessAlive` answers "does this PID exist". After a holder crashes,
233
233
  * the kernel may hand its PID to a long-lived daemon, and a PID-only check
234
234
  * then honours the dead lock until the waiter's timeout. Where the record
235
235
  * carries the writer's start tick and the candidate's own tick is cheaply