@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
@@ -16,7 +16,7 @@ import { detectHarnessCrashSignature } from './test-harness-crash.js';
16
16
  // This block is a frozen compatibility list, not a barrel to grow: every name
17
17
  // here already had a `from './mach.js'` import when the module was split.
18
18
  // New helpers belong in their own sub-module and are imported from it
19
- // directly — adding to this list pulls the whole sub-module into every suite
19
+ // directly. Adding to this list pulls the whole sub-module into every suite
20
20
  // that mocks `mach.js`.
21
21
  export { attemptMozinfoRewrite, buildArtifactMismatchMessage, hasBuildArtifacts, hasRunnableBundle, } from './mach-build-artifacts.js';
22
22
  export { generateMozconfig } from './mach-mozconfig.js';
@@ -51,8 +51,8 @@ export async function runMach(args, engineDir, options = {}) {
51
51
  if (options.inherit) {
52
52
  // Group-reap every long-lived inherited mach dispatch (bootstrap, run,
53
53
  // watch): a mach dying at startup must not strand multiprocessing
54
- // workers. Short-lived metadata queries below stay on plain exec() —
55
- // adding groups there would touch every non-mach exec consumer's path
54
+ // workers. Short-lived metadata queries below stay on plain exec().
55
+ // Adding groups there would touch every non-mach exec consumer's path
56
56
  // for no reaping benefit.
57
57
  return execInherit(python, [machPath, ...args], { ...execOptions, processGroup: true });
58
58
  }
@@ -79,7 +79,7 @@ export async function runMachCapture(args, engineDir, options = {}) {
79
79
  const machPath = join(engineDir, 'mach');
80
80
  let stdout = '';
81
81
  let stderr = '';
82
- // Echo-path filters only: the captured strings above accumulate RAW so the
82
+ // Echo-path filters only: the captured strings above accumulate raw so the
83
83
  // classifier still sees the full teardown traceback. When the option is
84
84
  // off, the filters are absent and echo is a straight write (unchanged).
85
85
  // One shutdown context per run, shared by both stream filters: the
@@ -94,18 +94,18 @@ export async function runMachCapture(args, engineDir, options = {}) {
94
94
  ...(options.envUnset ? { envUnset: options.envUnset } : {}),
95
95
  // Every capture dispatch (test suites, protected builds, package,
96
96
  // storybook) runs as a process-group leader and is group-reaped on
97
- // exit/abort — see ExecOptions.processGroup.
97
+ // exit/abort. See ExecOptions.processGroup.
98
98
  processGroup: true,
99
99
  onStdout: (data) => {
100
100
  stdout += data;
101
101
  if (stdout.length > CAPTURE_TAIL_LIMIT) {
102
102
  stdout = stdout.slice(-CAPTURE_TAIL_LIMIT);
103
103
  }
104
- // RAW into the log, filtered into the echo. The log exists to be
104
+ // Raw into the log, filtered into the echo. The log exists to be
105
105
  // re-read after the fact by whoever is diagnosing the run, and the
106
- // echo filter's whole purpose is to shorten what a HUMAN scrolls
107
- // past — collapsing a traceback in the artifact would reintroduce
108
- // the loss this log exists to prevent.
106
+ // echo filter only exists to shorten what a human scrolls past.
107
+ // Collapsing a traceback in the artifact would reintroduce the loss
108
+ // this log exists to prevent.
109
109
  writeToActiveRunLog(data);
110
110
  process.stdout.write(stdoutFilter ? stdoutFilter.transform(data) : data);
111
111
  },
@@ -163,9 +163,9 @@ export async function bootstrapWithOutput(engineDir) {
163
163
  * propagates so the hint sits immediately below the raw mach error in the
164
164
  * operator's terminal.
165
165
  *
166
- * The scanner is passed the concatenation of stderr AND stdout because mach
166
+ * The scanner is passed the concatenation of stderr and stdout because mach
167
167
  * streams its subcommand output through a timestamp-prefixing wrapper that
168
- * writes both streams to whatever FD the subprocess chose — `rustc` errors
168
+ * writes both streams to whatever FD the subprocess chose, so `rustc` errors
169
169
  * from `mach build` can land on stdout, so feeding only `result.stderr`
170
170
  * silently loses the match.
171
171
  */
@@ -186,10 +186,10 @@ function surfaceMachErrorHints(result) {
186
186
  */
187
187
  const DEFAULT_BUILD_CRASH_RETRIES = 2;
188
188
  /**
189
- * Names the known mozsystemmonitor teardown traceback when a BUILD carried
190
- * it. The test path collapses this signature in the echo; a build cannot
189
+ * Names the known mozsystemmonitor teardown traceback when a build carried
190
+ * it. The test path collapses this signature in the echo. A build cannot
191
191
  * (see `mach-known-noise-filter.ts`), so it reached operators as an
192
- * unexplained traceback in a build log — a recognized, documented upstream
192
+ * unexplained traceback in a build log: a recognized, documented upstream
193
193
  * defect wearing the appearance of a new one. The output is left verbatim
194
194
  * and this one line is added beside it, so the same signature reads the same
195
195
  * in both phases.
@@ -201,20 +201,20 @@ function noteKnownTeardownNoiseInBuild(result) {
201
201
  }
202
202
  /**
203
203
  * The single protected path every FireForge mach build dispatch routes
204
- * through — `build`, `build --ui`, and the pre-test `--build` step all use
204
+ * through. `build`, `build --ui`, and the pre-test `--build` step all use
205
205
  * it, so no entry point is left unprotected with a different retry budget:
206
206
  *
207
- * 1. installs the resource-monitor degrade guard IN the mach virtualenvs
208
- * (plus the PYTHONPATH fallback) — re-installed before every attempt, so
207
+ * 1. installs the resource-monitor degrade guard in the mach virtualenvs
208
+ * (plus the PYTHONPATH fallback), re-installed before every attempt, so
209
209
  * a venv materialized by a crashed first attempt is guarded on the next
210
- * one instead of every retry dying on the same wedged state;
211
- * 2. spawns a fresh mach process per attempt;
212
- * 3. retries ONLY the recognized harness-crash family (resource monitor /
213
- * psutil startup tracebacks) up to the uniform budget — an ordinary
210
+ * one instead of every retry dying on the same wedged state.
211
+ * 2. spawns a fresh mach process per attempt.
212
+ * 3. retries only the recognized harness-crash family (resource monitor /
213
+ * psutil startup tracebacks) up to the uniform budget. An ordinary
214
214
  * compile error is never retried.
215
215
  *
216
216
  * The protected path never runs `mach configure`, never clobbers, and never
217
- * widens the requested build kind — a `faster` dispatch retries as
217
+ * widens the requested build kind: a `faster` dispatch retries as
218
218
  * `mach build faster`, so it cannot invalidate more of the objdir than the
219
219
  * command the operator asked for.
220
220
  */
@@ -250,8 +250,8 @@ export async function runProtectedMachBuild(kind, engineDir, options = {}) {
250
250
  * hints are surfaced on top of the raw mach output so operators get an
251
251
  * actionable nudge alongside the cryptic mozbuild traceback. Returns the
252
252
  * captured result so the caller (e.g. `fireforge build`) can inspect the
253
- * tail for post-build diagnostics that mach prints AFTER "Your build was
254
- * successful!" — notably the stale `config.status is out of date`
253
+ * tail for post-build diagnostics that mach prints after "Your build was
254
+ * successful!", notably the stale `config.status is out of date`
255
255
  * notice that mach emits when a tool-managed edit landed on
256
256
  * `moz.configure` before the build.
257
257
  * @param engineDir - Path to the engine directory
@@ -279,13 +279,13 @@ export async function buildUI(engineDir) {
279
279
  *
280
280
  * Without it, a `build --ui` started while a full `build` is still in flight
281
281
  * hands off to `mach build faster` and fails almost immediately with `No
282
- * rule to make target 'XUL'` — the real problem being that the first build
282
+ * rule to make target 'XUL'`, the real problem being that the first build
283
283
  * has not yet materialised the full backend, with nothing in the low-level
284
284
  * make error pointing at the concurrent run. The lock intercepts the second
285
285
  * invocation before it touches mach, and the refusal names the PID holding
286
286
  * the lock so the operator can decide whether to wait or investigate.
287
287
  *
288
- * Stale-lock recovery: the lock stores the owner PID; a crashed build
288
+ * Stale-lock recovery: the lock stores the owner PID. A crashed build
289
289
  * (SIGINT, SIGTERM, or a kernel kill) leaves the lock dir behind but not the
290
290
  * owning process, and `withFileLock` removes the lock on the next attempt
291
291
  * when `process.kill(pid, 0)` shows the owner is gone.
@@ -299,9 +299,9 @@ export async function buildUI(engineDir) {
299
299
  export async function withBuildLock(projectRoot, operation) {
300
300
  const lockPath = createSiblingLockPath(join(projectRoot, '.fireforge-build'), '.lock');
301
301
  return withFileLock(lockPath, operation, {
302
- // Default lock timeout is 30s; bump to 24h so a slow full build does
303
- // not trip the timeout while the second invocation waits. A real
304
- // operator will ^C long before 24h elapses; the ceiling is there
302
+ // Default lock timeout is 30s. Bump it to 24h so a slow full build
303
+ // does not trip the timeout while the second invocation waits. A real
304
+ // operator will ^C long before 24h elapses. The ceiling is there
305
305
  // purely so a forgotten lock cannot wedge the command forever.
306
306
  timeoutMs: 24 * 60 * 60 * 1000,
307
307
  onTimeoutMessage: `Timed out waiting for the FireForge build lock at ${lockPath}. ` +
@@ -323,7 +323,7 @@ export async function run(engineDir, args = []) {
323
323
  * enforces a deadline by SIGTERMing the whole process group, and returns
324
324
  * the captured output alongside a `timedOut` flag.
325
325
  *
326
- * Unlike {@link run}, this variant does NOT inherit stdio. The child
326
+ * Unlike {@link run}, this variant does not inherit stdio. The child
327
327
  * stdout/stderr are piped back through the line callbacks so the caller
328
328
  * can scan for `JavaScript error:` / `console.error:` without coupling
329
329
  * the runner to chrome-specific pattern logic.
@@ -360,7 +360,7 @@ export async function machPackageCapture(engineDir) {
360
360
  * `env` is threaded through so the caller can prepend the resolved watchman
361
361
  * directory to PATH in a way mach inherits: `fireforge watch` can locate
362
362
  * `watchman` via `which`, but the mach subprocess spawns with the parent's
363
- * PATH only — on macOS that typically omits `/opt/homebrew/bin`, so
363
+ * PATH only, and on macOS that typically omits `/opt/homebrew/bin`, so
364
364
  * `mach watch` fails at the `watch-project` subscription step.
365
365
  *
366
366
  * @param engineDir - Path to the engine directory
@@ -376,13 +376,13 @@ export async function watchWithOutput(engineDir, options = {}) {
376
376
  * agent (`mozbuild.util.is_running_under_coding_agent`), which quiets
377
377
  * terminal output to warnings and errors.
378
378
  *
379
- * The quieting is genuinely useful for BUILDS — that is most of what an
380
- * agent session prints — but it applies to test runs too, where it removes
379
+ * The quieting is genuinely useful for builds, which are most of what an
380
+ * agent session prints, but it applies to test runs too, where it removes
381
381
  * `TEST_START` and console INFO: exactly the lines a hang or stall
382
382
  * diagnosis needs, and the ones FireForge's own classifier reads
383
383
  * (`Ran N checks`, `Unexpected results:`, `TEST-UNEXPECTED-*`). Unsetting
384
384
  * the variable globally would give up the build half as well, so the
385
- * dispatchers below unset it per TEST dispatch and leave the build path
385
+ * dispatchers below unset it per test dispatch and leave the build path
386
386
  * alone.
387
387
  */
388
388
  const CODING_AGENT_ENV_MARKERS = ['CLAUDECODE'];
@@ -399,8 +399,8 @@ function testVerbosityEnvUnset(fullOutput) {
399
399
  /**
400
400
  * Runs one mach test command (`mach test` / `mach xpcshell-test` / `mach
401
401
  * mochitest`) while capturing streamed output for better diagnostics. The
402
- * three commands share every other detail of the dispatch — resource guard,
403
- * verbosity env, teardown-noise annotation — so they share one entry point
402
+ * three commands share every other detail of the dispatch (resource guard,
403
+ * verbosity env, teardown-noise annotation), so they share one entry point
404
404
  * keyed by `kind` rather than three copies that drift.
405
405
  *
406
406
  * @param kind - Which mach command to run
@@ -11,7 +11,7 @@ export interface MarionettePortHolder {
11
11
  /**
12
12
  * Full command line the holder was launched with, when the probe
13
13
  * can recover it. `lsof` by itself only returns the basename, so
14
- * POSIX callers see `command === commandLine`; Windows callers
14
+ * POSIX callers see `command === commandLine`. Windows callers
15
15
  * recover the full command line via `Get-Process`. Used to detect
16
16
  * the `-marionette` flag, which positively identifies a stale
17
17
  * browser rather than an unrelated listener.
@@ -33,7 +33,7 @@ export interface RunningBundleProcess {
33
33
  commandLine: string;
34
34
  /**
35
35
  * Elapsed wall-clock seconds since the process started, from `ps
36
- * etime=`. `NaN` when the field was absent or unparseable — callers must
36
+ * etime=`. `NaN` when the field was absent or unparseable, and callers must
37
37
  * omit the clause rather than print a zero, because "started 0s ago" is
38
38
  * exactly the wrong attribution for a peer session's long-lived browser.
39
39
  */
@@ -44,7 +44,7 @@ export interface RunningBundleProcess {
44
44
  * regression-testable.
45
45
  *
46
46
  * Reads `pid etime args` where the middle field is a `ps` duration. The
47
- * elapsed field is parsed OPTIMISTICALLY: a listing produced without
47
+ * elapsed field is parsed optimistically: a listing produced without
48
48
  * `etime=` still parses, with the duration reported as `NaN` and the whole
49
49
  * second field folded back into the command line, so a caller that lost the
50
50
  * column degrades to the old behaviour instead of dropping the process.
@@ -62,17 +62,17 @@ export declare function ensureLaunchableBrowserNotRunning(launchableBinary: stri
62
62
  /**
63
63
  * Builds the refusal for a running objdir browser.
64
64
  *
65
- * Reports the EVIDENCE rather than a bare PID: the elapsed time and the
65
+ * Reports the evidence rather than a bare PID: the elapsed time and the
66
66
  * command line are what let an operator on a shared checkout decide whose
67
67
  * process it is, without reconstructing PID ancestry by hand. A downstream
68
- * fork hit exactly this — the message named a PID belonging to a peer
68
+ * fork hit exactly this: the message named a PID belonging to a peer
69
69
  * session's live browser and offered a flag that would have killed a
70
70
  * multi-hour evaluation run.
71
71
  *
72
- * So `--kill-stale-marionette` is offered ONLY for a marionette-driven
72
+ * So `--kill-stale-marionette` is offered only for a marionette-driven
73
73
  * browser. For a bare launch the message says what it found and stops:
74
74
  * FireForge cannot tell a dead run's orphan from someone's live window, and
75
- * the flag is the right MANUAL clear once ownership is verified, never an
75
+ * the flag is the right manual clear once ownership is verified, never an
76
76
  * automatic one.
77
77
  *
78
78
  * Exported for direct unit testing.
@@ -88,7 +88,7 @@ export declare function describeRunningBundleRefusal(holder: RunningBundleProces
88
88
  export declare function probeMarionettePort(port?: number): Promise<MarionettePortProbeResult>;
89
89
  /**
90
90
  * Raises a targeted {@link GeneralError} when the Marionette port
91
- * is held by a browser process; raises a softer warning-shaped
91
+ * is held by a browser process. Raises a softer warning-shaped
92
92
  * error when the holder is unrelated (so the operator still sees
93
93
  * a useful signal but can decide whether to wait it out).
94
94
  *
@@ -118,18 +118,20 @@ export declare function ensureMarionettePortAvailable(port?: number, options?: {
118
118
  * the test command auto-forwards to mach.
119
119
  *
120
120
  * @param machArgs - Forwarded mach args as they would appear on the command
121
- * line (one element per token; `--foo=bar` and `--foo bar` both supported).
122
- * @returns The integer port if a recognised arg is present and parses; else
123
- * `undefined`.
121
+ * line (one element per token, with `--foo=bar` and `--foo bar` both
122
+ * supported).
123
+ * @returns The integer port if a recognised arg is present and parses,
124
+ * otherwise `undefined`.
124
125
  */
125
126
  export declare function extractForwardedMarionettePort(machArgs: string[]): number | undefined;
126
127
  /**
127
128
  * True when forwarded mach args already set a Marionette **client** address
128
129
  * for mach/mochitest (`--marionette=host:port` or `--marionette host:port`).
129
130
  * Used only to avoid duplicating FireForge's auto-injected
130
- * `--marionette=127.0.0.1:<n>`; this is not a full URL validator (IPv6, etc.).
131
+ * `--marionette=127.0.0.1:<n>`. This is not a full URL validator (IPv6,
132
+ * etc.).
131
133
  *
132
- * Deliberately does **not** treat `--marionette-port` as a client endpoint.
134
+ * Does not treat `--marionette-port` as a client endpoint.
133
135
  */
134
136
  export declare function forwardedMachArgsIncludeMarionetteClient(machArgs: string[]): boolean;
135
137
  /**
@@ -7,11 +7,11 @@
7
7
  * browser with that flag, so any test run needs the port free at start.
8
8
  *
9
9
  * An interrupted `fireforge test` can leave an orphan browser process
10
- * listening on 2828 with parent PID 1, and the next test run — possibly in a
11
- * *different* FireForge project — then fails with a bare Marionette bind
12
- * error. This probe runs before every test launch, detects when the port is
13
- * held, and — when the holder is a browser process (by command-line
14
- * `-marionette` flag or by basename matching a known browser binary) —
10
+ * listening on 2828 with parent PID 1, and the next test run (possibly in a
11
+ * *different* FireForge project) then fails with a bare Marionette bind
12
+ * error. This probe runs before every test launch and detects when the port
13
+ * is held. When the holder is a browser process (by command-line
14
+ * `-marionette` flag or by basename matching a known browser binary), it
15
15
  * throws a targeted `GeneralError` naming the PID and the exact `kill`
16
16
  * command to run.
17
17
  *
@@ -22,7 +22,8 @@
22
22
  *
23
23
  * Both paths tolerate missing tooling: if `lsof` / PowerShell is not
24
24
  * installed the probe returns `{ inUse: false }` rather than failing the
25
- * test run — it is a best-effort friendliness check, not a prerequisite.
25
+ * test run. It is a best-effort friendliness check rather than a
26
+ * prerequisite.
26
27
  */
27
28
  import { PreflightRefusalError } from '../errors/base.js';
28
29
  import { toError } from '../utils/errors.js';
@@ -63,7 +64,7 @@ async function findRunningBundleProcesses(launchableBinary) {
63
64
  return parseProcessList(result.stdout, launchableBinary);
64
65
  }
65
66
  // `etime=` is what makes the refusal attributable on a shared checkout:
66
- // a browser that started as YOUR run was finishing is not yours.
67
+ // a browser that started as your run was finishing is not yours.
67
68
  const result = await exec('ps', ['-axo', 'pid=,etime=,args=']);
68
69
  return parseProcessList(result.stdout, launchableBinary);
69
70
  }
@@ -76,7 +77,7 @@ async function findRunningBundleProcesses(launchableBinary) {
76
77
  * regression-testable.
77
78
  *
78
79
  * Reads `pid etime args` where the middle field is a `ps` duration. The
79
- * elapsed field is parsed OPTIMISTICALLY: a listing produced without
80
+ * elapsed field is parsed optimistically: a listing produced without
80
81
  * `etime=` still parses, with the duration reported as `NaN` and the whole
81
82
  * second field folded back into the command line, so a caller that lost the
82
83
  * column degrades to the old behaviour instead of dropping the process.
@@ -139,13 +140,13 @@ export async function ensureLaunchableBrowserNotRunning(launchableBinary, option
139
140
  throw new PreflightRefusalError(describeRunningBundleRefusal(holder), 'stale-browser');
140
141
  }
141
142
  /**
142
- * True when the process was launched BY a test harness — its command line
143
- * carries `-marionette` (the control channel every `fireforge test` browser
144
- * is started with) or a harness `-profile`.
143
+ * True when the process was launched by a test harness, i.e. its command
144
+ * line carries `-marionette` (the control channel every `fireforge test`
145
+ * browser is started with) or a harness `-profile`.
145
146
  *
146
147
  * This is the distinction the refusal turns on. The objdir-bundle probe
147
148
  * matches any process running this project's binary, which on a shared
148
- * checkout includes a peer session's LIVE browser and a developer's own
149
+ * checkout includes a peer session's live browser and a developer's own
149
150
  * interactive one. Only a marionette-driven browser is safely
150
151
  * attributable to an interrupted run.
151
152
  */
@@ -155,17 +156,17 @@ function isHarnessDrivenBrowser(commandLine) {
155
156
  /**
156
157
  * Builds the refusal for a running objdir browser.
157
158
  *
158
- * Reports the EVIDENCE rather than a bare PID: the elapsed time and the
159
+ * Reports the evidence rather than a bare PID: the elapsed time and the
159
160
  * command line are what let an operator on a shared checkout decide whose
160
161
  * process it is, without reconstructing PID ancestry by hand. A downstream
161
- * fork hit exactly this — the message named a PID belonging to a peer
162
+ * fork hit exactly this: the message named a PID belonging to a peer
162
163
  * session's live browser and offered a flag that would have killed a
163
164
  * multi-hour evaluation run.
164
165
  *
165
- * So `--kill-stale-marionette` is offered ONLY for a marionette-driven
166
+ * So `--kill-stale-marionette` is offered only for a marionette-driven
166
167
  * browser. For a bare launch the message says what it found and stops:
167
168
  * FireForge cannot tell a dead run's orphan from someone's live window, and
168
- * the flag is the right MANUAL clear once ownership is verified, never an
169
+ * the flag is the right manual clear once ownership is verified, never an
169
170
  * automatic one.
170
171
  *
171
172
  * Exported for direct unit testing.
@@ -216,19 +217,19 @@ function isBrowserMarionettePortHolder(holder, binaryName) {
216
217
  }
217
218
  /**
218
219
  * Probes the given port with `lsof` (macOS / Linux). Returns
219
- * `{ inUse: false }` when the port is free OR when `lsof` is not
220
- * available — the probe is a best-effort courtesy check, so a
220
+ * `{ inUse: false }` when the port is free or when `lsof` is not
221
+ * available. The probe is a best-effort courtesy check, so a
221
222
  * missing tool must not block the test run.
222
223
  */
223
224
  async function probeWithLsof(port) {
224
225
  try {
225
- // `-sTCP:LISTEN` filters to listeners only; `-P -n` avoids
226
+ // `-sTCP:LISTEN` filters to listeners only, and `-P -n` avoids
226
227
  // service/host lookups (faster + no DNS-dependent flakiness).
227
228
  // `-Fpcn` emits a machine-readable format: one field per line,
228
229
  // with `p<pid>`, `c<command>`, `n<name>` records.
229
230
  const result = await exec('lsof', ['-i', `tcp:${port}`, '-P', '-n', '-sTCP:LISTEN', '-Fpcn']);
230
- // `lsof` exits 1 when no matches — that's "port is free", not an
231
- // error. We key off stdout shape instead of exit code.
231
+ // `lsof` exits 1 when no matches, which means "port is free" rather
232
+ // than an error. We key off stdout shape instead of exit code.
232
233
  const stdout = result.stdout;
233
234
  const lines = stdout.split(/\r?\n/).filter((l) => l.length > 0);
234
235
  let pid = -1;
@@ -242,7 +243,7 @@ async function probeWithLsof(port) {
242
243
  if (!Number.isFinite(pid) || pid < 0 || command === '') {
243
244
  return { inUse: false };
244
245
  }
245
- // `lsof` does not return the full command line; `ps` does. A
246
+ // `lsof` does not return the full command line, but `ps` does. A
246
247
  // missing `ps` (exotic Linux container) falls back to `command`
247
248
  // alone, which is still enough to match `BROWSER_BASENAMES`.
248
249
  let commandLine = command;
@@ -253,7 +254,7 @@ async function probeWithLsof(port) {
253
254
  commandLine = psLine.trim();
254
255
  }
255
256
  catch {
256
- // ps not available — keep the basename.
257
+ // ps not available, so keep the basename.
257
258
  }
258
259
  return { inUse: true, holder: { pid, command, commandLine } };
259
260
  }
@@ -320,7 +321,7 @@ export async function probeMarionettePort(port = DEFAULT_MARIONETTE_PORT) {
320
321
  platform = getPlatform();
321
322
  }
322
323
  catch {
323
- // Unrecognised host platform — no probe strategy applies, so the port is
324
+ // Unrecognised host platform, so no probe strategy applies and the port is
324
325
  // reported free rather than blocking the run.
325
326
  return { inUse: false };
326
327
  }
@@ -332,7 +333,7 @@ export async function probeMarionettePort(port = DEFAULT_MARIONETTE_PORT) {
332
333
  }
333
334
  /**
334
335
  * Raises a targeted {@link GeneralError} when the Marionette port
335
- * is held by a browser process; raises a softer warning-shaped
336
+ * is held by a browser process. Raises a softer warning-shaped
336
337
  * error when the holder is unrelated (so the operator still sees
337
338
  * a useful signal but can decide whether to wait it out).
338
339
  *
@@ -405,9 +406,10 @@ export async function ensureMarionettePortAvailable(port = DEFAULT_MARIONETTE_PO
405
406
  * the test command auto-forwards to mach.
406
407
  *
407
408
  * @param machArgs - Forwarded mach args as they would appear on the command
408
- * line (one element per token; `--foo=bar` and `--foo bar` both supported).
409
- * @returns The integer port if a recognised arg is present and parses; else
410
- * `undefined`.
409
+ * line (one element per token, with `--foo=bar` and `--foo bar` both
410
+ * supported).
411
+ * @returns The integer port if a recognised arg is present and parses,
412
+ * otherwise `undefined`.
411
413
  */
412
414
  export function extractForwardedMarionettePort(machArgs) {
413
415
  for (const [i, arg] of machArgs.entries()) {
@@ -427,7 +429,7 @@ export function extractForwardedMarionettePort(machArgs) {
427
429
  return n;
428
430
  }
429
431
  }
430
- // `--setpref=marionette.port=NNNN` — the auto-forward shape; recognised
432
+ // `--setpref=marionette.port=NNNN`, the auto-forward shape. Recognised
431
433
  // here so a duplicate check at the call site can spot operator-supplied
432
434
  // setprefs without re-implementing the parse.
433
435
  match = /^--setpref=marionette\.port=(\d+)$/.exec(arg);
@@ -443,9 +445,10 @@ export function extractForwardedMarionettePort(machArgs) {
443
445
  * True when forwarded mach args already set a Marionette **client** address
444
446
  * for mach/mochitest (`--marionette=host:port` or `--marionette host:port`).
445
447
  * Used only to avoid duplicating FireForge's auto-injected
446
- * `--marionette=127.0.0.1:<n>`; this is not a full URL validator (IPv6, etc.).
448
+ * `--marionette=127.0.0.1:<n>`. This is not a full URL validator (IPv6,
449
+ * etc.).
447
450
  *
448
- * Deliberately does **not** treat `--marionette-port` as a client endpoint.
451
+ * Does not treat `--marionette-port` as a client endpoint.
449
452
  */
450
453
  export function forwardedMachArgsIncludeMarionetteClient(machArgs) {
451
454
  const valueLooksLikeHostPort = (token) => /:[0-9]+$/.test(token) || /^\[[^]]+\]:[0-9]+$/.test(token);
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Answers a single question before tests run: "does marionette come up?" A
5
5
  * silent 360-second mach-test hang is indistinguishable from "tests failed
6
- * to discover"; this helper surfaces the failure in under a minute with a
6
+ * to discover". This helper surfaces the failure in under a minute with a
7
7
  * clear PASS/FAIL line and the tail of the browser's stderr.
8
8
  *
9
9
  * The probe is a cascade of layered checks (engine → mach → python →
@@ -22,7 +22,7 @@ export interface MarionettePreflightResult {
22
22
  export interface MarionettePreflightOptions {
23
23
  /** Total budget in ms. Defaults to 30 seconds. */
24
24
  timeoutMs?: number;
25
- /** Overrides marionette TCP port — primarily used in tests. */
25
+ /** Overrides marionette TCP port. Primarily used in tests. */
26
26
  port?: number;
27
27
  /**
28
28
  * Grace window after spawn() before the browser is considered "running
@@ -37,16 +37,16 @@ export interface MarionettePreflightOptions {
37
37
  }
38
38
  /**
39
39
  * Runs the marionette preflight. Returns PASS on first byte read from the
40
- * marionette socket within the budget; FAIL otherwise, with a diagnostic
41
- * identifying which layer of the cascade broke. Always tears down the
42
- * spawned browser before returning.
40
+ * marionette socket within the budget, and FAIL otherwise, with a
41
+ * diagnostic identifying which layer of the cascade broke. Always tears
42
+ * down the spawned browser before returning.
43
43
  */
44
44
  export declare function runMarionettePreflight(engineDir: string, options?: MarionettePreflightOptions): Promise<MarionettePreflightResult>;
45
45
  /** Renders a PASS/FAIL banner to the CLI using the shared logger helpers. */
46
46
  export declare function reportMarionettePreflight(result: MarionettePreflightResult): void;
47
47
  /**
48
48
  * Formats the PASS/FAIL banner as a plain string for direct
49
- * `process.stdout.write` use — bypassing the clack logger entirely so
49
+ * `process.stdout.write` use, bypassing the clack logger entirely so
50
50
  * operators running `fireforge test --doctor` under a non-TTY (pipe, CI,
51
51
  * `tee`-wrapped capture) always see the final line. Clack's renderer can
52
52
  * swallow trailing log output just before process exit, and a
@@ -4,7 +4,7 @@
4
4
  *
5
5
  * Answers a single question before tests run: "does marionette come up?" A
6
6
  * silent 360-second mach-test hang is indistinguishable from "tests failed
7
- * to discover"; this helper surfaces the failure in under a minute with a
7
+ * to discover". This helper surfaces the failure in under a minute with a
8
8
  * clear PASS/FAIL line and the tail of the browser's stderr.
9
9
  *
10
10
  * The probe is a cascade of layered checks (engine → mach → python →
@@ -34,7 +34,7 @@ const SOCKET_ATTEMPT_TIMEOUT_MS = 2_000;
34
34
  /**
35
35
  * Grace window after spawn() returns before we accept the child as
36
36
  * "spawned OK". A browser binary that exits immediately (missing dylib,
37
- * wrong CPU arch, corrupt profile) must be caught here — not 30 seconds
37
+ * wrong CPU arch, corrupt profile) must be caught here, not 30 seconds
38
38
  * later at the socket layer.
39
39
  */
40
40
  const SPAWN_SETTLE_MS = 750;
@@ -58,9 +58,9 @@ function layerTag(name) {
58
58
  }
59
59
  /**
60
60
  * Runs the marionette preflight. Returns PASS on first byte read from the
61
- * marionette socket within the budget; FAIL otherwise, with a diagnostic
62
- * identifying which layer of the cascade broke. Always tears down the
63
- * spawned browser before returning.
61
+ * marionette socket within the budget, and FAIL otherwise, with a
62
+ * diagnostic identifying which layer of the cascade broke. Always tears
63
+ * down the spawned browser before returning.
64
64
  */
65
65
  export async function runMarionettePreflight(engineDir, options = {}) {
66
66
  const timeoutMs = options.timeoutMs ?? DEFAULT_PREFLIGHT_TIMEOUT_MS;
@@ -101,15 +101,15 @@ export async function runMarionettePreflight(engineDir, options = {}) {
101
101
  let stderrTail = '';
102
102
  // Shutdown contract for a child spawned outside the exec layer.
103
103
  //
104
- // This is the repo's one legitimate raw `spawn`: the preflight needs the
105
- // live `ChildProcess` mid-run (`hasChildExited` gates the socket poll),
104
+ // This is the one raw `spawn` in the repo. The preflight needs the live
105
+ // `ChildProcess` mid-run (`hasChildExited` gates the socket poll),
106
106
  // returns while the browser is still running, and aborts on a TCP byte
107
- // rather than on a deadline — none of which any wrapper in utils/process
108
- // can express. What it does NOT get to skip is the contract every wrapper
109
- // applies to a detached child: register the closure so the bin signal
110
- // handler waits for it, and forward the parent's SIGINT/SIGTERM to the
111
- // group. Without both, Ctrl+C during `fireforge test --doctor` left the
112
- // whole mach → Firefox tree running.
107
+ // rather than on a deadline. No wrapper in utils/process can express
108
+ // that. It still has to honour the contract every wrapper applies to a
109
+ // detached child: register the closure so the bin signal handler waits
110
+ // for it, and forward the parent's SIGINT/SIGTERM to the group. Without
111
+ // both, Ctrl+C during `fireforge test --doctor` left the whole
112
+ // mach → Firefox tree running.
113
113
  let closure;
114
114
  let forwarder;
115
115
  try {
@@ -130,7 +130,7 @@ export async function runMarionettePreflight(engineDir, options = {}) {
130
130
  // `detached: true` puts the child in a new process group so we can
131
131
  // signal it and every descendant (Firefox, its helpers) via
132
132
  // `process.kill(-pid, …)` in the finally block. Without it, the
133
- // child is Python running mach; a SIGTERM kills Python but the
133
+ // child is Python running mach. A SIGTERM kills Python but the
134
134
  // Firefox grandchild inherits the stderr pipe FD and keeps Node's
135
135
  // event loop alive even after the preflight PASS log, so
136
136
  // `fireforge test --doctor` prints `Marionette preflight: PASS`
@@ -150,7 +150,7 @@ export async function runMarionettePreflight(engineDir, options = {}) {
150
150
  const chunk = data.toString();
151
151
  stderrTail = (stderrTail + chunk).slice(-STDERR_TAIL_LIMIT);
152
152
  });
153
- // Short settle window — catches "binary exits immediately" failures
153
+ // Short settle window. Catches "binary exits immediately" failures
154
154
  // (missing dylib, wrong CPU arch, corrupt profile) before the socket
155
155
  // poll swallows the full overall budget waiting for bytes that will
156
156
  // never come.
@@ -173,7 +173,7 @@ export async function runMarionettePreflight(engineDir, options = {}) {
173
173
  detail: `Marionette handshake received on 127.0.0.1:${port} in ${Date.now() - startedAt}ms.`,
174
174
  };
175
175
  }
176
- // Child may have exited before the socket was ever ready — surface that
176
+ // Child may have exited before the socket was ever ready. Surface that
177
177
  // distinctly from "socket never answered" so the operator has a lead.
178
178
  if (hasChildExited(spawnedChild)) {
179
179
  return fail('marionette-handshake', `Browser process exited before marionette handshake (exit code ${spawnedChild.exitCode}, signal ${spawnedChild.signalCode ?? 'none'}). ` +
@@ -213,8 +213,8 @@ async function teardownPreflightChild(child, forwarder, closure, profileDir) {
213
213
  }
214
214
  }
215
215
  // Reap anything that outlived the group signal. The file's own comments
216
- // worry about exactly this — Firefox grandchildren surviving the Python
217
- // mach wrapper — and every exec-layer wrapper sweeps for it.
216
+ // worry about exactly this case (Firefox grandchildren surviving the
217
+ // Python mach wrapper), and every exec-layer wrapper sweeps for it.
218
218
  if (groupPid !== undefined && process.platform !== 'win32') {
219
219
  try {
220
220
  await sweepProcessGroup(groupPid);
@@ -226,8 +226,8 @@ async function teardownPreflightChild(child, forwarder, closure, profileDir) {
226
226
  closure?.settle();
227
227
  // Destroy the stderr pipe explicitly. Firefox (a grandchild of the Python
228
228
  // mach wrapper we spawned) can inherit and hold the stderr FD even after
229
- // its direct parent exits — until the pipe closes, Node's readable
230
- // stream stays attached and `uv__io_poll` keeps the event loop alive.
229
+ // its direct parent exits. Until the pipe closes, Node's readable stream
230
+ // stays attached and `uv__io_poll` keeps the event loop alive.
231
231
  // `destroy()` closes the local end regardless, so `fireforge test
232
232
  // --doctor` exits cleanly after a passing preflight.
233
233
  child?.stderr?.destroy();
@@ -271,7 +271,7 @@ function attemptMarionetteConnect(port, connectFn) {
271
271
  socket.destroy();
272
272
  }
273
273
  catch {
274
- // Ignore — already closed.
274
+ // Ignore: already closed.
275
275
  }
276
276
  resolve({ ok });
277
277
  };
@@ -280,7 +280,7 @@ function attemptMarionetteConnect(port, connectFn) {
280
280
  }, SOCKET_ATTEMPT_TIMEOUT_MS);
281
281
  attemptTimer.unref();
282
282
  socket.once('connect', () => {
283
- // Connect alone is insufficient — the marionette server performs a
283
+ // Connect alone is insufficient. The marionette server performs a
284
284
  // handshake send as soon as the socket opens, so wait for at least one
285
285
  // byte to confirm the server is actually speaking marionette.
286
286
  const readTimer = setTimeout(() => {
@@ -311,7 +311,7 @@ export function reportMarionettePreflight(result) {
311
311
  }
312
312
  /**
313
313
  * Formats the PASS/FAIL banner as a plain string for direct
314
- * `process.stdout.write` use — bypassing the clack logger entirely so
314
+ * `process.stdout.write` use, bypassing the clack logger entirely so
315
315
  * operators running `fireforge test --doctor` under a non-TTY (pipe, CI,
316
316
  * `tee`-wrapped capture) always see the final line. Clack's renderer can
317
317
  * swallow trailing log output just before process exit, and a