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
|
@@ -38,13 +38,13 @@ Hecks.bluebook "Hecks" do
|
|
|
38
38
|
identified_by :run
|
|
39
39
|
|
|
40
40
|
value_object "RunKey" do
|
|
41
|
-
attribute :value, String,
|
|
41
|
+
attribute :value, String, matches: :present
|
|
42
42
|
|
|
43
43
|
invariant("a run is named") { !value.to_s.empty? }
|
|
44
44
|
end
|
|
45
45
|
|
|
46
46
|
value_object "Operation" do
|
|
47
|
-
attribute :value, String,
|
|
47
|
+
attribute :value, String, matches: :present
|
|
48
48
|
end
|
|
49
49
|
|
|
50
50
|
value_object "Switch" do
|
|
@@ -57,7 +57,7 @@ Hecks.bluebook "Hecks" do
|
|
|
57
57
|
|
|
58
58
|
# A keyword of the language, or the keyword an argument belongs to.
|
|
59
59
|
value_object "Word" do
|
|
60
|
-
attribute :value, String,
|
|
60
|
+
attribute :value, String, matches: :present
|
|
61
61
|
|
|
62
62
|
invariant("a word is named") { !value.to_s.empty? }
|
|
63
63
|
end
|
|
@@ -94,7 +94,7 @@ Hecks.bluebook "Hecks" do
|
|
|
94
94
|
|
|
95
95
|
# How a pairs argument is read, such as verbatim.
|
|
96
96
|
value_object "Shape" do
|
|
97
|
-
attribute :value, String,
|
|
97
|
+
attribute :value, String, matches: :present
|
|
98
98
|
end
|
|
99
99
|
|
|
100
100
|
lifecycle :status, default: "requested" do
|
|
@@ -641,13 +641,13 @@ Hecks.bluebook "Hecks" do
|
|
|
641
641
|
identified_by :run
|
|
642
642
|
|
|
643
643
|
value_object "RunKey" do
|
|
644
|
-
attribute :value, String,
|
|
644
|
+
attribute :value, String, matches: :present
|
|
645
645
|
|
|
646
646
|
invariant("a run is named") { !value.to_s.empty? }
|
|
647
647
|
end
|
|
648
648
|
|
|
649
649
|
value_object "Operation" do
|
|
650
|
-
attribute :value, String,
|
|
650
|
+
attribute :value, String, matches: :present
|
|
651
651
|
end
|
|
652
652
|
|
|
653
653
|
value_object "Switch" do
|
|
@@ -796,13 +796,13 @@ Hecks.bluebook "Hecks" do
|
|
|
796
796
|
identified_by :run
|
|
797
797
|
|
|
798
798
|
value_object "RunKey" do
|
|
799
|
-
attribute :value, String,
|
|
799
|
+
attribute :value, String, matches: :present
|
|
800
800
|
|
|
801
801
|
invariant("a run is named") { !value.to_s.empty? }
|
|
802
802
|
end
|
|
803
803
|
|
|
804
804
|
value_object "Operation" do
|
|
805
|
-
attribute :value, String,
|
|
805
|
+
attribute :value, String, matches: :present
|
|
806
806
|
end
|
|
807
807
|
|
|
808
808
|
value_object "Switch" do
|
|
@@ -971,13 +971,13 @@ Hecks.bluebook "Hecks" do
|
|
|
971
971
|
identified_by :run
|
|
972
972
|
|
|
973
973
|
value_object "RunKey" do
|
|
974
|
-
attribute :value, String,
|
|
974
|
+
attribute :value, String, matches: :present
|
|
975
975
|
|
|
976
976
|
invariant("a run is named") { !value.to_s.empty? }
|
|
977
977
|
end
|
|
978
978
|
|
|
979
979
|
value_object "Operation" do
|
|
980
|
-
attribute :value, String,
|
|
980
|
+
attribute :value, String, matches: :present
|
|
981
981
|
end
|
|
982
982
|
|
|
983
983
|
value_object "Switch" do
|
|
@@ -990,7 +990,7 @@ Hecks.bluebook "Hecks" do
|
|
|
990
990
|
|
|
991
991
|
# A `CiGate` row of the Vocabulary chapter, by name.
|
|
992
992
|
value_object "GateName" do
|
|
993
|
-
attribute :value, String,
|
|
993
|
+
attribute :value, String, matches: :present
|
|
994
994
|
end
|
|
995
995
|
|
|
996
996
|
lifecycle :status, default: "requested" do
|
|
@@ -1201,17 +1201,17 @@ Hecks.bluebook "Hecks" do
|
|
|
1201
1201
|
identified_by :run
|
|
1202
1202
|
|
|
1203
1203
|
value_object "RunKey" do
|
|
1204
|
-
attribute :value, String,
|
|
1204
|
+
attribute :value, String, matches: :present
|
|
1205
1205
|
|
|
1206
1206
|
invariant("a run is named") { !value.to_s.empty? }
|
|
1207
1207
|
end
|
|
1208
1208
|
|
|
1209
1209
|
value_object "Operation" do
|
|
1210
|
-
attribute :value, String,
|
|
1210
|
+
attribute :value, String, matches: :present
|
|
1211
1211
|
end
|
|
1212
1212
|
|
|
1213
1213
|
value_object "Stage" do
|
|
1214
|
-
attribute :value, String,
|
|
1214
|
+
attribute :value, String, matches: :snake_name
|
|
1215
1215
|
|
|
1216
1216
|
invariant("a stage is named") { !value.to_s.empty? }
|
|
1217
1217
|
end
|
|
@@ -1355,13 +1355,13 @@ Hecks.bluebook "Hecks" do
|
|
|
1355
1355
|
identified_by :run
|
|
1356
1356
|
|
|
1357
1357
|
value_object "RunKey" do
|
|
1358
|
-
attribute :value, String,
|
|
1358
|
+
attribute :value, String, matches: :present
|
|
1359
1359
|
|
|
1360
1360
|
invariant("a run is named") { !value.to_s.empty? }
|
|
1361
1361
|
end
|
|
1362
1362
|
|
|
1363
1363
|
value_object "Operation" do
|
|
1364
|
-
attribute :value, String,
|
|
1364
|
+
attribute :value, String, matches: :present
|
|
1365
1365
|
end
|
|
1366
1366
|
|
|
1367
1367
|
value_object "Switch" do
|
|
@@ -1391,12 +1391,12 @@ Hecks.bluebook "Hecks" do
|
|
|
1391
1391
|
|
|
1392
1392
|
# A revision a code comparison is made against.
|
|
1393
1393
|
value_object "Ref" do
|
|
1394
|
-
attribute :value, String,
|
|
1394
|
+
attribute :value, String, matches: :no_whitespace
|
|
1395
1395
|
end
|
|
1396
1396
|
|
|
1397
1397
|
# A JSON file.
|
|
1398
1398
|
value_object "FilePath" do
|
|
1399
|
-
attribute :value, String,
|
|
1399
|
+
attribute :value, String, matches: :not_empty
|
|
1400
1400
|
|
|
1401
1401
|
invariant("a file is named") { !value.to_s.empty? }
|
|
1402
1402
|
end
|
|
@@ -1676,13 +1676,13 @@ Hecks.bluebook "Hecks" do
|
|
|
1676
1676
|
identified_by :run
|
|
1677
1677
|
|
|
1678
1678
|
value_object "RunKey" do
|
|
1679
|
-
attribute :value, String,
|
|
1679
|
+
attribute :value, String, matches: :present
|
|
1680
1680
|
|
|
1681
1681
|
invariant("a run is named") { !value.to_s.empty? }
|
|
1682
1682
|
end
|
|
1683
1683
|
|
|
1684
1684
|
value_object "Operation" do
|
|
1685
|
-
attribute :value, String,
|
|
1685
|
+
attribute :value, String, matches: :present
|
|
1686
1686
|
end
|
|
1687
1687
|
|
|
1688
1688
|
value_object "Switch" do
|
|
@@ -1891,13 +1891,13 @@ Hecks.bluebook "Hecks" do
|
|
|
1891
1891
|
identified_by :run
|
|
1892
1892
|
|
|
1893
1893
|
value_object "RunKey" do
|
|
1894
|
-
attribute :value, String,
|
|
1894
|
+
attribute :value, String, matches: :present
|
|
1895
1895
|
|
|
1896
1896
|
invariant("a run is named") { !value.to_s.empty? }
|
|
1897
1897
|
end
|
|
1898
1898
|
|
|
1899
1899
|
value_object "Operation" do
|
|
1900
|
-
attribute :value, String,
|
|
1900
|
+
attribute :value, String, matches: :present
|
|
1901
1901
|
end
|
|
1902
1902
|
|
|
1903
1903
|
value_object "Switch" do
|
|
@@ -2064,13 +2064,13 @@ Hecks.bluebook "Hecks" do
|
|
|
2064
2064
|
identified_by :run
|
|
2065
2065
|
|
|
2066
2066
|
value_object "RunKey" do
|
|
2067
|
-
attribute :value, String,
|
|
2067
|
+
attribute :value, String, matches: :present
|
|
2068
2068
|
|
|
2069
2069
|
invariant("a run is named") { !value.to_s.empty? }
|
|
2070
2070
|
end
|
|
2071
2071
|
|
|
2072
2072
|
value_object "Operation" do
|
|
2073
|
-
attribute :value, String,
|
|
2073
|
+
attribute :value, String, matches: :present
|
|
2074
2074
|
end
|
|
2075
2075
|
|
|
2076
2076
|
value_object "Switch" do
|
|
@@ -2090,19 +2090,19 @@ Hecks.bluebook "Hecks" do
|
|
|
2090
2090
|
|
|
2091
2091
|
# A CI run's number.
|
|
2092
2092
|
value_object "RunId" do
|
|
2093
|
-
attribute :value, String,
|
|
2093
|
+
attribute :value, String, matches: :digits
|
|
2094
2094
|
end
|
|
2095
2095
|
|
|
2096
2096
|
# A file, relative to the checkout or absolute.
|
|
2097
2097
|
value_object "FilePath" do
|
|
2098
|
-
attribute :value, String,
|
|
2098
|
+
attribute :value, String, matches: :not_empty
|
|
2099
2099
|
|
|
2100
2100
|
invariant("a file is named") { !value.to_s.empty? }
|
|
2101
2101
|
end
|
|
2102
2102
|
|
|
2103
2103
|
# Part of an example's description.
|
|
2104
2104
|
value_object "ExampleText" do
|
|
2105
|
-
attribute :value, String,
|
|
2105
|
+
attribute :value, String, matches: :not_empty
|
|
2106
2106
|
|
|
2107
2107
|
invariant("an example is named") { !value.to_s.empty? }
|
|
2108
2108
|
end
|
|
@@ -2114,7 +2114,7 @@ Hecks.bluebook "Hecks" do
|
|
|
2114
2114
|
|
|
2115
2115
|
# A regular expression naming the specs to leave out.
|
|
2116
2116
|
value_object "ExcludePattern" do
|
|
2117
|
-
attribute :value, String,
|
|
2117
|
+
attribute :value, String, matches: :not_empty
|
|
2118
2118
|
end
|
|
2119
2119
|
|
|
2120
2120
|
# The tag filter, as the test runner spells it.
|
|
@@ -2390,13 +2390,13 @@ Hecks.bluebook "Hecks" do
|
|
|
2390
2390
|
identified_by :run
|
|
2391
2391
|
|
|
2392
2392
|
value_object "RunKey" do
|
|
2393
|
-
attribute :value, String,
|
|
2393
|
+
attribute :value, String, matches: :present
|
|
2394
2394
|
|
|
2395
2395
|
invariant("a run is named") { !value.to_s.empty? }
|
|
2396
2396
|
end
|
|
2397
2397
|
|
|
2398
2398
|
value_object "Operation" do
|
|
2399
|
-
attribute :value, String,
|
|
2399
|
+
attribute :value, String, matches: :present
|
|
2400
2400
|
end
|
|
2401
2401
|
|
|
2402
2402
|
value_object "Switch" do
|
|
@@ -2424,7 +2424,7 @@ Hecks.bluebook "Hecks" do
|
|
|
2424
2424
|
|
|
2425
2425
|
# The name of one field of a construct.
|
|
2426
2426
|
value_object "FieldName" do
|
|
2427
|
-
attribute :value, String,
|
|
2427
|
+
attribute :value, String, matches: :snake_name
|
|
2428
2428
|
end
|
|
2429
2429
|
|
|
2430
2430
|
# A local port a server listens on.
|
|
@@ -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 }
|
|
@@ -2633,13 +2654,13 @@ Hecks.bluebook "Hecks" do
|
|
|
2633
2654
|
identified_by :run
|
|
2634
2655
|
|
|
2635
2656
|
value_object "RunKey" do
|
|
2636
|
-
attribute :value, String,
|
|
2657
|
+
attribute :value, String, matches: :present
|
|
2637
2658
|
|
|
2638
2659
|
invariant("a run is named") { !value.to_s.empty? }
|
|
2639
2660
|
end
|
|
2640
2661
|
|
|
2641
2662
|
value_object "Operation" do
|
|
2642
|
-
attribute :value, String,
|
|
2663
|
+
attribute :value, String, matches: :present
|
|
2643
2664
|
end
|
|
2644
2665
|
|
|
2645
2666
|
value_object "Switch" do
|
|
@@ -2652,7 +2673,7 @@ Hecks.bluebook "Hecks" do
|
|
|
2652
2673
|
|
|
2653
2674
|
# One word of a fact: a branch, a commit, whether a tag stands.
|
|
2654
2675
|
value_object "Word" do
|
|
2655
|
-
attribute :value, String,
|
|
2676
|
+
attribute :value, String, matches: :present
|
|
2656
2677
|
end
|
|
2657
2678
|
|
|
2658
2679
|
value_object "Version" do
|
|
@@ -2968,13 +2989,13 @@ Hecks.bluebook "Hecks" do
|
|
|
2968
2989
|
identified_by :run
|
|
2969
2990
|
|
|
2970
2991
|
value_object "RunKey" do
|
|
2971
|
-
attribute :value, String,
|
|
2992
|
+
attribute :value, String, matches: :present
|
|
2972
2993
|
|
|
2973
2994
|
invariant("a run is named") { !value.to_s.empty? }
|
|
2974
2995
|
end
|
|
2975
2996
|
|
|
2976
2997
|
value_object "Operation" do
|
|
2977
|
-
attribute :value, String,
|
|
2998
|
+
attribute :value, String, matches: :present
|
|
2978
2999
|
end
|
|
2979
3000
|
|
|
2980
3001
|
value_object "Switch" do
|
|
@@ -2987,7 +3008,7 @@ Hecks.bluebook "Hecks" do
|
|
|
2987
3008
|
|
|
2988
3009
|
# A branch name, or a commit.
|
|
2989
3010
|
value_object "Word" do
|
|
2990
|
-
attribute :value, String,
|
|
3011
|
+
attribute :value, String, matches: :present
|
|
2991
3012
|
end
|
|
2992
3013
|
|
|
2993
3014
|
# How long a lane has stood behind the lane it follows, or how long its row lets it.
|
|
@@ -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 }
|
|
@@ -27,14 +27,14 @@ Hecks.bluebook "Hecks" do
|
|
|
27
27
|
identified_by :run
|
|
28
28
|
|
|
29
29
|
value_object "OperationKey" do
|
|
30
|
-
attribute :value, String,
|
|
30
|
+
attribute :value, String, matches: :present
|
|
31
31
|
|
|
32
32
|
invariant("an operation is named") { !value.to_s.empty? }
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
# What the operation acts on: a domain directory, or a behaviors file or directory.
|
|
36
36
|
value_object "Subject" do
|
|
37
|
-
attribute :value, String,
|
|
37
|
+
attribute :value, String, matches: :not_empty
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
value_object "Script" do
|
|
@@ -42,7 +42,7 @@ Hecks.bluebook "Hecks" do
|
|
|
42
42
|
end
|
|
43
43
|
|
|
44
44
|
value_object "Verb" do
|
|
45
|
-
attribute :value, String,
|
|
45
|
+
attribute :value, String, matches: :present
|
|
46
46
|
end
|
|
47
47
|
|
|
48
48
|
# One `name=value` word of the verb a run dispatches.
|
|
@@ -59,7 +59,7 @@ Hecks.bluebook "Hecks" do
|
|
|
59
59
|
end
|
|
60
60
|
|
|
61
61
|
value_object "HeaderName" do
|
|
62
|
-
attribute :value, String,
|
|
62
|
+
attribute :value, String, matches: :present
|
|
63
63
|
end
|
|
64
64
|
|
|
65
65
|
value_object "Scheme" do
|
|
@@ -71,7 +71,7 @@ Hecks.bluebook "Hecks" do
|
|
|
71
71
|
end
|
|
72
72
|
|
|
73
73
|
value_object "PayloadFile" do
|
|
74
|
-
attribute :value, String,
|
|
74
|
+
attribute :value, String, matches: :not_empty
|
|
75
75
|
end
|
|
76
76
|
|
|
77
77
|
value_object "Output" do
|
|
@@ -84,11 +84,11 @@ Hecks.bluebook "Hecks" do
|
|
|
84
84
|
end
|
|
85
85
|
|
|
86
86
|
value_object "PersonName" do
|
|
87
|
-
attribute :value, String,
|
|
87
|
+
attribute :value, String, matches: :not_empty
|
|
88
88
|
end
|
|
89
89
|
|
|
90
90
|
value_object "RoleName" do
|
|
91
|
-
attribute :value, String,
|
|
91
|
+
attribute :value, String, matches: :no_whitespace
|
|
92
92
|
end
|
|
93
93
|
|
|
94
94
|
lifecycle :status, default: "requested" do
|
|
@@ -361,7 +361,7 @@ Hecks.bluebook "Hecks" do
|
|
|
361
361
|
|
|
362
362
|
# The file listing the eras that should be running, one per line.
|
|
363
363
|
value_object "ExpectedFile" do
|
|
364
|
-
attribute :value, String,
|
|
364
|
+
attribute :value, String, matches: :not_empty
|
|
365
365
|
end
|
|
366
366
|
|
|
367
367
|
value_object "Seconds" do
|
|
@@ -371,7 +371,7 @@ Hecks.bluebook "Hecks" do
|
|
|
371
371
|
end
|
|
372
372
|
|
|
373
373
|
value_object "EraId" do
|
|
374
|
-
attribute :value, String,
|
|
374
|
+
attribute :value, String, matches: :present
|
|
375
375
|
end
|
|
376
376
|
|
|
377
377
|
value_object "VersionText" do
|
|
@@ -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
|
|
@@ -546,19 +538,19 @@ policy "RecordTheEra" do
|
|
|
546
538
|
identified_by :run
|
|
547
539
|
|
|
548
540
|
value_object "RunKey" do
|
|
549
|
-
attribute :value, String,
|
|
541
|
+
attribute :value, String, matches: :present
|
|
550
542
|
|
|
551
543
|
invariant("a change is named") { !value.to_s.empty? }
|
|
552
544
|
end
|
|
553
545
|
|
|
554
546
|
# The domain whose journal is changed: its directory.
|
|
555
547
|
value_object "DomainPath" do
|
|
556
|
-
attribute :value, String,
|
|
548
|
+
attribute :value, String, matches: :not_empty
|
|
557
549
|
end
|
|
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.
|
|
@@ -574,7 +566,7 @@ policy "RecordTheEra" do
|
|
|
574
566
|
|
|
575
567
|
# Aggregate names, comma separated; every aggregate that keeps a journal when absent.
|
|
576
568
|
value_object "AggregateList" do
|
|
577
|
-
attribute :value, String,
|
|
569
|
+
attribute :value, String, matches: :not_empty
|
|
578
570
|
end
|
|
579
571
|
|
|
580
572
|
value_object "Switch" do
|
|
@@ -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, pattern: '[^\t\n\r]'
|
|
592
|
-
end
|
|
593
|
-
|
|
594
|
-
value_object "HostVersion" do
|
|
595
|
-
attribute :value, String, pattern: '[^ \t\n\r]'
|
|
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" }
|