hecks 3.0.4 → 3.1.0

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 (159) hide show
  1. checksums.yaml +4 -4
  2. data/exe/hecks +25 -7
  3. data/lib/hecks/adapters/driven/lambda/client.rb +1 -1
  4. data/lib/hecks/adapters/driven/lambda.rb +1 -1
  5. data/lib/hecks/adapters/driven/tenant_provisioner.rb +2 -2
  6. data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +59 -32
  7. data/lib/hecks/bluebook/hexagon.rb +45 -25
  8. data/lib/hecks/bluebook/model_check.rb +7 -7
  9. data/lib/hecks/chapters.rb +31 -3
  10. data/lib/hecks/cli/check_era.rb +1 -1
  11. data/lib/hecks/cli/console.rb +24 -8
  12. data/lib/hecks/cli/deploy_template_diff.rb +1 -1
  13. data/lib/hecks/cli/doc_coverage.rb +1 -1
  14. data/lib/hecks/cli/domain_stub.rb +128 -0
  15. data/lib/hecks/cli/interview_draft.rb +246 -0
  16. data/lib/hecks/cli/model_check.rb +1 -1
  17. data/lib/hecks/cli/project_cli.rb +69 -18
  18. data/lib/hecks/cli/reference.rb +2 -1
  19. data/lib/hecks/cli/refresh_rspec_runtime_baseline.rb +1 -1
  20. data/lib/hecks/cli/seed_semantics_corpus.rb +38 -9
  21. data/lib/hecks/cli/spec_example.rb +1 -1
  22. data/lib/hecks/cli/stress_concurrency_specs.rb +14 -5
  23. data/lib/hecks/corpus.rb +11 -8
  24. data/lib/hecks/deploy/bluebook/deploy.bluebook +85 -12
  25. data/lib/hecks/deploy/oidc.json +5 -0
  26. data/lib/hecks/doc/reference.rb +4 -3
  27. data/lib/hecks/doors/cli_door.rb +13 -13
  28. data/lib/hecks/doors/cli_runner.rb +52 -32
  29. data/lib/hecks/doors/launcher_options.rb +23 -5
  30. data/lib/hecks/doors/mcp_door.rb +40 -18
  31. data/lib/hecks/doors/mcp_door_scope.rb +244 -24
  32. data/lib/hecks/doors.rb +1 -1
  33. data/lib/hecks/embryonaut_bluebook.rb +2 -2
  34. data/lib/hecks/forms/banking_presentation.rb +1 -1
  35. data/lib/hecks/framework/bluebook/compliance.bluebook +1 -1
  36. data/lib/hecks/framework/bluebook/console_settings.bluebook +1 -1
  37. data/lib/hecks/framework/bluebook/framework.hecksagon +4 -4
  38. data/lib/hecks/framework.rb +1 -1
  39. data/lib/hecks/fuzzing/combination_miner.rb +1 -1
  40. data/lib/hecks/fuzzing/concurrent_dispatch.rb +1 -1
  41. data/lib/hecks/fuzzing/differential.rb +4 -2
  42. data/lib/hecks/fuzzing/era_boundary.rb +1 -1
  43. data/lib/hecks/fuzzing/form_census.rb +2 -2
  44. data/lib/hecks/fuzzing/generated_domain_check.rb +1 -1
  45. data/lib/hecks/fuzzing/isolated_boot.rb +10 -3
  46. data/lib/hecks/fuzzing/persistence_parity.rb +2 -2
  47. data/lib/hecks/fuzzing/target_capabilities.rb +3 -3
  48. data/lib/hecks/gate/stages.yml +8 -4
  49. data/lib/hecks/grammar/grammar.hecksagon +2 -2
  50. data/lib/hecks/hecks/adapters/deploy_toolchain.rb +4 -4
  51. data/lib/hecks/hecks/adapters/host_http.rb +4 -3
  52. data/lib/hecks/hecks/adapters/local_files.rb +59 -0
  53. data/lib/hecks/hecks/adapters/site_toolchain.adapter +7 -0
  54. data/lib/hecks/hecks/adapters/site_toolchain.rb +54 -0
  55. data/lib/hecks/hecks/codebase.bluebook +4 -3
  56. data/lib/hecks/hecks/context_map.hecksagon +2 -2
  57. data/lib/hecks/hecks/custodian.bluebook +45 -3
  58. data/lib/hecks/hecks/hecks.hecksagon +10 -4
  59. data/lib/hecks/hecks/hecks.world +7 -4
  60. data/lib/hecks/hecks/site.behaviors +17 -0
  61. data/lib/hecks/hecks/site.world +10 -0
  62. data/lib/hecks/language/bluebook/bluebook.hecksagon +1 -1
  63. data/lib/hecks/language/hecksagon/hecksagon.bluebook +24 -47
  64. data/lib/hecks/ports/persistence/plugins/era/era_check.rb +4 -4
  65. data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +2 -1
  66. data/lib/hecks/projections/deploy/box/settings.rb +248 -0
  67. data/lib/hecks/projections/deploy/box/templates/box.yaml.tmpl +267 -0
  68. data/lib/hecks/projections/deploy/box/templates/deploy-box.sh.tmpl +70 -0
  69. data/lib/hecks/projections/deploy/box/templates/fetch-secrets.sh +21 -0
  70. data/lib/hecks/projections/deploy/box/templates/rds.yaml.tmpl +165 -0
  71. data/lib/hecks/projections/deploy/box/templates/render-compose.sh.tmpl +43 -0
  72. data/lib/hecks/projections/deploy/box.rb +387 -0
  73. data/lib/hecks/projections/deploy/fargate/cdn.rb +13 -1
  74. data/lib/hecks/projections/deploy/fargate.rb +1 -1
  75. data/lib/hecks/projections/deploy/lambda.rb +11 -10
  76. data/lib/hecks/projections/deploy/scripts/hosting.mk.tmpl +1 -1
  77. data/lib/hecks/projections/diagrams.rb +2 -2
  78. data/lib/hecks/projections/site/edge/behaviours.rb +107 -0
  79. data/lib/hecks/projections/site/edge/checks.rb +137 -0
  80. data/lib/hecks/projections/site/edge/pattern.rb +50 -0
  81. data/lib/hecks/projections/site/edge/rules.rb +128 -0
  82. data/lib/hecks/projections/site/edge.rb +136 -0
  83. data/lib/hecks/projections/site/regions.rb +44 -0
  84. data/lib/hecks/projections/site/routes_ts.rb +284 -0
  85. data/lib/hecks/projections/site/site_cdn.rb +78 -0
  86. data/lib/hecks/projections/site/table/checks.rb +124 -0
  87. data/lib/hecks/projections/site/table/row_builder.rb +155 -0
  88. data/lib/hecks/projections/site/table.rb +98 -0
  89. data/lib/hecks/projections.rb +2 -0
  90. data/lib/hecks/projector/cli_projector.rb +172 -95
  91. data/lib/hecks/quality_control/adapters/agent.adapter +1 -1
  92. data/lib/hecks/quality_control/adapters/agent.rb +2 -2
  93. data/lib/hecks/quality_control/cli/qa_concurrency_racer.rb +3 -3
  94. data/lib/hecks/quality_control/cli/qa_discover_external_domains.rb +8 -8
  95. data/lib/hecks/quality_control/cli/qa_domain_novelty.rb +3 -3
  96. data/lib/hecks/quality_control/cli/qa_generated_domains.rb +4 -4
  97. data/lib/hecks/quality_control/cli/qa_log_bug.rb +2 -2
  98. data/lib/hecks/quality_control/cli/qa_mine_combinations.rb +6 -5
  99. data/lib/hecks/quality_control/cli/qa_postgres_migrate.rb +2 -2
  100. data/lib/hecks/quality_control/cli/qa_postgres_role.rb +5 -5
  101. data/lib/hecks/quality_control/cli/qa_pr_check.rb +3 -3
  102. data/lib/hecks/quality_control/cli/qa_sweep/all_mode.rb +3 -3
  103. data/lib/hecks/quality_control/cli/qa_sweep/checks.rb +2 -2
  104. data/lib/hecks/quality_control/cli/qa_sweep.rb +10 -9
  105. data/lib/hecks/quality_control/cli/qa_tick.rb +3 -3
  106. data/lib/hecks/quality_control/quality_control.bluebook +18 -18
  107. data/lib/hecks/quality_control/quality_control.hecksagon +1 -1
  108. data/lib/hecks/runtime/command_interpreter.rb +2 -0
  109. data/lib/hecks/runtime/interpreting.rb +21 -0
  110. data/lib/hecks/runtime/invocation.rb +5 -3
  111. data/lib/hecks/runtime/registry/verification.rb +15 -29
  112. data/lib/hecks/runtime/registry.rb +14 -20
  113. data/lib/hecks/rust_build/append_optionals.rb +79 -0
  114. data/lib/hecks/rust_build/conformance_fuzz.rb +2 -1
  115. data/lib/hecks/rust_build/domain_name.rb +26 -0
  116. data/lib/hecks/rust_build/kernel_input.rb +58 -0
  117. data/lib/hecks/rust_build/project_rust/codegen_run.rb +143 -0
  118. data/lib/hecks/rust_build/project_rust/root_mod.rb +1 -1
  119. data/lib/hecks/rust_build/project_rust.rb +57 -24
  120. data/lib/hecks/rust_build/rust_literal.rb +33 -0
  121. data/lib/hecks/rust_build/write_if_changed.rb +86 -0
  122. data/lib/hecks/site/bluebook/site.bluebook +205 -0
  123. data/lib/hecks/site/bluebook/site.hecksagon +5 -0
  124. data/lib/hecks/site/bluebook/site.ports.hecksagon +15 -0
  125. data/lib/hecks/sme/bluebook/sme.bluebook +336 -0
  126. data/lib/hecks/sme/bluebook/sme.hecksagon +5 -0
  127. data/lib/hecks/storehouse.rb +37 -7
  128. data/lib/hecks/tenancy/bluebook/tenancy.bluebook +1 -1
  129. data/lib/hecks/three_zero/forms.yml +88 -88
  130. data/lib/hecks/tools/ci_gates.rb +1 -1
  131. data/lib/hecks/tools/deploy_recipe.rb +14 -6
  132. data/lib/hecks/tools/oidc_manifests.rb +2 -1
  133. data/lib/hecks/tools/sequence_script.rb +2 -2
  134. data/lib/hecks/tools/site_routes.rb +152 -0
  135. data/lib/hecks/tools/tenant_provisioning.rb +1 -1
  136. data/lib/hecks/tools.rb +1 -0
  137. data/lib/hecks/version.rb +1 -1
  138. data/rust/build/src/cargo_sync.rs +1 -1
  139. data/rust/build/src/pipeline.rs +23 -16
  140. data/rust/build/src/resolve.rs +39 -6
  141. data/rust/host/HECKS_RELEASE +1 -1
  142. data/rust/host/src/api.rs +1 -1
  143. data/rust/host/src/dispatch.rs +87 -7
  144. data/rust/host/src/needs.rs +111 -0
  145. data/rust/host/src/web/newsletter/template.rs +69 -0
  146. data/rust/host/src/web/newsletter/tests.rs +43 -0
  147. data/rust/host/src/web/newsletter.rs +6 -1
  148. data/rust/host/src/web/newsletter_send.rs +1 -1
  149. data/rust/parser/src/keywords.rs +7 -6
  150. data/rust/parser/src/main.rs +4 -3
  151. data/rust/parser/src/parse/chapter.rs +1 -1
  152. data/rust/parser/src/parse/hecksagon.rs +25 -10
  153. data/rust/project/mutations.rb +4 -30
  154. data/rust/project/naming.rb +8 -28
  155. data/rust/project/write_if_changed.rb +4 -80
  156. data/rust/project_rust_pipeline.rb +16 -12
  157. data/rust/src/kernel/cli.rs +2 -0
  158. data/rust/src/kernel/needs.rs +74 -1
  159. metadata +39 -2
