hecks 3.14.0 → 5.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.hecksagon +5 -3
- data/examples/pizzas/config.ru +22 -0
- data/exe/hecks +1 -1
- data/lib/hecks/adapters/driven/prism.rb +0 -2
- data/lib/hecks/adapters/driven.rb +0 -2
- data/lib/hecks/adapters/driving/json.rb +9 -16
- 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/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 +2 -0
- data/lib/hecks/chapters.rb +3 -3
- data/lib/hecks/cli/project_cli/launcher_source.rb +1 -1
- 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/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/app/responses.rb +3 -1
- 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/fuzzing/bounded_exhaustive_expressions.rb +0 -3
- 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/first_admin.rb +3 -3
- 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 +21 -0
- 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 +3 -80
- data/lib/hecks/hecks/hecks.hecksagon +2 -2
- data/lib/hecks/hecks/hecks.world +1 -1
- data/lib/hecks/hecks/rehearsal.bluebook +7 -13
- data/lib/hecks/kernel_capabilities/templates.rb +4 -4
- data/lib/hecks/kernel_capabilities.rb +1 -1
- data/lib/hecks/language/bluebook/vocabulary.bluebook +2 -3
- 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/site/cms_editor/templates/src/host.ts.tmpl +7 -2
- 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/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/unwrapping.rb +60 -0
- data/lib/hecks/runtime/value.rb +10 -21
- 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/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/{1a6f596be124228be93eba1d86dbc9d2933190fa389b284331241cb9f27115a0.marshal → ad68f9e06c8068c2a4176b57abf3083d591d5d8980c2b3e897b97331f965b643.marshal} +0 -0
- data/prebuilt/{a883a7e568667aa5ac904c82daff356bdf9e996252a36af6def4a4a43efb967e.marshal → ee22ec8642c4006717ba2b80f46e5efb81de459eef9dfec043e838c0ad4fd720.marshal} +0 -0
- data/prebuilt/{verdicts-872993b1aa26d73fe48f28251374b8585fed145d02aab42be0f00de386b6ff80.json → verdicts-b69f5dcbba79c20daa0493476fa7c317004a30aa2bc3d3dc6a722ea70ae2b43b.json} +1 -1
- 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 +306 -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 +151 -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/presenters.rs +335 -0
- data/rust/codegen/src/queries.rs +601 -226
- data/rust/codegen/src/reactions.rs +268 -74
- data/rust/codegen/src/read_models.rs +574 -229
- 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 +1037 -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 +39 -7
- data/rust/host/src/payments/tests.rs +1427 -282
- data/rust/host/src/payments.rs +391 -112
- 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 +555 -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 -1
- data/rust/parser/src/build/named_pattern.rs +4 -1
- 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 -516
- 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 +22 -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 +244 -114
- 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 +244 -148
- data/rust/src/kernel/mod.rs +47 -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/present.rs +261 -0
- 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/rust/host/src/approval.rs +0 -652
|
@@ -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: "" }
|
|
@@ -2467,6 +2467,22 @@ Hecks.bluebook "Hecks" do
|
|
|
2467
2467
|
emits PresentRequested
|
|
2468
2468
|
end
|
|
2469
2469
|
|
|
2470
|
+
command "Compose" do
|
|
2471
|
+
role "Maintainer"
|
|
2472
|
+
goal "Serve the Composer, a live bluebook editor over one domain directory, on a local port until stopped"
|
|
2473
|
+
|
|
2474
|
+
attribute :port, Port, optional: true
|
|
2475
|
+
attribute :domains, PathList, optional: true
|
|
2476
|
+
attribute :run, RunKey
|
|
2477
|
+
|
|
2478
|
+
sets :port
|
|
2479
|
+
sets :domains
|
|
2480
|
+
sets :run
|
|
2481
|
+
sets :operation, to: "compose"
|
|
2482
|
+
|
|
2483
|
+
emits ComposeRequested
|
|
2484
|
+
end
|
|
2485
|
+
|
|
2470
2486
|
# What the tree reported about itself, held against every request: nothing here runs
|
|
2471
2487
|
# outside a hecks checkout (hecks.gemspec beside lib/).
|
|
2472
2488
|
command "Accept" do
|
|
@@ -2571,6 +2587,11 @@ Hecks.bluebook "Hecks" do
|
|
|
2571
2587
|
trigger CorpusRun::SourceTree::Examine, with: { run: :run }
|
|
2572
2588
|
end
|
|
2573
2589
|
|
|
2590
|
+
policy "ExamineWhenComposeRequested" do
|
|
2591
|
+
on "CorpusRun.ComposeRequested"
|
|
2592
|
+
trigger CorpusRun::SourceTree::Examine, with: { run: :run }
|
|
2593
|
+
end
|
|
2594
|
+
|
|
2574
2595
|
policy "AcceptCorpusWhenExamined" do
|
|
2575
2596
|
on "CorpusRun.CorpusExamined"
|
|
2576
2597
|
trigger CorpusRun::Accept, with: { checkout: :checkout }
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
Hecks.behaviors "Composer" do
|
|
2
|
+
vision "A draft is opened, revised, judged by its check and talked about with an agent, one recorded step at a time."
|
|
3
|
+
|
|
4
|
+
loads "hecks.bluebook", "custodian.bluebook", "tooling.bluebook", "rehearsal.bluebook", "codebase.bluebook", "context_map.hecksagon", "hecks.hecksagon", "environments/memory.world"
|
|
5
|
+
|
|
6
|
+
test "Begin opens a chapter for editing" do
|
|
7
|
+
tests "Begin", on: "Draft"
|
|
8
|
+
input slug: { value: "account" }, chapter_name: { value: "Account" }, text: { value: "" }
|
|
9
|
+
expect status:"drafting"
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
test "Revise replaces the text of a draft" do
|
|
13
|
+
tests "Revise", on: "Draft"
|
|
14
|
+
setup "Composer::Draft.Begin", slug: { value: "account" }, chapter_name: { value: "Account" }, text: { value: "" }
|
|
15
|
+
input slug: { value: "account" }, text: { value: "Hecks.bluebook \"Account\" do\nend" }
|
|
16
|
+
expect emits: ["DraftRevised"]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
test "Accept records a draft that passed its check" do
|
|
20
|
+
tests "Accept", on: "Draft"
|
|
21
|
+
setup "Composer::Draft.Begin", slug: { value: "account" }, chapter_name: { value: "Account" }, text: { value: "" }
|
|
22
|
+
input slug: { value: "account" }, note: { value: "ok" }
|
|
23
|
+
expect status:"valid"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
test "Reject records a draft that failed its check" do
|
|
27
|
+
tests "Reject", on: "Draft"
|
|
28
|
+
setup "Composer::Draft.Begin", slug: { value: "account" }, chapter_name: { value: "Account" }, text: { value: "" }
|
|
29
|
+
input slug: { value: "account" }, note: { value: "line 3: expected one of: attribute, command" }
|
|
30
|
+
expect status:"invalid"
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
test "Revise returns a valid draft to drafting" do
|
|
34
|
+
tests "Revise", on: "Draft"
|
|
35
|
+
setup "Composer::Draft.Begin", slug: { value: "account" }, chapter_name: { value: "Account" }, text: { value: "" }
|
|
36
|
+
setup "Composer::Draft.Accept", slug: { value: "account" }, note: { value: "ok" }
|
|
37
|
+
input slug: { value: "account" }, text: { value: "Hecks.bluebook \"Account\" do\nend" }
|
|
38
|
+
expect status:"drafting"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
test "Ask puts a request to the conversation" do
|
|
42
|
+
tests "Ask", on: "Draft"
|
|
43
|
+
setup "Composer::Draft.Begin", slug: { value: "account" }, chapter_name: { value: "Account" }, text: { value: "" }
|
|
44
|
+
input slug: { value: "account" }, sequence: { value: 1 }, said: { value: "add a Refund command" }
|
|
45
|
+
expect emits: ["TurnAsked"]
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
test "Ask refuses a turn that says nothing" do
|
|
49
|
+
tests "Ask", on: "Draft"
|
|
50
|
+
setup "Composer::Draft.Begin", slug: { value: "account" }, chapter_name: { value: "Account" }, text: { value: "" }
|
|
51
|
+
input slug: { value: "account" }, sequence: { value: 1 }, said: { value: "" }
|
|
52
|
+
expect refused: "says something"
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
test "Answer records the agent's reply after a request" do
|
|
56
|
+
tests "Answer", on: "Draft"
|
|
57
|
+
setup "Composer::Draft.Begin", slug: { value: "account" }, chapter_name: { value: "Account" }, text: { value: "" }
|
|
58
|
+
setup "Composer::Draft.Ask", slug: { value: "account" }, sequence: { value: 1 }, said: { value: "add a Refund command" }
|
|
59
|
+
input slug: { value: "account" }, sequence: { value: 2 }, said: { value: "Added Refund." }, text: { value: "Hecks.bluebook \"Account\" do\nend" }
|
|
60
|
+
expect emits: ["TurnAnswered"]
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
test "Accept refuses a draft that was never begun" do
|
|
64
|
+
tests "Accept", on: "Draft"
|
|
65
|
+
input slug: { value: "nothing" }, note: { value: "ok" }
|
|
66
|
+
expect refused: "no Draft with"
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -8,6 +8,6 @@ end
|
|
|
8
8
|
|
|
9
9
|
# The attached chapters (hecks.hecksagon `attaches`): each is a bounded context whose store comes
|
|
10
10
|
# from hecks.world's `default_adapter`, so the memory overlay swaps them with the Hecks chapter.
|
|
11
|
-
%w[Bluebook Hecksagon World Adapter Port Translation Expression Tenancy Deploy Site Tickets QualityControl].each do |chapter|
|
|
11
|
+
%w[Bluebook Hecksagon World Adapter Port Translation Expression Tenancy Deploy Site Tickets Composer QualityControl].each do |chapter|
|
|
12
12
|
Hecks.hecksagon(chapter) { attaches "Governance" }
|
|
13
13
|
end
|
|
@@ -105,12 +105,6 @@ Hecks.behaviors "Custodian" do
|
|
|
105
105
|
expect refused: "an era is counted from one"
|
|
106
106
|
end
|
|
107
107
|
|
|
108
|
-
test "ApproveTranslation refuses a rehearsal that neither passed nor failed" do
|
|
109
|
-
tests "ApproveTranslation", on: "Era"
|
|
110
|
-
input domain: { value: "examples/pizzas" }, run: { value: "approve" }, confirm: { value: true }, rehearsal: { value: "maybe" }
|
|
111
|
-
expect refused: "must match"
|
|
112
|
-
end
|
|
113
|
-
|
|
114
108
|
test "CompactHeki keeps a domain that is not there as a refused change" do
|
|
115
109
|
tests "CompactHeki", on: "Era"
|
|
116
110
|
input domain: { value: "/tmp/hecks-behaviors-absent/heki-domain" }, run: { value: "compact" }, confirm: { value: true }
|
|
@@ -524,20 +524,12 @@ policy "RecordTheEra" do
|
|
|
524
524
|
attribute :era, Ordinal, optional: true
|
|
525
525
|
attribute :aggregates, AggregateList, optional: true
|
|
526
526
|
attribute :confirm, Switch, optional: true
|
|
527
|
-
attribute :snapshot, Snapshot, optional: true
|
|
528
|
-
attribute :host_version, HostVersion, optional: true
|
|
529
|
-
attribute :rehearsal, Verdict, optional: true
|
|
530
|
-
attribute :rehearsed_at, Moment, optional: true
|
|
531
527
|
attribute :capable, Switch, optional: true
|
|
532
528
|
attribute :held, Count, optional: true
|
|
533
529
|
attribute :forks, Count, optional: true
|
|
534
530
|
attribute :contested, Count, optional: true
|
|
535
|
-
attribute :edges, Count, optional: true
|
|
536
531
|
attribute :bound, Count, optional: true
|
|
537
532
|
attribute :candidates, Count, optional: true
|
|
538
|
-
attribute :audited, Switch, optional: true
|
|
539
|
-
attribute :rehearsal_needed, Switch, optional: true
|
|
540
|
-
attribute :rehearsal_recorded, Switch, optional: true
|
|
541
533
|
attribute :drifted, Switch, optional: true
|
|
542
534
|
attribute :loadable, Switch, optional: true
|
|
543
535
|
attribute :shape_kept, Switch, optional: true
|
|
@@ -558,7 +550,7 @@ policy "RecordTheEra" do
|
|
|
558
550
|
|
|
559
551
|
value_object "OperationName" do
|
|
560
552
|
attribute :value, String,
|
|
561
|
-
pattern: '^(hold_first|merge_tail|reattest|backfill_projections|compact|compact_heki
|
|
553
|
+
pattern: '^(hold_first|merge_tail|reattest|backfill_projections|compact|compact_heki)$'
|
|
562
554
|
end
|
|
563
555
|
|
|
564
556
|
# `id:old,id:new`: which world's record wins for each id both worlds touched since the cut.
|
|
@@ -585,24 +577,6 @@ policy "RecordTheEra" do
|
|
|
585
577
|
attribute :value, Integer
|
|
586
578
|
end
|
|
587
579
|
|
|
588
|
-
# The rehearsal a compute or rekey edge is approved on: the snapshot it ran against, the host
|
|
589
|
-
# that ran it, whether it passed, and when.
|
|
590
|
-
value_object "Snapshot" do
|
|
591
|
-
attribute :value, String, matches: :not_empty
|
|
592
|
-
end
|
|
593
|
-
|
|
594
|
-
value_object "HostVersion" do
|
|
595
|
-
attribute :value, String, matches: :present
|
|
596
|
-
end
|
|
597
|
-
|
|
598
|
-
value_object "Verdict" do
|
|
599
|
-
attribute :value, String, pattern: '^(pass|fail)$'
|
|
600
|
-
end
|
|
601
|
-
|
|
602
|
-
value_object "Moment" do
|
|
603
|
-
attribute :value, String, pattern: '^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]T[^ \t\n\r]+$'
|
|
604
|
-
end
|
|
605
|
-
|
|
606
580
|
value_object "Report" do
|
|
607
581
|
attribute :value, String
|
|
608
582
|
end
|
|
@@ -730,34 +704,6 @@ policy "RecordTheEra" do
|
|
|
730
704
|
emits HekiCompactionRequested
|
|
731
705
|
end
|
|
732
706
|
|
|
733
|
-
# Writes `translations/<edge>.approval` beside the edge, for the host to apply at its next
|
|
734
|
-
# boot. An edge with a compute or rekey rule also needs the rehearsal a person ran by hand.
|
|
735
|
-
command "ApproveTranslation" do
|
|
736
|
-
role "Operator"
|
|
737
|
-
goal "Approve the edge that leads a domain's latest era to its current shape, in a committed file"
|
|
738
|
-
|
|
739
|
-
attribute :domain, DomainPath
|
|
740
|
-
attribute :run, RunKey
|
|
741
|
-
attribute :confirm, Switch, optional: true
|
|
742
|
-
attribute :snapshot, Snapshot, optional: true
|
|
743
|
-
attribute :host_version, HostVersion, optional: true
|
|
744
|
-
attribute :rehearsal, Verdict, optional: true
|
|
745
|
-
attribute :rehearsed_at, Moment, optional: true
|
|
746
|
-
|
|
747
|
-
given("the approval is confirmed") { confirm.value == true }
|
|
748
|
-
|
|
749
|
-
sets :domain
|
|
750
|
-
sets :run
|
|
751
|
-
sets :confirm
|
|
752
|
-
sets :snapshot
|
|
753
|
-
sets :host_version
|
|
754
|
-
sets :rehearsal
|
|
755
|
-
sets :rehearsed_at
|
|
756
|
-
sets :operation, to: "approve_translation"
|
|
757
|
-
|
|
758
|
-
emits ApprovalRequested
|
|
759
|
-
end
|
|
760
|
-
|
|
761
707
|
# The facts the journal store reported, held against the change that was asked for.
|
|
762
708
|
command "Permit" do
|
|
763
709
|
role "System"
|
|
@@ -768,12 +714,8 @@ policy "RecordTheEra" do
|
|
|
768
714
|
attribute :held, Count
|
|
769
715
|
attribute :forks, Count
|
|
770
716
|
attribute :contested, Count
|
|
771
|
-
attribute :edges, Count
|
|
772
717
|
attribute :bound, Count
|
|
773
718
|
attribute :candidates, Count
|
|
774
|
-
attribute :audited, Switch
|
|
775
|
-
attribute :rehearsal_needed, Switch
|
|
776
|
-
attribute :rehearsal_recorded, Switch
|
|
777
719
|
attribute :drifted, Switch
|
|
778
720
|
attribute :loadable, Switch
|
|
779
721
|
attribute :shape_kept, Switch
|
|
@@ -795,13 +737,6 @@ policy "RecordTheEra" do
|
|
|
795
737
|
given("no projection reads the journal that would be emptied") do
|
|
796
738
|
(operation.value != "compact" && operation.value != "compact_heki") || bound.value == 0
|
|
797
739
|
end
|
|
798
|
-
given("exactly one edge leaves the latest era") do
|
|
799
|
-
operation.value != "approve_translation" || edges.value == 1
|
|
800
|
-
end
|
|
801
|
-
given("the audit passed") { operation.value != "approve_translation" || audited.value }
|
|
802
|
-
given("a rehearsal that passed is recorded for an edge with a compute or rekey rule") do
|
|
803
|
-
operation.value != "approve_translation" || !rehearsal_needed.value || rehearsal_recorded.value
|
|
804
|
-
end
|
|
805
740
|
given("the held text no longer matches its digest: there is nothing to re-attest") do
|
|
806
741
|
operation.value != "reattest" || drifted.value
|
|
807
742
|
end
|
|
@@ -816,12 +751,8 @@ policy "RecordTheEra" do
|
|
|
816
751
|
sets :held
|
|
817
752
|
sets :forks
|
|
818
753
|
sets :contested
|
|
819
|
-
sets :edges
|
|
820
754
|
sets :bound
|
|
821
755
|
sets :candidates
|
|
822
|
-
sets :audited
|
|
823
|
-
sets :rehearsal_needed
|
|
824
|
-
sets :rehearsal_recorded
|
|
825
756
|
sets :drifted
|
|
826
757
|
sets :loadable
|
|
827
758
|
sets :shape_kept
|
|
@@ -930,17 +861,11 @@ policy "RecordTheEra" do
|
|
|
930
861
|
trigger Era::JournalStore::Examine, with: { run: :run }
|
|
931
862
|
end
|
|
932
863
|
|
|
933
|
-
policy "ExamineWhenApprovalRequested" do
|
|
934
|
-
on "Era.ApprovalRequested"
|
|
935
|
-
trigger Era::JournalStore::Examine, with: { run: :run }
|
|
936
|
-
end
|
|
937
|
-
|
|
938
864
|
policy "PermitWhenExamined" do
|
|
939
865
|
on "Era.EraExamined"
|
|
940
866
|
trigger Era::Permit, with: {
|
|
941
|
-
capable: :capable, held: :held, forks: :forks, contested: :contested,
|
|
942
|
-
bound: :bound, candidates: :candidates,
|
|
943
|
-
rehearsal_needed: :rehearsal_needed, rehearsal_recorded: :rehearsal_recorded,
|
|
867
|
+
capable: :capable, held: :held, forks: :forks, contested: :contested,
|
|
868
|
+
bound: :bound, candidates: :candidates,
|
|
944
869
|
drifted: :drifted, loadable: :loadable, shape_kept: :shape_kept
|
|
945
870
|
}
|
|
946
871
|
end
|
|
@@ -956,8 +881,6 @@ policy "RecordTheEra" do
|
|
|
956
881
|
(operation.value == "merge_tail" && (held.value <= 1 || forks.value != 0 || contested.value != 0)) ||
|
|
957
882
|
((operation.value == "compact" || operation.value == "compact_heki") &&
|
|
958
883
|
(candidates.value <= 0 || bound.value != 0)) ||
|
|
959
|
-
(operation.value == "approve_translation" &&
|
|
960
|
-
(edges.value != 1 || !audited.value || (rehearsal_needed.value && !rehearsal_recorded.value))) ||
|
|
961
884
|
(operation.value == "reattest" && (!drifted.value || !loadable.value || !shape_kept.value))
|
|
962
885
|
end
|
|
963
886
|
trigger Era::Abandon, with: { refusal: "the journal's facts do not admit this change" }
|
|
@@ -2,8 +2,8 @@ Hecks.hecksagon "Hecks" do
|
|
|
2
2
|
attaches "Governance"
|
|
3
3
|
|
|
4
4
|
# The chapters the gem carries: the language declared in itself (Paging comes with Bluebook),
|
|
5
|
-
# Expression, Tenancy, Deploy, Site, Tickets and QualityControl (the last three bring their own ports).
|
|
6
|
-
%w[Bluebook Hecksagon World Adapter Port Translation Expression Tenancy Deploy Site Tickets QualityControl]
|
|
5
|
+
# Expression, Tenancy, Deploy, Site, Tickets, Composer and QualityControl (the last three bring their own ports).
|
|
6
|
+
%w[Bluebook Hecksagon World Adapter Port Translation Expression Tenancy Deploy Site Tickets Composer QualityControl]
|
|
7
7
|
.each { |chapter| attaches chapter }
|
|
8
8
|
# Persistence is not bound here: hecks.world's `default_adapter` binds every aggregate, so
|
|
9
9
|
# environments/memory.world can swap the whole domain without a double bind.
|
data/lib/hecks/hecks/hecks.world
CHANGED
|
@@ -61,7 +61,7 @@ Hecks.world "Hecks" do
|
|
|
61
61
|
CodemodRun TestSuiteRun CorpusRun PublishingRun PromotionRun Release
|
|
62
62
|
SyntaxBootCache],
|
|
63
63
|
newcomer: %w[launch.init launch.interview operation.open_console],
|
|
64
|
-
chapters: %w[Deploy Governance Tenancy Site Tickets QualityControl],
|
|
64
|
+
chapters: %w[Deploy Governance Tenancy Site Tickets Composer QualityControl],
|
|
65
65
|
maintainer_chapters: %w[Bluebook Hecksagon World Adapter Port Translation Expression],
|
|
66
66
|
memory_commands: %w[console init interview],
|
|
67
67
|
legacy: %w[run docs narrate ir stores model_check smoke_test
|
|
@@ -35,7 +35,6 @@ Hecks.bluebook "Hecks" do
|
|
|
35
35
|
attribute :after, ShapeLabel, optional: true
|
|
36
36
|
attribute :minting, Minting, optional: true
|
|
37
37
|
attribute :edge_present, Switch, optional: true
|
|
38
|
-
attribute :edge_approved, Switch, optional: true
|
|
39
38
|
attribute :refused_rows, list_of(RefusedRow), optional: true
|
|
40
39
|
attribute :refusal_total, Count, optional: true
|
|
41
40
|
attribute :audited, Switch, optional: true
|
|
@@ -279,15 +278,14 @@ Hecks.bluebook "Hecks" do
|
|
|
279
278
|
emits RehearsalBooted
|
|
280
279
|
end
|
|
281
280
|
|
|
282
|
-
# The mint's own three layers and its edge
|
|
281
|
+
# The mint's own three layers and its edge and coverage rules, run over the copy.
|
|
283
282
|
command "Audit" do
|
|
284
283
|
role "System"
|
|
285
|
-
goal "Record whether an edge leads to the shape
|
|
284
|
+
goal "Record whether an edge leads to the shape, and every row the mint's audit would refuse"
|
|
286
285
|
|
|
287
286
|
reference_to RehearsalRun
|
|
288
287
|
attribute :minting, Minting
|
|
289
288
|
attribute :edge_present, Switch
|
|
290
|
-
attribute :edge_approved, Switch
|
|
291
289
|
attribute :refused_rows, list_of(RefusedRow), optional: true
|
|
292
290
|
attribute :refusal_total, Count
|
|
293
291
|
attribute :audited, Switch
|
|
@@ -302,7 +300,6 @@ Hecks.bluebook "Hecks" do
|
|
|
302
300
|
|
|
303
301
|
sets :minting
|
|
304
302
|
sets :edge_present
|
|
305
|
-
sets :edge_approved
|
|
306
303
|
sets :refused_rows
|
|
307
304
|
sets :refusal_total
|
|
308
305
|
sets :audited
|
|
@@ -326,7 +323,6 @@ Hecks.bluebook "Hecks" do
|
|
|
326
323
|
attribute :verdict, Verdict
|
|
327
324
|
attribute :refusal_total, Count
|
|
328
325
|
attribute :edge_present, Switch
|
|
329
|
-
attribute :edge_approved, Switch
|
|
330
326
|
|
|
331
327
|
given("a rehearsal that finds a refused row would not mint") { refusal_total.value == 0 }
|
|
332
328
|
given("a rehearsal judged to mint names that verdict") { verdict.value == "would_mint" }
|
|
@@ -439,7 +435,7 @@ Hecks.bluebook "Hecks" do
|
|
|
439
435
|
|
|
440
436
|
policy "RecordAuditWhenStoreExamined" do
|
|
441
437
|
on "RehearsalRun.StoreExamined"
|
|
442
|
-
trigger RehearsalRun::Audit, with: { minting: :minting, edge_present: :edge_present,
|
|
438
|
+
trigger RehearsalRun::Audit, with: { minting: :minting, edge_present: :edge_present,
|
|
443
439
|
refused_rows: :refused_rows, refusal_total: :refusal_total,
|
|
444
440
|
audited: :audited, rows_examined: :rows_examined,
|
|
445
441
|
rust_rows_examined: :rust_rows_examined,
|
|
@@ -451,11 +447,10 @@ Hecks.bluebook "Hecks" do
|
|
|
451
447
|
policy "JudgeWhenNothingWouldStopTheMint" do
|
|
452
448
|
on "RehearsalRun.RehearsalAudited"
|
|
453
449
|
where do
|
|
454
|
-
(minting.value != "next" || edge_present.value) && refusal_total.value == 0
|
|
455
|
-
(minting.value != "next" || edge_approved.value)
|
|
450
|
+
(minting.value != "next" || edge_present.value) && refusal_total.value == 0
|
|
456
451
|
end
|
|
457
452
|
trigger RehearsalRun::Judge, with: { verdict: "would_mint", refusal_total: :refusal_total,
|
|
458
|
-
edge_present: :edge_present
|
|
453
|
+
edge_present: :edge_present }
|
|
459
454
|
end
|
|
460
455
|
|
|
461
456
|
policy "WithholdWhenNoEdgeLeadsOn" do
|
|
@@ -468,10 +463,9 @@ Hecks.bluebook "Hecks" do
|
|
|
468
463
|
policy "WithholdWhenTheMintWouldRefuse" do
|
|
469
464
|
on "RehearsalRun.RehearsalAudited"
|
|
470
465
|
where do
|
|
471
|
-
(minting.value != "next" || edge_present.value) &&
|
|
472
|
-
(refusal_total.value > 0 || (minting.value == "next" && !edge_approved.value))
|
|
466
|
+
(minting.value != "next" || edge_present.value) && refusal_total.value > 0
|
|
473
467
|
end
|
|
474
468
|
trigger RehearsalRun::Withhold, with: { verdict: "would_refuse",
|
|
475
|
-
refusal: "the mint would refuse: see the refused rows
|
|
469
|
+
refusal: "the mint would refuse: see the refused rows" }
|
|
476
470
|
end
|
|
477
471
|
end
|
|
@@ -30,13 +30,13 @@ module Hecks
|
|
|
30
30
|
/// variant names — `hecks measure_kernel_coverage`'s own existence
|
|
31
31
|
/// check reads this, so the file-name spelling here is the ONE
|
|
32
32
|
/// place that ever needs to change if a name is renamed.
|
|
33
|
-
pub fn module_name(&self) -> &'static str {
|
|
33
|
+
pub const fn module_name(&self) -> &'static str {
|
|
34
34
|
match self {
|
|
35
35
|
%<arms>s
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
pub const ALL: &'static [
|
|
39
|
+
pub const ALL: &'static [Self] = &[%<all>s];
|
|
40
40
|
}
|
|
41
41
|
RUST
|
|
42
42
|
|
|
@@ -78,8 +78,8 @@ module Hecks
|
|
|
78
78
|
directory: shapes ? "attribute_shapes" : "expression_operators",
|
|
79
79
|
mods: names.map { |name| "pub mod #{name};" }.join("\n"),
|
|
80
80
|
variants: names.map { |name| " #{pascal(name)}," }.join("\n"),
|
|
81
|
-
arms: names.map { |name| "
|
|
82
|
-
all: names.map { |name| "
|
|
81
|
+
arms: names.map { |name| " Self::#{pascal(name)} => #{name.to_s.inspect}," }.join("\n"),
|
|
82
|
+
all: names.map { |name| "Self::#{pascal(name)}" }.join(", "))
|
|
83
83
|
end
|
|
84
84
|
|
|
85
85
|
# @param name [String, Symbol] a snake_case capability name
|
|
@@ -42,7 +42,7 @@ module Hecks
|
|
|
42
42
|
File.join(kernel, "attribute_shapes/mod.rs") => shapes_module,
|
|
43
43
|
File.join(kernel, "expression_operators/mod.rs") => operators_module
|
|
44
44
|
}
|
|
45
|
-
ProjectionFiles::Result.new(content, [])
|
|
45
|
+
ProjectionFiles::Result.new(RustFormat.files(content), [])
|
|
46
46
|
end
|
|
47
47
|
|
|
48
48
|
# Writes the capability modules.
|
|
@@ -846,7 +846,6 @@ Hecks.bluebook "Bluebook" do
|
|
|
846
846
|
member script: "backfill_era_projections", section: "Custodian", aggregate: "Era", verb: "backfill_projections"
|
|
847
847
|
member script: "scaffold_translation", section: "Custodian", aggregate: "Era", verb: "scaffold_translation"
|
|
848
848
|
member script: "translation_audit", section: "Custodian", aggregate: "Era", verb: "audit_translation"
|
|
849
|
-
member script: "translation_audit", section: "Custodian", aggregate: "Era", verb: "approve_translation"
|
|
850
849
|
member script: "compact", section: "Custodian", aggregate: "Era", verb: "compact"
|
|
851
850
|
member script: "heki_compact", section: "Custodian", aggregate: "Era", verb: "compact_heki"
|
|
852
851
|
member script: "vendor_bluebook", section: "Custodian", aggregate: "Package", verb: "vendor", note: "waits: a refusal exits 1 with its reason on stderr"
|
|
@@ -954,8 +953,8 @@ Hecks.bluebook "Bluebook" do
|
|
|
954
953
|
# hand-typed copies.
|
|
955
954
|
value_object "RustReservedWord" do
|
|
956
955
|
attribute :word, String,
|
|
957
|
-
one_of: ["as", "
|
|
958
|
-
"fn", "for", "if", "impl", "in", "let", "loop", "match", "mod", "move", "mut", "pub",
|
|
956
|
+
one_of: ["as", "async", "await", "break", "const", "continue", "crate", "dyn", "else", "enum",
|
|
957
|
+
"extern", "false", "fn", "for", "if", "impl", "in", "let", "loop", "match", "mod", "move", "mut", "pub",
|
|
959
958
|
"ref", "return", "self", "Self", "static", "struct", "super", "trait", "true", "type",
|
|
960
959
|
"unsafe", "use", "where", "while", "abstract", "become", "box", "do", "final", "macro",
|
|
961
960
|
"override", "priv", "typeof", "unsized", "virtual", "yield", "try"]
|