@starci/hfs 4.4.0 → 4.4.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 (69) hide show
  1. package/CHANGELOG.md +3 -0
  2. package/README.md +1 -1
  3. package/db/migrate.mjs +4 -4
  4. package/db/post-cutover.mjs +4 -4
  5. package/emit/contracts.mjs +2 -2
  6. package/emit/db-types.mjs +2 -2
  7. package/lint/run.mjs +2 -2
  8. package/package.json +1 -1
  9. package/release/gate.mjs +4 -4
  10. package/release/index.mjs +2 -2
  11. package/release/push.mjs +1 -1
  12. package/report/sonar.mjs +1 -1
  13. package/runtime/config.example.yaml +7 -6
  14. package/runtime/engine/config.mjs +10 -18
  15. package/runtime/engine/removed-vocabulary.mjs +0 -2
  16. package/runtime/knowledge/hfs/canon-pins.yaml +4 -4
  17. package/runtime/knowledge/hfs/rules.yaml +410 -967
  18. package/runtime/knowledge/hfs/slots.yaml +13 -24
  19. package/runtime/modules/kernel/failure-codes.yaml +0 -22
  20. package/runtime/modules/kernel/removed-vocabulary.yaml +30 -0
  21. package/runtime/modules/models/runtimes.yaml +4 -6
  22. package/runtime/packages/cli/src/catalog.generated.mjs +46 -381
  23. package/runtime/scripts/api/git/lib.mjs +3 -3
  24. package/runtime/scripts/api/sops/lib.mjs +1 -1
  25. package/runtime/scripts/hfs/app-wiring.mjs +2 -2
  26. package/runtime/scripts/hfs/architecture/config.mjs +1 -1
  27. package/runtime/scripts/hfs/architecture/index.mjs +1 -1
  28. package/runtime/scripts/hfs/architecture/supabase.mjs +1 -1
  29. package/runtime/scripts/hfs/architecture/tiers.mjs +1 -1
  30. package/runtime/scripts/hfs/architecture.mjs +1 -1
  31. package/runtime/scripts/hfs/coverage-from.mjs +1 -1
  32. package/runtime/scripts/hfs/coverage-scope.mjs +1 -1
  33. package/runtime/scripts/hfs/example-secrets.mjs +1 -1
  34. package/runtime/scripts/hfs/manifest-shape.mjs +3 -3
  35. package/runtime/scripts/hfs/param-names.mjs +1 -1
  36. package/runtime/scripts/hfs/rule-catalog.mjs +3 -1
  37. package/runtime/scripts/hfs/rules/a15-findings.mjs +1 -1
  38. package/runtime/scripts/hfs/rules/assets.mjs +1 -1
  39. package/runtime/scripts/hfs/rules/cli.mjs +1 -1
  40. package/runtime/scripts/hfs/rules/contract-compat.mjs +1 -1
  41. package/runtime/scripts/hfs/rules/contract.mjs +1 -1
  42. package/runtime/scripts/hfs/rules/frontend-tree.mjs +2 -2
  43. package/runtime/scripts/hfs/rules/supabase-secrets.mjs +1 -1
  44. package/runtime/scripts/hfs/runtime-rules/workflow-source.mjs +2 -2
  45. package/runtime/scripts/hfs/slots.mjs +2 -2
  46. package/runtime/scripts/hfs/typescript-programs.mjs +0 -8
  47. package/runtime/scripts/lib/env.mjs +2 -2
  48. package/runtime/scripts/lib/git.mjs +1 -1
  49. package/runtime/scripts/lib/i18n.mjs +0 -2
  50. package/runtime/scripts/lib/language.mjs +1 -1
  51. package/runtime/scripts/lib/roots.mjs +2 -4
  52. package/scaffold/add-fe-overlay.mjs +0 -121
  53. package/scaffold/add-fe-page.mjs +0 -268
  54. package/scaffold/supabase-ports.mjs +1 -1
  55. package/stack/age-install.mjs +1 -1
  56. package/stack/cli.mjs +2 -2
  57. package/stack/context.mjs +1 -1
  58. package/stack/digest.mjs +1 -1
  59. package/stack/edge-alias.mjs +1 -1
  60. package/stack/image-scan.mjs +1 -1
  61. package/stack/ingress-create.mjs +2 -2
  62. package/stack/ingress.mjs +3 -3
  63. package/stack/remote.mjs +2 -2
  64. package/stack/sealed.mjs +5 -5
  65. package/sync/format.mjs +1 -1
  66. package/sync/hygiene.mjs +1 -1
  67. package/sync/index.mjs +2 -2
  68. package/sync/stack-images.mjs +2 -2
  69. package/upgrade/index.mjs +1 -1