@@ -1,127 +1,127 @@
1
1
  # Each bin/ script and exe/hecks route, and the hecks 3.0 form that replaces it: the verb spelling the
2
2
  # 3.0 launcher answers to (ADR 0080, section 7), with QualityControl verbs after `hecks quality_control`.
3
3
  ---
4
- argument_gate_matrix: hecks argument_gate_matrix [--confirm] (writes only with --confirm)
5
- backfill_era_projections: hecks backfill_projections <domain>
6
- behaviors: hecks run_behaviors subject=<path>
7
- bench: hecks bench [domains=pizzas,banking] [targets=] [iterations=1000] [warmup=200]
4
+ argument_gate_matrix: hecks conformance_run.argument_gate_matrix [--confirm] (writes only with --confirm)
5
+ backfill_era_projections: hecks era.backfill_projections <domain>
6
+ behaviors: hecks operation.run_behaviors subject=<path>
7
+ bench: hecks fuzz_run.bench [domains=pizzas,banking] [targets=] [iterations=1000] [warmup=200]
8
8
  [runs=3] [rust_binary=] [format=markdown] [output=]
9
- canonicalise: hecks canonicalise <file.json>
10
- check_engine_agreement: hecks check_engine_agreement
11
- check_era: hecks check_era <url> expected=era-file [timeout=10]
12
- codemod_hoist_local_givens: hecks hoist_local_givens --confirm
13
- codemod_implicit_append_fields: hecks drop_implicit_append_fields --confirm
14
- compact: hecks compact <domain> [aggregates=A,B] --confirm
9
+ canonicalise: hecks style_run.canonicalise <file.json>
10
+ check_engine_agreement: hecks conformance_run.check_engine_agreement
11
+ check_era: hecks host.check_era <url> expected=era-file [timeout=]
12
+ codemod_hoist_local_givens: hecks codemod_run.hoist_local_givens --confirm
13
+ codemod_implicit_append_fields: hecks codemod_run.drop_implicit_append_fields --confirm
14
+ compact: hecks era.compact <domain> [aggregates=A,B] --confirm
15
15
  console: hecks console [subject=<domain>]
