@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
@@ -19,7 +19,7 @@ export function isString(value) {
19
19
  * @returns True if value is a finite number
20
20
  */
21
21
  export function isNumber(value) {
22
- // Number.isFinite matches the documented contract: NaN AND ±Infinity are
22
+ // Number.isFinite matches the documented contract: NaN and ±Infinity are
23
23
  // excluded (a JSON config field of 1e999 parses to Infinity and used to
24
24
  // validate as a legal number).
25
25
  return typeof value === 'number' && Number.isFinite(value);
@@ -42,9 +42,9 @@ export function isPositiveInteger(value) {
42
42
  * orders instead of failing fast.
43
43
  *
44
44
  * Rejects leading-zero forms ("01"), decimals ("1.5"), whitespace, and
45
- * non-numeric garbage via a strict regex — only the canonical
46
- * representation is accepted, so there is no ambiguity between what the user
47
- * typed and what the value becomes on disk.
45
+ * non-numeric garbage via a strict regex. Only the canonical representation
46
+ * is accepted, so there is no ambiguity between what the user typed and what
47
+ * the value becomes on disk.
48
48
  *
49
49
  * @param flagName - Flag name to include in the error (e.g. `--order`)
50
50
  * @param rawValue - Raw string value from Commander
@@ -83,8 +83,8 @@ export function isArray(value) {
83
83
  * Narrows a JSON value to a JSON object node (excludes arrays and `null`).
84
84
  *
85
85
  * Unlike {@link isObject} this accepts only values already known to be JSON
86
- * data, so the narrowed `JsonObject` keeps its concrete value contract —
87
- * use it when walking a `JsonValue` tree rather than at `unknown` boundaries.
86
+ * data, so the narrowed `JsonObject` keeps its concrete value contract.
87
+ * Use it when walking a `JsonValue` tree rather than at `unknown` boundaries.
88
88
  * @param value - JSON value to check
89
89
  * @returns True if value is a JSON object node
90
90
  */
@@ -110,16 +110,16 @@ export function isValidFirefoxCandidate(candidate) {
110
110
  /**
111
111
  * Naming contract for this module's checks.
112
112
  *
113
- * `validate*` is easy to spread across incompatible return contracts — some
113
+ * `validate*` is easy to spread across incompatible return contracts: some
114
114
  * throwing and returning void, some returning an issue list, some a parsed
115
- * value, some a boolean, some an error MESSAGE — and a caller cannot tell
116
- * which from the name. Passing a THROWING `validate*` to a clack `validate`
115
+ * value, some a boolean, some an error message. A caller cannot tell which
116
+ * from the name. Passing a throwing `validate*` to a clack `validate`
117
117
  * callback, which expects a returned message, kills the prompt instead of
118
118
  * re-prompting.
119
119
  *
120
120
  * The two dominant contracts keep the prefix:
121
- * - `validate*` — throws on failure, or returns an issue list.
122
- * - `is*` / `has*` — a type predicate or boolean.
121
+ * - `validate*`: throws on failure, or returns an issue list.
122
+ * - `is*` / `has*`: a type predicate or boolean.
123
123
  * The message-returning minority is `describe*Problem`, which reads as what
124
124
  * it is: a description of what is wrong, or `undefined`.
125
125
  *
@@ -129,9 +129,9 @@ export function isValidFirefoxCandidate(candidate) {
129
129
  * Valid Firefox product identifiers.
130
130
  *
131
131
  * `satisfies readonly FirefoxProduct[]` links the runtime list to the union
132
- * in ONE direction: it rejects an entry here that the union does not
133
- * declare. It cannot see a union member missing from this list — widening a
134
- * `readonly T[]` check never fails for being short. The reverse direction is
132
+ * in one direction: it rejects an entry here that the union does not
133
+ * declare. It cannot see a union member missing from this list, because
134
+ * widening a `readonly T[]` check never fails for being short. The reverse direction is
135
135
  * covered by the `ExhaustiveFirefoxProductList` operand below, which stops
136
136
  * compiling when the union grows past this list.
137
137
  */
@@ -146,22 +146,21 @@ export const FIREFOX_PRODUCTS = FIREFOX_PRODUCT_VALUES;
146
146
  * Validates a Firefox product string.
147
147
  *
148
148
  * A type predicate, matching its sibling {@link isValidProjectLicense}.
149
- * Returning plain `boolean` would force
150
- * `as FirefoxProduct` casts at the call sites even though the `.includes`
151
- * check IS the runtime proof.
149
+ * Returning plain `boolean` would force `as FirefoxProduct` casts at the
150
+ * call sites even though the `.includes` check is the runtime proof.
152
151
  */
153
152
  export const isValidFirefoxProduct = makeEnumGuard(FIREFOX_PRODUCTS);
154
153
  /**
155
154
  * Builds a type predicate from a `readonly` tuple of allowed values.
156
155
  *
157
- * Deriving the type from the list — rather than declaring a union and
158
- * hand-maintaining a matching array — removes a whole class of drift: a
156
+ * Deriving the type from the list, rather than declaring a union and
157
+ * hand-maintaining a matching array, removes a whole class of drift: a
159
158
  * union can otherwise accept a stale allowlist with no compile error, and a
160
159
  * copy of the member list on the `fireforge.json` read path can silently
161
160
  * reject a newly added value.
162
161
  *
163
162
  * Returning a predicate rather than a boolean is what removes the `as`
164
- * casts: `.includes` IS the runtime proof, so the caller should not have to
163
+ * casts: `.includes` is the runtime proof, so the caller should not have to
165
164
  * re-assert it. `ParsedRecord.stringEnum` (src/utils/parse.ts) consumes
166
165
  * exactly this shape.
167
166
  *
@@ -311,7 +310,7 @@ export function normalizeTokenName(name) {
311
310
  * Normalizes a patch display name against its category:
312
311
  * strips a trailing `.patch` and any redundant `NNN-<category>-` /
313
312
  * `<category>-` prefixes, case-insensitively and repeatedly, mirroring
314
- * the filename slug pipeline's require-the-category-token rule — a bare
313
+ * the filename slug pipeline's require-the-category-token rule. A bare
315
314
  * leading number is never stripped, so names like `2-step-verification`
316
315
  * survive intact. Falls back to the `.patch`-stripped stem when the
317
316
  * strip would empty the name.
package/docs/README.md CHANGED
@@ -4,8 +4,8 @@
4
4
 
5
5
  [`../README.md`](../README.md) is the getting-started page. These files are
6
6
  the reference material behind it. `fireforge --help` (and
7
- `fireforge <command> --help`) stays the authority on flags; the docs cover
8
- what a flag list cannot state.
7
+ `fireforge <command> --help`) is always the authority on flags. These docs
8
+ cover the things a flag list cannot say.
9
9
 
10
10
  ## Using FireForge
11
11
 
@@ -2,55 +2,57 @@
2
2
 
3
3
  # Configuration
4
4
 
5
- `fireforge.json` at the project root is the project's configuration;
5
+ `fireforge.json` at the project root holds the project's configuration, and
6
6
  `furnace.json` holds component configuration. This file covers the settings
7
- whose behaviour needs more than a schema line, plus the environment variables
7
+ whose behavior needs more than a schema line, plus the environment variables
8
8
  FireForge reads.
9
9
 
10
- ## `firefox` — the source pin
10
+ ## `firefox`, the source pin
11
11
 
12
- `firefox.version` (with `firefox.product`, and optionally `firefox.sha256` and
13
- `firefox.candidate`) is the source pin `fireforge download` resolves an archive
14
- from. `fireforge source set` writes it.
12
+ `firefox.version`, together with `firefox.product` and optionally
13
+ `firefox.sha256` and `firefox.candidate`, is the source pin that
14
+ `fireforge download` resolves an archive from. `fireforge source set` writes
15
+ it.
15
16
 
16
- The pin lives in `fireforge.json` beside hand-maintained policy sections, which
17
- is worth knowing when reverting that file: `git checkout -- fireforge.json`
18
- after an accidental reformat also reverts an **uncommitted** pin, and the tree
19
- is then building a different version than the config claims.
17
+ The pin lives in `fireforge.json` next to hand-maintained policy sections,
18
+ which is worth knowing when you revert that file. Running
19
+ `git checkout -- fireforge.json` after an accidental reformat also reverts an
20
+ uncommitted pin, and the tree is then building a different version than the
21
+ config claims.
20
22
 
21
23
  ### Archive integrity: `firefox.sha256` and `firefox.allowUnverifiedDownload`
22
24
 
23
25
  Every fresh download is checked against Mozilla's published `SHA256SUMS` for
24
- the release, and a mismatch fails the download and discards the archive. The
25
- check also **fails closed when the published digest cannot be obtained** — a
26
- 404, a captive portal answering with an HTML page, a dropped connection or a
27
- timeout. TLS alone is thin trust for the artifact that becomes the git
26
+ the release. A mismatch fails the download and discards the archive. The
27
+ check also fails closed when the published digest cannot be obtained at all:
28
+ a 404, a captive portal answering with an HTML page, a dropped connection, or
29
+ a timeout. TLS alone is thin trust for the artifact that becomes the git
28
30
  baseline every patch is built on, and "the checksum host was unreachable" is
29
31
  exactly the condition someone positioned on the network can arrange.
30
32
 
31
33
  - `firefox.sha256` pins the digest. It takes precedence over the published
32
34
  file and is the right answer for reproducible builds and offline mirrors:
33
- obtain it out of band and the download verifies with no network beyond the
35
+ obtain it out of band, and the download verifies with no network beyond the
34
36
  archive itself.
35
37
  - `firefox.allowUnverifiedDownload: true` accepts a download when the
36
- published digest is **unavailable**, with a loud warning. **This disables
37
- the integrity check for that case** — the archive is trusted on TLS alone.
38
- Use it only for a mirror you already trust, and prefer pinning `sha256`
39
- instead. A digest that IS fetched and does not match is rejected regardless
40
- of this setting. Ignored when `sha256` is set.
38
+ published digest is unavailable, with a loud warning. This disables the
39
+ integrity check for that case, so the archive is trusted on TLS alone. Use
40
+ it only for a mirror you already trust, and prefer pinning `sha256`
41
+ instead. A digest that is fetched and does not match is rejected either
42
+ way. The setting is ignored when `sha256` is set.
41
43
 
42
- `fireforge doctor` reports the pin beside what the checkout actually is — the
44
+ `fireforge doctor` reports the pin beside what the checkout actually is (the
43
45
  engine's own `browser/config/version.txt` and the version the last download
44
- recorded — and warns when they disagree. It is a report, not a lock: a tree
45
- may legitimately be mid-migration. `product`, `sha256` and `candidate` have no
46
- recorded counterpart on disk, so the check does not claim to have verified
47
- them.
46
+ recorded) and warns when they disagree. It is a report, not a lock, since a
47
+ tree may legitimately be mid-migration. `product`, `sha256` and `candidate`
48
+ have no recorded counterpart on disk, so the check does not claim to have
49
+ verified them.
48
50
 
49
51
  ## External toolchains
50
52
 
51
53
  Projects with generated asset prerequisites can declare opt-in
52
- `externalToolchains`. `fireforge doctor` reports missing **required** tools as
53
- errors and missing **optional** tools as warnings.
54
+ `externalToolchains`. `fireforge doctor` reports missing required tools as
55
+ errors and missing optional tools as warnings.
54
56
 
55
57
  Seasonal branding on macOS, for example, can declare Apple's Icon Composer
56
58
  tool at
@@ -59,27 +61,28 @@ plus `actool` via `xcrun`, `sips`, and `iconutil`.
59
61
 
60
62
  ## `patchLint`
61
63
 
62
- Per-patch lint type-checks plain Firefox JS against a built-in Firefox-globals
63
- shim that tracks upstream WebIDL additions per release.
64
+ Per-patch lint type-checks plain Firefox JS against a built-in
65
+ Firefox-globals shim that tracks upstream WebIDL additions per release.
64
66
 
65
- - `patchLint.checkJsExtraShim` adds members to the structured shim globals via
66
- TypeScript interface merging, e.g.
67
+ - `patchLint.checkJsExtraShim` adds members to the structured shim globals
68
+ via TypeScript interface merging, for example
67
69
  `interface ChromeUtilsShim { newApi(): any }`.
68
70
  - `patchLint.checkJsTestFiles: true` extends the pass to patch-owned test
69
- `.js` files (`browser_*` / `test_*` / `xpcshell_*` and `/test/` paths). Each
70
- is checked as its own small script-scope program against a loose built-in
71
- harness shim.
71
+ `.js` files (`browser_*`, `test_*`, `xpcshell_*`, and `/test/` paths). Each
72
+ one is checked as its own small script-scope program against a loose
73
+ built-in harness shim.
72
74
  - `patchLint.checkJsTestShim` points at a project `.d.ts` whose typed
73
- declarations (e.g. a real `TestUtils` interface) override the loose
74
- baseline, so calls to nonexistent harness members fail at export time.
75
- - `patchLint.prettier` (`'off'` | `'warning'` | `'error'`, default `'off'`)
75
+ declarations (a real `TestUtils` interface, say) override the loose
76
+ baseline, so calls to harness members that do not exist fail at export
77
+ time.
78
+ - `patchLint.prettier` (`'off'`, `'warning'` or `'error'`, default `'off'`)
76
79
  runs the project's configured Prettier over patch-owned `.sys.mjs`
77
80
  modules. It runs from inside `engine/`, so `engine/.prettierrc*` and
78
- `engine/.prettierignore` decide — the same command run from the repo root
79
- can report a false pass when the root `.prettierignore` excludes
81
+ `engine/.prettierignore` decide the outcome. The same command run from the
82
+ repo root can report a false pass when the root `.prettierignore` excludes
80
83
  `engine/`. Prettier is resolved from `engine/node_modules`, then the
81
- project's, then `npx --no-install`. **Left `'off'`, formatting is out of
82
- scope for the per-patch tier**; no other tier checks `.sys.mjs`
84
+ project's, then `npx --no-install`. Left at `'off'`, formatting is out of
85
+ scope for the per-patch tier, and no other tier checks `.sys.mjs`
83
86
  formatting either.
84
87
  - `patchLint.fileSizeThresholds` tunes the `file-too-large` line counts per
85
88
  file class:
@@ -96,11 +99,11 @@ shim that tracks upstream WebIDL additions per release.
96
99
  ```
97
100
 
98
101
  Every field is optional and merges over the defaults (general
99
- `500/750/900`, test `1200/1400/1600`). The merged triple must satisfy
100
- `notice <= warning <= error`, which is validated at config load. Note that
101
- under the recommended gate posture `--max-warnings 0` the `warning` band is
102
- a hard failure, not a soft limit — which is what these thresholds exist to
103
- let you move.
102
+ `500/750/900`, test `1200/1400/1600`). The merged triple has to satisfy
103
+ `notice <= warning <= error`, which is validated at config load. Under
104
+ the recommended gate posture `--max-warnings 0`, the `warning` band
105
+ is a hard failure rather than a soft limit, which is what these thresholds
106
+ exist to let you move.
104
107
 
105
108
  ## `patchPolicy`
106
109
 
@@ -115,12 +118,13 @@ gaps does not move a patch out of the band its category owns.
115
118
  ## `buildAudit`
116
119
 
117
120
  The post-build packaging audit is warn-only. Most of what it would otherwise
118
- report as "missing packaged artifact" is classified away structurally — an
119
- unselected `--with-branding` tree read from the generated `engine/mozconfig`,
120
- a directory reached only through a platform-gated `DIRS +=` in an ancestor
121
- `moz.build`, a Storybook `*.stories.mjs`. One case cannot be derived from the
122
- tree: a source that is deliberately never packaged, such as a type-only
123
- mirror whose header says it is never loaded. Declare those:
121
+ report as "missing packaged artifact" is classified away from the structure
122
+ of the tree itself: an unselected `--with-branding` tree read from the
123
+ generated `engine/mozconfig`, a directory reached only through a
124
+ platform-gated `DIRS +=` in an ancestor `moz.build`, a Storybook
125
+ `*.stories.mjs`. One case cannot be derived from the tree: a source that is
126
+ deliberately never packaged, such as a type-only mirror whose header says it
127
+ is never loaded. Declare those:
124
128
 
125
129
  ```json
126
130
  {
@@ -128,112 +132,114 @@ mirror whose header says it is never loaded. Declare those:
128
132
  "unpackaged": [
129
133
  {
130
134
  "path": "browser/base/content/hominis-tile-host-types.js",
131
- "reason": "Type-only mirror of the tile host; never loaded, no jar.mn entry by design."
135
+ "reason": "Type-only mirror of the tile host, never loaded, and no jar.mn entry by design."
132
136
  }
133
137
  ]
134
138
  }
135
139
  }
136
140
  ```
137
141
 
138
- - `path` is engine-relative. A `*` may glob **within one path segment**;
139
- `**` is refused, because a subtree carve-out is how a reviewed exception
140
- quietly becomes a blanket one.
142
+ - `path` is engine-relative. A `*` may glob within one path segment. `**` is
143
+ refused, because a subtree carve-out is how a reviewed exception quietly
144
+ becomes a blanket one.
141
145
  - `reason` is required and must be non-empty. This is the one audit class
142
146
  FireForge cannot verify against the tree, so the declaration is the
143
- evidence; an unexplained carve-out is indistinguishable from a mistake by
144
- the time someone reads it.
145
- - Admitted paths are **listed** in the audit output
146
- (`admitted as unpackaged by buildAudit.unpackaged "<path>" — <reason>`),
147
- never silenced.
148
- - A declared path that DOES resolve to a packaged artifact is reported as a
149
- **stale carve-out** rather than suppressed: the declaration asserts a fact
150
- about the tree that is no longer true.
147
+ evidence. By the time someone reads it, an unexplained carve-out is
148
+ indistinguishable from a mistake.
149
+ - Admitted paths are listed in the audit output, never silenced. The notice
150
+ reads `admitted as unpackaged by buildAudit.unpackaged "<path>"` followed
151
+ by the declared reason.
152
+ - A declared path that does resolve to a packaged artifact is reported as a
153
+ stale carve-out rather than suppressed, because the declaration asserts a
154
+ fact about the tree that is no longer true.
151
155
  - A declaration matching nothing that changed in a given run says nothing.
152
- Unlike `--expect-unmanaged`, whose unmet entries are reported because it
153
- is a per-invocation flag list, this is a standing list checked only
154
- against the files that happened to change — "not met" is the normal case.
156
+ Unlike `--expect-unmanaged`, whose unmet entries are reported because it is
157
+ a per-invocation flag list, this is a standing list checked only against
158
+ the files that happened to change, so "not met" is the normal case.
155
159
 
156
160
  The `Packaged:` summary line names each non-zero skip class with its count,
157
- so a run that dismissed four unselected-branding files reads differently
158
- from one that dismissed four unregistered sources.
161
+ so a run that dismissed four unselected-branding files reads differently from
162
+ one that dismissed four unregistered sources.
159
163
 
160
164
  ## Design tokens
161
165
 
162
- Tokens are managed with `fireforge token add`; `fireforge token list` and
166
+ Tokens are managed with `fireforge token add`. `fireforge token list` and
163
167
  `fireforge token show` report what is already there.
164
168
 
165
169
  - `--create-category` declares a new category banner and inserts the token in
166
- one step. It is incompatible with `--variant`; author the category with the
167
- base token first, then add each variant.
170
+ one step. It cannot be combined with `--variant`: author the category with
171
+ the base token first, then add each variant.
168
172
  - `--category` is required for a base declaration and optional under
169
173
  `--variant`, where the declaration is routed into a `:root<selector>` block
170
174
  and never into a category section. It is still validated when supplied.
171
175
  - `--variant` takes the same selector grammar the block matcher understands:
172
- one attribute fragment (`[data-private]`, `[data-skin=precision]`), a run of
173
- them (`[data-skin=precision][data-theme=dark]`), and an optional pseudo-class
174
- tail (`[data-skin=precision]:not([data-private])`). Names and values must be
175
- identifier-safe, and `=value` is normalized to `="value"`. A variant naming a
176
- qualifier matches only a block carrying that qualifier; one without a
177
- qualifier still matches a qualified block, and the write says so.
176
+ one attribute fragment (`[data-private]`, `[data-skin=precision]`), a run
177
+ of them (`[data-skin=precision][data-theme=dark]`), and an optional
178
+ pseudo-class tail (`[data-skin=precision]:not([data-private])`). Names and
179
+ values must be identifier-safe, and `=value` is normalized to `="value"`. A
180
+ variant naming a qualifier matches only a block carrying that qualifier.
181
+ One without a qualifier still matches a qualified block, and the write says
182
+ so.
178
183
  - `--mode override` mirrors into both `:root[data-theme="dark"]` and
179
184
  `:root[data-theme="light"]`. A qualified block such as
180
185
  `:root[data-theme="light"]:not([data-private])` is matched and written
181
- through, with a warning naming the selector — the qualifier is
182
- semantically load-bearing, but silently skipping half the mirror is the
183
- worse failure.
186
+ through, with a warning naming the selector. The qualifier carries meaning,
187
+ but silently skipping half the mirror is the worse failure.
184
188
  - A token already present in the target block is reported with its location
185
- (`already exists in :root[…] (line N), unchanged`) rather than a bare
189
+ (`already exists in :root[…] (line N), unchanged`) rather than as a bare
186
190
  no-op.
187
191
 
188
192
  ### Reading the token file
189
193
 
190
- `token add --category` refuses a category the tokens CSS does not declare, so
191
- `token list` exists to name them without hand-parsing a `= Category =` banner
192
- out of the file.
194
+ `token add --category` refuses a category that the tokens CSS does not
195
+ declare, so `token list` exists to name the categories without you
196
+ hand-parsing a `= Category =` banner out of the file.
193
197
 
194
198
  - `fireforge token list [--category <name>] [--json]` reports each category
195
199
  banner with the tokens declared under it, in file order. Declarations above
196
- the first banner are reported under `(no category)` rather than dropped, and
197
- a banner with no tokens is still listed — `token add` accepts it. An unknown
198
- `--category` is refused by naming the ones that exist, because a filter that
199
- printed nothing would read as "this category is empty".
200
- - `fireforge token show <token-name> [--json]` reports the owning category and
201
- the value the token takes in **every** block that declares it — the base
202
- `:root`, the dark `@media` mirror, and each `:root[variant]` — with the line
203
- of each. The leading `--` is optional; with it, pass the `--` separator
204
- first (`fireforge token show -- --my-token`).
205
-
206
- Only the base `:root` block owns a token, so `token list` reports it once;
207
- the dark and variant blocks mirror it and appear in `token show`.
200
+ the first banner are reported under `(no category)` rather than dropped,
201
+ and a banner with no tokens is still listed, since `token add` accepts it.
202
+ An unknown `--category` is refused by naming the ones that exist, because a
203
+ filter that printed nothing would read as "this category is empty".
204
+ - `fireforge token show <token-name> [--json]` reports the owning category
205
+ and the value the token takes in every block that declares it: the base
206
+ `:root`, the dark `@media` mirror, and each `:root[variant]`, with the line
207
+ of each. The leading `--` is optional, and if you include it, pass the `--`
208
+ separator first (`fireforge token show -- --my-token`).
209
+
210
+ Only the base `:root` block owns a token, so `token list` reports it once.
211
+ The dark and variant blocks mirror it and appear in `token show`.
208
212
 
209
213
  ## Smoke runs
210
214
 
211
215
  For unattended smoke checks, `fireforge run --smoke-exit <s> --headless`
212
216
  launches the browser headless. A headed smoke window on a shared desktop
213
- absorbs live input, which contaminates the console capture — headed non-CI
214
- launches print a warning saying so. Exit codes 12 and 13 separate a console
215
- regression from a launch failure; see [`exit-codes.md`](exit-codes.md).
217
+ absorbs live input, which contaminates the console capture, so headed
218
+ non-CI launches print a warning saying so. Exit codes 12 and 13 separate a
219
+ console regression from a launch failure. See
220
+ [`exit-codes.md`](exit-codes.md).
216
221
 
217
222
  ## Lock waits
218
223
 
219
- Every FireForge command that mutates the engine takes the engine-session lock,
220
- and some take a second subsystem lock as well. Contention fails fast after
221
- about a second by default.
224
+ Every FireForge command that mutates the engine takes the engine-session
225
+ lock, and some take a second subsystem lock as well. Contention fails fast
226
+ after about a second by default.
222
227
 
223
- `--wait-lock [seconds]` (bare flag = 60, valid 1–3600) replaces that with a
224
- bounded wait, and the budget covers **every** lock the command takes — for
225
- `furnace apply`/`deploy`/`sync` that means the furnace lock as well as the
226
- engine-session lock. While waiting, a progress line roughly every 5 seconds
227
- identifies the holder by PID, command and start time.
228
+ `--wait-lock [seconds]` (bare flag means 60, valid range 1 to 3600) replaces
229
+ that with a bounded wait, and the budget covers every lock the command takes.
230
+ For `furnace apply`, `deploy` and `sync` that means the furnace lock as well
231
+ as the engine-session lock. While waiting, a progress line roughly every 5
232
+ seconds identifies the holder by PID, command and start time.
228
233
 
229
234
  Commands that take no lock accept `--wait-lock` and ignore it, so a scripted
230
- sequence can blanket-append the flag without a usage error killing the run.
235
+ sequence can append the flag everywhere without a usage error killing the
236
+ run.
231
237
 
232
238
  `FIREFORGE_WAIT_LOCK=<seconds>` applies the same budget to every command in a
233
239
  session, using the same bounds as the flag. It is the only way to give a
234
240
  budget to the furnace mutators that declare no flag (`create`, `remove`,
235
- `rename`, `refresh`, `scan`, `override`, `chrome-doc`, …). An explicit
236
- `--wait-lock` always wins.
241
+ `rename`, `refresh`, `scan`, `override`, `chrome-doc`, and the rest). An
242
+ explicit `--wait-lock` always wins.
237
243
 
238
244
  `fireforge status --lock` reports the current holder and queue depth.
239
245
 
@@ -241,11 +247,11 @@ budget to the furnace mutators that declare no flag (`create`, `remove`,
241
247
 
242
248
  | Variable | Effect |
243
249
  | ------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------- |
244
- | `FIREFORGE_WAIT_LOCK` | Session-wide lock wait budget in seconds (1–3600). See above. |
250
+ | `FIREFORGE_WAIT_LOCK` | Session-wide lock wait budget in seconds (1 to 3600). See above. |
245
251
  | `FIREFORGE_MAX_UNTRACKED_FILES` | Per-directory cap when expanding collapsed untracked directories in `status` (default 5000). A non-positive value warns and is ignored. |
246
252
  | `FIREFORGE_GIT_ADD_TIMEOUT_MS` | Timeout for the monolithic `git add -A` baseline pass (default 10 min). For slow or loaded filesystems. |
247
253
  | `FIREFORGE_GIT_ADD_CHUNK_TIMEOUT_MS` | Timeout for the chunked `git add -- <dir>` fallback (default 30 min). Paired with the above. |
248
254
 
249
- `CLAUDECODE` is read by mozbuild, not by FireForge, and `fireforge test
250
- --full-output` unsets it for test dispatches only — see
255
+ `CLAUDECODE` is read by mozbuild, not by FireForge. `fireforge test
256
+ --full-output` unsets it for test dispatches only. See
251
257
  [`testing.md`](testing.md#output-verbosity).
@@ -2,76 +2,81 @@
2
2
 
3
3
  # Exit codes (internal)
4
4
 
5
- The exit code is the machine-readable half of the CLI's contract: a script
6
- branches on it, and CI decides whether to retry or escalate. The values live
7
- in `src/errors/codes.ts`; this file is the operator-facing statement of what
8
- they mean and which class produces each.
5
+ The exit code is the machine-readable half of the CLI's contract. A script
6
+ branches on it, and CI uses it to decide whether to retry or escalate. The
7
+ values live in `src/errors/codes.ts`. This file says what they mean and
8
+ which error class produces each one.
9
9
 
10
- | Code | Name | Meaning | Produced by |
11
- | ---: | ---------------------- | ------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------- |
12
- | 0 | `SUCCESS` | Completed. Also a run that prompted and the operator declined — declining is a successful run that chose not to proceed. | — |
13
- | 1 | `GENERAL_ERROR` | Unspecified failure the operator must act on. | `GeneralError` (and `PreflightRefusalError`), `ParserFallbackError`, `ExecTimeoutError` |
14
- | 2 | `CONFIG_ERROR` | `fireforge.json` missing or invalid. | `ConfigError` and subclasses |
15
- | 3 | `DOWNLOAD_ERROR` | Could not download or extract Firefox source. | `DownloadError` and subclasses |
16
- | 4 | `GIT_ERROR` | A git operation failed. | `GitError` and subclasses, except `GitNotFoundError` |
17
- | 5 | `BUILD_ERROR` | `mach build` failed, or a test suite went red. | `BuildError` and subclasses, `TestFailureError` |
18
- | 6 | `PATCH_ERROR` | A patch failed to apply, or the patch queue could not be mutated. | `PatchError`, `PatchManifestCorruptError`, `RebaseError` and subclasses |
19
- | 7 | `MISSING_DEPENDENCY` | A required tool (python3, git, tar) was not found. | `PythonNotFoundError`, `GitNotFoundError`, `MachNotFoundError` |
20
- | 8 | `INVALID_ARGUMENT` | The flags were wrong. Usage problem, not an environment one. | `InvalidArgumentError`; commander usage errors (unknown command or option, missing argument) |
21
- | 9 | `FURNACE_ERROR` | A Furnace component operation failed. | `FurnaceError` |
22
- | 10 | `RESOLUTION_ERROR` | Conflict resolution failed. | `ResolutionError` |
23
- | 11 | `INTERNAL_ERROR` | A FireForge invariant did not hold. **A bug in FireForge**, not something the operator can fix. | `InternalInvariantError` |
24
- | 12 | `SMOKE_EXIT_FAILURE` | `run --smoke-exit` saw unallowed console errors in the smoke window. | `SmokeRunError` |
25
- | 13 | `SMOKE_LAUNCH_FAILURE` | `run --smoke-exit` saw a non-clean browser exit before the window elapsed. | `SmokeRunError` |
26
- | 14 | `INCONCLUSIVE` | A test run's verdict was thrown away: `engine/` moved while the harness ran. **Not red** — re-run it. | `InconclusiveVerdictError` |
27
- | 15 | `LOCK_TIMEOUT` | A lock wait expired, so the run never started. Re-queue it, with a larger `--wait-lock`. | `LockContentionError` |
28
- | 130 | `USER_CANCELLED` | The operator INTERRUPTED a prompt (Esc / Ctrl+C). 128 + SIGINT. | `CancellationError` |
10
+ | Code | Name | Meaning | Produced by |
11
+ | ---: | ---------------------- | ----------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
12
+ | 0 | `SUCCESS` | Completed. Also a run that prompted and the operator declined: declining is a successful run that chose not to proceed. | (none) |
13
+ | 1 | `GENERAL_ERROR` | Unspecified failure the operator has to act on. | `GeneralError` (and `PreflightRefusalError`), `ParserFallbackError`, `ExecTimeoutError` |
14
+ | 2 | `CONFIG_ERROR` | `fireforge.json` missing or invalid. | `ConfigError` and subclasses |
15
+ | 3 | `DOWNLOAD_ERROR` | Could not download or extract Firefox source. | `DownloadError` and subclasses |
16
+ | 4 | `GIT_ERROR` | A git operation failed. | `GitError` and subclasses, except `GitNotFoundError` |
17
+ | 5 | `BUILD_ERROR` | `mach build` failed, or a test suite went red. | `BuildError` and subclasses, `TestFailureError` |
18
+ | 6 | `PATCH_ERROR` | A patch failed to apply, or the patch queue could not be mutated. | `PatchError`, `PatchManifestCorruptError`, `RebaseError` and subclasses |
19
+ | 7 | `MISSING_DEPENDENCY` | A required tool (python3, git, tar) was not found. | `PythonNotFoundError`, `GitNotFoundError`, `MachNotFoundError` |
20
+ | 8 | `INVALID_ARGUMENT` | The flags were wrong. A usage problem, not an environment one. | `InvalidArgumentError`, plus commander usage errors (unknown command or option, missing argument) |
21
+ | 9 | `FURNACE_ERROR` | A Furnace component operation failed. | `FurnaceError` |
22
+ | 10 | `RESOLUTION_ERROR` | Conflict resolution failed. | `ResolutionError` |
23
+ | 11 | `INTERNAL_ERROR` | A FireForge invariant did not hold. This is a bug in FireForge, not something the operator can fix. | `InternalInvariantError` |
24
+ | 12 | `SMOKE_EXIT_FAILURE` | `run --smoke-exit` saw console errors that were not allowed in the smoke window. | `SmokeRunError` |
25
+ | 13 | `SMOKE_LAUNCH_FAILURE` | `run --smoke-exit` saw the browser exit uncleanly before the window elapsed. | `SmokeRunError` |
26
+ | 14 | `INCONCLUSIVE` | A test run's verdict was thrown away because `engine/` moved while the harness ran. This is not red. Re-run it. | `InconclusiveVerdictError` |
27
+ | 15 | `LOCK_TIMEOUT` | A lock wait expired, so the run never started. Re-queue it with a larger `--wait-lock`. | `LockContentionError` |
28
+ | 130 | `USER_CANCELLED` | The operator interrupted a prompt (Esc or Ctrl+C). 128 + SIGINT. | `CancellationError` |
29
29
 
30
- A usage error commander itself detects — an unknown command, an unknown or
31
- malformed option, a missing required argument — never reaches a command
32
- action, so before 0.46.0 commander terminated the process with its own exit
33
- 1 and, under `--json`, no refusal envelope. `createProgram` now installs
34
- commander's `exitOverride()` and the entry point maps the resulting
30
+ Usage errors that commander detects itself (an unknown command, an unknown
31
+ or malformed option, a missing required argument) never reach a command
32
+ action. Before 0.46.0 commander terminated the process with its own exit 1
33
+ and printed no refusal envelope under `--json`. `createProgram` now installs
34
+ commander's `exitOverride()`, and the entry point maps the resulting
35
35
  `CommanderError` to `INVALID_ARGUMENT` (8) with the standard envelope on
36
- stdout. `--help` and `--version` travel the same path and still exit 0, and
37
- so does a command group invoked without a subcommand (`fireforge`,
36
+ stdout. `--help` and `--version` take the same path and still exit 0, and so
37
+ does a command group invoked without a subcommand (`fireforge`,
38
38
  `fireforge tree`): commander prints the group's help and the entry point
39
- treats it as informational rather than as a wrong flag, matching the exit 0
40
- that `patch`, `token` and `furnace` give through their own help action.
39
+ treats that as informational rather than as a wrong flag. That matches the
40
+ exit 0 that `patch`, `token` and `furnace` give through their own help
41
+ action.
41
42
 
42
43
  ## The three distinctions that matter for CI
43
44
 
44
- **Retry vs escalate.** `GENERAL_ERROR` usually means the operator must change
45
- something and a retry may help. `INTERNAL_ERROR` means nothing they could
46
- change would have helped — escalate it, do not retry.
45
+ **Retry or escalate.** `GENERAL_ERROR` usually means the operator has to
46
+ change something, and a retry may then help. `INTERNAL_ERROR` means nothing
47
+ they could change would have helped. Escalate it, do not retry.
47
48
 
48
- **Red vs never-ran vs thrown-away.** These are three different facts and,
49
- before 0.44.0, two of them shared exit 1. `BUILD_ERROR` (5) is a suite that
50
- FAILED — thrown as `TestFailureError` since 0.45.0, which keeps the code but
51
- carries test remedies rather than build ones (`--json` reports it as
52
- `test-failure`). `LOCK_TIMEOUT` (15) is a run that never started, because another
53
- FireForge process held the lock for the whole budget — nothing about the
54
- request was wrong, so re-queue it. `INCONCLUSIVE` (14) is a suite whose
55
- result was DISCARDED, because `engine/` moved underneath it — the code may
56
- be perfectly green, and reporting it as red is wrong. A summary line reading
57
- `FAIL — exit 1` beside `FAIL — exit 5` invited treating opposites as the same
58
- kind of fact; the codes now separate them mechanically. The
59
- `FIREFORGE-VERDICT:` line's `reason=` key carries the same distinction for
60
- humans.
49
+ **Red, never ran, or thrown away.** These are three different facts, and
50
+ before 0.44.0 two of them shared exit 1.
61
51
 
62
- Note that `LockContentionError` backs every lock in FireForge — engine
63
- session, patch directory, build, furnace — so all four now exit 15. That is
64
- deliberate: the fact is the same whichever lock was contended.
52
+ - `BUILD_ERROR` (5) is a suite that failed. Since 0.45.0 it is thrown as
53
+ `TestFailureError`, which keeps the code but carries test remedies rather
54
+ than build ones (`--json` reports it as `test-failure`).
55
+ - `LOCK_TIMEOUT` (15) is a run that never started, because another FireForge
56
+ process held the lock for the whole budget. Nothing about the request was
57
+ wrong, so re-queue it.
58
+ - `INCONCLUSIVE` (14) is a suite whose result was discarded because
59
+ `engine/` moved underneath it. The code may be perfectly green, so
60
+ reporting it as red is wrong.
65
61
 
66
- **Interrupted vs declined.** Before 0.44.0 both a Ctrl+C and a deliberate
67
- "no" at a confirmation returned the same value and exited 0, so a script
68
- could not tell them apart. They are now distinct: an interrupt raises
69
- `CancellationError` and exits **130**; a declined confirmation returns
70
- normally and exits **0**, because the run did what it was asked and the
71
- answer was no.
62
+ A summary line reading `FAIL - exit 1` beside `FAIL - exit 5` invited
63
+ treating opposite facts as the same kind of thing. The codes now separate
64
+ them. The `FIREFORGE-VERDICT:` line's `reason=` key carries the same
65
+ distinction for humans.
66
+
67
+ `LockContentionError` backs every lock in FireForge (engine session, patch
68
+ directory, build, furnace), so all four exit 15. That is intentional: the
69
+ fact is the same whichever lock was contended.
70
+
71
+ **Interrupted or declined.** Before 0.44.0 a Ctrl+C and a deliberate "no" at
72
+ a confirmation both returned the same value and exited 0, so a script could
73
+ not tell them apart. They are now distinct: an interrupt raises
74
+ `CancellationError` and exits 130, and a declined confirmation returns
75
+ normally and exits 0, because the run did what it was asked and the answer
76
+ was no.
72
77
 
73
78
  ## Adding a code
74
79
 
75
80
  New codes go in `src/errors/codes.ts` with a comment saying what a consumer
76
- should DO differently on seeing it — if the answer is "nothing different from
81
+ should do differently on seeing it. If the answer is "nothing different from
77
82
  an existing code", it does not need one. Add a row here in the same change.