@@ -1,7 +1,7 @@
1
1
  // GENERATED by scripts/cli/gen-catalog.mjs — do not edit
2
2
  export const CATALOG = {
3
3
  "schema": "starci/cli-catalog@1",
4
- "hash": "757ac9945db2a2b217a5dea8be2cd2c0fcb895230762eb9cd15700b8a44bce49",
4
+ "hash": "65c712b99fc864f4135df840b2f870d54bf783fc7762eab2232b37557690e9bc",
5
5
  "global": [
6
6
  {
7
7
  "name": "json",
@@ -2073,35 +2073,6 @@ export const CATALOG = {
2073
2073
  },
2074
2074
  "runtimeSide": "tree"
2075
2075
  },
2076
- "runtime-coverage": {
2077
- "summary": "run the runtime spec suite under Node coverage and write coverage/lcov.info",
2078
- "owner": "runtime",
2079
- "positional": [
2080
- {
2081
- "name": "specs",
2082
- "required": false,
2083
- "variadic": true
2084
- }
2085
- ],
2086
- "flags": [],
2087
- "exit": {
2088
- "0": "the suite is green",
2089
- "1": "a spec failed",
2090
- "2": "bad usage"
2091
- },
2092
- "json": "none",
2093
- "examples": [
2094
- "starci gate runtime-coverage",
2095
- "starci gate runtime-coverage tests/cli/catalog.spec.mjs"
2096
- ],
2097
- "editions": [
2098
- "full"
2099
- ],
2100
- "impl": {
2101
- "script": "scripts/gates/runtime-coverage.mjs"
2102
- },
2103
- "runtimeSide": "tree"
2104
- },
2105
2076
  "sonar": {
2106
2077
  "summary": "inspect, provision, run and start the local Sonar quality gate",
2107
2078
  "owner": "runtime",
@@ -2532,16 +2503,6 @@ export const CATALOG = {
2532
2503
  }
2533
2504
  ],
2534
2505
  "flags": [
2535
- {
2536
- "name": "verified",
2537
- "type": "string",
2538
- "summary": "an earlier verified tip that must be an ancestor of ref"
2539
- },
2540
- {
2541
- "name": "verified-log",
2542
- "type": "string",
2543
- "summary": "the earlier verification log whose prior-red specs must rerun"
2544
- },
2545
2506
  {
2546
2507
  "name": "dry-run",
2547
2508
  "type": "boolean",
@@ -2556,23 +2517,16 @@ export const CATALOG = {
2556
2517
  "name": "kernel-note",
2557
2518
  "type": "string",
2558
2519
  "summary": "one line, what a Kernel must do differently after this land; the land record carries it and the runtime delivers it verbatim with the Kernels' next wake (absent: no line)"
2559
- },
2560
- {
2561
- "name": "concurrency",
2562
- "type": "number",
2563
- "default": 4,
2564
- "summary": "dependent spec file concurrency"
2565
2520
  }
2566
2521
  ],
2567
2522
  "exit": {
2568
2523
  "0": "the verification passed and local main fast-forwarded, or a dry run passed without moving it",
2569
- "1": "refused at a named gate, check, spec, lock or fast-forward step",
2524
+ "1": "refused at the verify receipt, a named gate, the check, the lock or the fast-forward step",
2570
2525
  "2": "bad usage"
2571
2526
  },
2572
- "json": "starci/git-land@1",
2527
+ "json": "starci/git-land@2",
2573
2528
  "examples": [
2574
2529
  "starci git land <worktree> <ref>",
2575
- "starci git land <worktree> <ref> --verified <sha> --verified-log <file> --concurrency 2",
2576
2530
  "starci git land <worktree> <ref> --dry-run --json",
2577
2531
  "starci git land <worktree> <ref> --kernel-note \"settle needs --evidence now\""
2578
2532
  ],
@@ -2589,10 +2543,10 @@ export const CATALOG = {
2589
2543
  "owner"
2590
2544
  ],
2591
2545
  "conventions": [
2592
- "land only after starci test run --level L2 --against <ref> is green",
2593
- "lands are serial and hold the host land lock through the gate, check, specs and local merge",
2594
- "local main is the only destination; a land never pushes, tags or touches origin",
2595
- "delta lands use --verified with the matching --verified-log and always rerun prior-red spec files"
2546
+ "land only a tip `starci runtime verify` proved (check, package clean-test, scaffold e2e on that exact commit)",
2547
+ "the runtime has no specs of its own (owner ruling no-runtime-specs)",
2548
+ "lands are serial and hold the host land lock through the receipt, gate, full check and local merge",
2549
+ "local main is the only destination; a land never pushes, tags or touches origin"
2596
2550
  ],
2597
2551
  "runtimeSide": "host"
2598
2552
  },
@@ -7781,7 +7735,7 @@ export const CATALOG = {
7781
7735
  "examples": [
7782
7736
  "starci release cut",
7783
7737
  "starci release cut --plan --tag v1.0.0-alpha.9",
7784
- "starci release cut --tag v1.0.0-alpha.9 --rows \"npm test,linux-parity\"",
7738
+ "starci release cut --tag v1.0.0-alpha.9 --rows \"npm run test:e2e,linux-parity\"",
7785
7739
  "starci release cut --repo <path> --tag v1.0.0-alpha.9 --json"
7786
7740
  ],
7787
7741
  "editions": [
@@ -7792,43 +7746,6 @@ export const CATALOG = {
7792
7746
  },
7793
7747
  "runtimeSide": "tree"
7794
7748
  },
7795
- "env-test": {
7796
- "summary": "run the runtime spec suite under the release cut's own conditions",
7797
- "owner": "runtime",
7798
- "flags": [
7799
- {
7800
- "name": "lane",
7801
- "type": "boolean",
7802
- "summary": "a lane clone is no Orca terminal: leave out STARCI_REQUIRE_ORCA_LIVE and the host check, keep everything else of the cut"
7803
- },
7804
- {
7805
- "name": "reuse-installs",
7806
- "type": "boolean",
7807
- "summary": "keep an example app whose node_modules exists instead of a fresh npm ci"
7808
- }
7809
- ],
7810
- "exit": {
7811
- "0": "the suite is green and no skip fails the evidence rule",
7812
- "1": "a step is red or a skipped test ran in no leg",
7813
- "2": "the host lacks a prerequisite of the cut, or bad usage"
7814
- },
7815
- "json": "none",
7816
- "examples": [
7817
- "starci release env-test",
7818
- "starci release env-test --lane --reuse-installs"
7819
- ],
7820
- "editions": [
7821
- "full"
7822
- ],
7823
- "impl": {
7824
- "script": "scripts/supervisor/release-env-test.mjs"
7825
- },
7826
- "conventions": [
7827
- "the suite is the cut's own spec leg, so a red the cut would find shows here first; it takes minutes to an hour and writes each step to a log",
7828
- "without --lane it refuses (exit 2) unless the host has an Orca terminal, a reachable Orca and a Docker daemon, the same prerequisites the cut refuses on"
7829
- ],
7830
- "runtimeSide": "tree"
7831
- },
7832
7749
  "images": {
7833
7750
  "summary": "build, run, health-check and tear down the shipped application images",
7834
7751
  "owner": "runtime",
@@ -7891,75 +7808,6 @@ export const CATALOG = {
7891
7808
  ],
7892
7809
  "runtimeSide": "tree"
7893
7810
  },
7894
- "launch-smoke": {
7895
- "summary": "prove live nested-agent launch paths on an Orca host",
7896
- "owner": "runtime",
7897
- "positional": [
7898
- {
7899
- "name": "action",
7900
- "enum": [
7901
- "stage",
7902
- "mark"
7903
- ],
7904
- "required": false,
7905
- "variadic": false
7906
- }
7907
- ],
7908
- "flags": [
7909
- {
7910
- "name": "app-repo",
7911
- "type": "string",
7912
- "summary": "scratch app main checkout registered in Orca"
7913
- },
7914
- {
7915
- "name": "entry",
7916
- "type": "string",
7917
- "summary": "plain entry terminal for the smoke"
7918
- },
7919
- {
7920
- "name": "timeout-ms",
7921
- "type": "number",
7922
- "summary": "smoke deadline in milliseconds"
7923
- },
7924
- {
7925
- "name": "out",
7926
- "type": "string",
7927
- "summary": "write the smoke result to this file"
7928
- },
7929
- {
7930
- "name": "as",
7931
- "type": "enum",
7932
- "enum": [
7933
- "supervisor",
7934
- "worker",
7935
- "kernel",
7936
- "op",
7937
- "opFe",
7938
- "opFail",
7939
- "critic"
7940
- ],
7941
- "summary": "internal smoke role for stage or mark"
7942
- }
7943
- ],
7944
- "exit": {
7945
- "0": "smoke or role action passed",
7946
- "1": "smoke or role action failed",
7947
- "2": "bad usage or no entry terminal"
7948
- },
7949
- "json": "always",
7950
- "examples": [
7951
- "starci release launch-smoke --app-repo <scratch-app>",
7952
- "starci release launch-smoke stage --as kernel",
7953
- "starci release launch-smoke mark --as op"
7954
- ],
7955
- "editions": [
7956
- "full"
7957
- ],
7958
- "impl": {
7959
- "script": "scripts/kernel/launch-smoke.mjs"
7960
- },
7961
- "runtimeSide": "tree"
7962
- },
7963
7811
  "notes": {
7964
7812
  "summary": "print or write the release notes of a tag, its CHANGELOG section",
7965
7813
  "owner": "runtime",
@@ -8136,6 +7984,32 @@ export const CATALOG = {
8136
7984
  ],
8137
7985
  "runtimeSide": "tree"
8138
7986
  },
7987
+ "scaffold-e2e": {
7988
+ "summary": "run the scaffold end-to-end proof (full and lite scaffolds installed, built and run for real)",
7989
+ "owner": "runtime",
7990
+ "flags": [],
7991
+ "exit": {
7992
+ "0": "every scaffold e2e test ran and passed",
7993
+ "1": "a scaffold e2e test failed, was cancelled or was skipped",
7994
+ "2": "the run could not start or bad usage"
7995
+ },
7996
+ "json": "none",
7997
+ "examples": [
7998
+ "starci release scaffold-e2e"
7999
+ ],
8000
+ "editions": [
8001
+ "full"
8002
+ ],
8003
+ "impl": {
8004
+ "script": "scripts/gates/scaffold-e2e.mjs"
8005
+ },
8006
+ "conventions": [
8007
+ "With release clean-test, the real test proof of the runtime (owner ruling no-runtime-specs): the runtime has no specs.",
8008
+ "A skipped test is red: every scaffold test must run (Docker, npm and the source canon registry are prerequisites).",
8009
+ "Builds the grammar and heroicons dist first when they are stale, from their own lockfiles: a fresh lane needs no build step."
8010
+ ],
8011
+ "runtimeSide": "tree"
8012
+ },
8139
8013
  "sync-runtime": {
8140
8014
  "summary": "refresh or check package runtime copies and optionally prepare grammar",
8141
8015
  "owner": "runtime",
@@ -8440,7 +8314,7 @@ export const CATALOG = {
8440
8314
  "owner"
8441
8315
  ],
8442
8316
  "conventions": [
8443
- "refuses unless the source is clean, a fast-forward of the host and its check and affected specs are proven by a receipt on that commit",
8317
+ "refuses unless the source is clean, a fast-forward of the host and its check, package clean-test and scaffold e2e are proven by a receipt on that commit",
8444
8318
  "refuses while a release cut holds the host lock; waits for settles, Critic runs and prepared decisions in flight, stops none",
8445
8319
  "several commits are one revision change, with one fast-forward, installed artefacts migrated, one engine restart, then verified",
8446
8320
  "journals one runtime-deployed event; --plan prints every step and refusal and changes nothing",
@@ -9074,7 +8948,7 @@ export const CATALOG = {
9074
8948
  "runtimeSide": "tree"
9075
8949
  },
9076
8950
  "verify": {
9077
- "summary": "verify a committed revision - the check AND the affected specs on one commit, one receipt",
8951
+ "summary": "verify a commit - the check, package clean-test and scaffold e2e on one commit, one receipt",
9078
8952
  "owner": "runtime",
9079
8953
  "positional": [],
9080
8954
  "flags": [
@@ -9090,12 +8964,11 @@ export const CATALOG = {
9090
8964
  }
9091
8965
  ],
9092
8966
  "exit": {
9093
- "0": "verified: check and every affected spec passed on the exact commit, receipt written",
9094
- "1": "NOT VERIFIED: dirty tree, no base, red check, or a red spec file",
9095
- "2": "bad usage",
9096
- "3": "PARTIAL: nothing red, the lane's own specs ran, some were not started inside the budget (fit to land, not to deploy)"
8967
+ "0": "verified: check, package clean-test and scaffold e2e passed on the exact commit, receipt written",
8968
+ "1": "NOT VERIFIED: dirty tree, no base, red check, a red or unrun package, or a failed or skipped scaffold e2e test",
8969
+ "2": "bad usage"
9097
8970
  },
9098
- "json": "starci/runtime-verify@1",
8971
+ "json": "starci/runtime-verify@2",
9099
8972
  "examples": [
9100
8973
  "starci runtime verify --base <tip>",
9101
8974
  "starci runtime verify --json"
@@ -9116,11 +8989,11 @@ export const CATALOG = {
9116
8989
  "owner"
9117
8990
  ],
9118
8991
  "conventions": [
9119
- "A branch is verified only by this receipt: check N of N and affected specs N of N for base..tip, on the exact commit.",
9120
- "A fix lane reports the last line of this verb, not the line of starci runtime check (which never runs a spec).",
8992
+ "A branch is verified only by this receipt: check N of N, the clean-test of every package base..tip touches, the scaffold e2e.",
8993
+ "The runtime has no specs of its own (owner ruling no-runtime-specs): package specs and the scaffold e2e decide.",
8994
+ "A fix lane reports the last line of this verb, not the line of starci runtime check (which runs no test).",
9121
8995
  "Refuses a tree with uncommitted or untracked changes; the receipt binds a commit.",
9122
- "starci git land accepts a partial receipt (0 failed, the lane's changed specs ran, not-started counted); deploy and release need all of them.",
9123
- "A spec whose inputs are unchanged since a proven green run is reused; the receipt counts the reused files."
8996
+ "starci git land, starci runtime deploy and the release read the same receipt: every proof passed."
9124
8997
  ],
9125
8998
  "runtimeSide": "tree"
9126
8999
  },
@@ -9864,21 +9737,6 @@ export const CATALOG = {
9864
9737
  "type": "string",
9865
9738
  "summary": "comma-separated commit shas to land"
9866
9739
  },
9867
- {
9868
- "name": "specs",
9869
- "type": "string",
9870
- "summary": "spec files or touching, direct, all, or none"
9871
- },
9872
- {
9873
- "name": "reason",
9874
- "type": "string",
9875
- "summary": "reason required when no spec applies"
9876
- },
9877
- {
9878
- "name": "full-by-push-git",
9879
- "type": "boolean",
9880
- "summary": "authorize the full suite from the push flow"
9881
- },
9882
9740
  {
9883
9741
  "name": "lane",
9884
9742
  "type": "string",
@@ -9914,7 +9772,7 @@ export const CATALOG = {
9914
9772
  "examples": [
9915
9773
  "starci supervisor land --status",
9916
9774
  "starci supervisor land --job <job-id>",
9917
- "starci supervisor land --commit <sha> --specs touching --lane <name>"
9775
+ "starci supervisor land --commit <sha> --lane <name>"
9918
9776
  ],
9919
9777
  "editions": [
9920
9778
  "full"
@@ -9960,20 +9818,10 @@ export const CATALOG = {
9960
9818
  "type": "string",
9961
9819
  "summary": "source lane name"
9962
9820
  },
9963
- {
9964
- "name": "specs",
9965
- "type": "string",
9966
- "summary": "comma-separated specs for the land gate"
9967
- },
9968
- {
9969
- "name": "wrongly-blocked",
9970
- "type": "string",
9971
- "summary": "spec proving the prior gate was wrong"
9972
- },
9973
9821
  {
9974
9822
  "name": "reason",
9975
9823
  "type": "string",
9976
- "summary": "reason when no spec applies"
9824
+ "summary": "why the experiment is landed"
9977
9825
  },
9978
9826
  {
9979
9827
  "name": "wait-ms",
@@ -10937,189 +10785,6 @@ export const CATALOG = {
10937
10785
  }
10938
10786
  }
10939
10787
  },
10940
- "test": {
10941
- "summary": "run the bounded L1-L4 test ladder without accidental whole-suite work",
10942
- "owner": "runtime",
10943
- "verbs": {
10944
- "affected": {
10945
- "summary": "the specs related to the changed functions (--by file: every importer); --run runs each once",
10946
- "owner": "runtime",
10947
- "positional": [],
10948
- "flags": [
10949
- {
10950
- "name": "base",
10951
- "type": "string",
10952
- "summary": "ref to diff against (default: the merge-base with main, else origin/main)"
10953
- },
10954
- {
10955
- "name": "changed",
10956
- "type": "list",
10957
- "summary": "explicit changed repository paths instead of the diff"
10958
- },
10959
- {
10960
- "name": "by",
10961
- "type": "string",
10962
- "summary": "symbol (default: the specs related to the changed functions) or file (every spec importing a changed file)"
10963
- },
10964
- {
10965
- "name": "run",
10966
- "type": "boolean",
10967
- "summary": "run the selected spec files, one per process, inside the time budget"
10968
- },
10969
- {
10970
- "name": "plan",
10971
- "type": "boolean",
10972
- "summary": "print the selected files with the reason each is in the set; run nothing"
10973
- },
10974
- {
10975
- "name": "receipt-file",
10976
- "type": "string",
10977
- "summary": "with --run, write the receipt to this file; the answer carries its path (a gate reads the file, not the output)"
10978
- },
10979
- {
10980
- "name": "no-cache",
10981
- "type": "boolean",
10982
- "summary": "run every selected file; ignore the per-spec result cache"
10983
- },
10984
- {
10985
- "name": "concurrency",
10986
- "type": "number",
10987
- "summary": "override automatic file concurrency with a positive integer"
10988
- },
10989
- {
10990
- "name": "root",
10991
- "type": "string",
10992
- "summary": "repository root (default: the command cwd)"
10993
- }
10994
- ],
10995
- "exit": {
10996
- "0": "selection printed, or every selected file passed",
10997
- "1": "a selected spec file was red",
10998
- "2": "no base to diff against, or the time budget ended before every selected file started"
10999
- },
11000
- "json": "starci/test-affected@1",
11001
- "examples": [
11002
- "starci test affected",
11003
- "starci test affected --run",
11004
- "starci test affected --changed scripts/machine/ladder-test.mjs --run"
11005
- ],
11006
- "editions": [
11007
- "full"
11008
- ],
11009
- "impl": {
11010
- "module": "scripts/supervisor/affected-test.mjs",
11011
- "export": "testAffected"
11012
- },
11013
- "effect": "host",
11014
- "roles": [
11015
- "worker",
11016
- "lead",
11017
- "coordinator",
11018
- "release",
11019
- "owner"
11020
- ],
11021
- "conventions": [
11022
- "Everyday verification after npm run check; the whole suite is the merged-tree run and the release cut.",
11023
- "The set is computed - each changed .mjs symbol is followed by name through its importers, callers and CLI verbs.",
11024
- "What cannot be followed by name (yaml, templates, load-time statements, no base, the depth bound) keeps the file-level rule, named in the report.",
11025
- "Selection and --plan JSON carry every symbol, its specs and reasons, and file-level fallbacks; the set is never larger than --by file.",
11026
- "A --run machine answer carries the complete selected set, every result and the receipt; the diagnostic graph remains available through --plan.",
11027
- "A large set is never refused; it runs in parallel shards inside the printed time budget, and files not started when it ends are listed.",
11028
- "The --plan flag prints each selected file with the reason it is in the set; a --run answer carries a receipt (base, tip, passed, total) a gate can require.",
11029
- "A generated output maps to its generator's specs; an append-only change to a data file to the specs that name it or its readers.",
11030
- "A red file is fixed and run again, then the affected set once; never the whole suite.",
11031
- "A spec whose key (import closure, data it names, runner) is unchanged since a green run is reused; the receipt counts reused files; --no-cache runs all.",
11032
- "Each file is its own low-priority node process with the four preloads, at the concurrency of test-concurrency.yaml."
11033
- ],
11034
- "runtimeSide": "tree"
11035
- },
11036
- "run": {
11037
- "summary": "run the specs selected for one local ladder level",
11038
- "owner": "runtime",
11039
- "positional": [],
11040
- "flags": [
11041
- {
11042
- "name": "level",
11043
- "type": "enum",
11044
- "enum": [
11045
- "L1",
11046
- "L2",
11047
- "L3",
11048
- "L4"
11049
- ],
11050
- "required": true,
11051
- "summary": "bounded local test level"
11052
- },
11053
- {
11054
- "name": "changed",
11055
- "type": "list",
11056
- "summary": "changed repository paths used for L1 selection"
11057
- },
11058
- {
11059
- "name": "against",
11060
- "type": "string",
11061
- "default": "main",
11062
- "summary": "local main ref used for L2 and L3 selection"
11063
- },
11064
- {
11065
- "name": "spec",
11066
- "type": "list",
11067
- "summary": "explicit spec files at L1 only"
11068
- },
11069
- {
11070
- "name": "concurrency",
11071
- "type": "number",
11072
- "summary": "override automatic CPU/RAM file concurrency with a positive integer"
11073
- },
11074
- {
11075
- "name": "root",
11076
- "type": "string",
11077
- "summary": "repository root (default is the command cwd)"
11078
- },
11079
- {
11080
- "name": "release-cut",
11081
- "type": "boolean",
11082
- "summary": "confirm an owner or release-role L4 release-cut run"
11083
- }
11084
- ],
11085
- "exit": {
11086
- "0": "selected specs passed",
11087
- "1": "a check or spec was red",
11088
- "2": "usage or ladder policy refusal"
11089
- },
11090
- "json": "starci/test-run@1",
11091
- "examples": [
11092
- "starci test run --level L1 --changed scripts/machine/ladder-test.mjs",
11093
- "starci test run --level L2 --against main --json",
11094
- "starci test run --level L3 --against main"
11095
- ],
11096
- "editions": [
11097
- "full"
11098
- ],
11099
- "impl": {
11100
- "module": "scripts/machine/ladder-test.mjs",
11101
- "export": "testRun"
11102
- },
11103
- "effect": "host",
11104
- "roles": [
11105
- "worker",
11106
- "lead",
11107
- "coordinator",
11108
- "release",
11109
- "owner"
11110
- ],
11111
- "conventions": [
11112
- "Use L1 while working, L2 before asking for a land, and L3 when an IO slot changed.",
11113
- "Never run the whole suite outside L4; L4 belongs to starci release cut and L5 belongs to CI.",
11114
- "L2 and L3 need a clean committed tree, run the full check first, and hold the one host test lock.",
11115
- "A red L2 or L3 selection is re-run once serially; a green re-run is recorded as a flake, never skipped.",
11116
- "File concurrency uses fresh idle CPU and free RAM under modules/supervisor/test-concurrency.yaml; --concurrency overrides it.",
11117
- "The result and spec log retain the concurrency decision and host measurements."
11118
- ],
11119
- "runtimeSide": "tree"
11120
- }
11121
- }
11122
- },
11123
10788
  "typecheck": {
11124
10789
  "summary": "typecheck only the projects selected by the test ladder",
11125
10790
  "owner": "runtime",
@@ -20,7 +20,7 @@ import { withTempEnv } from '../../../engine/temp-root.mjs';
20
20
  * is a request for raw bytes, not an encoding: spawnSync encodes a string `input` with it and throws
21
21
  * ERR_UNKNOWN_ENCODING, so it reaches spawnSync as encoding:null (Buffer output either way).
22
22
  */
23
- export const gitSpawn = (file, args, options = {}) => {
23
+ const gitSpawn = (file, args, options = {}) => {
24
24
  assertMutationFence({ kind: 'git-effect', args });
25
25
  const spawn = { encoding: 'utf8', windowsHide: true, ...options };
26
26
  if (spawn.encoding === 'buffer') spawn.encoding = null;
@@ -76,5 +76,5 @@ export const gitExecutable = (options = null) => {
76
76
  return found;
77
77
  };
78
78
 
79
- /** The output ceiling of the whole-diff and `cat-file --batch` calls `test affected` batches (a release diff is tens of megabytes). */
80
- export const BATCH_MAX_BUFFER = 1024 * 1024 * 1024;
79
+ /** The output ceiling of the whole-diff and `cat-file --batch` calls batch (a release diff is tens of megabytes). */
80
+ const BATCH_MAX_BUFFER = 1024 * 1024 * 1024;
@@ -105,7 +105,7 @@ const IDENTITY_TIMEOUT_MS = 20_000;
105
105
  const CONTROLLED_ENV = new Set(['SOPS_AGE_KEY', 'SOPS_AGE_KEY_FILE', 'SOPS_AGE_KEY_CMD', 'SOPS_AGE_SSH_PRIVATE_KEY_FILE', 'SOPS_AGE_SSH_PRIVATE_KEY_CMD', 'SOPS_AGE_RECIPIENT', 'SOPS_KEYSERVICE', 'SOPS_ENABLE_LOCAL_KEYSERVICE', 'SOPS_DECRYPTION_ORDER', 'SOPS_KMS_ARN', 'SOPS_GCP_KMS_IDS', 'SOPS_HUAWEICLOUD_KMS_IDS', 'SOPS_AZURE_KEYVAULT_URLS', 'SOPS_VAULT_URIS', 'SOPS_PGP_FP', 'SOPS_AGE_RECIPIENTS', 'HOME', 'USERPROFILE', 'APPDATA', 'XDG_CONFIG_HOME']);
106
106
 
107
107
  /** Construct only the child map; empty desktop roots make Go return directory errors, not fallback paths. */
108
- export function isolatedSopsEnv(env, inlineName = 'SOPS_AGE_KEY') {
108
+ function isolatedSopsEnv(env, inlineName = 'SOPS_AGE_KEY') {
109
109
  const out = Object.fromEntries(Object.entries(env).filter(([name]) => !CONTROLLED_ENV.has(name.toUpperCase())));
110
110
  out.HOME = ''; out.USERPROFILE = ''; out.APPDATA = ''; out.XDG_CONFIG_HOME = '';
111
111
  if (inlineName !== null) out.SOPS_AGE_KEY = env[inlineName];
@@ -24,7 +24,7 @@ const COMPILATION_FAILURE = 'module or proof could not be compiled';
24
24
  const WORKER_FAILURE = 'proof worker failed or timed out';
25
25
  const SAFE_REASONS = new Set([...DI_FAILURES.values(), COMPILATION_FAILURE]);
26
26
  const modulePath = app => `apps/${app}/src/app.module.ts`;
27
- export const wiringFixturePath = app => `src/tests/fixtures/builders/${app}.builder.ts`;
27
+ const wiringFixturePath = app => `src/tests/fixtures/builders/${app}.builder.ts`;
28
28
 
29
29
  const refusal = (file, reason) => ({ code: BOOT_PROOF_CODE, level: 'error', path: file,
30
30
  message: `${file}: lite boot proof failed (${reason}); compile the real AppModule with explicit fixture options and infrastructure doubles using starci app check --wiring`, reason });
@@ -177,7 +177,7 @@ export function appWiring({ repoRoot, repo = readJson(repoRoot, 'hfs.json'), fil
177
177
  }
178
178
 
179
179
  /** Optional standalone entry; coordinator connects the same seam to app check --wiring. */
180
- export function appWiringMain(argv, { cwd = invocationDir(), stdout = text => process.stdout.write(text), stderr = text => process.stderr.write(text) } = {}) {
180
+ function appWiringMain(argv, { cwd = invocationDir(), stdout = text => process.stdout.write(text), stderr = text => process.stderr.write(text) } = {}) {
181
181
  let directory = cwd, json = false;
182
182
  for (let at = 0; at < argv.length; at += 1) {
183
183
  if (argv[at] === '--cwd' && argv[at + 1]) directory = path.resolve(cwd, argv[++at]);
@@ -346,4 +346,4 @@ export function loadArchitectureConfig(repositoryRoot, { hfs } = {}) {
346
346
  };
347
347
  }
348
348
 
349
- export { canonical, enclosingRepository, exactKeys, isInside, slash };
349
+ export { canonical, exactKeys, isInside, slash };
@@ -162,7 +162,7 @@ const machineIds = () => [
162
162
  * backend composition and data machine and frontend repository machine. A spec about another rule judges its own
163
163
  * report without these (they have their own specs); every one of them is in ARCHITECTURE_RULE_IDS.
164
164
  */
165
- export const HFS_MACHINE_RULE_IDS = Object.freeze((() => {
165
+ const HFS_MACHINE_RULE_IDS = Object.freeze((() => {
166
166
  const ordinary = new Set([...COMMON_RULE_IDS, ...BACKEND_RULE_IDS, ...FRONTEND_RULE_IDS, ...OWNER_RULE_IDS, ...GRAMMAR_RULE_IDS, ...REGISTRATION_RULE_IDS,
167
167
  ...SWR_DATA_RULE_IDS, SOURCE_LAYOUT_RULE_ID, SOURCE_NAME_RULE_ID, PUBLIC_CONTRACT_RULE_ID, READONLY_BOUNDARY_RULE_ID]);
168
168
  return [...new Set(machineIds().filter((id) => !ordinary.has(id)))].sort(byCodeUnit);
@@ -209,7 +209,7 @@ export function checkBackendSupabase(input) {
209
209
  };
210
210
  }
211
211
 
212
- export function checkJwtPolicy(input) {
212
+ function checkJwtPolicy(input) {
213
213
  const kit = machineKit(input);
214
214
  const violations = [];
215
215
  let verifyCalls = 0;
@@ -67,7 +67,7 @@ function finishFrame(state, frame) {
67
67
  if (state.low.get(frame.node) === state.index.get(frame.node)) closeComponent(state, frame);
68
68
  }
69
69
 
70
- export function stronglyConnected(adjacency) {
70
+ function stronglyConnected(adjacency) {
71
71
  const state = { counter: 0, index: new Map(), low: new Map(), onStack: new Set(), stack: [], result: [], work: [] };
72
72
  for (const start of adjacency.keys()) {
73
73
  if (state.index.has(start)) continue;
@@ -26,7 +26,7 @@ function parseArchitectureArgs(argv) {
26
26
  return {root, base};
27
27
  }
28
28
 
29
- export function architectureMain(argv, {check = checkArchitecture, write = (text) => process.stdout.write(text), fail = (text) => process.stderr.write(text)} = {}) {
29
+ function architectureMain(argv, {check = checkArchitecture, write = (text) => process.stdout.write(text), fail = (text) => process.stderr.write(text)} = {}) {
30
30
  let parsed;
31
31
  try { parsed = parseArchitectureArgs(argv); } catch (error) { fail(`${error.message}\n`); return 2; }
32
32
  let report;
@@ -55,7 +55,7 @@ export function formatCoverageReport(report) {
55
55
  }
56
56
 
57
57
  /** Standalone coordinator entry point: exit 0 proof passed, 2 proof or invocation refused. */
58
- export function coverageFromMain(argv, { cwd = invocationDir(), stdout = (text) => process.stdout.write(text), stderr = (text) => process.stderr.write(text), run = coverageFrom } = {}) {
58
+ function coverageFromMain(argv, { cwd = invocationDir(), stdout = (text) => process.stdout.write(text), stderr = (text) => process.stderr.write(text), run = coverageFrom } = {}) {
59
59
  try {
60
60
  const opts = parse(argv);
61
61
  const report = run({ repoRoot: path.resolve(cwd, opts.cwd ?? '.'), coverageFrom: opts.coverageFrom });