16
- corpus: hecks rust_domains; hecks regen_order; hecks corpus_rust_coverage
17
- deploy_template_diff: hecks deploy diff before=a.yaml after=b.yaml [--json] [--strict]
18
- doc_coverage: hecks measure_doc_coverage
16
+ corpus: hecks corpus_run.rust_domains; hecks corpus_run.regen_order; hecks corpus_run.corpus_rust_coverage
17
+ deploy_template_diff: hecks deploy template_comparison.diff before=a.yaml after=b.yaml [--json] [--strict]
18
+ doc_coverage: hecks conformance_run.measure_doc_coverage
19
19
  docs: hecks docs [domain-path] [aggregate]
20
- evolve: hecks word_status; hecks propose <word> context=X [body=none] [inner=] [opens=]
21
- [fills=]; hecks admit|deprecate|retire <word> context=X; hecks rename <word> context=X
22
- new_name=Y; hecks propose_argument <word> context=X kind=K [required=false] [at=N]
23
- [named=] [fills=] [pairs_shape=]; hecks admit_argument|deprecate_argument|retire_argument
20
+ evolve: hecks language_run.word_status; hecks language_run.propose <word> context=X [body=none] [inner=] [opens=]
21
+ [fills=]; hecks language_run.admit|deprecate|retire <word> context=X; hecks language_run.rename <word> context=X
22
+ new_name=Y; hecks language_run.propose_argument <word> context=X kind=K [required=false] [at=N]
23
+ [named=] [fills=] [pairs_shape=]; hecks language_run.admit_argument|deprecate_argument|retire_argument
24
24
  <word> context=X [at=N] [named=]
25
- expression_projection: hecks project_expression_tables [--stdout]
26
- follow: hecks follow <domain> [aggregate=Name] [since=N] [interval=0.5] [wait=N] [--from-now] [--stream]
27
- fuzz: hecks fuzz [domain] [seeds=20] [steps=30] [workers=] [adapter=memory]
28
- generate: hecks generate_sequence <domain> [seed=1] [steps=30] [adversarial=0.0]
25
+ expression_projection: hecks language_run.project_expression_tables [--stdout]
26
+ follow: hecks operation.follow <domain> [aggregate=Name] [since=N] [interval=0.5] [wait=N] [--from-now] [--stream]
27
+ fuzz: hecks fuzz_run.fuzz [domain] [seeds=20] [steps=30] [workers=] [adapter=memory]
28
+ generate: hecks fuzz_run.generate_sequence <domain> [seed=1] [steps=30] [adversarial=0.0]
29
29
  hecks_mcp_door: hecks mcp [--stdio]
30
- hecks_query_ir_mcp: hecks serve_query_ir_mcp
31
- heki_compact: hecks compact_heki <domain> [aggregates=A,B] --confirm
32
- history: hecks history <domain>
30
+ hecks_query_ir_mcp: hecks corpus_run.serve_query_ir_mcp
31
+ heki_compact: hecks era.compact_heki <domain> [aggregates=A,B] --confirm
32
+ history: hecks introspection.history <domain>
33
33
  ir: hecks ir <domain> [--translations] | hecks ir --meta
34
- lint_deploy_recipes: hecks deploy lint [makefiles=a,b]
35
- merge_tail: hecks merge_tail <domain> winners=id:old,id:new --confirm
34
+ lint_deploy_recipes: hecks deploy makefile_check.lint [makefiles=a,b]
35
+ merge_tail: hecks era.merge_tail <domain> winners=id:old,id:new --confirm
36
36
  model_check: hecks model_check [--strict] [--profile client] [<domain> …]
37
37
  narrate: hecks narrate [domain-path] [aggregate]
38
- pattern-cases: hecks record_pattern_cases
39
- present: hecks present [port=4567]
40
- project: hecks refresh_projections subject=<domain>
41
- project_bootstrap_table: hecks project_bootstrap_table
38
+ pattern-cases: hecks test_suite_run.record_pattern_cases
39
+ present: hecks corpus_run.present [port=4567]
40
+ project: hecks operation.refresh_projections subject=<domain>
41
+ project_bootstrap_table: hecks language_run.project_bootstrap_table
42
42
  project_cli: hecks project_cli [domain-path …]
43
- project_deploy: hecks deploy project <domain> [tenant=] [schema=] [out=] [environment=]
43
+ project_deploy: hecks deploy recipe.project <domain> [tenant=] [schema=] [out=] [environment=]
44
44
  project_diagrams: hecks project_diagrams <domain-path> <ChapterName>
