hecks 3.13.0 → 4.0.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.
- checksums.yaml +4 -4
- data/examples/pizzas/adapters/fake_processor.rb +34 -0
- data/examples/pizzas/adapters/payment_signature.rb +66 -0
- data/examples/pizzas/adapters/payment_webhook.rb +87 -0
- data/examples/pizzas/bluebook/pizzas.behaviors +33 -0
- data/examples/pizzas/bluebook/pizzas.bluebook +4 -4
- data/examples/pizzas/bluebook/pizzas.hecksagon +5 -3
- data/examples/pizzas/config.ru +22 -0
- data/lib/hecks/adapters/driven/prism.rb +0 -2
- data/lib/hecks/adapters/driven.rb +0 -2
- data/lib/hecks/adapters/driving/json.rb +1 -7
- data/lib/hecks/bluebook/dsl/attribute_collector.rb +15 -5
- data/lib/hecks/bluebook/dsl/bootstrap_table.rb +2 -2
- data/lib/hecks/bluebook/dsl/derivation_words.rb +58 -0
- data/lib/hecks/bluebook/dsl/translation_builder.rb +6 -37
- data/lib/hecks/bluebook/expression/ast_json.rb +0 -9
- data/lib/hecks/bluebook/hecksagon.rb +1 -1
- data/lib/hecks/bluebook/meta_validator/translation_judge/rules.rb +7 -10
- data/lib/hecks/bluebook/meta_validator/translation_judge.rb +4 -8
- data/lib/hecks/bluebook/meta_validator.rb +0 -11
- data/lib/hecks/bluebook/named_pattern.rb +33 -0
- data/lib/hecks/bluebook/translation.rb +18 -10
- data/lib/hecks/bluebook/translation_expression/evaluator.rb +63 -0
- data/lib/hecks/bluebook/translation_expression/parser.rb +127 -0
- data/lib/hecks/bluebook/translation_expression.rb +39 -0
- data/lib/hecks/bluebook/translation_plan.rb +70 -0
- data/lib/hecks/bluebook.rb +3 -0
- data/lib/hecks/chapters.rb +3 -3
- data/lib/hecks/cli/domain_stub.rb +1 -1
- data/lib/hecks/cli/interview_aggregate.rb +4 -4
- data/lib/hecks/composer/adapters/claude_composer.adapter +3 -0
- data/lib/hecks/composer/adapters/claude_composer.rb +83 -0
- data/lib/hecks/composer/adapters/fake_agent.adapter +3 -0
- data/lib/hecks/composer/adapters/fake_agent.rb +55 -0
- data/lib/hecks/composer/adapters/jev.adapter +3 -0
- data/lib/hecks/composer/adapters/jev.rb +66 -0
- data/lib/hecks/composer/agent.rb +113 -0
- data/lib/hecks/composer/assistant.rb +110 -0
- data/lib/hecks/composer/behavior_run.rb +53 -0
- data/lib/hecks/composer/bluebook/composer.bluebook +178 -0
- data/lib/hecks/composer/bluebook/composer.hecksagon +16 -0
- data/lib/hecks/composer/board.rb +65 -0
- data/lib/hecks/composer/board_edit/command_text.rb +39 -0
- data/lib/hecks/composer/board_edit/source.rb +84 -0
- data/lib/hecks/composer/board_edit.rb +144 -0
- data/lib/hecks/composer/check.rb +89 -0
- data/lib/hecks/composer/domains.rb +81 -0
- data/lib/hecks/composer/jobs.rb +134 -0
- data/lib/hecks/composer/layout.rb +37 -0
- data/lib/hecks/composer/live.rb +150 -0
- data/lib/hecks/composer/outline.rb +48 -0
- data/lib/hecks/composer/page.html +989 -0
- data/lib/hecks/composer/panels.rb +142 -0
- data/lib/hecks/composer/parse.rb +83 -0
- data/lib/hecks/composer/plain.rb +28 -0
- data/lib/hecks/composer/ports/composer_agent.port +7 -0
- data/lib/hecks/composer/session.rb +141 -0
- data/lib/hecks/composer/toolbox.rb +166 -0
- data/lib/hecks/composer/web.rb +156 -0
- data/lib/hecks/composer/workbench.rb +51 -0
- data/lib/hecks/composer/workspace.rb +81 -0
- data/lib/hecks/composer.rb +17 -0
- data/lib/hecks/corpus/adapters.rb +22 -0
- data/lib/hecks/corpus/rust.rb +1 -1
- data/lib/hecks/corpus/worlds.rb +19 -0
- data/lib/hecks/corpus.rb +5 -0
- data/lib/hecks/deploy/bluebook/deploy.bluebook +34 -34
- data/lib/hecks/forms/app/commands.rb +2 -3
- data/lib/hecks/forms/app/queries.rb +2 -3
- data/lib/hecks/forms/app/records.rb +17 -5
- data/lib/hecks/forms/command_form_renderer.rb +42 -16
- data/lib/hecks/forms/field_controls.rb +2 -2
- data/lib/hecks/forms/field_renderer.rb +1 -1
- data/lib/hecks/forms/field_shape.rb +36 -17
- data/lib/hecks/forms/index_renderer.rb +2 -1
- data/lib/hecks/forms/page.rb +1 -1
- data/lib/hecks/forms/params.rb +0 -13
- data/lib/hecks/forms/query_form_renderer.rb +7 -6
- data/lib/hecks/forms/record_renderer.rb +11 -7
- data/lib/hecks/forms/rule_words.rb +100 -0
- data/lib/hecks/forms/value_object_shape.rb +2 -1
- data/lib/hecks/framework/bluebook/change.bluebook +2 -2
- data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +0 -3
- data/lib/hecks/fuzzing/domain_generator/block_rendering.rb +1 -1
- data/lib/hecks/fuzzing/isolated_boot/worlds.rb +3 -6
- data/lib/hecks/fuzzing/replay/filters.rb +2 -6
- data/lib/hecks/gate/stages.yml +25 -0
- data/lib/hecks/grammar/evolve/seeds.rb +0 -6
- data/lib/hecks/grammar/evolve.rb +0 -3
- data/lib/hecks/grammar/translation.bluebook +1 -1
- data/lib/hecks/hecks/adapters/codebase/composing.rb +56 -0
- data/lib/hecks/hecks/adapters/codebase/source_tree.rb +3 -1
- data/lib/hecks/hecks/adapters/journal_store/changes.rb +0 -26
- data/lib/hecks/hecks/adapters/journal_store/examination.rb +2 -23
- data/lib/hecks/hecks/adapters/journal_store/readings.rb +3 -11
- data/lib/hecks/hecks/adapters/journal_store.rb +0 -11
- data/lib/hecks/hecks/adapters/rehearsal/inquiry.rb +4 -11
- data/lib/hecks/hecks/adapters/rehearsal/memory_store.rb +0 -9
- data/lib/hecks/hecks/adapters/rehearsal/postgres_reading.rb +0 -4
- data/lib/hecks/hecks/codebase.behaviors +6 -0
- data/lib/hecks/hecks/codebase.bluebook +58 -37
- data/lib/hecks/hecks/composer.behaviors +68 -0
- data/lib/hecks/hecks/context_map.hecksagon +1 -1
- data/lib/hecks/hecks/custodian.behaviors +0 -6
- data/lib/hecks/hecks/custodian.bluebook +15 -92
- data/lib/hecks/hecks/hecks.bluebook +2 -2
- data/lib/hecks/hecks/hecks.hecksagon +2 -2
- data/lib/hecks/hecks/hecks.world +1 -1
- data/lib/hecks/hecks/rehearsal.bluebook +10 -16
- data/lib/hecks/hecks/tooling.bluebook +22 -22
- data/lib/hecks/kernel_capabilities/templates.rb +4 -4
- data/lib/hecks/kernel_capabilities.rb +1 -1
- data/lib/hecks/language/bluebook/aggregate.bluebook +1 -0
- data/lib/hecks/language/bluebook/command.bluebook +1 -0
- data/lib/hecks/language/bluebook/entity.bluebook +1 -0
- data/lib/hecks/language/bluebook/query.bluebook +1 -0
- data/lib/hecks/language/bluebook/shape.bluebook +8 -7
- data/lib/hecks/language/bluebook/vocabulary.bluebook +2 -3
- data/lib/hecks/language/hecksagon/port_operation.bluebook +1 -0
- data/lib/hecks/language/translation/translation_aggregate.bluebook +21 -24
- data/lib/hecks/ports/access_control.rb +2 -2
- data/lib/hecks/ports/persistence/plugins/era/era_check.rb +3 -41
- data/lib/hecks/ports/persistence/plugins/era/lineage/coverage.rb +7 -7
- data/lib/hecks/ports/persistence/plugins/era/lineage/rewrite.rb +25 -2
- data/lib/hecks/ports/persistence/plugins/era/lineage/rules.rb +4 -4
- data/lib/hecks/ports/persistence/plugins/era/lineage.rb +17 -25
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/base_sql.rb +0 -12
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/domain_rename.rb +1 -1
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +2 -22
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/provisioning.rb +0 -1
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage.rb +9 -3
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +3 -29
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/refusals.rb +2 -26
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb +6 -33
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb +3 -3
- data/lib/hecks/ports/persistence/plugins/era/translation/audit.rb +2 -4
- data/lib/hecks/ports/persistence/plugins/era/translation/expression_sql.rb +52 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +23 -29
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold.rb +1 -1
- data/lib/hecks/ports/persistence/plugins/era/translation.rb +0 -1
- data/lib/hecks/ports/persistence/plugins/era.rb +3 -6
- data/lib/hecks/ports.rb +0 -1
- data/lib/hecks/projection_files.rb +3 -1
- data/lib/hecks/projections/deploy/templates/lambda/nat_comment_oauth.tmpl +1 -1
- data/lib/hecks/projections/glossary/entries.rb +10 -4
- data/lib/hecks/projections/glossary/groups.rb +42 -0
- data/lib/hecks/projections/glossary/html/page.rb +7 -2
- data/lib/hecks/projections/glossary/html/parser.rb +1 -1
- data/lib/hecks/projections/glossary/html/sections.rb +31 -11
- data/lib/hecks/projections/glossary/html.rb +1 -2
- data/lib/hecks/projections/glossary/markdown.rb +31 -28
- data/lib/hecks/projections/glossary/mermaid.rb +3 -0
- data/lib/hecks/projections/glossary/page.css +143 -153
- data/lib/hecks/projections/glossary/page.js +63 -3
- data/lib/hecks/projections/glossary/sentences/actions.rb +88 -0
- data/lib/hecks/projections/glossary/sentences/paths.rb +77 -0
- data/lib/hecks/projections/glossary/sentences/queries.rb +90 -0
- data/lib/hecks/projections/glossary/sentences/value_objects.rb +32 -5
- data/lib/hecks/projections/glossary/sentences.rb +13 -3
- data/lib/hecks/projections/glossary/slugs.rb +4 -1
- data/lib/hecks/projections/glossary.rb +2 -1
- data/lib/hecks/projections/plain_english.rb +97 -0
- data/lib/hecks/projections/rust_vocabulary/arguments.rb +2 -2
- data/lib/hecks/projections/rust_vocabulary/enum_body.rb +20 -25
- data/lib/hecks/projections/rust_vocabulary/tests.rb +2 -2
- data/lib/hecks/projections/rust_vocabulary.rb +14 -6
- data/lib/hecks/projections/site/cms_editor/color.rb +0 -6
- data/lib/hecks/projections/statements/actions.rb +99 -0
- data/lib/hecks/projections/statements/relationships.rb +86 -0
- data/lib/hecks/projections/statements.rb +15 -24
- data/lib/hecks/projector/exporter/adapters.rb +112 -0
- data/lib/hecks/projector/exporter/translations.rb +18 -35
- data/lib/hecks/projector/exporter/worlds.rb +103 -0
- data/lib/hecks/projector/exporter.rb +5 -1
- data/lib/hecks/quality_control/adapters/agent.rb +6 -7
- data/lib/hecks/quality_control/adapters/agent_profile.rb +16 -114
- data/lib/hecks/quality_control/cli/qa_mine_combinations.rb +1 -1
- data/lib/hecks/quality_control/quality_control.bluebook +51 -51
- data/lib/hecks/runtime/loader/boot_steps.rb +0 -20
- data/lib/hecks/runtime/outbox.rb +2 -9
- data/lib/hecks/runtime/port_operation_interpreter.rb +1 -9
- data/lib/hecks/runtime/remote_dispatcher.rb +2 -2
- data/lib/hecks/runtime/value.rb +13 -0
- data/lib/hecks/rust_build/project_rust/target_ir.rb +23 -4
- data/lib/hecks/rust_build/wasm.rb +0 -12
- data/lib/hecks/rust_build/write_if_changed.rb +12 -12
- data/lib/hecks/rust_format.rb +77 -0
- data/lib/hecks/site/bluebook/site.bluebook +5 -5
- data/lib/hecks/sme/bluebook/sme.bluebook +12 -12
- data/lib/hecks/tickets/bluebook/tickets.bluebook +3 -3
- data/lib/hecks/tools/fuzz_sweep/findings.rb +3 -9
- data/lib/hecks/tools/fuzz_sweep.rb +1 -3
- data/lib/hecks/tools/translation_audit/verdicts.rb +3 -28
- data/lib/hecks/tools/translation_audit.rb +8 -10
- data/lib/hecks/tools/translation_scaffold/reporting.rb +1 -1
- data/lib/hecks/version.rb +1 -1
- data/lib/hecks/vocabulary.rb +2 -1
- data/lib/hecks.rb +3 -0
- data/prebuilt/{58208399bada10b0db99928c48e38789288fc58f7b71a72b21bfa386680e32ed.marshal → 02c09c73b272c1fb5a9ae6d87bb5e5e529208e00f6b4b597dc2c0fd70a9c0964.marshal} +0 -0
- data/prebuilt/{2b59737fbdbd5f44edda0fddce2611f45d76087b3a7c782d1f1a17ea58c77948.marshal → bb84a835cf6a15136bad5ca03aa5bf93a5b92f5f72444618d3ef2412b987fb32.marshal} +0 -0
- data/prebuilt/verdicts-f1f10da14c8e8f01b4c9b7e3e2d74be8cd2bf4676364ed17fa16975d2a076d75.json +1 -0
- data/rust/Cargo.toml +40 -0
- data/rust/build/Cargo.toml +36 -0
- data/rust/build/clippy.toml +4 -0
- data/rust/build/src/adapters_pass.rs +196 -0
- data/rust/build/src/binding_pass.rs +54 -13
- data/rust/build/src/build_artifact.rs +23 -5
- data/rust/build/src/cargo_sync.rs +69 -26
- data/rust/build/src/lineage_pass.rs +101 -87
- data/rust/build/src/main.rs +11 -2
- data/rust/build/src/pipeline.rs +80 -19
- data/rust/build/src/reserved_names.rs +6 -50
- data/rust/build/src/resolve.rs +82 -35
- data/rust/build/src/rustfmt.rs +100 -0
- data/rust/build/src/seams_pass.rs +85 -16
- data/rust/build/src/subprocess.rs +30 -6
- data/rust/build/src/tmp.rs +5 -2
- data/rust/build/src/translation_pass.rs +72 -22
- data/rust/build/src/world_pass.rs +109 -0
- data/rust/clippy.toml +4 -0
- data/rust/codegen/Cargo.toml +36 -0
- data/rust/codegen/clippy.toml +4 -0
- data/rust/codegen/src/asks.rs +40 -14
- data/rust/codegen/src/attr.rs +2 -2
- data/rust/codegen/src/bridging.rs +676 -117
- data/rust/codegen/src/commands.rs +979 -373
- data/rust/codegen/src/constraints.rs +88 -25
- data/rust/codegen/src/dependency_planning.rs +128 -34
- data/rust/codegen/src/domain_generator.rs +300 -170
- data/rust/codegen/src/exemplar.rs +87 -32
- data/rust/codegen/src/expr_emitter.rs +54 -6
- data/rust/codegen/src/fielded.rs +193 -41
- data/rust/codegen/src/hecks_naming.rs +124 -16
- data/rust/codegen/src/hecks_naming_tests.rs +81 -0
- data/rust/codegen/src/json.rs +80 -44
- data/rust/codegen/src/json_codec.rs +585 -149
- data/rust/codegen/src/literal.rs +104 -138
- data/rust/codegen/src/main.rs +145 -52
- data/rust/codegen/src/manifest.rs +76 -14
- data/rust/codegen/src/mutations.rs +1212 -239
- data/rust/codegen/src/naming.rs +111 -60
- data/rust/codegen/src/optional_pass.rs +90 -28
- data/rust/codegen/src/ports.rs +5 -4
- data/rust/codegen/src/prelude.rs +139 -49
- data/rust/codegen/src/queries.rs +601 -226
- data/rust/codegen/src/reactions.rs +268 -74
- data/rust/codegen/src/read_models.rs +606 -205
- data/rust/codegen/src/reference_specs.rs +16 -3
- data/rust/codegen/src/registry.rs +128 -79
- data/rust/codegen/src/reserved_names.rs +6 -50
- data/rust/codegen/src/shared.rs +71 -22
- data/rust/codegen/src/sidecars.rs +15 -5
- data/rust/codegen/src/skip_reason.rs +8 -2
- data/rust/codegen/src/types.rs +306 -108
- data/rust/host/Cargo.lock +1 -0
- data/rust/host/Cargo.toml +40 -4
- data/rust/host/HECKS_RELEASE +1 -1
- data/rust/host/clippy.toml +4 -0
- data/rust/host/src/api.rs +698 -218
- data/rust/host/src/auth.rs +491 -214
- data/rust/host/src/b64.rs +91 -0
- data/rust/host/src/bin/expr_harness.rs +6 -2
- data/rust/host/src/bin/lineage_harness.rs +47 -11
- data/rust/host/src/bin/mint_harness.rs +70 -37
- data/rust/host/src/bin/validate_harness.rs +16 -8
- data/rust/host/src/boot.rs +144 -68
- data/rust/host/src/boundary_fuzz/api.rs +130 -32
- data/rust/host/src/boundary_fuzz/auth.rs +108 -23
- data/rust/host/src/boundary_fuzz/expr_json.rs +85 -11
- data/rust/host/src/boundary_fuzz/ir.rs +164 -12
- data/rust/host/src/boundary_fuzz/server.rs +283 -36
- data/rust/host/src/boundary_fuzz/web.rs +56 -8
- data/rust/host/src/checkout.rs +78 -32
- data/rust/host/src/clock.rs +8 -0
- data/rust/host/src/commerce_ir.rs +333 -95
- data/rust/host/src/crypto.rs +33 -0
- data/rust/host/src/dispatch.rs +990 -331
- data/rust/host/src/expr_json.rs +1021 -273
- data/rust/host/src/extension.rs +24 -4
- data/rust/host/src/field_hints.rs +11 -7
- data/rust/host/src/fuzz_support.rs +85 -13
- data/rust/host/src/host.rs +100 -0
- data/rust/host/src/http.rs +22 -0
- data/rust/host/src/ir.rs +326 -16
- data/rust/host/src/journal.rs +277 -176
- data/rust/host/src/lambda_client.rs +219 -53
- data/rust/host/src/lib.rs +16 -4
- data/rust/host/src/log.rs +62 -11
- data/rust/host/src/mint.rs +1153 -326
- data/rust/host/src/needs.rs +185 -44
- data/rust/host/src/payments/keystore.rs +197 -45
- data/rust/host/src/payments/roles.rs +191 -0
- data/rust/host/src/payments/tests.rs +1445 -275
- data/rust/host/src/payments.rs +409 -121
- data/rust/host/src/platform_signin/attack_tests.rs +5 -5
- data/rust/host/src/platform_signin/config.rs +11 -11
- data/rust/host/src/platform_signin/cookie.rs +2 -2
- data/rust/host/src/platform_signin/extension.rs +2 -1
- data/rust/host/src/platform_signin/handler.rs +9 -8
- data/rust/host/src/platform_signin/jti.rs +4 -2
- data/rust/host/src/platform_signin/jwks.rs +2 -1
- data/rust/host/src/platform_signin/jws.rs +2 -37
- data/rust/host/src/platform_signin/known_answer_tests.rs +5 -1
- data/rust/host/src/platform_signin/mode_tests.rs +5 -3
- data/rust/host/src/platform_signin/pages.rs +20 -20
- data/rust/host/src/platform_signin/session.rs +8 -1
- data/rust/host/src/platform_signin/settings.rs +6 -6
- data/rust/host/src/platform_signin/strict_json.rs +12 -9
- data/rust/host/src/platform_signin/verify.rs +41 -41
- data/rust/host/src/platform_signin/wiring_support.rs +13 -18
- data/rust/host/src/presentation.rs +207 -63
- data/rust/host/src/presentation_write.rs +502 -187
- data/rust/host/src/query_step.rs +69 -18
- data/rust/host/src/rate_limit.rs +541 -142
- data/rust/host/src/reference_transform.rs +77 -25
- data/rust/host/src/reference_validate.rs +443 -104
- data/rust/host/src/resend.rs +190 -55
- data/rust/host/src/secrets.rs +116 -21
- data/rust/host/src/server.rs +483 -104
- data/rust/host/src/storage_shape.rs +88 -21
- data/rust/host/src/test_pg.rs +17 -7
- data/rust/host/src/ui_schema.rs +495 -207
- data/rust/host/src/wasm_runner.rs +21 -6
- data/rust/host/src/web/commerce.rs +101 -23
- data/rust/host/src/web/newsletter/cooldown.rs +10 -3
- data/rust/host/src/web/newsletter/template.rs +26 -7
- data/rust/host/src/web/newsletter/tests.rs +112 -23
- data/rust/host/src/web/newsletter.rs +209 -59
- data/rust/host/src/web/newsletter_send.rs +251 -79
- data/rust/host/src/web/registration_receipt/tests.rs +16 -4
- data/rust/host/src/web/registration_receipt.rs +100 -24
- data/rust/host/src/web/registrations.rs +1384 -332
- data/rust/host/src/web/resend_webhook.rs +138 -80
- data/rust/host/src/web.rs +2416 -508
- data/rust/lsp/Cargo.toml +36 -0
- data/rust/lsp/clippy.toml +4 -0
- data/rust/lsp/src/json.rs +29 -22
- data/rust/lsp/src/main.rs +81 -31
- data/rust/lsp/src/outline.rs +23 -7
- data/rust/lsp/src/rpc.rs +17 -4
- data/rust/parser/Cargo.toml +36 -0
- data/rust/parser/clippy.toml +4 -0
- data/rust/parser/src/build/closed_sets.rs +6 -1
- data/rust/parser/src/build/identity.rs +4 -3
- data/rust/parser/src/build/mod.rs +1 -0
- data/rust/parser/src/build/named_pattern.rs +26 -0
- data/rust/parser/src/build/naming.rs +2 -80
- data/rust/parser/src/build/pattern_subset.rs +6 -8
- data/rust/parser/src/build/query_derive.rs +3 -1
- data/rust/parser/src/build/query_inference.rs +14 -5
- data/rust/parser/src/build/read_model.rs +4 -1
- data/rust/parser/src/build/references.rs +4 -3
- data/rust/parser/src/canonical.rs +34 -15
- data/rust/parser/src/emit.rs +187 -105
- data/rust/parser/src/expr/ast_json.rs +134 -42
- data/rust/parser/src/expr/evaluator.rs +27 -9
- data/rust/parser/src/expr/mod.rs +54 -13
- data/rust/parser/src/expr/resolver.rs +299 -92
- data/rust/parser/src/ir.rs +35 -3
- data/rust/parser/src/keywords.rs +7168 -510
- data/rust/parser/src/lex.rs +11 -25
- data/rust/parser/src/lib.rs +1 -0
- data/rust/parser/src/main.rs +65 -6
- data/rust/parser/src/parse/adapter.rs +157 -0
- data/rust/parser/src/parse/aggregate.rs +19 -10
- data/rust/parser/src/parse/chapter.rs +16 -17
- data/rust/parser/src/parse/command.rs +35 -16
- data/rust/parser/src/parse/domain_port.rs +4 -7
- data/rust/parser/src/parse/entity.rs +21 -11
- data/rust/parser/src/parse/hecksagon.rs +10 -4
- data/rust/parser/src/parse/lifecycle.rs +9 -5
- data/rust/parser/src/parse/mod.rs +43 -91
- data/rust/parser/src/parse/needs.rs +21 -12
- data/rust/parser/src/parse/policy.rs +2 -2
- data/rust/parser/src/parse/process_manager.rs +9 -11
- data/rust/parser/src/parse/query.rs +8 -4
- data/rust/parser/src/parse/read_model.rs +57 -16
- data/rust/parser/src/parse/value_object.rs +7 -2
- data/rust/parser/src/parse/world.rs +322 -0
- data/rust/parser/src/ruby_value.rs +7 -6
- data/rust/src/exemplar/json.rs +4 -4
- data/rust/src/exemplar/mutations.rs +18 -0
- data/rust/src/exemplar/read_models.rs +1 -10
- data/rust/src/kernel/attribute_shapes/composite.rs +54 -14
- data/rust/src/kernel/attribute_shapes/list.rs +2 -2
- data/rust/src/kernel/attribute_shapes/mod.rs +8 -8
- data/rust/src/kernel/attribute_shapes/scalar.rs +2 -2
- data/rust/src/kernel/cli.rs +229 -112
- data/rust/src/kernel/dispatch.rs +323 -115
- data/rust/src/kernel/dispatch_guard_tests.rs +327 -65
- data/rust/src/kernel/expr.rs +203 -86
- data/rust/src/kernel/expression_operators/arithmetic.rs +138 -25
- data/rust/src/kernel/expression_operators/comparison.rs +87 -2
- data/rust/src/kernel/expression_operators/enumeration.rs +106 -22
- data/rust/src/kernel/expression_operators/logical.rs +9 -3
- data/rust/src/kernel/expression_operators/membership.rs +3 -1
- data/rust/src/kernel/expression_operators/mod.rs +34 -21
- data/rust/src/kernel/expression_operators/pattern_match.rs +46 -11
- data/rust/src/kernel/expression_operators/positional.rs +84 -30
- data/rust/src/kernel/expression_operators/presence.rs +52 -13
- data/rust/src/kernel/expression_operators/sign_test.rs +3 -1
- data/rust/src/kernel/expression_operators/sized.rs +24 -8
- data/rust/src/kernel/expression_operators/text.rs +120 -27
- data/rust/src/kernel/expression_operators/to_string.rs +10 -4
- data/rust/src/kernel/json.rs +230 -148
- data/rust/src/kernel/mod.rs +46 -33
- data/rust/src/kernel/named_query.rs +63 -15
- data/rust/src/kernel/needs.rs +112 -25
- data/rust/src/kernel/orchestrate.rs +980 -581
- data/rust/src/kernel/orchestrate_guard_tests.rs +538 -140
- data/rust/src/kernel/pattern.rs +107 -34
- data/rust/src/kernel/query_comparators.rs +118 -41
- data/rust/src/kernel/query_ordering.rs +13 -5
- data/rust/src/kernel/read_model.rs +479 -181
- data/rust/src/kernel/reference_lookup.rs +122 -26
- data/rust/src/kernel/repository.rs +293 -66
- data/rust/src/kernel/routing.rs +58 -42
- data/rust/src/kernel/ruby_float.rs +139 -0
- data/rust/src/kernel/vocab/aggregate_dispatch_order.rs +57 -57
- data/rust/src/kernel/vocab/entity_dispatch_order.rs +54 -54
- data/rust/src/kernel/vocab/field_hint.rs +19 -25
- data/rust/src/kernel/vocab/mod.rs +6 -6
- data/rust/src/kernel/vocab/query_comparator.rs +23 -24
- data/rust/src/kernel/vocab/refusal_template.rs +501 -297
- data/rust/src/lib.rs +50 -0
- data/rust/src/main.rs +4 -1
- data/rust/web/Cargo.toml +36 -0
- data/rust/web/clippy.toml +4 -0
- metadata +85 -15
- data/examples/pizzas/bluebook/hecksagon/mock_stripe_payment_adapter.rb +0 -36
- data/lib/hecks/adapters/driven/google_authentication.adapter +0 -3
- data/lib/hecks/adapters/driven/google_authentication.rb +0 -99
- data/lib/hecks/adapters/driven/mock_stripe_adapter.adapter +0 -3
- data/lib/hecks/adapters/driven/mock_stripe_adapter.rb +0 -32
- data/lib/hecks/ports/authentication.port +0 -6
- data/lib/hecks/ports/authentication.rb +0 -67
- data/lib/hecks/ports/persistence/plugins/era/translation/approval_file.rb +0 -255
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/approval_digest.rb +0 -22
- data/prebuilt/verdicts-48318ca172edd21443b1ad02801c697fff100b746e828f09db987647641a5df2.json +0 -1
- data/rust/host/src/approval.rs +0 -652
|
@@ -74,12 +74,9 @@ module Hecks
|
|
|
74
74
|
|
|
75
75
|
def hecksagon_names_in(path) = File.read(path).scan(HECKSAGON_NAME).flatten
|
|
76
76
|
|
|
77
|
-
# Deletes every `translations/*.bluebook` in the copy.
|
|
78
|
-
#
|
|
79
|
-
#
|
|
80
|
-
# than tripping that refusal. Safe to drop: an ephemeral, zero-history boot never
|
|
81
|
-
# has a pre-existing era-1 row to translate — the edge only matters at mint time,
|
|
82
|
-
# against a real database, never here.
|
|
77
|
+
# Deletes every `translations/*.bluebook` in the copy. Safe to drop: an ephemeral,
|
|
78
|
+
# zero-history boot never has a pre-existing era-1 row to translate; the edge only
|
|
79
|
+
# matters at mint time, against a real database, never here.
|
|
83
80
|
def strip_translations!(copy)
|
|
84
81
|
Dir.glob(File.join(copy, "**", "translations", "*.bluebook")).each { |path| File.delete(path) }
|
|
85
82
|
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require_relative "../../
|
|
1
|
+
require_relative "../../vocabulary"
|
|
2
2
|
require_relative "../../query_specification/common/where_clause"
|
|
3
3
|
require_relative "../../query_specification/field_path"
|
|
4
4
|
require_relative "../../ports/query/in_memory"
|
|
@@ -9,10 +9,6 @@ module Hecks
|
|
|
9
9
|
# Answers the ad hoc `{aggregate:, field:, op:, value:}` filter steps that bypass the
|
|
10
10
|
# declared query DSL.
|
|
11
11
|
module Filters
|
|
12
|
-
# Mirrors QuerySpecification::Common::COMPARATORS, not the Rust
|
|
13
|
-
# kernel's own comparator enum, which is missing `none_in_state` and has drifted.
|
|
14
|
-
FILTER_COMPARATORS = Hecks::QuerySpecification::Common::COMPARATORS.map(&:to_s).freeze
|
|
15
|
-
|
|
16
12
|
# Answers one ad hoc filter step, the mirror image of kernel/cli.rs's own
|
|
17
13
|
# `run_filter`, calling the same production `Ports::Query::InMemory` rather than
|
|
18
14
|
# re-deriving comparator behavior by hand. Sorted by id ascending regardless,
|
|
@@ -31,7 +27,7 @@ module Hecks
|
|
|
31
27
|
|
|
32
28
|
# A malformed ad-hoc ask is a fault (C8.3), not a bare RuntimeError.
|
|
33
29
|
def check_comparator!(comparator)
|
|
34
|
-
return if
|
|
30
|
+
return if Hecks::Vocabulary.fetch("QueryComparator").include?(comparator)
|
|
35
31
|
|
|
36
32
|
raise Bluebook::Expression::EvaluationError, "unknown query comparator #{comparator.inspect}"
|
|
37
33
|
end
|
data/lib/hecks/gate/stages.yml
CHANGED
|
@@ -84,6 +84,20 @@ pre_push:
|
|
|
84
84
|
title: comment blocks, no run of comment lines past ADR 0075's cap
|
|
85
85
|
run: [bundle, exec, exe/hecks, style_run.check_comments, "paths=lib,spec,examples", only=long_block, --wait]
|
|
86
86
|
blocked: a comment block ran past the cap; shorten it.
|
|
87
|
+
- &check_rust_fmt
|
|
88
|
+
id: rust_fmt
|
|
89
|
+
title: rustfmt, every Rust crate laid out as `cargo fmt` would
|
|
90
|
+
run:
|
|
91
|
+
- sh
|
|
92
|
+
- -ec
|
|
93
|
+
- |
|
|
94
|
+
# The main crate's generated modules are not committed, so cargo fmt would stop at a
|
|
95
|
+
# missing file on a fresh checkout; its hand-written entry points are named instead.
|
|
96
|
+
rustfmt --check --edition 2021 rust/src/main.rs rust/src/kernel/mod.rs rust/tests/*.rs
|
|
97
|
+
for crate in parser codegen lsp host web build; do
|
|
98
|
+
cargo fmt --check --manifest-path "rust/$crate/Cargo.toml"
|
|
99
|
+
done
|
|
100
|
+
blocked: a Rust file is not laid out as rustfmt has it; run `cargo fmt` in its crate (rust/src/exemplar is exempt, it is text templates). Generated Rust is laid out by its generators, so fix the generator, not the output.
|
|
87
101
|
|
|
88
102
|
# The checks a push of only unguarded lanes (`main`) runs in place of pre_push. The slow suite is
|
|
89
103
|
# skipped there; the style checks are not, since an offense that lands on `main` is a red CI run,
|
|
@@ -140,6 +154,17 @@ ci:
|
|
|
140
154
|
- *check_comment_style
|
|
141
155
|
- *check_comment_blocks
|
|
142
156
|
- *check_codegen_drift
|
|
157
|
+
- *check_rust_fmt
|
|
158
|
+
- id: rust_clippy
|
|
159
|
+
title: clippy, every Rust crate with its warnings as errors
|
|
160
|
+
run:
|
|
161
|
+
- sh
|
|
162
|
+
- -ec
|
|
163
|
+
- |
|
|
164
|
+
for crate in . parser codegen lsp host web build; do
|
|
165
|
+
cargo clippy --all-targets --manifest-path "rust/$crate/Cargo.toml" -- -D warnings
|
|
166
|
+
done
|
|
167
|
+
blocked: clippy found a warning in a Rust crate, under the strict `[lints.clippy]` table of its Cargo.toml. The main crate needs rust/src/generated, so run `hecks regenerate_corpus --confirm` first on a fresh checkout. Fix the code, or allow a lint at the one site with a line saying why; a warning in generated Rust is fixed in its generator.
|
|
143
168
|
- id: lint_deploy_recipes
|
|
144
169
|
title: generated deploy recipes, a command with no checked exit status or no echo
|
|
145
170
|
run: [bundle, exec, exe/hecks, deploy, makefile_check.lint, --wait]
|
|
@@ -157,15 +157,9 @@ module Hecks
|
|
|
157
157
|
# First `end` after the opener is the block's own — member rows sit bare (ADR 0025).
|
|
158
158
|
def keyword_blocks(source) = seed_blocks(source, "KeywordSeed")
|
|
159
159
|
|
|
160
|
-
# The first KeywordSeed block's source text.
|
|
161
|
-
def keyword_block(source) = seed_block(source, "KeywordSeed", required: true)
|
|
162
|
-
|
|
163
160
|
# ArgumentSeed blocks; see keyword_blocks for why the first bare end
|
|
164
161
|
# after the opener is already the block's own.
|
|
165
162
|
def argument_blocks(source) = seed_blocks(source, "ArgumentSeed")
|
|
166
|
-
|
|
167
|
-
# The first ArgumentSeed block's source text.
|
|
168
|
-
def argument_block(source) = seed_block(source, "ArgumentSeed", required: true)
|
|
169
163
|
end
|
|
170
164
|
end
|
|
171
165
|
end
|
data/lib/hecks/grammar/evolve.rb
CHANGED
|
@@ -96,9 +96,6 @@ module Hecks
|
|
|
96
96
|
end
|
|
97
97
|
end
|
|
98
98
|
|
|
99
|
-
# Narrow compatibility entry point for single-file callers; syntax_paths is normal.
|
|
100
|
-
def syntax_path = syntax_paths.first
|
|
101
|
-
|
|
102
99
|
# Resolves the file(s) a call should search or write.
|
|
103
100
|
def paths_for(path) = path ? Array(path) : syntax_paths
|
|
104
101
|
|
|
@@ -23,7 +23,7 @@ Hecks.bluebook "Translation" do
|
|
|
23
23
|
# "retired" is the edge-level declaration (TranslationBuilder#retired).
|
|
24
24
|
value_object "Kind" do
|
|
25
25
|
attribute :value, String,
|
|
26
|
-
one_of: ["rename", "move", "convert", "drop", "retype", "retired", "
|
|
26
|
+
one_of: ["rename", "move", "convert", "drop", "retype", "retired", "derive", "rekey_to",
|
|
27
27
|
"backfill", "unresolved"]
|
|
28
28
|
end
|
|
29
29
|
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
require_relative "corpus_tasks"
|
|
2
|
+
|
|
3
|
+
module Hecks
|
|
4
|
+
module Adapters
|
|
5
|
+
module Codebase
|
|
6
|
+
# What Codebase's `CorpusRun` asks of the working tree to open the Composer: serve its editor
|
|
7
|
+
# over one domain directory, on the loopback address only, until the server is stopped.
|
|
8
|
+
#
|
|
9
|
+
# The server hook is the one `CorpusTasks` has, so a spec replaces both servers the same way.
|
|
10
|
+
module Composing
|
|
11
|
+
# Every operation this family carries out.
|
|
12
|
+
OPERATIONS = %w[compose].freeze
|
|
13
|
+
|
|
14
|
+
# The port the editor listens on when none is named.
|
|
15
|
+
DEFAULT_PORT = 4570
|
|
16
|
+
|
|
17
|
+
# The directory the editor opens when none is named, relative to the checkout.
|
|
18
|
+
DEFAULT_WORKSPACE = "examples/pizzas/bluebook".freeze
|
|
19
|
+
|
|
20
|
+
# The only address the editor binds: it carries no authentication.
|
|
21
|
+
HOST = "127.0.0.1".freeze
|
|
22
|
+
|
|
23
|
+
module_function
|
|
24
|
+
|
|
25
|
+
# Opens the editor.
|
|
26
|
+
#
|
|
27
|
+
# @param operation [String] `compose`
|
|
28
|
+
# @param held [Hash] the `CorpusRun` record's fields: `port`, `domains` (the directory)
|
|
29
|
+
# @param tree [Tree] the working tree, already known to be a hecks checkout
|
|
30
|
+
# @param shell [#capture, nil] unused
|
|
31
|
+
# @return [String] a note that the server stopped
|
|
32
|
+
def call(operation, held, tree, shell: nil)
|
|
33
|
+
_ = [operation, shell]
|
|
34
|
+
require "hecks/composer/web"
|
|
35
|
+
fields = held.transform_values { |value| value.is_a?(Hash) ? value[:value] : value }
|
|
36
|
+
workspace = File.expand_path(fields[:domains] || DEFAULT_WORKSPACE, tree.root)
|
|
37
|
+
port = fields[:port] || DEFAULT_PORT
|
|
38
|
+
warn "composer over #{workspace} on http://#{HOST}:#{port}/composer - no authentication, " \
|
|
39
|
+
"no CSRF protection, no caller identity; do not expose beyond localhost"
|
|
40
|
+
app = Composer::Web.app(workspace: workspace)
|
|
41
|
+
(CorpusTasks.web_server || method(:serve)).call(app: app, port: port, host: HOST)
|
|
42
|
+
"composed on port #{port}, now stopped"
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# @param app [#call] the Rack app
|
|
46
|
+
# @param port [Integer] the port
|
|
47
|
+
# @param host [String] the address to bind
|
|
48
|
+
# @return [void]
|
|
49
|
+
def serve(app:, port:, host:)
|
|
50
|
+
require "rackup"
|
|
51
|
+
Rackup::Server.start(app: app, Host: host, Port: port, server: "webrick")
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -11,6 +11,7 @@ require_relative "inspection"
|
|
|
11
11
|
require_relative "codemods"
|
|
12
12
|
require_relative "test_suite"
|
|
13
13
|
require_relative "corpus_tasks"
|
|
14
|
+
require_relative "composing"
|
|
14
15
|
require_relative "publishing"
|
|
15
16
|
require_relative "promotion"
|
|
16
17
|
require_relative "../git"
|
|
@@ -183,7 +184,8 @@ module Hecks
|
|
|
183
184
|
# The task families, each carrying out the operations it lists.
|
|
184
185
|
FAMILIES = [Codebase::Language, Codebase::KernelTables, Codebase::Conformance, Codebase::Regeneration,
|
|
185
186
|
Codebase::Gate, Codebase::Style, Codebase::Inspection, Codebase::Codemods, Codebase::TestSuite,
|
|
186
|
-
Codebase::CorpusTasks, Codebase::
|
|
187
|
+
Codebase::CorpusTasks, Codebase::Composing, Codebase::Publishing,
|
|
188
|
+
Codebase::Promotion].freeze
|
|
187
189
|
private_constant :FAMILIES
|
|
188
190
|
|
|
189
191
|
# The facts of a promotion or a watch, naming the operation so policies can tell them apart.
|
|
@@ -117,32 +117,6 @@ module Hecks
|
|
|
117
117
|
def apply_compaction(held, kind)
|
|
118
118
|
Compaction.new(plain(held[:domain]), aggregates: names(held[:aggregates]), kind: kind).apply!.join("\n")
|
|
119
119
|
end
|
|
120
|
-
|
|
121
|
-
# Writes `translations/<edge>.approval`; the host reads it at its next boot.
|
|
122
|
-
def apply_approve_translation(held)
|
|
123
|
-
domain = HeldDomain.open(plain(held[:domain]))
|
|
124
|
-
finding = domain.reading { |lineage| audited_edge(domain, lineage) }
|
|
125
|
-
document = approval_document(domain, finding, held)
|
|
126
|
-
path = Translation::ApprovalFile.write!(domain.directory, finding.edge, document)
|
|
127
|
-
"approval of edge #{document["edge"]} written to #{path} (digest #{document["edge_digest"][0, 12]}…, " \
|
|
128
|
-
"by #{document["approved_by"]}). Commit it with the edge; the host applies it at its next boot."
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
def approval_document(domain, finding, held)
|
|
132
|
-
Translation::ApprovalFile.build(
|
|
133
|
-
edge: finding.edge, approved_by: Git.new.identity(chdir: domain.directory),
|
|
134
|
-
approved_at: Time.now.utc.iso8601, rehearsal: rehearsal_block(held)
|
|
135
|
-
)
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
def audited_edge(domain, lineage)
|
|
139
|
-
eras = domain.held_eras(lineage)
|
|
140
|
-
finding = eras.empty? ? nil : EdgeAudit.call(domain, lineage, eras)
|
|
141
|
-
raise Runtime::WiringError, "#{domain.bluebook.name} has no edge to approve" unless finding
|
|
142
|
-
raise Runtime::WiringError, "#{finding.report}\nAUDIT REFUSED." unless finding.ok
|
|
143
|
-
|
|
144
|
-
finding
|
|
145
|
-
end
|
|
146
120
|
end
|
|
147
121
|
end
|
|
148
122
|
end
|
|
@@ -15,15 +15,14 @@ module Hecks
|
|
|
15
15
|
module Examination
|
|
16
16
|
# What every fact is until an examination finds otherwise.
|
|
17
17
|
NEUTRAL = {
|
|
18
|
-
capable: false, held: 0, forks: 0, contested: 0,
|
|
19
|
-
audited: false, rehearsal_needed: false, rehearsal_recorded: false,
|
|
18
|
+
capable: false, held: 0, forks: 0, contested: 0, bound: 0, candidates: 0,
|
|
20
19
|
drifted: false, loadable: false, shape_kept: false
|
|
21
20
|
}.freeze
|
|
22
21
|
|
|
23
22
|
# Examines the domain a change was asked for.
|
|
24
23
|
#
|
|
25
24
|
# @param held [Hash] the `Era` record: `operation`, `domain`, and whichever of `winners`,
|
|
26
|
-
# `era
|
|
25
|
+
# `era` and `aggregates` the request carried
|
|
27
26
|
# @return [Hash{Symbol => Hash}] every fact, as `{ value: x }`, and the request's own
|
|
28
27
|
# `operation`, which the reactions to the examination read
|
|
29
28
|
# @raise [Runtime::NotFound] if the domain cannot be loaded or has no such era
|
|
@@ -90,26 +89,6 @@ module Hecks
|
|
|
90
89
|
{ candidates: compaction.candidates.size, bound: compaction.bound.size }
|
|
91
90
|
end
|
|
92
91
|
|
|
93
|
-
def examine_approve_translation(held)
|
|
94
|
-
domain = HeldDomain.open(plain(held[:domain]))
|
|
95
|
-
return {} unless domain.capable?
|
|
96
|
-
|
|
97
|
-
domain.reading do |lineage|
|
|
98
|
-
eras = domain.held_eras(lineage)
|
|
99
|
-
finding = eras.empty? ? nil : EdgeAudit.call(domain, lineage, eras)
|
|
100
|
-
next { capable: true, held: eras.size } unless finding
|
|
101
|
-
|
|
102
|
-
{ capable: true, held: eras.size, edges: finding.leaving, audited: finding.ok }.merge(rehearsal_facts(finding, held))
|
|
103
|
-
end
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
def rehearsal_facts(finding, held)
|
|
107
|
-
{
|
|
108
|
-
rehearsal_needed: Translation::ApprovalFile.needs_rehearsal?(finding.edge),
|
|
109
|
-
rehearsal_recorded: Translation::ApprovalFile.rehearsed?(rehearsal_block(held))
|
|
110
|
-
}
|
|
111
|
-
end
|
|
112
|
-
|
|
113
92
|
# How many eras, before the latest, do not have exactly one edge leading to the next.
|
|
114
93
|
def forks_in(domain, eras)
|
|
115
94
|
eras.each_cons(2).count do |from, to|
|
|
@@ -18,6 +18,8 @@ module Hecks
|
|
|
18
18
|
# a domain that holds no era answers that it holds none, and only `hold_first` holds one.
|
|
19
19
|
# What a reading refuses is a `Runtime::NotFound`, the refusal a launcher words as an answer.
|
|
20
20
|
module Readings
|
|
21
|
+
AUDIT_PASSED = "AUDIT PASSED \u2014 review the samples above; intent is yours to approve."
|
|
22
|
+
|
|
21
23
|
include Scaffolding
|
|
22
24
|
include Attestation
|
|
23
25
|
|
|
@@ -112,17 +114,7 @@ module Hecks
|
|
|
112
114
|
return "#{held.bluebook.name} stands at era 1 — no edge to audit." unless finding
|
|
113
115
|
raise Runtime::NotFound, "#{finding.report}\nAUDIT REFUSED." unless finding.ok
|
|
114
116
|
|
|
115
|
-
[finding.report,
|
|
116
|
-
end
|
|
117
|
-
|
|
118
|
-
def audit_verdict(edge, path)
|
|
119
|
-
if Translation::ApprovalFile.needs_rehearsal?(edge)
|
|
120
|
-
"AUDIT PASSED — this edge carries a compute or rekey rule, and the samples above are its ONLY " \
|
|
121
|
-
"verification. If they show what you intended, rehearse it against a snapshot and run " \
|
|
122
|
-
"`hecks approve_translation #{path} --confirm` with the rehearsal; the mint refuses until then."
|
|
123
|
-
else
|
|
124
|
-
"AUDIT PASSED — review the samples above; intent is yours to approve."
|
|
125
|
-
end
|
|
117
|
+
[finding.report, AUDIT_PASSED].join("\n")
|
|
126
118
|
end
|
|
127
119
|
end
|
|
128
120
|
end
|
|
@@ -42,17 +42,6 @@ module Hecks
|
|
|
42
42
|
end
|
|
43
43
|
end
|
|
44
44
|
|
|
45
|
-
# The rehearsal a compute or rekey edge is approved on, as the block the file carries. A
|
|
46
|
-
# rehearsal that names no host version ran on this one, so it records this release.
|
|
47
|
-
def rehearsal_block(held)
|
|
48
|
-
block = { "snapshot" => plain(held[:snapshot]), "host_version" => plain(held[:host_version]),
|
|
49
|
-
"result" => plain(held[:rehearsal]), "at" => plain(held[:rehearsed_at]) }.compact
|
|
50
|
-
return nil if block.empty?
|
|
51
|
-
|
|
52
|
-
block["host_version"] ||= Hecks::VERSION
|
|
53
|
-
block
|
|
54
|
-
end
|
|
55
|
-
|
|
56
45
|
# The era as stored, digest unchecked: a text that drifted is what re-attesting is for.
|
|
57
46
|
def raw_era(domain, lineage, ordinal)
|
|
58
47
|
present = lineage.db.exec("SELECT to_regclass('hecks_eras') AS present")[0]["present"]
|
|
@@ -45,7 +45,7 @@ module Hecks
|
|
|
45
45
|
refusals, after = edge ? @store.audit(@subject, edge) : [[], {}]
|
|
46
46
|
rust = RustAudit.call(@subject, after)
|
|
47
47
|
report = AuditReport.new(minting: minting, edge: edge, states: after, ruby: refusals, rust: rust)
|
|
48
|
-
answer(edge, report, (refusals + rust.violations).uniq, limits(
|
|
48
|
+
answer(edge, report, (refusals + rust.violations).uniq, limits(rust, report))
|
|
49
49
|
end
|
|
50
50
|
|
|
51
51
|
private
|
|
@@ -82,7 +82,7 @@ module Hecks
|
|
|
82
82
|
def copy_facts = census.facts.merge(copy_empty: flag(copy_empty?))
|
|
83
83
|
|
|
84
84
|
def edge_facts(edge)
|
|
85
|
-
{ minting: plain(minting), edge_present: flag(!edge.nil?)
|
|
85
|
+
{ minting: plain(minting), edge_present: flag(!edge.nil?) }
|
|
86
86
|
end
|
|
87
87
|
|
|
88
88
|
def eras = @eras ||= @store.eras(@subject)
|
|
@@ -97,16 +97,9 @@ module Hecks
|
|
|
97
97
|
before == @subject.label ? "none" : "next"
|
|
98
98
|
end
|
|
99
99
|
|
|
100
|
-
def
|
|
101
|
-
return false unless edge
|
|
102
|
-
|
|
103
|
-
!Translation::ApprovalFile.needs_rehearsal?(edge) ||
|
|
104
|
-
!Translation::ApprovalFile.applicable(@subject.directory, edge).nil?
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
def limits(edge, rust, report)
|
|
100
|
+
def limits(rust, report)
|
|
108
101
|
engine = rust.ran ? [] : [ENGINE_LIMIT]
|
|
109
|
-
engine + report.limits + ALWAYS +
|
|
102
|
+
engine + report.limits + ALWAYS + [journal_limit] + attached_limits +
|
|
110
103
|
(@subject.held.capable? ? [] : [binding_note])
|
|
111
104
|
end
|
|
112
105
|
|
|
@@ -65,15 +65,6 @@ module Hecks
|
|
|
65
65
|
[refusals, after]
|
|
66
66
|
end
|
|
67
67
|
|
|
68
|
-
# @param edge [Bluebook::Translation] the edge
|
|
69
|
-
# @return [Array<Hash>] what memory cannot apply, as report limits
|
|
70
|
-
def limits(edge)
|
|
71
|
-
return [] unless edge && Translation::ApprovalFile.needs_rehearsal?(edge)
|
|
72
|
-
|
|
73
|
-
[{ what: "the edge's compute and rekey rules",
|
|
74
|
-
why: "they are SQL, which only a postgres copy runs; memory leaves those fields as stored" }]
|
|
75
|
-
end
|
|
76
|
-
|
|
77
68
|
private
|
|
78
69
|
|
|
79
70
|
def records(name) = @document.dig("records", name.to_s) || {}
|
|
@@ -170,6 +170,12 @@ Hecks.behaviors "Codebase" do
|
|
|
170
170
|
expect refused: "a port is 1 to 65535"
|
|
171
171
|
end
|
|
172
172
|
|
|
173
|
+
test "Compose refuses a port that is not one" do
|
|
174
|
+
tests "Compose", on: "CorpusRun"
|
|
175
|
+
input port: { value: 70_000 }, run: { value: "compose" }
|
|
176
|
+
expect refused: "a port is 1 to 65535"
|
|
177
|
+
end
|
|
178
|
+
|
|
173
179
|
test "ServeQueryIrMcp refuses a run that is not named" do
|
|
174
180
|
tests "ServeQueryIrMcp", on: "CorpusRun"
|
|
175
181
|
input run: { value: "" }
|