45
- project_field_hints: hecks project_field_hints
46
- project_glossary: hecks glossary <domain> chapter=Name
47
- project_kernel_capabilities: hecks project_kernel_capabilities
48
- project_model: hecks project_model
49
- project_oidc: hecks deploy project_oidc [domains=a,b]
50
- project_parser_table: hecks project_parser_table
51
- project_refusal_wording: hecks project_refusal_wording
52
- project_reserved_names: hecks project_reserved_names
53
- project_rust: hecks project_rust <domain>
54
- project_rust_vocabulary: hecks project_rust_vocabulary
55
- project_tenant: hecks deploy provision <domain_dir> slug=s domain= realm= schema=
56
- database= [adapter=PostgresEra]; hecks deploy reprovision <tenant> directory= database=
45
+ project_field_hints: hecks language_run.project_field_hints
46
+ project_glossary: hecks introspection.glossary <domain> chapter=Name
47
+ project_kernel_capabilities: hecks kernel_run.project_kernel_capabilities
48
+ project_model: hecks language_run.project_model
49
+ project_oidc: hecks deploy oidc_manifest.project_oidc [domains=a,b]
50
+ project_parser_table: hecks language_run.project_parser_table
51
+ project_refusal_wording: hecks language_run.project_refusal_wording
52
+ project_reserved_names: hecks language_run.project_reserved_names
53
+ project_rust: hecks build.project_rust <domain>
54
+ project_rust_vocabulary: hecks language_run.project_rust_vocabulary
55
+ project_tenant: hecks deploy tenant.provision <domain_dir> slug=s domain= realm= schema=
56
+ database= [adapter=PostgresEra]; hecks deploy tenant.reprovision <tenant> directory= database=
57
57
  [adapter=PostgresEra]
58
- project_vocabulary: hecks project_vocabulary
59
- project_wasm: hecks build_wasm <domain>
60
- project_wasm_browser: hecks build_browser_wasm <domain>
58
+ project_vocabulary: hecks language_run.project_vocabulary
59
+ project_wasm: hecks build.build_wasm <domain>
60
+ project_wasm_browser: hecks build.build_browser_wasm <domain>
61
61
  qa_concurrency_racer: not user-facing; ProcessPool starts it as hecks quality_control
62
- race domain= database= schema= verb= step_arguments=
63
- qa_discover_external_domains: hecks quality_control discover_external_domains [arguments="--projects-dir
62
+ sweep.race domain= database= schema= verb= step_arguments=
63
+ qa_discover_external_domains: hecks quality_control target.discover_external_domains [arguments="--projects-dir
64
64
  ~/Projects --max-depth 3 --known-path PATH …"]
65
- qa_domain_novelty: hecks quality_control judge_novelty <domain> [arguments="--against
65
+ qa_domain_novelty: hecks quality_control target.judge_novelty <domain> [arguments="--against
66
66
  PATH …"]
67
- qa_generated_domains: hecks quality_control check_generated_domains [arguments="--domains
67
+ qa_generated_domains: hecks quality_control target.check_generated_domains [arguments="--domains
68
68
  3 --start N --forms a,b --seeds 5 --steps 25 --adversarial 0.3 --rust --shrink-budget
69
69
  200 --domain-shrink-budget 40 --promote dir --name N --from-dials --blueprint F
70
70
  --source F"]
71
- qa_log_bug: hecks quality_control log sweep=<sweep id> reference= sequence=N title=
71
+ qa_log_bug: hecks quality_control bug.log sweep=<sweep id> reference= sequence=N title=
72
72
  demonstration= symptom= expectation= submitter= [tags=a,b] [name=] [reproduced=yes|no]
73
- qa_mine_combinations: hecks quality_control mine_combinations [arguments="--candidates
73
+ qa_mine_combinations: hecks quality_control target.mine_combinations [arguments="--candidates
74
74
  3 --rust --seeds 5 --steps 25 --adversarial 0.3 --repair-rounds 1 --agent CMD --from
75
75
  DIR --against PATH --brief"]
76
76
  qa_open_pr: hecks quality_control patch.open bug=BUG#n number=N url=… branch=… commit=SHA
77
77
  title=… [now=]; hecks quality_control improvement.open [angle=ANGLE-n] number=N
78
78
  url=… branch=… title=… [now=]
79
- qa_postgres_migrate: hecks quality_control migrate_ledger_from_heki domain=<domain_dir>
79
+ qa_postgres_migrate: hecks quality_control sweep.migrate_ledger_from_heki domain=<domain_dir>
80
80
  data=<heki_dir> [arguments="[aggregate …] --force"] (a dry run without --force)
81
- qa_postgres_role: hecks quality_control create_ledger_role <database> [role=hecks_qa]
82
- qa_pr_check: hecks quality_control check_pull_requests
81
+ qa_postgres_role: hecks quality_control sweep.create_ledger_role <database> [role=hecks_qa]
82
+ qa_pr_check: hecks quality_control clearance.check_pull_requests
83
83
  qa_seed_angles: hecks quality_control angle.seed
84
84
  qa_seed_targets: hecks quality_control target.seed
85
- qa_sweep: hecks quality_control ask run [target=] [arguments="--all --seeds N --steps
85
+ qa_sweep: hecks quality_control query sweep.run [target=] [arguments="--all --seeds N --steps
86
86
  N --adversarial F --role-draw F --dry-run F --self-consistency BOOL --modes a,b
87
- --persistence-parity --no-parity"]; hecks quality_control release <target> [now=]
87
+ --persistence-parity --no-parity"]; hecks quality_control target.release <target> [now=]
88
88
  [next_streak=] [capabilities=] [yield_score=]
89
- qa_tick: hecks quality_control tick
90
- query_ir: hecks ir_constructs [names=a,b]; hecks ir_duplicates [domains=a,b] [--meta];
91
- hecks ir_impact name=N field=F
92
- reattest_era: hecks reattest <domain> era=N --confirm
93
- reference: hecks project_reference
94
- refresh_rspec_runtime_baseline: hecks refresh_runtime_baseline [workers=6] [from_run=ID]
95
- regen_codegen_domains: hecks regenerate_corpus [--check]
96
- regenerate_persistence_legacy_fixtures: hecks regenerate_legacy_fixtures --confirm
97
- release: hecks publish [--gem-only] [--npm-only] [--npm-local] [--no-wait] --confirm
89
+ qa_tick: hecks quality_control sweep.tick
90
+ query_ir: hecks corpus_run.ir_constructs [names=a,b]; hecks corpus_run.ir_duplicates [domains=a,b] [--meta];
91
+ hecks corpus_run.ir_impact name=N field=F
92
+ reattest_era: hecks era.reattest <domain> era=N --confirm
93
+ reference: hecks language_run.project_reference
94
+ refresh_rspec_runtime_baseline: hecks test_suite_run.refresh_runtime_baseline [workers=] [from_run=ID]
95
+ regen_codegen_domains: hecks regeneration_run.regenerate_corpus [--check]
96
+ regenerate_persistence_legacy_fixtures: hecks test_suite_run.regenerate_legacy_fixtures --confirm
97
+ release: hecks publishing_run.publish [--gem-only] [--npm-only] [--npm-local] [--no-wait] --confirm
98
98
  (without --confirm, the old --dry-run)
99
- release_gem: hecks publish_gem --confirm
100
- rspec_io_parallel_files: hecks list_io_parallel_specs exclude=REGEX [tags=] [check=file];
101
- hecks write_io_parallel_spec_list exclude=REGEX [tags=] write=file --confirm
102
- rspec_shard_files: hecks shard_specs group=1 groups=N [runtime_log=]
99
+ release_gem: hecks publishing_run.publish_gem --confirm
100
+ rspec_io_parallel_files: hecks test_suite_run.list_io_parallel_specs exclude=REGEX [tags=] [check=file];
101
+ hecks test_suite_run.write_io_parallel_spec_list exclude=REGEX [tags=] write=file --confirm
102
+ rspec_shard_files: hecks test_suite_run.shard_specs group=1 groups=N [runtime_log=]
103
103
  run: hecks run [domain] <verb [name=value …] | script.json | - | '{"steps":[…]}'>
104
- rust_conformance: hecks check_conformance <domain> script=steps.json [artifact=native]
105
- rust_conformance_fuzz: hecks fuzz_conformance <domain> artifact=native [seeds=10]
104
+ rust_conformance: hecks build.check_conformance <domain> script=steps.json [artifact=native]
105
+ rust_conformance_fuzz: hecks build.fuzz_conformance <domain> artifact=native [seeds=10]
106
106
  [steps=25]
107
- rust_coverage: hecks rust_coverage <module> [codegen=ruby]; hecks check_coverage_allowlist
108
- rust_kernel_coverage: hecks measure_kernel_coverage
109
- scaffold_translation: hecks scaffold_translation <domain>
110
- seed_semantics_corpus: hecks seed_semantics_corpus [fixture=name]
111
- shape: hecks shape <domain>
112
- smoke_http: hecks smoke_http path=/p [url=] [header=] [scheme=timestamped]
107
+ rust_coverage: hecks build.rust_coverage <module> [codegen=ruby]; hecks build.check_coverage_allowlist
108
+ rust_kernel_coverage: hecks kernel_run.measure_kernel_coverage
109
+ scaffold_translation: hecks era.scaffold_translation <domain>
110
+ seed_semantics_corpus: hecks test_suite_run.seed_semantics_corpus [fixture=name]
111
+ shape: hecks introspection.shape <domain>
112
+ smoke_http: hecks operation.smoke_http path=/p [url=] [header=] [scheme=timestamped]
113
113
  [payload=] [payload_file=] [health_path=] [state_path=]
114
114
  smoke_test: hecks smoke_test [domain]
115
- spec_example: hecks run_spec_example file=path example=text
116
- standardize_comments: hecks report_comments paths=a,b [only=] [--json] [top=20]; hecks
117
- check_comments paths=…; hecks fix_comments paths=… --confirm; hecks write_comment_baseline
118
- --confirm; hecks check_comments_unchanged ref=REF
119
- standardize_comments_rust: hecks report_rust_comments paths=a,b [only=] [--json] [top=N];
120
- hecks check_rust_comments paths=… [only=]; hecks fix_rust_comments paths=… [only=]
115
+ spec_example: hecks test_suite_run.run_spec_example file=path example=text
116
+ standardize_comments: hecks style_run.report_comments paths=a,b [only=] [--json] [top=20]; hecks
117
+ style_run.check_comments paths=…; hecks style_run.fix_comments paths=… --confirm; hecks style_run.write_comment_baseline
118
+ --confirm; hecks style_run.check_comments_unchanged ref=REF
119
+ standardize_comments_rust: hecks style_run.report_rust_comments paths=a,b [only=] [--json] [top=N];
120
+ hecks style_run.check_rust_comments paths=… [only=]; hecks style_run.fix_rust_comments paths=… [only=]
121
121
  --confirm
122
- statements: hecks statements <domain> chapter=Name
122
+ statements: hecks introspection.statements <domain> chapter=Name
123
123
  stores: hecks stores <domain>
124
- stress_concurrency_specs: hecks stress_concurrency [runs=30] [parallel=] [seed_start=1]
125
- translation_audit: hecks audit_translation <domain>; hecks approve_translation <domain>
124
+ stress_concurrency_specs: hecks test_suite_run.stress_concurrency [runs=] [parallel=] [seed_start=]
125
+ translation_audit: hecks era.audit_translation <domain>; hecks era.approve_translation <domain>
126
126
  [snapshot=] [host_version=] [rehearsal=pass|fail] [rehearsed_at=] --confirm
127
- vendor_bluebook: hecks vendor <package[@version]> [from=path] [root=path]
127
+ vendor_bluebook: hecks package.vendor <package[@version]> [from=path] [root=path]
@@ -102,7 +102,7 @@ module Hecks
102
102
  " - uses: ./.github/actions/hecks-environment",
103
103
  " - id: diff",
104
104
  " name: #{quoted(gate.fetch('label'))}",
105
- " run: bundle exec exe/hecks decide_ci_gate gate=#{name} --wait",
105
+ " run: bundle exec exe/hecks regeneration_run.decide_ci_gate gate=#{name} --wait",
106
106
  " # END GENERATED ci_gate #{name}"
107
107
  ].join("\n")
108
108
  end
@@ -11,7 +11,7 @@ module Hecks
11
11
  # target and dispatches to the matching `Projector` export, writing the recipe (template,
12
12
  # scripts and Makefile) under `deploy/<stack>/` of the checkout.
13
13
  #
14
- # hecks deploy project <domain> [--tenant=<slug>] [--schema=<name>]
14
+ # hecks deploy recipe.project <domain> [--tenant=<slug>] [--schema=<name>]
15
15
  # [--out=<dir>] [--environment=<name>]
16
16
  #
17
17
  # `--environment` layers an overlay `.world` file over the base one; a missing overlay is an
@@ -96,7 +96,7 @@ module Hecks
96
96
 
97
97
  File.exist?(world_file) or
98
98
  abort "#{world_file} does not exist — a domain needs a .world file to declare " \
99
- "deployed_to(\"AwsLambda\") or deployed_to(\"AwsFargate\")"
99
+ "deployed_to(\"AwsLambda\"), deployed_to(\"AwsFargate\") or deployed_to(\"AwsBox\")"
100
100
  world_file
101
101
  end
102
102
 
@@ -150,7 +150,7 @@ module Hecks
150
150
  # Loads the whole registry a domain boots with, not just its own `.bluebook`, because a
151
151
  # cross-domain invoke grant can live in any attached chapter. A domain with no bluebook of
152
152
  # its own (the QA ledger) gets its chapter from the hecksagon's `Chapters.load!`. `root:` is
153
- # required or `uses_embryonaut_bluebook` refuses with "needs a registry with a root to
153
+ # required or `attaches ... from: :vendor` refuses with "needs a registry with a root to
154
154
  # vendor from".
155
155
  #
156
156
  # @param domain [String] the domain directory
@@ -176,15 +176,16 @@ module Hecks
176
176
  # @param deploy_settings [Hash] the world's `deployed_to` settings
177
177
  # @param world_file [String] the `.world` file, named in the refusal
178
178
  # @param domain [String] the domain directory, named in the refusal
179
- # @return [Symbol] `:aws_lambda` or `:aws_fargate`
180
- # @raise [SystemExit] with an example block when the world declares neither
179
+ # @return [Symbol] `:aws_lambda`, `:aws_fargate` or `:aws_box`
180
+ # @raise [SystemExit] with an example block when the world declares none of them
181
181
  def target_key(deploy_settings, world_file, domain)
182
182
  case deploy_settings[:adapter]
183
183
  when "AwsLambda" then :aws_lambda
184
184
  when "AwsFargate" then :aws_fargate
185
+ when "AwsBox" then :aws_box
185
186
  else
186
187
  abort <<~MSG
187
- #{world_file} declares no deployed_to("AwsLambda") or deployed_to("AwsFargate") block. Add one, e.g.:
188
+ #{world_file} declares no deployed_to("AwsLambda"), deployed_to("AwsFargate") or deployed_to("AwsBox") block. Add one, e.g.:
188
189
 
189
190
  deployed_to("AwsLambda") do
190
191
  region "us-east-1"
@@ -201,6 +202,13 @@ module Hecks
201
202
  port 8080
202
203
  end
203
204
 
205
+ or:
206
+
207
+ deployed_to("AwsBox") do
208
+ region "us-east-1"
209
+ containers [{ name: "web", port: 8080 }]
210
+ end
211
+
204
212
  then re-run hecks deploy project #{domain}.
205
213
  MSG
206
214
  end
@@ -9,7 +9,8 @@ module Hecks
9
9
  # `oidc.json` beside the domain.
10
10
  #
11
11
  # A domain that has no bluebook is skipped and one that cannot be projected is reported, so a
12
- # sweep over the whole checkout carries on past either. `hecks deploy project_oidc` loads
12
+ # sweep over the whole checkout carries on past either. `hecks deploy
13
+ # oidc_manifest.project_oidc` loads
13
14
  # `bundler/setup` first, which pins the `json` gem: newer releases pretty-print an empty array
14
15
  # as `[\n\n]`, a diff spec/oidc_manifest_spec.rb would report as drift.
15
16
  module OidcManifests
@@ -10,8 +10,8 @@ module Hecks
10
10
  #
11
11
  # hecks generate_sequence <domain> [--seed N] [--steps N] [--adversarial fraction]
12
12
  #
13
- # `--adversarial` mutates the sequence as `hecks quality_control ask run` does; 0 (off) by
14
- # default.
13
+ # `--adversarial` mutates the sequence as `hecks quality_control query sweep.run` does; 0 (off)
14
+ # by default.
15
15
  module SequenceScript
16
16
  USAGE = "usage: hecks generate_sequence <domain> [--seed N] [--steps N] [--adversarial FRACTION]"
17
17
 
@@ -0,0 +1,152 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "hecks"
4
+ require "fileutils"
5
+ require "optparse"
6
+ require_relative "../tools"
7
+ require_relative "../projections/site/routes_ts"
8
+ require_relative "../projections/site/site_cdn"
9
+ require_relative "../projections/site/regions"
10
+
11
+ module Hecks
12
+ module Tools
13
+ # Projects a project's route table into `routes.ts` (`Projections::Site::RoutesTs`) and, when
14
+ # it declares an edge, into the behaviours and listener rules of its template
15
+ # (`Projections::Site::SiteCdn`).
16
+ #
17
+ # hecks site site_projection.project_site [<project>] [--out=<dir>] [--check]
18
+ #
19
+ # `<project>` is the directory whose `bluebook/` holds the chapter that declares the rows and a
20
+ # hecksagon that attaches Site; it defaults to the checkout. `routes.ts` is written to
21
+ # `<project>/generated` unless `--out` names another directory. The template is rewritten in
22
+ # place between its `BEGIN`/`END GENERATED site_cdn` markers, or under `--out` a copy of it is
23
+ # written at the same relative path. With `--check` nothing is written: the tool answers 1 and
24
+ # names each file that differs from the table.
25
+ module SiteRoutes
26
+ # Where the files go, relative to the project, when `--out` names no directory.
27
+ DEFAULT_OUT = "generated"
28
+
29
+ USAGE = "usage: hecks site site_projection.project_site [<project>] [--out=<dir>] [--check]"
30
+
31
+ module_function
32
+
33
+ # Projects the route table, writes what differs and prints a line for each file written.
34
+ #
35
+ # @param argv [Array<String>] the project directory, then the flags
36
+ # @param root [String] the checkout, used as the project when `argv` names none
37
+ # @return [Integer] 0, or 1 when `--check` finds a file out of date
38
+ # @raise [SystemExit] with the reason on stderr when the project declares no route table or
39
+ # the table is refused
40
+ def main(argv, root: Tools::ROOT)
41
+ argv = argv.dup
42
+ out = nil
43
+ check = false
44
+ OptionParser.new do |parser|
45
+ parser.on("--out=DIR") { |value| out = value }
46
+ parser.on("--check") { check = true }
47
+ end.parse!(argv)
48
+ project = argv.empty? ? root : File.expand_path(argv.shift)
49
+ abort USAGE unless argv.empty?
50
+
51
+ files = projection(project, out: out)
52
+ stale = files.reject { |path, text| File.file?(path) && File.read(path) == text }.keys
53
+ return report(stale, project, check) if check
54
+
55
+ stale.each do |path|
56
+ FileUtils.mkdir_p(File.dirname(path))
57
+ File.write(path, files.fetch(path))
58
+ puts "wrote #{display(path, project)}"
59
+ end
60
+ puts "project_site: #{files.size} #{files.size == 1 ? 'file' : 'files'}, current" if stale.empty?
61
+ 0
62
+ end
63
+
64
+ # @param root [String] the project directory
65
+ # @param out [String, nil] the directory to write to; `generated/` of the project when nil
66
+ # @return [Hash{String => String}] each file's absolute path to the text it should hold
67
+ # @raise [SystemExit] when the project declares no route table or the table is refused
68
+ def projection(root, out: nil)
69
+ registry = registry_for(root)
70
+ chapter = Projections::Site::Table.chapter(registry)
71
+ table = Projections::Site::Table.read(chapter, registry: registry)
72
+ files = Projector.call(:site_routes_ts, bluebook: chapter, options: { table: table })
73
+ dir = out ? File.expand_path(out) : File.join(root, DEFAULT_OUT)
74
+ written = files.to_h { |name, text| [File.join(dir, name), text] }
75
+ written.merge(template_files(root, out, chapter, table, registry))
76
+ rescue Projections::Site::Table::Invalid => e
77
+ abort "project_site: #{e.message}"
78
+ end
79
+
80
+ # The template with the edge's regions rewritten, when the project declares an edge.
81
+ #
82
+ # @param root [String] the project directory
83
+ # @param out [String, nil] the directory to write to, or nil to rewrite the template in place
84
+ # @param chapter [Bluebook::Chapter] the chapter that declares the route table
85
+ # @param table [Projections::Site::Table] the checked table
86
+ # @param registry [Hecks::Runtime::Registry] the registry the project booted into
87
+ # @return [Hash{String => String}] the template's path to its text; empty with no edge
88
+ # @raise [SystemExit] when the template is missing or lacks a region
89
+ def template_files(root, out, chapter, table, registry)
90
+ edge = Projections::Site::Edge.read(chapter, table: table, vocabulary: Projections::Site::Table.vocabulary(registry))
91
+ return {} unless edge
92
+
93
+ regions = Projector.call(:site_cdn, bluebook: chapter, options: { table: table, edge: edge })
94
+ relative = edge.setting.template
95
+ source = File.join(root, relative)
96
+ abort "project_site: the template #{relative} does not exist in #{root}" unless File.file?(source)
97
+
98
+ text = regions.reduce(File.read(source)) do |current, (name, block)|
99
+ unless Projections::Site::Regions.region?(current, name)
100
+ abort "project_site: #{relative} has no BEGIN/END GENERATED site_cdn #{name} region"
101
+ end
102
+
103
+ Projections::Site::Regions.replace(current, name, block)
104
+ end
105
+ { (out ? File.join(File.expand_path(out), relative) : source) => text }
106
+ end
107
+
108
+ # Loads the project's chapters the way a deploy does: the bluebooks, then the hecksagons that
109
+ # attach the chapters they need.
110
+ #
111
+ # @param root [String] the project directory
112
+ # @return [Hecks::Runtime::Registry] the registry
113
+ # @raise [SystemExit] when the project has no `bluebook/` directory
114
+ def registry_for(root)
115
+ dir = File.join(root, "bluebook")
116
+ unless Dir.exist?(dir)
117
+ abort "project_site: #{dir} does not exist; a project declares its route table in a bluebook/ directory"
118
+ end
119
+
120
+ registry = Hecks::Runtime::Registry.new(root: root)
121
+ lib_hecks = File.expand_path("..", __dir__)
122
+ Hecks.with_registry(registry) do
123
+ %w[ports/persistence.port ports/extraction.port adapters/driven/memory.adapter
124
+ adapters/driven/prism.adapter].each { |file| Kernel.load(File.join(lib_hecks, file)) }
125
+ Dir.glob(File.join(dir, "*.bluebook")).each { |file| Kernel.load(file) }
126
+ Dir.glob(File.join(dir, "*.hecksagon")).each { |file| Kernel.load(file) }
127
+ end
128
+ registry
129
+ end
130
+
131
+ # @param stale [Array<String>] absolute paths whose text differs from the table
132
+ # @param project [String] the project directory
133
+ # @param check [Boolean] whether this is a `--check` run
134
+ # @return [Integer] 0 when current, else 1 with the stale files on stderr
135
+ def report(stale, project, _check)
136
+ if stale.empty?
137
+ puts "project_site: every file current"
138
+ return 0
139
+ end
140
+
141
+ warn "project_site: out of date: #{stale.map { |path| display(path, project) }.join(', ')} " \
142
+ "(run hecks site site_projection.project_site)"
143
+ 1
144
+ end
145
+
146
+ # @param path [String] an absolute path
147
+ # @param project [String] the project directory
148
+ # @return [String] the path relative to the project when it lies beneath it
149
+ def display(path, project) = path.delete_prefix("#{project}/")
150
+ end
151
+ end
152
+ end
@@ -16,7 +16,7 @@ module Hecks
16
16
  # merge) the base `persisted_by` settings, so `--database` is required. A policy's refusal is
17
17
  # swallowed by `PolicyInterpreter#deliver`, so success is confirmed by query.
18
18
  #
19
- # hecks deploy provision <domain-directory> <slug> --domain=name --realm=name \
19
+ # hecks deploy tenant.provision <domain-directory> <slug> --domain=name --realm=name \
20
20
  # --schema=name --database=name [--adapter=PostgresEra]
21
21
  module TenantProvisioning
22
22
  USAGE = "usage: hecks deploy provision <domain-directory> <slug> --domain=NAME --realm=NAME " \
data/lib/hecks/tools.rb CHANGED
@@ -24,6 +24,7 @@ module Hecks
24
24
  "project_ci_gates" => ["tools/ci_gates", "CiGates"],
25
25
  "decide_ci_gate" => ["tools/ci_gate_decision", "CiGateDecision"],
26
26
  "project_deploy" => ["tools/deploy_recipe", "DeployRecipe"],
27
+ "project_site" => ["tools/site_routes", "SiteRoutes"],
27
28
  "lint_deploy_recipes" => ["tools/deploy_recipe_lint", "DeployRecipeLint"],
28
29
  "project_oidc" => ["tools/oidc_manifests", "OidcManifests"],
29
30
  "project_tenant" => ["tools/tenant_provisioning", "TenantProvisioning"],
data/lib/hecks/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Hecks
2
2
  # Read directly by the gemspec, so this file must never require the
3
3
  # rest of the gem (its dependencies aren't resolved yet at that point).
4
- VERSION = "3.0.4".freeze
4
+ VERSION = "3.1.0".freeze
5
5
  end
@@ -50,7 +50,7 @@ fn write_root_mod(out_root: &Path, all_dirs: &[String], domains: &[String], targ
50
50
  out.push_str("// chapter (governance/identity — no merged.rs of its own, so absent\n");
51
51
  out.push_str("// from `domains`) stays unconditional: it has no single feature of its\n");
52
52
  out.push_str("// own to gate behind, and is compiled in by whichever domain(s) attach\n");
53
- out.push_str("// it via `uses_framework`.\n");
53
+ out.push_str("// it via `attaches`.\n");
54
54
  for name in all_dirs {
55
55
  if domains.iter().any(|d| d == name) {
56
56
  out.push_str(&format!("#[cfg(feature = {name:?})]\n"));
@@ -66,10 +66,10 @@ pub fn run(root: &Path, domain: &str, opts: &Options) -> Result<(), String> {
66
66
  }
67
67
  }
68
68
 
69
- let (uses_framework_names, uses_embryonaut_bluebook_names) = match &hecksagon_path {
69
+ let (gem_chapter_names, vendored_package_names) = match &hecksagon_path {
70
70
  Some(p) => (
71
- resolve::resolve_uses_framework(&parser_bin, &target_chapter_name, p)?,
72
- resolve::resolve_uses_embryonaut_bluebook(&parser_bin, &target_chapter_name, p)?,
71
+ resolve::resolve_gem_chapters(&parser_bin, &target_chapter_name, p)?,
72
+ resolve::resolve_vendored_packages(&parser_bin, &target_chapter_name, p)?,
73
73
  ),
74
74
  None => (Vec::new(), Vec::new()),
75
75
  };
@@ -85,45 +85,52 @@ pub fn run(root: &Path, domain: &str, opts: &Options) -> Result<(), String> {
85
85
  lineage_pass::run(&mut target_ir, hecksagon_path.as_deref(), world_path.as_deref(), root)?;
86
86
  let target_ir_text = crate::json::write(&target_ir);
87
87
 
88
- // Every other chapter's `uses_framework` names, resolved through the
88
+ // Every other chapter the gem supplies by `attaches "Name"`, resolved through the
89
89
  // same directory listing (`resolve::framework_members`) the Ruby
90
- // pipeline itself calls.
90
+ // pipeline itself calls. A gem chapter that is not a framework member (the language,
91
+ // Tenancy, Deploy) is loaded by the Ruby runtime alone, so it is checked and skipped.
91
92
  let framework_members = resolve::framework_members(root)?;
93
+ let other_gem_chapters = resolve::other_gem_chapter_names(root)?;
92
94
  let mut chapters: Vec<Chapter> = Vec::new();
93
- for fw_name in &uses_framework_names {
95
+ for fw_name in &gem_chapter_names {
96
+ if other_gem_chapters.contains(fw_name) && !framework_members.iter().any(|(name, _)| name == fw_name) {
97
+ continue;
98
+ }
94
99
  let fw_path = framework_members
95
100
  .iter()
96
101
  .find(|(name, _)| name == fw_name)
97
102
  .map(|(_, path)| path.clone())
98
103
  .ok_or_else(|| {
99
- let known: Vec<&str> = framework_members.iter().map(|(n, _)| n.as_str()).collect();
100
- format!("hecks-build: uses_framework {fw_name:?} names no known framework member — known: {}", known.join(", "))
104
+ let mut known: Vec<&str> = framework_members.iter().map(|(n, _)| n.as_str()).collect();
105
+ known.extend(other_gem_chapters.iter().map(String::as_str));
106
+ known.sort();
107
+ format!("hecks-build: attaches {fw_name:?} names no chapter the gem carries — known: {}", known.join(", "))
101
108
  })?;
102
109
  let fw_chapter_name = resolve::header_chapter_name(&fw_path)?;
103
110
  if &fw_chapter_name != fw_name {
104
111
  return Err(format!(
105
- "hecks-build: {} declares chapter {fw_chapter_name:?}, but uses_framework named {fw_name:?}",
112
+ "hecks-build: {} declares chapter {fw_chapter_name:?}, but attaches named {fw_name:?}",
106
113
  fw_path.display()
107
114
  ));
108
115
  }
109
116
  let fw_ir_text = parse_chapter_with_optionals(&parser_bin, &fw_chapter_name, std::slice::from_ref(&fw_path))?;
110
117
  chapters.push(Chapter {
111
118
  mod_name: fw_name.to_lowercase(),
112
- source_label: format!("{domain} (uses_framework {fw_name:?})"),
119
+ source_label: format!("{domain} (attaches {fw_name:?})"),
113
120
  ir_text: fw_ir_text,
114
121
  });
115
122
  }
116
123
 
117
- // Every vendored package's `uses_embryonaut_bluebook` names, resolved the
124
+ // Every vendored package's `attaches ... from: :vendor` names, resolved the
118
125
  // same way `EmbryonautBluebook.load!` (Ruby) resolves them — without this,
119
126
  // a vendored chapter would silently drop from the output.
120
- for pkg_name in &uses_embryonaut_bluebook_names {
127
+ for pkg_name in &vendored_package_names {
121
128
  let pkg_files = resolve::vendored_bluebook_files(&domain_path, pkg_name)?;
122
129
  let pkg_chapter_name = resolve::header_chapter_name(&pkg_files[0])?;
123
130
  let expected_chapter_name = resolve::pascal(pkg_name);
124
131
  if pkg_chapter_name != expected_chapter_name {
125
132
  return Err(format!(
126
- "hecks-build: {} declares chapter {pkg_chapter_name:?}, but uses_embryonaut_bluebook {pkg_name:?} \
133
+ "hecks-build: {} declares chapter {pkg_chapter_name:?}, but attaches {pkg_name:?}, from: :vendor \
127
134
  expects {expected_chapter_name:?}",
128
135
  pkg_files[0].display()
129
136
  ));
@@ -140,13 +147,13 @@ pub fn run(root: &Path, domain: &str, opts: &Options) -> Result<(), String> {
140
147
  // `expected_chapter_name` above), not the raw `pkg_name` — that
141
148
  // would diverge the moment a package name has an underscore.
142
149
  mod_name: expected_chapter_name.to_lowercase(),
143
- source_label: format!("{domain} (uses_embryonaut_bluebook {pkg_name:?})"),
150
+ source_label: format!("{domain} (attaches {pkg_name:?}, from: :vendor)"),
144
151
  ir_text: pkg_ir_text,
145
152
  });
146
153
  }
147
154
 
148
- // Guards against a `uses_framework`- and a `uses_embryonaut_bluebook`-
149
- // derived entry sharing a `mod_name`, which would silently overwrite one
155
+ // Guards against a gem-chapter and a vendored-package
156
+ // entry sharing a `mod_name`, which would silently overwrite one
150
157
  // chapter's sidecars with another's.
151
158
  {
152
159
  let mut seen: Vec<&str> = Vec::new();