hecks 3.4.2 → 3.6.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/bluebook/hecksagon/mock_stripe_payment_adapter.rb +1 -1
- data/lib/hecks/adapters/driven/claude_code.rb +11 -7
- data/lib/hecks/adapters/driven/d1/connection.rb +90 -0
- data/lib/hecks/adapters/driven/d1.rb +48 -314
- data/lib/hecks/adapters/driven/folder.rb +20 -10
- data/lib/hecks/adapters/driven/google_authentication.rb +18 -4
- data/lib/hecks/adapters/driven/governance_authorization.rb +2 -2
- data/lib/hecks/adapters/driven/heki/journal.rb +11 -10
- data/lib/hecks/adapters/driven/heki/saga_store.rb +4 -6
- data/lib/hecks/adapters/driven/heki/sagas.rb +55 -0
- data/lib/hecks/adapters/driven/heki.rb +21 -66
- data/lib/hecks/adapters/driven/in_memory_ordering.rb +37 -12
- data/lib/hecks/adapters/driven/lambda/client.rb +1 -1
- data/lib/hecks/adapters/driven/lambda.rb +1 -8
- data/lib/hecks/adapters/driven/memory/outbox_rows.rb +76 -0
- data/lib/hecks/adapters/driven/memory/shared_elements/values.rb +117 -0
- data/lib/hecks/adapters/driven/memory/shared_elements.rb +10 -97
- data/lib/hecks/adapters/driven/memory.rb +3 -65
- data/lib/hecks/adapters/driven/postgres/codec.rb +29 -26
- data/lib/hecks/adapters/driven/postgres/ddl.rb +50 -0
- data/lib/hecks/adapters/driven/postgres/dialect.rb +93 -0
- data/lib/hecks/adapters/driven/postgres/events.rb +57 -0
- data/lib/hecks/adapters/driven/postgres/journal.rb +127 -0
- data/lib/hecks/adapters/driven/postgres/outbox.rb +39 -31
- data/lib/hecks/adapters/driven/postgres/repository.rb +190 -0
- data/lib/hecks/adapters/driven/postgres/sagas.rb +72 -0
- data/lib/hecks/adapters/driven/postgres/schema_builder.rb +13 -41
- data/lib/hecks/adapters/driven/postgres.rb +61 -528
- data/lib/hecks/adapters/driven/prism.rb +1 -1
- data/lib/hecks/adapters/driven/sql_query_builder.rb +45 -53
- data/lib/hecks/adapters/driven/sql_value_members.rb +57 -0
- data/lib/hecks/adapters/driven/sqlite/codec.rb +32 -29
- data/lib/hecks/adapters/driven/sqlite/ddl.rb +68 -0
- data/lib/hecks/adapters/driven/sqlite/dialect.rb +55 -0
- data/lib/hecks/adapters/driven/sqlite/events.rb +61 -0
- data/lib/hecks/adapters/driven/sqlite/journal.rb +125 -0
- data/lib/hecks/adapters/driven/sqlite/outbox.rb +98 -0
- data/lib/hecks/adapters/driven/sqlite/projection.rb +82 -63
- data/lib/hecks/adapters/driven/sqlite/repository.rb +146 -0
- data/lib/hecks/adapters/driven/sqlite/sagas.rb +69 -0
- data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +8 -55
- data/lib/hecks/adapters/driven/sqlite.rb +36 -513
- data/lib/hecks/adapters/driven/tenant_provisioner.rb +13 -7
- data/lib/hecks/adapters/driving/github_webhook.rb +11 -8
- data/lib/hecks/behaviors/dsl.rb +17 -12
- data/lib/hecks/behaviors/expectations/boot.rb +81 -0
- data/lib/hecks/behaviors/expectations/checks.rb +178 -0
- data/lib/hecks/behaviors/expectations/dispatching.rb +93 -0
- data/lib/hecks/behaviors/expectations/qualify.rb +81 -0
- data/lib/hecks/behaviors/expectations.rb +39 -355
- data/lib/hecks/behaviors/rspec.rb +12 -12
- data/lib/hecks/behaviors/runner.rb +20 -11
- data/lib/hecks/bench/cli.rb +16 -13
- data/lib/hecks/bench/environment.rb +1 -1
- data/lib/hecks/bench/report.rb +11 -7
- data/lib/hecks/bench/ruby_runner.rb +13 -8
- data/lib/hecks/bench/rust_runner.rb +19 -11
- data/lib/hecks/bench/suite.rb +48 -20
- data/lib/hecks/bench/workload.rb +42 -31
- data/lib/hecks/bluebook/aggregate.rb +15 -21
- data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +18 -21
- data/lib/hecks/bluebook/assembly/build.rb +12 -7
- data/lib/hecks/bluebook/assembly/contracts/read_models.rb +70 -0
- data/lib/hecks/bluebook/assembly/contracts/rules.rb +84 -0
- data/lib/hecks/bluebook/assembly/contracts/sagas.rb +109 -0
- data/lib/hecks/bluebook/assembly/contracts/structure.rb +91 -0
- data/lib/hecks/bluebook/assembly/contracts.rb +9 -319
- data/lib/hecks/bluebook/assembly/marks.rb +9 -8
- data/lib/hecks/bluebook/attribute.rb +13 -10
- data/lib/hecks/bluebook/behaviour/aggregate.rb +10 -3
- data/lib/hecks/bluebook/behaviour/read_model.rb +26 -13
- data/lib/hecks/bluebook/chapter.rb +22 -14
- data/lib/hecks/bluebook/command.rb +14 -18
- data/lib/hecks/bluebook/domain_port.rb +11 -8
- data/lib/hecks/bluebook/dsl/aggregate_builder/correction_sealing.rb +78 -0
- data/lib/hecks/bluebook/dsl/aggregate_builder/draining.rb +74 -0
- data/lib/hecks/bluebook/dsl/aggregate_builder/query_field_sealing.rb +105 -0
- data/lib/hecks/bluebook/dsl/aggregate_builder/query_sealing.rb +121 -0
- data/lib/hecks/bluebook/dsl/aggregate_builder/relationships.rb +128 -0
- data/lib/hecks/bluebook/dsl/aggregate_builder/rules.rb +84 -0
- data/lib/hecks/bluebook/dsl/aggregate_builder/sealing.rb +61 -249
- data/lib/hecks/bluebook/dsl/aggregate_builder.rb +51 -285
- data/lib/hecks/bluebook/dsl/attribute_collector/identity_resolution.rb +113 -0
- data/lib/hecks/bluebook/dsl/attribute_collector.rb +58 -117
- data/lib/hecks/bluebook/dsl/binding_proxy.rb +24 -19
- data/lib/hecks/bluebook/dsl/bluebook_builder/pending_givens.rb +109 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation/correlation_keys.rb +105 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation/event_shapes.rb +126 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation/hop_tails.rb +79 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation/projected_fields.rb +76 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation/provisions.rb +65 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation/query_hops.rb +123 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation/references.rb +112 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation/with_projections.rb +126 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +34 -595
- data/lib/hecks/bluebook/dsl/bluebook_builder.rb +18 -107
- data/lib/hecks/bluebook/dsl/command_builder/implicit_attributes.rb +132 -0
- data/lib/hecks/bluebook/dsl/command_builder/mutations.rb +190 -0
- data/lib/hecks/bluebook/dsl/command_builder/owner.rb +22 -0
- data/lib/hecks/bluebook/dsl/command_builder/rules.rb +57 -0
- data/lib/hecks/bluebook/dsl/command_builder.rb +60 -360
- data/lib/hecks/bluebook/dsl/domain_port_builder.rb +19 -13
- data/lib/hecks/bluebook/dsl/entity_builder/rules.rb +96 -0
- data/lib/hecks/bluebook/dsl/entity_builder/scope.rb +25 -0
- data/lib/hecks/bluebook/dsl/entity_builder/sealing.rb +94 -0
- data/lib/hecks/bluebook/dsl/entity_builder.rb +35 -169
- data/lib/hecks/bluebook/dsl/generic_dispatch.rb +53 -24
- data/lib/hecks/bluebook/dsl/hecksagon_builder/chapter_scope.rb +133 -0
- data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +3 -97
- data/lib/hecks/bluebook/dsl/identity_declaration.rb +73 -73
- data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +7 -3
- data/lib/hecks/bluebook/dsl/need_word.rb +1 -1
- data/lib/hecks/bluebook/dsl/port_operation_builder.rb +34 -29
- data/lib/hecks/bluebook/dsl/process_manager_builder.rb +57 -41
- data/lib/hecks/bluebook/dsl/query_builder.rb +12 -15
- data/lib/hecks/bluebook/dsl/read_model_builder/sealing.rb +116 -0
- data/lib/hecks/bluebook/dsl/read_model_builder.rb +25 -102
- data/lib/hecks/bluebook/dsl/rule_reference.rb +26 -12
- data/lib/hecks/bluebook/dsl/translation_builder.rb +24 -14
- data/lib/hecks/bluebook/dsl/value_object_builder.rb +29 -19
- data/lib/hecks/bluebook/dsl/word_gate.rb +34 -27
- data/lib/hecks/bluebook/entity.rb +13 -17
- data/lib/hecks/bluebook/expression/ast_json/emitters.rb +93 -0
- data/lib/hecks/bluebook/expression/ast_json/emitters.rb-e +88 -0
- data/lib/hecks/bluebook/expression/ast_json.rb +49 -76
- data/lib/hecks/bluebook/expression/ast_reader.rb +95 -28
- data/lib/hecks/bluebook/expression/canonical_form.rb +6 -26
- data/lib/hecks/bluebook/expression/evaluator/parser.rb +62 -0
- data/lib/hecks/bluebook/expression/evaluator/scanning.rb +122 -0
- data/lib/hecks/bluebook/expression/evaluator.rb +11 -111
- data/lib/hecks/bluebook/expression/resolver/block_predicates.rb +28 -44
- data/lib/hecks/bluebook/expression/resolver/lookups.rb +77 -0
- data/lib/hecks/bluebook/expression/resolver/operations.rb +78 -0
- data/lib/hecks/bluebook/expression/resolver/parsing.rb +110 -0
- data/lib/hecks/bluebook/expression/resolver/scanning.rb +139 -0
- data/lib/hecks/bluebook/expression/resolver/values.rb +115 -0
- data/lib/hecks/bluebook/expression/resolver.rb +16 -414
- data/lib/hecks/bluebook/{hexagon.rb → hecksagon.rb} +22 -14
- data/lib/hecks/bluebook/keyword_fields.rb +42 -0
- data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +7 -6
- data/lib/hecks/bluebook/meta_validator/judge/cells.rb +99 -0
- data/lib/hecks/bluebook/meta_validator/judge/dispatching.rb +111 -0
- data/lib/hecks/bluebook/meta_validator/judge/identity.rb +108 -0
- data/lib/hecks/bluebook/meta_validator/judge/walking.rb +141 -0
- data/lib/hecks/bluebook/meta_validator/judge.rb +31 -376
- data/lib/hecks/bluebook/meta_validator/modes.rb +137 -0
- data/lib/hecks/bluebook/meta_validator/plan/category.rb +44 -0
- data/lib/hecks/bluebook/meta_validator/plan/verbs.rb +73 -0
- data/lib/hecks/bluebook/meta_validator/plan.rb +38 -122
- data/lib/hecks/bluebook/meta_validator/readings/fields.rb +100 -0
- data/lib/hecks/bluebook/meta_validator/readings.rb +10 -95
- data/lib/hecks/bluebook/meta_validator/reconstruction/heads.rb +89 -0
- data/lib/hecks/bluebook/meta_validator/reconstruction/reading.rb +96 -0
- data/lib/hecks/bluebook/meta_validator/reconstruction.rb +25 -151
- data/lib/hecks/bluebook/meta_validator/shapes/helpers.rb +83 -0
- data/lib/hecks/bluebook/meta_validator/shapes.rb +8 -75
- data/lib/hecks/bluebook/meta_validator/syntax_boot/disk_cache.rb +77 -0
- data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +31 -95
- data/lib/hecks/bluebook/meta_validator/translation_judge/rules.rb +74 -0
- data/lib/hecks/bluebook/meta_validator/translation_judge.rb +15 -65
- data/lib/hecks/bluebook/meta_validator/verdict_cache/tagging.rb +63 -0
- data/lib/hecks/bluebook/meta_validator/verdict_cache.rb +22 -43
- data/lib/hecks/bluebook/meta_validator/world_judge.rb +8 -4
- data/lib/hecks/bluebook/meta_validator.rb +59 -175
- data/lib/hecks/bluebook/model_check/lifecycle_checks.rb +122 -0
- data/lib/hecks/bluebook/model_check/policy_checks.rb +129 -0
- data/lib/hecks/bluebook/model_check/saga_checks.rb +134 -0
- data/lib/hecks/bluebook/model_check/verbs.rb +69 -0
- data/lib/hecks/bluebook/model_check.rb +73 -413
- data/lib/hecks/bluebook/pattern_subset/refusals.rb +54 -0
- data/lib/hecks/bluebook/pattern_subset/scan.rb +58 -0
- data/lib/hecks/bluebook/pattern_subset.rb +93 -134
- data/lib/hecks/bluebook/process_manager.rb +10 -9
- data/lib/hecks/bluebook/project_discovery.rb +10 -7
- data/lib/hecks/bluebook/project_register.rb +42 -41
- data/lib/hecks/bluebook/query.rb +19 -12
- data/lib/hecks/bluebook/read_model.rb +41 -39
- data/lib/hecks/bluebook/smoke_test.rb +51 -36
- data/lib/hecks/bluebook/synthesizer.rb +13 -5
- data/lib/hecks/bluebook/translation.rb +12 -12
- data/lib/hecks/bluebook.rb +1 -1
- data/lib/hecks/chapters.rb +32 -16
- data/lib/hecks/cli/behaviors.rb +22 -15
- data/lib/hecks/cli/check_era.rb +2 -2
- data/lib/hecks/cli/command_table.rb +72 -0
- data/lib/hecks/cli/console.rb +10 -7
- data/lib/hecks/cli/deploy_template_diff.rb +22 -9
- data/lib/hecks/cli/document.rb +14 -10
- data/lib/hecks/cli/domain_stub.rb +1 -1
- data/lib/hecks/cli/domain_writer.rb +1 -1
- data/lib/hecks/cli/expression_projection.rb +8 -6
- data/lib/hecks/cli/follow.rb +10 -4
- data/lib/hecks/cli/interview_aggregate.rb +132 -0
- data/lib/hecks/cli/interview_draft.rb +16 -200
- data/lib/hecks/cli/interview_record.rb +130 -0
- data/lib/hecks/cli/interview_run.rb +19 -8
- data/lib/hecks/cli/interview_session/agent_state.rb +70 -0
- data/lib/hecks/cli/interview_session/catalog.rb +76 -0
- data/lib/hecks/cli/interview_session/manual_findings.rb +48 -0
- data/lib/hecks/cli/interview_session/proposals.rb +90 -0
- data/lib/hecks/cli/interview_session.rb +8 -205
- data/lib/hecks/cli/interview_shape.rb +13 -6
- data/lib/hecks/cli/ir.rb +8 -11
- data/lib/hecks/cli/launcher_words.rb +168 -0
- data/lib/hecks/cli/model_check/examination.rb +93 -0
- data/lib/hecks/cli/model_check/sources.rb +57 -0
- data/lib/hecks/cli/model_check.rb +28 -134
- data/lib/hecks/cli/project_cli/launcher_source.rb +177 -0
- data/lib/hecks/cli/project_cli/templates.rb +106 -0
- data/lib/hecks/cli/project_cli.rb +57 -236
- data/lib/hecks/cli/project_diagrams.rb +26 -4
- data/lib/hecks/cli/project_glossary.rb +19 -9
- data/lib/hecks/cli/refresh_rspec_runtime_baseline.rb +29 -13
- data/lib/hecks/cli/release.rb +29 -22
- data/lib/hecks/cli/release_gem.rb +12 -6
- data/lib/hecks/cli/rspec_io_parallel_files.rb +87 -30
- data/lib/hecks/cli/rspec_shard_files.rb +24 -9
- data/lib/hecks/cli/run.rb +25 -44
- data/lib/hecks/cli/run_expectations.rb +63 -0
- data/lib/hecks/cli/seed_semantics_corpus.rb +37 -17
- data/lib/hecks/cli/smoke_http/checks.rb +66 -0
- data/lib/hecks/cli/smoke_http/settings.rb +63 -0
- data/lib/hecks/cli/smoke_http/transport.rb +45 -0
- data/lib/hecks/cli/smoke_http.rb +8 -142
- data/lib/hecks/cli/smoke_test.rb +18 -4
- data/lib/hecks/cli/stores.rb +7 -4
- data/lib/hecks/cli/stress_concurrency_specs/reporting.rb +44 -0
- data/lib/hecks/cli/stress_concurrency_specs/usage.rb +28 -0
- data/lib/hecks/cli/stress_concurrency_specs.rb +82 -80
- data/lib/hecks/cli.rb +32 -208
- data/lib/hecks/codemod/runner.rb +92 -0
- data/lib/hecks/codemod/sweep.rb +94 -0
- data/lib/hecks/codemod.rb +22 -165
- data/lib/hecks/corpus/routes.rb +34 -0
- data/lib/hecks/corpus/rust.rb +193 -0
- data/lib/hecks/corpus/sources.rb +46 -0
- data/lib/hecks/corpus.rb +28 -265
- data/lib/hecks/deploy/bluebook/deploy.bluebook +1510 -3
- data/lib/hecks/deploy/bluebook/deploy.hecksagon +57 -0
- data/lib/hecks/deploy/oidc.json +225 -0
- data/lib/hecks/doc/reference/coverage.rb +70 -0
- data/lib/hecks/doc/reference/harvester.rb +55 -0
- data/lib/hecks/doc/reference/readme.rb +89 -0
- data/lib/hecks/doc/reference/rendering.rb +149 -0
- data/lib/hecks/doc/reference.rb +14 -273
- data/lib/hecks/doors/cli_door/nesting.rb +34 -0
- data/lib/hecks/doors/cli_door/shorthand.rb +85 -0
- data/lib/hecks/doors/cli_door.rb +23 -95
- data/lib/hecks/doors/cli_runner/answers.rb +138 -0
- data/lib/hecks/doors/cli_runner/resolution.rb +146 -0
- data/lib/hecks/doors/cli_runner/settling.rb +115 -0
- data/lib/hecks/doors/cli_runner/streaming.rb +90 -0
- data/lib/hecks/doors/cli_runner/suggestions.rb +43 -0
- data/lib/hecks/doors/cli_runner.rb +12 -336
- data/lib/hecks/doors/command_request.rb +42 -31
- data/lib/hecks/doors/handle.rb +32 -30
- data/lib/hecks/doors/launcher_options.rb +62 -7
- data/lib/hecks/doors/mcp_door/properties.rb +47 -0
- data/lib/hecks/doors/mcp_door/tool_calls.rb +113 -0
- data/lib/hecks/doors/mcp_door/tool_definitions/auditing.rb +51 -0
- data/lib/hecks/doors/mcp_door/tool_definitions/calling.rb +69 -0
- data/lib/hecks/doors/mcp_door/tool_definitions/reading.rb +97 -0
- data/lib/hecks/doors/mcp_door/tool_definitions.rb +15 -0
- data/lib/hecks/doors/mcp_door.rb +55 -301
- data/lib/hecks/doors/mcp_door_scope/argument_policy.rb +92 -0
- data/lib/hecks/doors/mcp_door_scope/env_problems.rb +55 -0
- data/lib/hecks/doors/mcp_door_scope/presenter.rb +78 -0
- data/lib/hecks/doors/mcp_door_scope.rb +16 -172
- data/lib/hecks/doors/ruby_door/aggregate_door.rb +1 -1
- data/lib/hecks/doors/ruby_door/chapter.rb +33 -16
- data/lib/hecks/doors/ruby_door.rb +14 -11
- data/lib/hecks/doors/usage_cache.rb +14 -8
- data/lib/hecks/doors.rb +10 -4
- data/lib/hecks/embryonaut_bluebook/manifest.rb +11 -3
- data/lib/hecks/embryonaut_bluebook/registry/changelog.rb +26 -0
- data/lib/hecks/embryonaut_bluebook/registry/versions.rb +27 -0
- data/lib/hecks/embryonaut_bluebook/registry.rb +27 -37
- data/lib/hecks/embryonaut_bluebook/vendor/acceptance.rb +37 -0
- data/lib/hecks/embryonaut_bluebook/vendor.rb +22 -36
- data/lib/hecks/embryonaut_bluebook/vendor_cli.rb +9 -6
- data/lib/hecks/embryonaut_bluebook.rb +16 -11
- data/lib/hecks/engine_agreement.rb +24 -17
- data/lib/hecks/forms/app/commands.rb +98 -0
- data/lib/hecks/forms/app/queries.rb +62 -0
- data/lib/hecks/forms/app/records.rb +67 -0
- data/lib/hecks/forms/app/responses.rb +46 -0
- data/lib/hecks/forms/app.rb +33 -221
- data/lib/hecks/forms/banking_presentation.rb +5 -0
- data/lib/hecks/forms/command_form_renderer.rb +55 -14
- data/lib/hecks/forms/field_controls.rb +95 -0
- data/lib/hecks/forms/field_renderer.rb +34 -88
- data/lib/hecks/forms/field_shape.rb +9 -34
- data/lib/hecks/forms/html.rb +1 -1
- data/lib/hecks/forms/index_renderer.rb +14 -9
- data/lib/hecks/forms/page.rb +2 -106
- data/lib/hecks/forms/page_assets.rb +88 -0
- data/lib/hecks/forms/page_script.rb +28 -0
- data/lib/hecks/forms/params.rb +17 -8
- data/lib/hecks/forms/query_form_renderer.rb +11 -7
- data/lib/hecks/forms/record_renderer.rb +28 -19
- data/lib/hecks/forms/reference_options.rb +1 -1
- data/lib/hecks/forms/text_shape.rb +40 -0
- data/lib/hecks/fqn.rb +64 -32
- data/lib/hecks/framework.rb +10 -3
- data/lib/hecks/freezer.rb +10 -1
- data/lib/hecks/fuzzing/bounded_exhaustive_expressions/fragments.rb +61 -0
- data/lib/hecks/fuzzing/bounded_exhaustive_expressions/productions.rb +217 -0
- data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +5 -194
- data/lib/hecks/fuzzing/combination_miner.rb +23 -12
- data/lib/hecks/fuzzing/concurrent_dispatch/racing.rb +64 -0
- data/lib/hecks/fuzzing/concurrent_dispatch/world_copy.rb +66 -0
- data/lib/hecks/fuzzing/concurrent_dispatch.rb +31 -107
- data/lib/hecks/fuzzing/coverage_campaign.rb +7 -7
- data/lib/hecks/fuzzing/differential/wire_comparison.rb +74 -0
- data/lib/hecks/fuzzing/differential.rb +59 -84
- data/lib/hecks/fuzzing/domain_generator/block_rendering.rb +70 -0
- data/lib/hecks/fuzzing/domain_generator/builder/attribute_shapes.rb +105 -0
- data/lib/hecks/fuzzing/domain_generator/builder/shapes.rb +97 -0
- data/lib/hecks/fuzzing/domain_generator/builder/wiring.rb +128 -0
- data/lib/hecks/fuzzing/domain_generator/builder.rb +105 -0
- data/lib/hecks/fuzzing/domain_generator/pruning.rb +90 -0
- data/lib/hecks/fuzzing/domain_generator/removals.rb +62 -0
- data/lib/hecks/fuzzing/domain_generator/rendering.rb +94 -0
- data/lib/hecks/fuzzing/domain_generator/tokens.rb +38 -0
- data/lib/hecks/fuzzing/domain_generator.rb +7 -555
- data/lib/hecks/fuzzing/era_boundary.rb +34 -24
- data/lib/hecks/fuzzing/form_census.rb +18 -8
- data/lib/hecks/fuzzing/generated_domain_check.rb +23 -11
- data/lib/hecks/fuzzing/isolated_boot/copying.rb +62 -0
- data/lib/hecks/fuzzing/isolated_boot/postgres_scratch.rb +133 -0
- data/lib/hecks/fuzzing/isolated_boot/worlds.rb +102 -0
- data/lib/hecks/fuzzing/isolated_boot.rb +25 -252
- data/lib/hecks/fuzzing/persistence_parity.rb +5 -5
- data/lib/hecks/fuzzing/properties/aggregation_recompute.rb +121 -0
- data/lib/hecks/fuzzing/properties/catalog.rb +138 -0
- data/lib/hecks/fuzzing/properties/corrections.rb +23 -20
- data/lib/hecks/fuzzing/properties/dispatch_and_mutations.rb +64 -185
- data/lib/hecks/fuzzing/properties/group_by_recompute.rb +69 -0
- data/lib/hecks/fuzzing/properties/guards.rb +76 -108
- data/lib/hecks/fuzzing/properties/invariants_and_aggregation.rb +66 -227
- data/lib/hecks/fuzzing/properties/lifecycle_and_replay.rb +46 -35
- data/lib/hecks/fuzzing/properties/mutation_recompute.rb +162 -0
- data/lib/hecks/fuzzing/properties/outbox.rb +41 -24
- data/lib/hecks/fuzzing/properties/piece_invariants.rb +61 -0
- data/lib/hecks/fuzzing/properties/policy_wiring.rb +140 -0
- data/lib/hecks/fuzzing/properties/query_rows.rb +67 -0
- data/lib/hecks/fuzzing/properties/querying.rb +69 -90
- data/lib/hecks/fuzzing/properties/references.rb +100 -0
- data/lib/hecks/fuzzing/properties/tenant_scope.rb +84 -0
- data/lib/hecks/fuzzing/properties.rb +6 -119
- data/lib/hecks/fuzzing/qa_settings.rb +23 -17
- data/lib/hecks/fuzzing/replay/fan_out.rb +78 -0
- data/lib/hecks/fuzzing/replay/filters.rb +72 -0
- data/lib/hecks/fuzzing/replay/guard_check.rb +88 -0
- data/lib/hecks/fuzzing/replay/mutation_trace.rb +117 -0
- data/lib/hecks/fuzzing/replay/observation.rb +60 -0
- data/lib/hecks/fuzzing/replay/read_only_steps.rb +84 -0
- data/lib/hecks/fuzzing/replay/session.rb +151 -0
- data/lib/hecks/fuzzing/replay.rb +35 -442
- data/lib/hecks/fuzzing/rust_gap_manifest.rb +3 -4
- data/lib/hecks/fuzzing/self_consistency/saga_redelivery.rb +133 -0
- data/lib/hecks/fuzzing/self_consistency/sagas.rb +93 -0
- data/lib/hecks/fuzzing/self_consistency/value_objects.rb +87 -0
- data/lib/hecks/fuzzing/self_consistency.rb +8 -213
- data/lib/hecks/fuzzing/sequence_generator/adversary/argument_mutations.rb +116 -0
- data/lib/hecks/fuzzing/sequence_generator/adversary/caller_draw.rb +68 -0
- data/lib/hecks/fuzzing/sequence_generator/adversary/identity_mutations.rb +62 -0
- data/lib/hecks/fuzzing/sequence_generator/adversary/precedence_mutations.rb +126 -0
- data/lib/hecks/fuzzing/sequence_generator/adversary.rb +23 -283
- data/lib/hecks/fuzzing/sequence_generator/argument_drawing.rb +78 -0
- data/lib/hecks/fuzzing/sequence_generator/catalog.rb +69 -53
- data/lib/hecks/fuzzing/sequence_generator/identity_shaping.rb +85 -0
- data/lib/hecks/fuzzing/sequence_generator/outcome_tracker.rb +20 -16
- data/lib/hecks/fuzzing/sequence_generator/picker.rb +12 -6
- data/lib/hecks/fuzzing/sequence_generator/prefixing.rb +45 -0
- data/lib/hecks/fuzzing/sequence_generator/query_binding.rb +19 -8
- data/lib/hecks/fuzzing/sequence_generator/step_builder.rb +43 -144
- data/lib/hecks/fuzzing/sequence_generator.rb +65 -63
- data/lib/hecks/fuzzing/shrinker.rb +33 -29
- data/lib/hecks/fuzzing/target_capabilities.rb +10 -4
- data/lib/hecks/fuzzing/value_generator.rb +27 -17
- data/lib/hecks/gate/stages.yml +10 -0
- data/lib/hecks/grammar/evolve/arguments.rb +90 -0
- data/lib/hecks/grammar/evolve/keywords.rb +81 -0
- data/lib/hecks/grammar/evolve/seeds.rb +172 -0
- data/lib/hecks/grammar/evolve.rb +22 -263
- data/lib/hecks/grammar/operators.rb +111 -0
- data/lib/hecks/grammar.rb +53 -126
- data/lib/hecks/hecks/adapters/bluebook_report.rb +91 -0
- data/lib/hecks/hecks/adapters/codebase/codemods.rb +1 -1
- data/lib/hecks/hecks/adapters/codebase/corpus_tasks.rb +23 -9
- data/lib/hecks/hecks/adapters/codebase/language/edits.rb +75 -0
- data/lib/hecks/hecks/adapters/codebase/language.rb +30 -72
- data/lib/hecks/hecks/adapters/codebase/promotion/candidates.rb +54 -0
- data/lib/hecks/hecks/adapters/codebase/promotion/gate.rb +50 -0
- data/lib/hecks/hecks/adapters/codebase/promotion/move.rb +70 -0
- data/lib/hecks/hecks/adapters/codebase/promotion/standing.rb +88 -0
- data/lib/hecks/hecks/adapters/codebase/promotion/watch.rb +83 -0
- data/lib/hecks/hecks/adapters/codebase/promotion.rb +115 -0
- data/lib/hecks/hecks/adapters/codebase/publishing.rb +31 -12
- data/lib/hecks/hecks/adapters/codebase/regeneration.rb +43 -6
- data/lib/hecks/hecks/adapters/codebase/release_facts.rb +16 -5
- data/lib/hecks/hecks/adapters/codebase/source_tree.rb +9 -1
- data/lib/hecks/hecks/adapters/codebase/sqlite_fixture.rb +1 -1
- data/lib/hecks/hecks/adapters/codebase/style.rb +1 -1
- data/lib/hecks/hecks/adapters/codebase/test_runner.rb +11 -5
- data/lib/hecks/hecks/adapters/codebase/test_suite.rb +27 -8
- data/lib/hecks/hecks/adapters/console_capture.rb +21 -17
- data/lib/hecks/hecks/adapters/cost_explorer.rb +11 -6
- data/lib/hecks/hecks/adapters/deploy_plans.rb +49 -0
- data/lib/hecks/hecks/adapters/deploy_toolchain/answers.rb +141 -0
- data/lib/hecks/hecks/adapters/deploy_toolchain/scripts.rb +95 -0
- data/lib/hecks/hecks/adapters/deploy_toolchain/statuses.rb +74 -0
- data/lib/hecks/hecks/adapters/deploy_toolchain.rb +122 -59
- data/lib/hecks/hecks/adapters/finding_github.rb +2 -2
- data/lib/hecks/hecks/adapters/first_admin.rb +22 -8
- data/lib/hecks/hecks/adapters/git.rb +18 -5
- data/lib/hecks/hecks/adapters/git_refs.rb +144 -0
- data/lib/hecks/hecks/adapters/github_rulesets.rb +126 -0
- data/lib/hecks/hecks/adapters/host_http.rb +16 -6
- data/lib/hecks/hecks/adapters/in_process_boot.rb +9 -5
- data/lib/hecks/hecks/adapters/in_process_operations/tailing.rb +61 -0
- data/lib/hecks/hecks/adapters/in_process_operations.rb +39 -37
- data/lib/hecks/hecks/adapters/journal_store/changes.rb +21 -15
- data/lib/hecks/hecks/adapters/journal_store/edge_audit.rb +29 -12
- data/lib/hecks/hecks/adapters/journal_store/readings/attestation.rb +52 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/scaffolding.rb +52 -0
- data/lib/hecks/hecks/adapters/journal_store/readings.rb +5 -62
- data/lib/hecks/hecks/adapters/local_files.rb +27 -10
- data/lib/hecks/hecks/adapters/pg_admin/ownership.rb +115 -0
- data/lib/hecks/hecks/adapters/pg_admin.rb +14 -87
- data/lib/hecks/hecks/adapters/process_pool.rb +54 -22
- data/lib/hecks/hecks/adapters/rust_toolchain.rb +12 -4
- data/lib/hecks/hecks/adapters/site_toolchain.rb +19 -10
- data/lib/hecks/hecks/adapters/terminal.rb +13 -9
- data/lib/hecks/hecks/codebase.bluebook +322 -5
- data/lib/hecks/hecks/custodian.bluebook +12 -2
- data/lib/hecks/hecks/hecks.hecksagon +73 -0
- data/lib/hecks/hecks/hecks.world +15 -3
- data/lib/hecks/kernel_capabilities/templates.rb +92 -0
- data/lib/hecks/kernel_capabilities.rb +18 -85
- data/lib/hecks/language/bluebook/vocabulary.bluebook +43 -1
- data/lib/hecks/literal/item_splitter.rb +50 -0
- data/lib/hecks/literal.rb +29 -38
- data/lib/hecks/mcp_stdio_guard.rb +8 -8
- data/lib/hecks/naming.rb +9 -3
- data/lib/hecks/persistence_legacy_fixture/postgres_stores.rb +81 -0
- data/lib/hecks/persistence_legacy_fixture/regenerate.rb +26 -66
- data/lib/hecks/persistence_legacy_fixture.rb +13 -10
- data/lib/hecks/ports/access_control.rb +13 -10
- data/lib/hecks/ports/agent/answers.rb +2 -2
- data/lib/hecks/ports/agent.rb +13 -10
- data/lib/hecks/ports/authentication.rb +13 -10
- data/lib/hecks/ports/authorization.rb +13 -10
- data/lib/hecks/ports/clock.rb +13 -10
- data/lib/hecks/ports/extraction.rb +13 -12
- data/lib/hecks/ports/identity_assignment.rb +13 -10
- data/lib/hecks/ports/identity_generation.rb +13 -10
- data/lib/hecks/ports/identity_resolution.rb +13 -10
- data/lib/hecks/ports/key_vault.rb +13 -10
- data/lib/hecks/ports/persistence/append_only.rb +5 -5
- data/lib/hecks/ports/persistence/binding_policy.rb +33 -9
- data/lib/hecks/ports/persistence/codec_boundary.rb +22 -11
- data/lib/hecks/ports/persistence/constants.rb +10 -0
- data/lib/hecks/ports/persistence/plugins/era/era_check.rb +18 -16
- data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +27 -18
- data/lib/hecks/ports/persistence/plugins/era/era_guard.rb +52 -23
- data/lib/hecks/ports/persistence/plugins/era/era_tamper.rb +14 -8
- data/lib/hecks/ports/persistence/plugins/era/expected_era.rb +17 -6
- data/lib/hecks/ports/persistence/plugins/era/lineage/coverage.rb +58 -0
- data/lib/hecks/ports/persistence/plugins/era/lineage/rewrite.rb +130 -0
- data/lib/hecks/ports/persistence/plugins/era/lineage/rules.rb +25 -0
- data/lib/hecks/ports/persistence/plugins/era/lineage.rb +20 -180
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/boot.rb +41 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/class_methods.rb +105 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/dialect.rb +137 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/events.rb +25 -28
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/head_writes.rb +62 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/journal.rb +128 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/base_sql.rb +74 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/chain_sql.rb +169 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/domain_rename.rb +91 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_integrity.rb +99 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +0 -73
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/field_cache.rb +55 -39
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/head_compiler.rb +51 -222
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/merge_writes.rb +120 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/mint_transaction.rb +85 -60
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/provisioning.rb +97 -181
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/resumable_backfill.rb +19 -19
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/sql_templates.rb +88 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/tail_merge.rb +77 -118
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/transform_installer.rb +3 -117
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/transform_sql.rb +116 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage.rb +3 -1
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/context.rb +38 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/coverage_check.rb +43 -25
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/era_resolver.rb +62 -38
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/merge_coordinator.rb +21 -16
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +66 -86
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/refusals.rb +75 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager.rb +27 -9
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/query_phases.rb +63 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/sagas.rb +78 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +28 -482
- data/lib/hecks/ports/persistence/plugins/era/translation/approval_file.rb +40 -12
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_one.rb +22 -15
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb +39 -19
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb +16 -16
- data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +48 -25
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +60 -99
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/path_diff.rb +57 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/renderer.rb +21 -11
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/writer.rb +13 -4
- data/lib/hecks/ports/persistence/postgres_dump/connection.rb +4 -2
- data/lib/hecks/ports/persistence/postgres_dump.rb +13 -7
- data/lib/hecks/ports/persistence/repository_factory.rb +35 -11
- data/lib/hecks/ports/persistence/state_codec.rb +10 -0
- data/lib/hecks/ports/persistence.rb +1 -10
- data/lib/hecks/ports/projection.rb +34 -21
- data/lib/hecks/ports/query/in_memory.rb +16 -8
- data/lib/hecks/projection_files/expression_tables.rb +64 -0
- data/lib/hecks/projection_files/texts.rb +67 -0
- data/lib/hecks/projection_files.rb +19 -103
- data/lib/hecks/projections/bootstrap_table.rb +43 -29
- data/lib/hecks/projections/deploy/bastion_lines.rb +32 -0
- data/lib/hecks/projections/deploy/box/access.rb +73 -0
- data/lib/hecks/projections/deploy/box/caddy.rb +87 -0
- data/lib/hecks/projections/deploy/box/compose.rb +70 -0
- data/lib/hecks/projections/deploy/box/hosting.rb +16 -108
- data/lib/hecks/projections/deploy/box/hosting_parts.rb +97 -0
- data/lib/hecks/projections/deploy/box/hosting_settings.rb +1 -1
- data/lib/hecks/projections/deploy/box/roll_recipe.rb +62 -0
- data/lib/hecks/projections/deploy/box/roll_scripts.rb +135 -0
- data/lib/hecks/projections/deploy/box/settings/checks.rb +38 -0
- data/lib/hecks/projections/deploy/box/settings/containers.rb +123 -0
- data/lib/hecks/projections/deploy/box/settings/origin.rb +56 -0
- data/lib/hecks/projections/deploy/box/settings/patterns.rb +43 -0
- data/lib/hecks/projections/deploy/box/settings/types.rb +72 -0
- data/lib/hecks/projections/deploy/box/settings.rb +58 -263
- data/lib/hecks/projections/deploy/box/stack_yaml.rb +107 -0
- data/lib/hecks/projections/deploy/box/templates/MIGRATION.md.tmpl +39 -0
- data/lib/hecks/projections/deploy/box/templates/Makefile.tmpl +24 -0
- data/lib/hecks/projections/deploy/box/templates/deploy-box.sh.tmpl +51 -4
- data/lib/hecks/projections/deploy/box/templates/deploy-service.services-roll.part +4 -3
- data/lib/hecks/projections/deploy/box/templates/deploy-service.sh.tmpl +16 -4
- data/lib/hecks/projections/deploy/box/templates/deploy-service.taskdef-roll.part +8 -7
- data/lib/hecks/projections/deploy/box/templates/deploy-service.taskdef.part +1 -1
- data/lib/hecks/projections/deploy/box/templates/deploy-usage-services.tmpl +4 -0
- data/lib/hecks/projections/deploy/box/templates/deploy-usage-taskdef.tmpl +5 -0
- data/lib/hecks/projections/deploy/box/templates/ecr-repository.yaml.tmpl +9 -0
- data/lib/hecks/projections/deploy/box/templates/hosting.mk.tmpl +6 -3
- data/lib/hecks/projections/deploy/box/templates/mode-summary-services.tmpl +2 -0
- data/lib/hecks/projections/deploy/box/templates/mode-summary-taskdef.tmpl +4 -0
- data/lib/hecks/projections/deploy/box/templates/restore-to-rds.sh.tmpl +8 -3
- data/lib/hecks/projections/deploy/box/templates/services-block.tmpl +9 -0
- data/lib/hecks/projections/deploy/box/templates/tunnel-egress.yaml.tmpl +11 -0
- data/lib/hecks/projections/deploy/box/templates/verify-copy.sh.tmpl +2 -2
- data/lib/hecks/projections/deploy/box/templates/writable-secrets.yaml.tmpl +7 -0
- data/lib/hecks/projections/deploy/box.rb +37 -503
- data/lib/hecks/projections/deploy/fargate/assembly.rb +13 -142
- data/lib/hecks/projections/deploy/fargate/cdn/behaviors.rb +76 -0
- data/lib/hecks/projections/deploy/fargate/cdn/lines.rb +112 -0
- data/lib/hecks/projections/deploy/fargate/cdn/options.rb +85 -0
- data/lib/hecks/projections/deploy/fargate/cdn.rb +23 -215
- data/lib/hecks/projections/deploy/fargate/check.rb +16 -6
- data/lib/hecks/projections/deploy/fargate/containers/definition_lines.rb +61 -0
- data/lib/hecks/projections/deploy/fargate/containers/reading.rb +86 -0
- data/lib/hecks/projections/deploy/fargate/containers/rendering.rb +132 -0
- data/lib/hecks/projections/deploy/fargate/containers/routing.rb +93 -0
- data/lib/hecks/projections/deploy/fargate/containers.rb +10 -286
- data/lib/hecks/projections/deploy/fargate/extras/reading.rb +90 -0
- data/lib/hecks/projections/deploy/fargate/extras/rendering.rb +81 -0
- data/lib/hecks/projections/deploy/fargate/extras.rb +9 -158
- data/lib/hecks/projections/deploy/fargate/monitoring/alarms.rb +115 -0
- data/lib/hecks/projections/deploy/fargate/monitoring/reading.rb +84 -0
- data/lib/hecks/projections/deploy/fargate/monitoring/topic.rb +59 -0
- data/lib/hecks/projections/deploy/fargate/monitoring/warmer.rb +90 -0
- data/lib/hecks/projections/deploy/fargate/monitoring/warmer_roles.rb +76 -0
- data/lib/hecks/projections/deploy/fargate/monitoring.rb +14 -348
- data/lib/hecks/projections/deploy/fargate/sections.rb +115 -0
- data/lib/hecks/projections/deploy/fargate/settings/ids.rb +55 -0
- data/lib/hecks/projections/deploy/fargate/settings/tuning.rb +77 -0
- data/lib/hecks/projections/deploy/fargate/settings.rb +17 -104
- data/lib/hecks/projections/deploy/fargate/stack/blocks.rb +91 -0
- data/lib/hecks/projections/deploy/fargate/stack/readers.rb +87 -0
- data/lib/hecks/projections/deploy/fargate/stack/recipes.rb +106 -0
- data/lib/hecks/projections/deploy/fargate/stack.rb +146 -0
- data/lib/hecks/projections/deploy/fargate/task_sections.rb +56 -0
- data/lib/hecks/projections/deploy/fargate/yaml.rb +1 -1
- data/lib/hecks/projections/deploy/fargate.rb +51 -756
- data/lib/hecks/projections/deploy/lambda/pii.rb +49 -0
- data/lib/hecks/projections/deploy/lambda/stack/blocks.rb +118 -0
- data/lib/hecks/projections/deploy/lambda/stack/checks.rb +64 -0
- data/lib/hecks/projections/deploy/lambda/stack/deploy_chain.rb +119 -0
- data/lib/hecks/projections/deploy/lambda/stack/readers.rb +62 -0
- data/lib/hecks/projections/deploy/lambda/stack/reading.rb +170 -0
- data/lib/hecks/projections/deploy/lambda/stack/reading_web.rb +53 -0
- data/lib/hecks/projections/deploy/lambda/stack/recipes.rb +112 -0
- data/lib/hecks/projections/deploy/lambda/stack/web.rb +57 -0
- data/lib/hecks/projections/deploy/lambda/stack.rb +54 -0
- data/lib/hecks/projections/deploy/lambda.rb +77 -1885
- data/lib/hecks/projections/deploy/preview/access_yaml.rb +8 -74
- data/lib/hecks/projections/deploy/preview/containers.rb +18 -7
- data/lib/hecks/projections/deploy/preview/routing_yaml.rb +15 -87
- data/lib/hecks/projections/deploy/preview/settings.rb +7 -4
- data/lib/hecks/projections/deploy/preview/task_yaml.rb +42 -106
- data/lib/hecks/projections/deploy/preview/template.rb +11 -106
- data/lib/hecks/projections/deploy/preview/yaml_text.rb +1 -1
- data/lib/hecks/projections/deploy/scripts/hosting.mk.tmpl +1 -1
- data/lib/hecks/projections/deploy/scripts/settings.rb +14 -6
- data/lib/hecks/projections/deploy/scripts.rb +11 -9
- data/lib/hecks/projections/deploy/shared/rows.rb +48 -0
- data/lib/hecks/projections/deploy/shared.rb +89 -449
- data/lib/hecks/projections/deploy/smoke.rb +15 -10
- data/lib/hecks/projections/deploy/template_diff/comparer.rb +21 -147
- data/lib/hecks/projections/deploy/template_diff/normalizer.rb +60 -0
- data/lib/hecks/projections/deploy/template_diff/value_diff.rb +136 -0
- data/lib/hecks/projections/deploy/template_diff.rb +8 -3
- data/lib/hecks/projections/deploy/templates/fargate/Dockerfile.tmpl +28 -0
- data/lib/hecks/projections/deploy/templates/fargate/Makefile.tmpl +63 -0
- data/lib/hecks/projections/deploy/templates/fargate/always_params.tmpl +4 -0
- data/lib/hecks/projections/deploy/templates/fargate/deploy_plain.tmpl +1 -0
- data/lib/hecks/projections/deploy/templates/fargate/deploy_shared.tmpl +11 -0
- data/lib/hecks/projections/deploy/templates/fargate/mint_era_own.tmpl +44 -0
- data/lib/hecks/projections/deploy/templates/fargate/mint_era_shared.tmpl +8 -0
- data/lib/hecks/projections/deploy/templates/fargate/missing_owner.tmpl +9 -0
- data/lib/hecks/projections/deploy/templates/fargate/oauth_params.tmpl +7 -0
- data/lib/hecks/projections/deploy/templates/fargate/oauth_task_env.tmpl +4 -0
- data/lib/hecks/projections/deploy/templates/fargate/oauth_task_policy.tmpl +7 -0
- data/lib/hecks/projections/deploy/templates/fargate/owning_params.tmpl +33 -0
- data/lib/hecks/projections/deploy/templates/fargate/template.yaml.tmpl +281 -0
- data/lib/hecks/projections/deploy/templates/lambda/Makefile.tmpl +218 -0
- data/lib/hecks/projections/deploy/templates/lambda/aurora_depends.tmpl +18 -0
- data/lib/hecks/projections/deploy/templates/lambda/build_dispatch_none.tmpl +10 -0
- data/lib/hecks/projections/deploy/templates/lambda/build_pg.tmpl +15 -0
- data/lib/hecks/projections/deploy/templates/lambda/build_plain.tmpl +2 -0
- data/lib/hecks/projections/deploy/templates/lambda/build_web.tmpl +11 -0
- data/lib/hecks/projections/deploy/templates/lambda/env_blind_guard.tmpl +4 -0
- data/lib/hecks/projections/deploy/templates/lambda/mint_era_own.tmpl +122 -0
- data/lib/hecks/projections/deploy/templates/lambda/mint_era_shared.tmpl +47 -0
- data/lib/hecks/projections/deploy/templates/lambda/missing_owner.tmpl +9 -0
- data/lib/hecks/projections/deploy/templates/lambda/nat_comment_oauth.tmpl +14 -0
- data/lib/hecks/projections/deploy/templates/lambda/nat_comment_plain.tmpl +3 -0
- data/lib/hecks/projections/deploy/templates/lambda/oauth_note.tmpl +8 -0
- data/lib/hecks/projections/deploy/templates/lambda/params_oauth.tmpl +13 -0
- data/lib/hecks/projections/deploy/templates/lambda/params_shared.tmpl +33 -0
- data/lib/hecks/projections/deploy/templates/lambda/pg_native.tmpl +71 -0
- data/lib/hecks/projections/deploy/templates/lambda/pii_oac.tmpl +8 -0
- data/lib/hecks/projections/deploy/templates/lambda/pii_permission.tmpl +8 -0
- data/lib/hecks/projections/deploy/templates/lambda/pii_resources.tmpl +116 -0
- data/lib/hecks/projections/deploy/templates/lambda/predeploy_bridge.tmpl +30 -0
- data/lib/hecks/projections/deploy/templates/lambda/predeploy_bridge_oauth.tmpl +12 -0
- data/lib/hecks/projections/deploy/templates/lambda/predeploy_bridge_plain.tmpl +7 -0
- data/lib/hecks/projections/deploy/templates/lambda/rename_schema_own.tmpl +93 -0
- data/lib/hecks/projections/deploy/templates/lambda/rename_schema_shared.tmpl +7 -0
- data/lib/hecks/projections/deploy/templates/lambda/rust_oauth_env.tmpl +17 -0
- data/lib/hecks/projections/deploy/templates/lambda/rust_oauth_policy.tmpl +16 -0
- data/lib/hecks/projections/deploy/templates/lambda/rust_session_secret.tmpl +13 -0
- data/lib/hecks/projections/deploy/templates/lambda/samconfig.toml.tmpl +12 -0
- data/lib/hecks/projections/deploy/templates/lambda/shared_note.tmpl +6 -0
- data/lib/hecks/projections/deploy/templates/lambda/sync_oauth.tmpl +23 -0
- data/lib/hecks/projections/deploy/templates/lambda/template.yaml.tmpl +187 -0
- data/lib/hecks/projections/deploy/templates/lambda/translation_own.tmpl +46 -0
- data/lib/hecks/projections/deploy/templates/lambda/translation_shared.tmpl +2 -0
- data/lib/hecks/projections/deploy/templates/lambda/web_function.tmpl +207 -0
- data/lib/hecks/projections/deploy/templates/lambda/web_google_oauth_env.tmpl +12 -0
- data/lib/hecks/projections/deploy/templates/lambda/web_no_oauth_env.tmpl +7 -0
- data/lib/hecks/projections/deploy/templates/lambda/web_oauth_policy.tmpl +4 -0
- data/lib/hecks/projections/deploy/templates/lambda/webhook_secret_resource.tmpl +20 -0
- data/lib/hecks/projections/deploy/templates/preview/alb.tmpl +8 -0
- data/lib/hecks/projections/deploy/templates/preview/alb_security_group.tmpl +11 -0
- data/lib/hecks/projections/deploy/templates/preview/assume_role.tmpl +6 -0
- data/lib/hecks/projections/deploy/templates/preview/base_parameters.tmpl +24 -0
- data/lib/hecks/projections/deploy/templates/preview/cluster.tmpl +4 -0
- data/lib/hecks/projections/deploy/templates/preview/container_secret.tmpl +9 -0
- data/lib/hecks/projections/deploy/templates/preview/db_init_script.sh.tmpl +23 -0
- data/lib/hecks/projections/deploy/templates/preview/db_init_secrets.tmpl +5 -0
- data/lib/hecks/projections/deploy/templates/preview/db_init_task.tmpl +39 -0
- data/lib/hecks/projections/deploy/templates/preview/desired_count.tmpl +5 -0
- data/lib/hecks/projections/deploy/templates/preview/distribution.tmpl +24 -0
- data/lib/hecks/projections/deploy/templates/preview/execution_role.tmpl +16 -0
- data/lib/hecks/projections/deploy/templates/preview/header.tmpl +16 -0
- data/lib/hecks/projections/deploy/templates/preview/ingress.tmpl +8 -0
- data/lib/hecks/projections/deploy/templates/preview/listener.tmpl +9 -0
- data/lib/hecks/projections/deploy/templates/preview/listener_rule.tmpl +11 -0
- data/lib/hecks/projections/deploy/templates/preview/log_group.tmpl +5 -0
- data/lib/hecks/projections/deploy/templates/preview/log_options.tmpl +5 -0
- data/lib/hecks/projections/deploy/templates/preview/outputs.tmpl +14 -0
- data/lib/hecks/projections/deploy/templates/preview/service.tmpl +17 -0
- data/lib/hecks/projections/deploy/templates/preview/session_secret.tmpl +11 -0
- data/lib/hecks/projections/deploy/templates/preview/target_group.tmpl +9 -0
- data/lib/hecks/projections/deploy/templates/preview/task_definition.tmpl +15 -0
- data/lib/hecks/projections/deploy/templates/preview/task_role.tmpl +22 -0
- data/lib/hecks/projections/deploy/templates/shared/aurora_db.tmpl +52 -0
- data/lib/hecks/projections/deploy/templates/shared/bastion.tmpl +74 -0
- data/lib/hecks/projections/deploy/templates/shared/bastion_own_public.tmpl +41 -0
- data/lib/hecks/projections/deploy/templates/shared/bastion_reuse_public.tmpl +10 -0
- data/lib/hecks/projections/deploy/templates/shared/nat_gateway.tmpl +102 -0
- data/lib/hecks/projections/deploy/templates/shared/oauth_egress.tmpl +17 -0
- data/lib/hecks/projections/deploy/templates/shared/plain_db.tmpl +16 -0
- data/lib/hecks/projections/deploy/templates/shared/vpc_and_database.tmpl +67 -0
- data/lib/hecks/projections/deploy/text_template.rb +35 -0
- data/lib/hecks/projections/diagrams/dispatch.rb +114 -0
- data/lib/hecks/projections/diagrams/statecharts.rb +59 -0
- data/lib/hecks/projections/diagrams/structure.rb +114 -0
- data/lib/hecks/projections/diagrams.rb +33 -256
- data/lib/hecks/projections/glossary/entries.rb +140 -0
- data/lib/hecks/projections/glossary/html/page.rb +96 -0
- data/lib/hecks/projections/glossary/html/parser.rb +66 -0
- data/lib/hecks/projections/glossary/html/sections.rb +78 -0
- data/lib/hecks/projections/glossary/html.rb +7 -179
- data/lib/hecks/projections/glossary/index.rb +45 -0
- data/lib/hecks/projections/glossary/markdown.rb +22 -11
- data/lib/hecks/projections/glossary/mermaid.rb +44 -31
- data/lib/hecks/projections/glossary/sensitivity.rb +7 -4
- data/lib/hecks/projections/glossary/sentences/value_objects.rb +77 -0
- data/lib/hecks/projections/glossary/sentences.rb +42 -81
- data/lib/hecks/projections/glossary/slugs.rb +33 -0
- data/lib/hecks/projections/glossary.rb +22 -190
- data/lib/hecks/projections/model.rb +20 -14
- data/lib/hecks/projections/rust_vocabulary/arguments/support.rb +33 -0
- data/lib/hecks/projections/rust_vocabulary/arguments.rb +171 -0
- data/lib/hecks/projections/rust_vocabulary/enum_body.rb +114 -0
- data/lib/hecks/projections/rust_vocabulary/tests.rb +144 -0
- data/lib/hecks/projections/rust_vocabulary.rb +24 -293
- data/lib/hecks/projections/site/admin.rb +146 -0
- data/lib/hecks/projections/site/admin_cms/templates/membership.rb +115 -0
- data/lib/hecks/projections/site/admin_cms/templates/session_strategy.rb +90 -0
- data/lib/hecks/projections/site/admin_cms/templates/sso.rb +101 -0
- data/lib/hecks/projections/site/admin_cms/templates/sso_tail.rb +54 -0
- data/lib/hecks/projections/site/admin_cms/templates/users.rb +83 -0
- data/lib/hecks/projections/site/admin_cms/templates.rb +33 -0
- data/lib/hecks/projections/site/admin_cms.rb +78 -0
- data/lib/hecks/projections/site/edge/behaviours.rb +10 -6
- data/lib/hecks/projections/site/edge/checks.rb +30 -80
- data/lib/hecks/projections/site/edge/findings.rb +28 -0
- data/lib/hecks/projections/site/edge/route_checks.rb +110 -0
- data/lib/hecks/projections/site/edge/row_reader.rb +52 -0
- data/lib/hecks/projections/site/edge/rules.rb +28 -26
- data/lib/hecks/projections/site/edge.rb +20 -31
- data/lib/hecks/projections/site/live_edge.rb +9 -7
- data/lib/hecks/projections/site/payload/fields/definitions.rb +90 -0
- data/lib/hecks/projections/site/payload/fields/readers.rb +69 -0
- data/lib/hecks/projections/site/payload/fields.rb +137 -0
- data/lib/hecks/projections/site/payload/lifecycle/text.rb +84 -0
- data/lib/hecks/projections/site/payload/lifecycle/text_tail.rb +106 -0
- data/lib/hecks/projections/site/payload/lifecycle.rb +33 -0
- data/lib/hecks/projections/site/payload/model.rb +128 -0
- data/lib/hecks/projections/site/payload/specs/wire.rb +69 -0
- data/lib/hecks/projections/site/payload/specs.rb +135 -0
- data/lib/hecks/projections/site/payload_driver.rb +95 -0
- data/lib/hecks/projections/site/root_rows.rb +67 -0
- data/lib/hecks/projections/site/routes_ts/helpers.rb +79 -0
- data/lib/hecks/projections/site/routes_ts/listings.rb +75 -0
- data/lib/hecks/projections/site/routes_ts/navigation.rb +79 -0
- data/lib/hecks/projections/site/routes_ts.rb +27 -175
- data/lib/hecks/projections/site/site_admin/access.rb +104 -0
- data/lib/hecks/projections/site/site_admin/session.rb +127 -0
- data/lib/hecks/projections/site/site_admin.rb +85 -0
- data/lib/hecks/projections/site/site_cdn.rb +12 -7
- data/lib/hecks/projections/site/site_host/dockerfile.rb +75 -0
- data/lib/hecks/projections/site/site_host/templates.rb +109 -0
- data/lib/hecks/projections/site/site_host.rb +58 -0
- data/lib/hecks/projections/site/site_root/workflow.rb +65 -0
- data/lib/hecks/projections/site/site_root.rb +128 -0
- data/lib/hecks/projections/site/table/checks.rb +28 -57
- data/lib/hecks/projections/site/table/link_builder.rb +14 -5
- data/lib/hecks/projections/site/table/navigation_checks.rb +75 -0
- data/lib/hecks/projections/site/table/row_builder.rb +31 -53
- data/lib/hecks/projections/site/table/row_defaults.rb +65 -0
- data/lib/hecks/projections/site/table.rb +9 -5
- data/lib/hecks/projections/vocabulary.rb +34 -31
- data/lib/hecks/projector/cli_audience.rb +42 -0
- data/lib/hecks/projector/cli_projector/claims.rb +149 -0
- data/lib/hecks/projector/cli_projector/command_help.rb +65 -0
- data/lib/hecks/projector/cli_projector/command_specs.rb +133 -0
- data/lib/hecks/projector/cli_projector/listing.rb +100 -0
- data/lib/hecks/projector/cli_projector/option_specs.rb +116 -0
- data/lib/hecks/projector/cli_projector/query_specs.rb +67 -0
- data/lib/hecks/projector/cli_projector/usage.rb +101 -0
- data/lib/hecks/projector/cli_projector.rb +15 -532
- data/lib/hecks/projector/docs_projector/attributes.rb +78 -0
- data/lib/hecks/projector/docs_projector/behaviour.rb +127 -0
- data/lib/hecks/projector/docs_projector/closing.rb +40 -0
- data/lib/hecks/projector/docs_projector.rb +58 -192
- data/lib/hecks/projector/exporter/bindings.rb +174 -0
- data/lib/hecks/projector/exporter/translations.rb +127 -0
- data/lib/hecks/projector/exporter.rb +8 -279
- data/lib/hecks/projector/narrate_projector/commands.rb +108 -0
- data/lib/hecks/projector/narrate_projector/reactions.rb +33 -0
- data/lib/hecks/projector/narrate_projector.rb +60 -160
- data/lib/hecks/projector.rb +22 -13
- data/lib/hecks/quality_control/adapters/agent_profile.rb +25 -16
- data/lib/hecks/quality_control/adapters/github_checks.rb +42 -6
- data/lib/hecks/quality_control/adapters/github_ci_webhook.rb +1 -1
- data/lib/hecks/quality_control/adapters/github_issues.rb +22 -10
- data/lib/hecks/quality_control/cli/qa_discover_external_domains/parsing.rb +54 -0
- data/lib/hecks/quality_control/cli/qa_discover_external_domains/reporting.rb +44 -0
- data/lib/hecks/quality_control/cli/qa_discover_external_domains/scanning.rb +119 -0
- data/lib/hecks/quality_control/cli/qa_discover_external_domains.rb +28 -155
- data/lib/hecks/quality_control/cli/qa_domain_novelty/verdict.rb +76 -0
- data/lib/hecks/quality_control/cli/qa_domain_novelty.rb +33 -66
- data/lib/hecks/quality_control/cli/qa_generated_domains/arguments.rb +62 -0
- data/lib/hecks/quality_control/cli/qa_generated_domains/blueprints.rb +45 -0
- data/lib/hecks/quality_control/cli/qa_generated_domains/evaluation.rb +107 -0
- data/lib/hecks/quality_control/cli/qa_generated_domains/promotion.rb +107 -0
- data/lib/hecks/quality_control/cli/qa_generated_domains/reporting.rb +97 -0
- data/lib/hecks/quality_control/cli/qa_generated_domains/shrinking.rb +70 -0
- data/lib/hecks/quality_control/cli/qa_generated_domains.rb +43 -327
- data/lib/hecks/quality_control/cli/qa_log_bug/arguments.rb +55 -0
- data/lib/hecks/quality_control/cli/qa_log_bug/proof.rb +65 -0
- data/lib/hecks/quality_control/cli/qa_log_bug.rb +18 -81
- data/lib/hecks/quality_control/cli/qa_mine_combinations/arguments.rb +54 -0
- data/lib/hecks/quality_control/cli/qa_mine_combinations/booting.rb +96 -0
- data/lib/hecks/quality_control/cli/qa_mine_combinations.rb +45 -109
- data/lib/hecks/quality_control/cli/qa_open_pr/arguments.rb +55 -0
- data/lib/hecks/quality_control/cli/qa_open_pr/recording.rb +79 -0
- data/lib/hecks/quality_control/cli/qa_open_pr/rules.rb +122 -0
- data/lib/hecks/quality_control/cli/qa_open_pr.rb +41 -200
- data/lib/hecks/quality_control/cli/qa_postgres_migrate/copying.rb +45 -0
- data/lib/hecks/quality_control/cli/qa_postgres_migrate/reporting.rb +33 -0
- data/lib/hecks/quality_control/cli/qa_postgres_migrate.rb +37 -63
- data/lib/hecks/quality_control/cli/qa_postgres_role/ownership.rb +57 -0
- data/lib/hecks/quality_control/cli/qa_postgres_role.rb +66 -71
- data/lib/hecks/quality_control/cli/qa_pr_check/checking.rb +118 -0
- data/lib/hecks/quality_control/cli/qa_pr_check/reporting.rb +54 -0
- data/lib/hecks/quality_control/cli/qa_pr_check.rb +28 -145
- data/lib/hecks/quality_control/cli/qa_seed_angles/seed.rb +80 -0
- data/lib/hecks/quality_control/cli/qa_seed_angles.rb +13 -86
- data/lib/hecks/quality_control/cli/qa_sweep/all_mode/children.rb +80 -0
- data/lib/hecks/quality_control/cli/qa_sweep/all_mode/report.rb +125 -0
- data/lib/hecks/quality_control/cli/qa_sweep/all_mode.rb +63 -193
- data/lib/hecks/quality_control/cli/qa_sweep/checks/boundary.rb +92 -0
- data/lib/hecks/quality_control/cli/qa_sweep/checks/engines.rb +92 -0
- data/lib/hecks/quality_control/cli/qa_sweep/checks/seeds.rb +86 -0
- data/lib/hecks/quality_control/cli/qa_sweep/checks/shrinking.rb +69 -0
- data/lib/hecks/quality_control/cli/qa_sweep/checks.rb +10 -248
- data/lib/hecks/quality_control/cli/qa_sweep/conclusion.rb +60 -0
- data/lib/hecks/quality_control/cli/qa_sweep/depth.rb +61 -0
- data/lib/hecks/quality_control/cli/qa_sweep/dials.rb +26 -13
- data/lib/hecks/quality_control/cli/qa_sweep/finding_report/shrunk.rb +42 -0
- data/lib/hecks/quality_control/cli/qa_sweep/finding_report.rb +40 -41
- data/lib/hecks/quality_control/cli/qa_sweep/parsing/validation.rb +70 -0
- data/lib/hecks/quality_control/cli/qa_sweep/parsing.rb +35 -65
- data/lib/hecks/quality_control/cli/qa_sweep/release_mode.rb +41 -22
- data/lib/hecks/quality_control/cli/qa_sweep/scratch.rb +67 -0
- data/lib/hecks/quality_control/cli/qa_sweep/seat.rb +94 -0
- data/lib/hecks/quality_control/cli/qa_sweep/seed_loop.rb +149 -0
- data/lib/hecks/quality_control/cli/qa_sweep/target_setup.rb +115 -0
- data/lib/hecks/quality_control/cli/qa_sweep.rb +22 -445
- data/lib/hecks/quality_control/cli/qa_tick/output.rb +107 -0
- data/lib/hecks/quality_control/cli/qa_tick/preflight.rb +95 -0
- data/lib/hecks/quality_control/cli/qa_tick.rb +42 -175
- data/lib/hecks/query_ir/formatting.rb +86 -0
- data/lib/hecks/query_ir/rules.rb +132 -0
- data/lib/hecks/query_ir/touchpoints.rb +104 -0
- data/lib/hecks/query_ir.rb +33 -281
- data/lib/hecks/query_ir_mcp/tools.rb +68 -0
- data/lib/hecks/query_ir_mcp.rb +27 -71
- data/lib/hecks/query_specification/common/comparison.rb +25 -5
- data/lib/hecks/query_specification/common/dsl.rb +1 -1
- data/lib/hecks/query_specification/common/null_policy.rb +9 -6
- data/lib/hecks/query_specification/common/options.rb +21 -14
- data/lib/hecks/query_specification/field_path.rb +5 -2
- data/lib/hecks/query_specification/hop_path.rb +15 -18
- data/lib/hecks/release/lane.rb +22 -0
- data/lib/hecks/release/runner/clean_tree.rb +2 -2
- data/lib/hecks/release/runner/commands.rb +1 -1
- data/lib/hecks/release/runner/options.rb +82 -0
- data/lib/hecks/release/runner/preflight.rb +12 -7
- data/lib/hecks/release/runner/publishing.rb +86 -0
- data/lib/hecks/release/runner/tagger.rb +8 -3
- data/lib/hecks/release/runner.rb +40 -156
- data/lib/hecks/rendering.rb +13 -9
- data/lib/hecks/router/door.rb +37 -0
- data/lib/hecks/router/namespace_installer.rb +45 -83
- data/lib/hecks/router/options_proxy.rb +44 -0
- data/lib/hecks/runtime/adapter_lookup.rb +45 -24
- data/lib/hecks/runtime/command_interpreter/argument_gate.rb +16 -8
- data/lib/hecks/runtime/command_interpreter/delegation.rb +116 -0
- data/lib/hecks/runtime/command_interpreter/enforcement.rb +38 -0
- data/lib/hecks/runtime/command_interpreter/hydration.rb +139 -0
- data/lib/hecks/runtime/command_interpreter/list_mutations.rb +98 -0
- data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +67 -114
- data/lib/hecks/runtime/command_interpreter/persisting.rb +96 -0
- data/lib/hecks/runtime/command_interpreter.rb +57 -352
- data/lib/hecks/runtime/command_rules/admissibility.rb +64 -147
- data/lib/hecks/runtime/command_rules/arithmetic.rb +13 -72
- data/lib/hecks/runtime/command_rules/authorization.rb +9 -9
- data/lib/hecks/runtime/command_rules/emission.rb +13 -14
- data/lib/hecks/runtime/command_rules/guard_state.rb +49 -0
- data/lib/hecks/runtime/command_rules/invariants.rb +84 -0
- data/lib/hecks/runtime/command_rules/operands.rb +88 -0
- data/lib/hecks/runtime/command_rules/references.rb +59 -57
- data/lib/hecks/runtime/command_rules/tenant_boundary.rb +69 -0
- data/lib/hecks/runtime/dependency_planning/analyzer.rb +90 -0
- data/lib/hecks/runtime/dependency_planning/expression_reads.rb +73 -0
- data/lib/hecks/runtime/dependency_planning/mutation_analysis.rb +89 -0
- data/lib/hecks/runtime/dependency_planning/rule_analysis.rb +82 -0
- data/lib/hecks/runtime/dependency_planning.rb +3 -250
- data/lib/hecks/runtime/dispatcher/queries.rb +62 -0
- data/lib/hecks/runtime/dispatcher/result.rb +55 -0
- data/lib/hecks/runtime/dispatcher/routing.rb +107 -0
- data/lib/hecks/runtime/dispatcher.rb +64 -209
- data/lib/hecks/runtime/entity_element/location.rb +124 -0
- data/lib/hecks/runtime/entity_element/mutations.rb +150 -0
- data/lib/hecks/runtime/entity_element.rb +5 -177
- data/lib/hecks/runtime/entity_interpreter/enforcement.rb +51 -0
- data/lib/hecks/runtime/entity_interpreter/locating.rb +62 -0
- data/lib/hecks/runtime/entity_interpreter/resolution.rb +42 -0
- data/lib/hecks/runtime/entity_interpreter/saving.rb +49 -0
- data/lib/hecks/runtime/entity_interpreter.rb +45 -164
- data/lib/hecks/runtime/identity.rb +15 -9
- data/lib/hecks/runtime/instance.rb +11 -7
- data/lib/hecks/runtime/interpreting.rb +16 -8
- data/lib/hecks/runtime/invocation.rb +3 -155
- data/lib/hecks/runtime/invocation_builder.rb +132 -0
- data/lib/hecks/runtime/invocation_facts.rb +87 -0
- data/lib/hecks/runtime/loader/boot_steps.rb +96 -0
- data/lib/hecks/runtime/loader/described.rb +27 -0
- data/lib/hecks/runtime/loader.rb +27 -114
- data/lib/hecks/runtime/outbox/consumer_runner.rb +40 -0
- data/lib/hecks/runtime/outbox/fanout.rb +82 -0
- data/lib/hecks/runtime/outbox/relay.rb +149 -0
- data/lib/hecks/runtime/outbox.rb +3 -214
- data/lib/hecks/runtime/policy_interpreter/arguments.rb +67 -0
- data/lib/hecks/runtime/policy_interpreter/fan_out.rb +96 -0
- data/lib/hecks/runtime/policy_interpreter.rb +22 -137
- data/lib/hecks/runtime/port_operation_interpreter.rb +18 -17
- data/lib/hecks/runtime/query_interpreter/arguments.rb +51 -0
- data/lib/hecks/runtime/query_interpreter/entity_rows.rb +82 -0
- data/lib/hecks/runtime/query_interpreter/outside_answer.rb +89 -0
- data/lib/hecks/runtime/query_interpreter.rb +43 -191
- data/lib/hecks/runtime/reaction_invocation/identities.rb +92 -0
- data/lib/hecks/runtime/reaction_invocation/target_resolution.rb +88 -0
- data/lib/hecks/runtime/reaction_invocation.rb +66 -183
- data/lib/hecks/runtime/reaction_outcome.rb +7 -3
- data/lib/hecks/runtime/read_model_interpreter/head_ordering.rb +49 -0
- data/lib/hecks/runtime/read_model_interpreter/reductions.rb +123 -0
- data/lib/hecks/runtime/read_model_interpreter/shaping.rb +100 -0
- data/lib/hecks/runtime/read_model_interpreter.rb +71 -214
- data/lib/hecks/runtime/reference_hop.rb +11 -11
- data/lib/hecks/runtime/refusal_wording.rb +11 -8
- data/lib/hecks/runtime/registry/chapter_verification.rb +84 -0
- data/lib/hecks/runtime/registry/declarations.rb +17 -0
- data/lib/hecks/runtime/registry/durability_warnings.rb +71 -0
- data/lib/hecks/runtime/registry/hecksagon_rules.rb +124 -0
- data/lib/hecks/runtime/registry/merging.rb +49 -0
- data/lib/hecks/runtime/registry/providers.rb +139 -0
- data/lib/hecks/runtime/registry/query_verification.rb +144 -0
- data/lib/hecks/runtime/registry/read_repository.rb +61 -0
- data/lib/hecks/runtime/registry/runtime_state.rb +27 -0
- data/lib/hecks/runtime/registry/saga_persistence.rb +12 -8
- data/lib/hecks/runtime/registry/verification.rb +45 -389
- data/lib/hecks/runtime/registry/world_defaults.rb +3 -3
- data/lib/hecks/runtime/registry.rb +58 -296
- data/lib/hecks/runtime/remote_dispatcher.rb +47 -31
- data/lib/hecks/runtime/saga_interpreter/compensation.rb +90 -0
- data/lib/hecks/runtime/saga_interpreter/correlation.rb +19 -10
- data/lib/hecks/runtime/saga_interpreter/delivery.rb +147 -0
- data/lib/hecks/runtime/saga_interpreter/lifecycle.rb +63 -0
- data/lib/hecks/runtime/saga_interpreter/transitions.rb +112 -0
- data/lib/hecks/runtime/saga_interpreter.rb +41 -320
- data/lib/hecks/runtime/tenant_check.rb +14 -9
- data/lib/hecks/runtime/value/admission.rb +28 -19
- data/lib/hecks/runtime/value/coercion.rb +55 -404
- data/lib/hecks/runtime/value/entity_list_coercion.rb +27 -29
- data/lib/hecks/runtime/value/field_checks.rb +57 -100
- data/lib/hecks/runtime/value/flags.rb +65 -0
- data/lib/hecks/runtime/value/identifiers.rb +64 -0
- data/lib/hecks/runtime/value/references.rb +195 -0
- data/lib/hecks/runtime/value/shape_checks.rb +61 -0
- data/lib/hecks/runtime/value/validation.rb +125 -0
- data/lib/hecks/runtime/value.rb +18 -6
- data/lib/hecks/rust_build/conformance/surface.rb +75 -0
- data/lib/hecks/rust_build/conformance.rb +27 -59
- data/lib/hecks/rust_build/conformance_fuzz.rb +26 -15
- data/lib/hecks/rust_build/coverage.rb +32 -104
- data/lib/hecks/rust_build/coverage_parts/expected.rb +68 -0
- data/lib/hecks/rust_build/coverage_parts/printer.rb +75 -0
- data/lib/hecks/rust_build/host.rb +23 -13
- data/lib/hecks/rust_build/kernel_input.rb +19 -12
- data/lib/hecks/rust_build/native_build.rb +19 -15
- data/lib/hecks/rust_build/project_rust/domain_loader.rb +75 -0
- data/lib/hecks/rust_build/project_rust/root_mod/notes.rb +66 -0
- data/lib/hecks/rust_build/project_rust/root_mod.rb +22 -55
- data/lib/hecks/rust_build/project_rust/target_ir.rb +74 -0
- data/lib/hecks/rust_build/project_rust.rb +21 -89
- data/lib/hecks/rust_build/wasm.rb +11 -4
- data/lib/hecks/rust_build/wasm_browser.rb +7 -7
- data/lib/hecks/rust_build/write_if_changed.rb +3 -6
- data/lib/hecks/rust_build.rb +7 -3
- data/lib/hecks/site/bluebook/site.bluebook +7 -1
- data/lib/hecks/storehouse/audit.rb +106 -0
- data/lib/hecks/storehouse/callers.rb +73 -0
- data/lib/hecks/storehouse/dispatching.rb +149 -0
- data/lib/hecks/storehouse/introspection.rb +145 -0
- data/lib/hecks/storehouse/querying.rb +78 -0
- data/lib/hecks/storehouse.rb +43 -451
- data/lib/hecks/tickets/bluebook/tickets.bluebook +29 -0
- data/lib/hecks/tools/argument_gate_matrix/dispatching.rb +69 -0
- data/lib/hecks/tools/argument_gate_matrix/rows.rb +121 -0
- data/lib/hecks/tools/argument_gate_matrix/violations.rb +108 -0
- data/lib/hecks/tools/argument_gate_matrix.rb +43 -212
- data/lib/hecks/tools/ci_gate_decision.rb +21 -14
- data/lib/hecks/tools/ci_gates.rb +40 -26
- data/lib/hecks/tools/comment_style/baseline.rb +41 -0
- data/lib/hecks/tools/comment_style/caps_words.rb +104 -0
- data/lib/hecks/tools/comment_style/cli.rb +121 -0
- data/lib/hecks/tools/comment_style/dictionary.rb +60 -0
- data/lib/hecks/tools/comment_style/fixing.rb +119 -0
- data/lib/hecks/tools/comment_style/long_blocks.rb +51 -0
- data/lib/hecks/tools/comment_style/masking.rb +94 -0
- data/lib/hecks/tools/comment_style/patterns.rb +61 -0
- data/lib/hecks/tools/comment_style/run.rb +161 -0
- data/lib/hecks/tools/comment_style/signature.rb +59 -0
- data/lib/hecks/tools/comment_style/source_file.rb +105 -0
- data/lib/hecks/tools/comment_style/structure_checks.rb +113 -0
- data/lib/hecks/tools/comment_style/text_checks.rb +67 -0
- data/lib/hecks/tools/comment_style/vocabulary.rb +55 -0
- data/lib/hecks/tools/comment_style/walker.rb +136 -0
- data/lib/hecks/tools/comment_style.rb +17 -1000
- data/lib/hecks/tools/corpus_report.rb +26 -16
- data/lib/hecks/tools/deploy_recipe/targets.rb +61 -0
- data/lib/hecks/tools/deploy_recipe/worlds.rb +114 -0
- data/lib/hecks/tools/deploy_recipe.rb +60 -174
- data/lib/hecks/tools/deploy_recipe_lint/checks.rb +78 -0
- data/lib/hecks/tools/deploy_recipe_lint/fixtures.rb +88 -0
- data/lib/hecks/tools/deploy_recipe_lint/makefile.rb +84 -0
- data/lib/hecks/tools/deploy_recipe_lint.rb +29 -192
- data/lib/hecks/tools/drop_implicit_append_fields.rb +20 -12
- data/lib/hecks/tools/era_projection_backfill.rb +50 -33
- data/lib/hecks/tools/era_reattest/reporting.rb +55 -0
- data/lib/hecks/tools/era_reattest.rb +32 -43
- data/lib/hecks/tools/evolve_run/arguments.rb +49 -0
- data/lib/hecks/tools/evolve_run/words.rb +60 -0
- data/lib/hecks/tools/evolve_run.rb +43 -90
- data/lib/hecks/tools/fuzz_sweep/findings.rb +106 -0
- data/lib/hecks/tools/fuzz_sweep/options.rb +69 -0
- data/lib/hecks/tools/fuzz_sweep/pool.rb +74 -0
- data/lib/hecks/tools/fuzz_sweep/reporting.rb +88 -0
- data/lib/hecks/tools/fuzz_sweep.rb +75 -273
- data/lib/hecks/tools/gate.rb +31 -16
- data/lib/hecks/tools/heki_compaction.rb +63 -42
- data/lib/hecks/tools/hoist_local_givens/rewriting.rb +119 -0
- data/lib/hecks/tools/hoist_local_givens.rb +89 -157
- data/lib/hecks/tools/journal_compaction.rb +40 -31
- data/lib/hecks/tools/lanes/files.rb +82 -0
- data/lib/hecks/tools/lanes/live.rb +41 -0
- data/lib/hecks/tools/lanes/rows.rb +45 -0
- data/lib/hecks/tools/lanes/ruleset.rb +44 -0
- data/lib/hecks/tools/lanes/watch_workflow.rb +82 -0
- data/lib/hecks/tools/lanes/workflow.rb +79 -0
- data/lib/hecks/tools/lanes.rb +71 -0
- data/lib/hecks/tools/oidc_manifests.rb +10 -9
- data/lib/hecks/tools/query_ir_run.rb +7 -3
- data/lib/hecks/tools/regeneration_run.rb +40 -26
- data/lib/hecks/tools/rust_comment_style/caps_words.rb +98 -0
- data/lib/hecks/tools/rust_comment_style/fixing.rb +102 -0
- data/lib/hecks/tools/rust_comment_style/masking.rb +85 -0
- data/lib/hecks/tools/rust_comment_style/run.rb +94 -0
- data/lib/hecks/tools/rust_comment_style/source_file.rb +71 -0
- data/lib/hecks/tools/rust_comment_style/structure.rb +79 -0
- data/lib/hecks/tools/rust_comment_style/text_checks.rb +63 -0
- data/lib/hecks/tools/rust_comment_style/tokenizer.rb +102 -0
- data/lib/hecks/tools/rust_comment_style.rb +38 -535
- data/lib/hecks/tools/sequence_script.rb +20 -14
- data/lib/hecks/tools/site_routes/cli.rb +70 -0
- data/lib/hecks/tools/site_routes/root_files.rb +59 -0
- data/lib/hecks/tools/site_routes/templates.rb +77 -0
- data/lib/hecks/tools/site_routes.rb +102 -108
- data/lib/hecks/tools/tail_merge.rb +45 -37
- data/lib/hecks/tools/tenant_provisioning.rb +45 -31
- data/lib/hecks/tools/tools_doc.rb +42 -19
- data/lib/hecks/tools/translation_audit/domain_loading.rb +71 -0
- data/lib/hecks/tools/translation_audit/edges.rb +71 -0
- data/lib/hecks/tools/translation_audit/verdicts.rb +107 -0
- data/lib/hecks/tools/translation_audit.rb +30 -161
- data/lib/hecks/tools/translation_scaffold/reporting.rb +40 -0
- data/lib/hecks/tools/translation_scaffold.rb +77 -60
- data/lib/hecks/tools.rb +1 -0
- data/lib/hecks/vendoring.rb +37 -11
- data/lib/hecks/version.rb +1 -1
- data/lib/hecks/vocabulary.rb +16 -1
- data/lib/rubocop/cop/hecks/fallback_hash_lookup.rb +7 -9
- data/lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb +8 -6
- data/rust/.cargo/mutants.toml +8 -0
- data/rust/host/Cargo.toml +5 -0
- data/rust/host/HECKS_RELEASE +1 -1
- data/rust/host/src/auth.rs +32 -0
- data/rust/host/src/web.rs +2 -3
- data/rust/src/kernel/dispatch.rs +4 -0
- data/rust/src/kernel/dispatch_guard_tests.rs +506 -0
- data/rust/src/kernel/orchestrate.rs +4 -0
- data/rust/src/kernel/orchestrate_guard_tests.rs +708 -0
- metadata +607 -3
- /data/lib/hecks/bluebook/behaviour/{hexagon.rb → hecksagon.rb} +0 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
- Statement:
|
|
2
|
+
- Effect: Allow
|
|
3
|
+
Action: secretsmanager:GetSecretValue
|
|
4
|
+
# NAME-BASED, not `!Ref`/`!GetAtt` -- this secret is
|
|
5
|
+
# never a stack resource (RUSTOAUTH's own Environment
|
|
6
|
+
# comment, above, has the full story), so there is no
|
|
7
|
+
# exact ARN to point at. The trailing `-*` is AWS's
|
|
8
|
+
# own documented pattern for granting a secret known
|
|
9
|
+
# only by name: every real ARN Secrets Manager mints
|
|
10
|
+
# is this name plus a random 6-character suffix,
|
|
11
|
+
# which can't be predicted at template-render time.
|
|
12
|
+
Resource: !Sub "arn:aws:secretsmanager:${AWS::Region}:${AWS::AccountId}:secret:@@stack_name@@-web-google-oauth-*"
|
|
13
|
+
- Statement:
|
|
14
|
+
- Effect: Allow
|
|
15
|
+
Action: secretsmanager:GetSecretValue
|
|
16
|
+
Resource: !Sub "${@@logical_id@@SessionSecret}"
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Auto-generated, never typed or seen -- rust/host's own
|
|
2
|
+
# auth.rs signs both the session cookie and the OAuth `state`
|
|
3
|
+
# token with this. Same ManageMasterUserPassword-style pattern
|
|
4
|
+
# @@db_id@@ already uses for its own password.
|
|
5
|
+
@@logical_id@@SessionSecret:
|
|
6
|
+
Type: AWS::SecretsManager::Secret
|
|
7
|
+
Properties:
|
|
8
|
+
GenerateSecretString:
|
|
9
|
+
SecretStringTemplate: '{}'
|
|
10
|
+
GenerateStringKey: session_secret
|
|
11
|
+
PasswordLength: 64
|
|
12
|
+
ExcludePunctuation: true
|
|
13
|
+
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# GENERATED by hecks deploy project @@domain@@ — re-run it to refresh
|
|
2
|
+
# this file rather than hand-editing.
|
|
3
|
+
version = 0.1
|
|
4
|
+
|
|
5
|
+
[default.deploy.parameters]
|
|
6
|
+
stack_name = "@@stack_name@@"
|
|
7
|
+
region = "@@region@@"
|
|
8
|
+
resolve_s3 = true
|
|
9
|
+
s3_prefix = "@@stack_name@@"
|
|
10
|
+
capabilities = "CAPABILITY_IAM"
|
|
11
|
+
confirm_changeset = false
|
|
12
|
+
disable_rollback = false
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
# deploy's own last step below looks up @@owner_domain_name@@'s live
|
|
2
|
+
# stack Outputs (never tracked anywhere generated -- same reasoning
|
|
3
|
+
# as WebRedirectBaseUrl's own live lookup above, and the SAME
|
|
4
|
+
# `aws cloudformation describe-stacks` pattern mint-era's own eval
|
|
5
|
+
# chain, below, already proves works against a sibling stack) and
|
|
6
|
+
# passes them as this template's own Owning* Parameters.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Owns @@stack_name@@-web-google-oauth's WHOLE lifecycle (create on
|
|
2
|
+
# first run, update every run after — idempotent, cheap, no reason
|
|
3
|
+
# to cache the way patch-pg-native's own multi-minute build does) —
|
|
4
|
+
# deliberately OUTSIDE CloudFormation, straight from @@domain@@'s own
|
|
5
|
+
# gitignored .env.local, so the real client_id/secret never lands in
|
|
6
|
+
# this generated, git-TRACKED template.yaml as plaintext. Read by
|
|
7
|
+
# name (`{{resolve:secretsmanager:@@stack_name@@-web-google-oauth:...}}`,
|
|
8
|
+
# template.yaml's own Environment — @@oauth_function_id@@'s
|
|
9
|
+
# own), not by `!Ref` — see that comment for why this secret isn't a
|
|
10
|
+
# stack resource at all. NOT nested inside patch-pg-native's own
|
|
11
|
+
# pg_version gate above -- a real, live "No rule to make target
|
|
12
|
+
# `sync-google-oauth'" caught that this target used to only exist
|
|
13
|
+
# when a Ruby WebFunction (with its own pg gem) was also present,
|
|
14
|
+
# even though Google OAuth itself has nothing to do with pg at all.
|
|
15
|
+
.PHONY: sync-google-oauth
|
|
16
|
+
sync-google-oauth:
|
|
17
|
+
@CLIENT_ID=$$(grep '^GOOGLE_CLIENT_ID=' @@domain@@/.env.local | cut -d= -f2-); \
|
|
18
|
+
CLIENT_SECRET=$$(grep '^GOOGLE_CLIENT_SECRET=' @@domain@@/.env.local | cut -d= -f2-); \
|
|
19
|
+
test -n "$$CLIENT_ID" -a -n "$$CLIENT_SECRET" || { echo "sync-google-oauth: @@domain@@/.env.local is missing GOOGLE_CLIENT_ID/GOOGLE_CLIENT_SECRET"; exit 1; }; \
|
|
20
|
+
SECRET_JSON=$$(ruby -rjson -e 'puts JSON.generate({client_id: ARGV[0], client_secret: ARGV[1]})' "$$CLIENT_ID" "$$CLIENT_SECRET"); \
|
|
21
|
+
aws secretsmanager put-secret-value --secret-id @@stack_name@@-web-google-oauth --secret-string "$$SECRET_JSON" >/dev/null 2>&1 || \
|
|
22
|
+
aws secretsmanager create-secret --name @@stack_name@@-web-google-oauth --secret-string "$$SECRET_JSON" >/dev/null
|
|
23
|
+
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# GENERATED by hecks deploy project @@domain@@ — re-run it to refresh
|
|
2
|
+
# this file rather than hand-editing. Source: @@world_file@@'s own
|
|
3
|
+
# deployed_to("AwsLambda") block.
|
|
4
|
+
#
|
|
5
|
+
# SELF-CONTAINED, ON PURPOSE — this stack owns its own private VPC,
|
|
6
|
+
# subnets, security groups, and RDS Postgres instance, not just the
|
|
7
|
+
# Lambda. No externally-supplied VPC/database parameters, no
|
|
8
|
+
# DatabaseUrl secret anyone has to type: RDS's own
|
|
9
|
+
# ManageMasterUserPassword generates and stores the password in
|
|
10
|
+
# Secrets Manager, and DATABASE_URL is composed from it via a
|
|
11
|
+
# CloudFormation dynamic reference — resolved at deploy time, never
|
|
12
|
+
# visible in this template, a parameter, or any tool's output.
|
|
13
|
+
#
|
|
14
|
+
# NO NAT GATEWAY for @@logical_id@@ — deliberately. Its own subnets
|
|
15
|
+
# have no route to the internet at all, only to the RDS instance
|
|
16
|
+
# inside the same VPC: dispatch a command, read/write the journal.
|
|
17
|
+
# CloudWatch Logs delivery doesn't go through the function's own VPC
|
|
18
|
+
# networking, so it needs no route either.
|
|
19
|
+
@@nat_comment@@
|
|
20
|
+
AWSTemplateFormatVersion: '2010-09-09'
|
|
21
|
+
Transform: AWS::Serverless-2016-10-31
|
|
22
|
+
Description: >
|
|
23
|
+
@@infra_name@@ — dispatched through hecks's rust/host, a
|
|
24
|
+
wasmtime-sandboxed Rust binary with a rehydrate-and-replay Postgres
|
|
25
|
+
journal (docs/decisions/0018), backed by its own private RDS
|
|
26
|
+
Postgres instance. PackageType Zip, no container.
|
|
27
|
+
@@parameters_section@@
|
|
28
|
+
Resources:
|
|
29
|
+
@@network_resources@@
|
|
30
|
+
|
|
31
|
+
@@rust_session_secret@@
|
|
32
|
+
@@logical_id@@:
|
|
33
|
+
Type: AWS::Serverless::Function@@aurora_depends@@
|
|
34
|
+
Metadata:
|
|
35
|
+
BuildMethod: makefile
|
|
36
|
+
Properties:
|
|
37
|
+
# PINNED, not SAM's own auto-suffixed default — a Ruby-side
|
|
38
|
+
# LambdaClient needs to know this function's name AHEAD OF a
|
|
39
|
+
# first deploy (there's no chicken-egg lookup step), the same
|
|
40
|
+
# "configured for me, in the projection" standard every other
|
|
41
|
+
# piece of generated deploy config already holds to. Matches
|
|
42
|
+
# `stack_name` above exactly — one name, two places it's read
|
|
43
|
+
# from, never out of sync since both derive from `infra_name`.
|
|
44
|
+
FunctionName: @@stack_name@@
|
|
45
|
+
# EXPLICIT, not omitted -- `sam build WebFunction` and
|
|
46
|
+
# `sam build --use-container WebFunction` run as TWO SEPARATE
|
|
47
|
+
# single-resource invocations (deploy:'s own comment on why:
|
|
48
|
+
# cargo-lambda cross-compiles on this host directly, pg's
|
|
49
|
+
# native extension needs the container -- `--use-container` is
|
|
50
|
+
# a global sam build flag, can't be scoped per-resource). Each
|
|
51
|
+
# invocation regenerates .aws-sam/build/template.yaml from
|
|
52
|
+
# THIS source template for every resource, not just the one it
|
|
53
|
+
# builds -- a resource with no CodeUri here reverts to
|
|
54
|
+
# CodeUri-less after the SECOND invocation, and `sam deploy`
|
|
55
|
+
# then defaults a missing CodeUri to the template's own
|
|
56
|
+
# containing directory (deploy/@@infra_name@@/ itself),
|
|
57
|
+
# zipping the whole project tree -- including WebFunction's
|
|
58
|
+
# own source -- as this function's code. A real, live deploy
|
|
59
|
+
# shipped exactly that broken artifact (confirmed via
|
|
60
|
+
# `aws lambda get-function` + downloading the actual deployed
|
|
61
|
+
# zip). Pinning CodeUri here survives that regeneration: it
|
|
62
|
+
# still resolves to `.aws-sam/build/@@logical_id@@/`, where
|
|
63
|
+
# build-@@logical_id@@'s own `cp ... $(ARTIFACTS_DIR)` already
|
|
64
|
+
# placed the real bootstrap+wasm, regardless of which of the
|
|
65
|
+
# two sam build calls ran most recently.
|
|
66
|
+
# "." NOT "@@logical_id@@" -- SAM's Makefile build workflow
|
|
67
|
+
# requires the Makefile to live INSIDE CodeUri itself
|
|
68
|
+
# (confirmed live: "Makefile not found at
|
|
69
|
+
# .../WebFunction/Makefile" when CodeUri named a
|
|
70
|
+
# directory of its own). This project's one Makefile lives at
|
|
71
|
+
# the deploy directory's own root, alongside this template --
|
|
72
|
+
# "." is where it actually is.
|
|
73
|
+
CodeUri: .
|
|
74
|
+
PackageType: Zip
|
|
75
|
+
Runtime: provided.al2023
|
|
76
|
+
Architectures: [arm64]
|
|
77
|
+
Handler: bootstrap
|
|
78
|
+
MemorySize: @@memory@@
|
|
79
|
+
Timeout: @@timeout@@
|
|
80
|
+
Environment:
|
|
81
|
+
Variables:
|
|
82
|
+
# NOT a `{{resolve:secretsmanager:...}}`-composed DATABASE_URL
|
|
83
|
+
# anymore (the WebFunction handler below still uses that
|
|
84
|
+
# mechanism, unchanged) -- that dynamic reference genuinely
|
|
85
|
+
# IS resolved fresh at deploy time and never rendered into
|
|
86
|
+
# this template, this tool's output, or the CloudFormation
|
|
87
|
+
# console. But once it resolves INTO a Lambda's own
|
|
88
|
+
# Environment.Variables entry, the resolved PLAINTEXT is
|
|
89
|
+
# stored in the function's OWN configuration:
|
|
90
|
+
# `lambda:GetFunctionConfiguration` returns it decrypted,
|
|
91
|
+
# and the Lambda console's Configuration tab displays it, to
|
|
92
|
+
# ANY principal holding read-only account access (AWS's own
|
|
93
|
+
# managed ReadOnlyAccess policy included) -- caught
|
|
94
|
+
# reviewing this template, not live; AWS's own guidance is
|
|
95
|
+
# to fetch a secret from Secrets Manager at RUNTIME instead,
|
|
96
|
+
# precisely to avoid this. DB_HOST/DB_NAME/DB_SECRET_ARN
|
|
97
|
+
# below are not secrets themselves -- an endpoint address, a
|
|
98
|
+
# database name, and a Secrets Manager ARN authenticate
|
|
99
|
+
# nothing on their own -- so sitting here as plain
|
|
100
|
+
# Environment.Variables values costs nothing; main.rs itself
|
|
101
|
+
# fetches the actual password from Secrets Manager at cold
|
|
102
|
+
# start, over the AWS SDK, and never hands it back to
|
|
103
|
+
# CloudFormation or Lambda's own configuration at all.
|
|
104
|
+
# @@logical_id@@'s own least-privilege Policies grant (below,
|
|
105
|
+
# sibling of VpcConfig) is the one runtime IAM permission
|
|
106
|
+
# that fetch needs, scoped to this one secret ARN.
|
|
107
|
+
@@db_env@@
|
|
108
|
+
# `domain_name`, NOT `infra_name` — this names the actual
|
|
109
|
+
# .wasm FILE `hecks build_wasm` writes (rust/dist/@@domain_name@@.wasm,
|
|
110
|
+
# its own target_mod_name convention, a Rust-build-pipeline
|
|
111
|
+
# concern unrelated to AWS resource identity) and what the
|
|
112
|
+
# Makefile below actually bundles into the Lambda package
|
|
113
|
+
# under. Confirmed the hard way: pinning this to infra_name
|
|
114
|
+
# alongside the real AWS-identity fields left it looking for
|
|
115
|
+
# a file `hecks build_wasm` never produces.
|
|
116
|
+
HECKS_WASM_PATH: !Sub "/var/task/@@domain_name@@.wasm"
|
|
117
|
+
# STATIC, not a deploy-time parameter — HECKS_DOMAIN is this
|
|
118
|
+
# domain's own declared name, known at generation time the
|
|
119
|
+
# same way DBName/HECKS_WASM_PATH already are. HECKS_ERA is
|
|
120
|
+
# "1" because that's what a FRESH database always gets:
|
|
121
|
+
# PostgresEra::LineageManager::EraResolver#check! mints era 1
|
|
122
|
+
# unconditionally the first time any Ruby process boots
|
|
123
|
+
# against an empty `hecks_eras` (era_resolver.rb's own
|
|
124
|
+
# `held.empty?` branch) — deterministic, not guessed. `make
|
|
125
|
+
# mint-era` (this directory's own Makefile) is what actually
|
|
126
|
+
# triggers that first boot; a LATER real schema evolution
|
|
127
|
+
# (era 2+) is a separate, later re-generation, not this one.
|
|
128
|
+
HECKS_DOMAIN: @@declared_domain_name@@
|
|
129
|
+
# UNCONDITIONAL, not gated on `rust_web` — `rust/host/src/main.rs`'s
|
|
130
|
+
# own boot sequence reads `ir::ir().ok_or(...)?` for every domain
|
|
131
|
+
# regardless of web mode (era-lineage bookkeeping needs the IR, not
|
|
132
|
+
# just the optional in-process web UI), so a Shared-mode domain with
|
|
133
|
+
# no web layer still needs this sidecar path to boot at all. Previously
|
|
134
|
+
# gated on `rust_web`, which left every such domain's Lambda crashing
|
|
135
|
+
# on cold start — checkout.rs's own header flagged this exact
|
|
136
|
+
# contradiction, confirmed live against Banking's committed template.
|
|
137
|
+
HECKS_IR_PATH: !Sub "/var/task/@@domain_name@@.ir.json"
|
|
138
|
+
HECKS_ERA: "1"@@schema_env@@@@rust_oauth_env@@
|
|
139
|
+
# LEAST-PRIVILEGE -- @@logical_id@@'s own execution role is
|
|
140
|
+
# otherwise SAM's bare default (logging only); this is the one
|
|
141
|
+
# runtime AWS permission the DB_SECRET_ARN handling above needs,
|
|
142
|
+
# scoped to the single secret ARN this stack itself depends on,
|
|
143
|
+
# never `Resource: "*"`.
|
|
144
|
+
Policies:
|
|
145
|
+
- Statement:
|
|
146
|
+
- Effect: Allow
|
|
147
|
+
Action: secretsmanager:GetSecretValue
|
|
148
|
+
Resource: !Sub "${@@db_secret_ref@@}"
|
|
149
|
+
@@rust_oauth_policy@@
|
|
150
|
+
# TMPL:cross_domain_lambda_policies
|
|
151
|
+
VpcConfig:
|
|
152
|
+
@@vpc_config@@
|
|
153
|
+
# AWS_IAM by default — this dispatches real domain commands
|
|
154
|
+
# (cap-table/governance-shaped data);
|
|
155
|
+
# an unauthenticated public URL is the wrong default for that,
|
|
156
|
+
# even though it's the simpler one to demo with. NONE only when
|
|
157
|
+
# `web "Rust"` (rust/host/src/web.rs) makes this the public web
|
|
158
|
+
# UI itself — safe even though the SAME Function URL also
|
|
159
|
+
# carries the internal {"verb"}/{"read"} dispatch shapes,
|
|
160
|
+
# because a Function-URL HTTP event can never be crafted into
|
|
161
|
+
# that raw top-level shape (Function URLs always wrap the real
|
|
162
|
+
# HTTP body inside requestContext.http/rawPath/event.body,
|
|
163
|
+
# unconditionally); that raw shape is reachable only through
|
|
164
|
+
# the AWS SDK's own IAM-authenticated Invoke API, which never
|
|
165
|
+
# goes through a Function URL at all.
|
|
166
|
+
FunctionUrlConfig:
|
|
167
|
+
AuthType: @@function_url_auth@@
|
|
168
|
+
@@web_function@@
|
|
169
|
+
|
|
170
|
+
Outputs:
|
|
171
|
+
FunctionUrl:
|
|
172
|
+
Value: !GetAtt @@logical_id@@Url.FunctionUrl@@web_function_url_output@@
|
|
173
|
+
# stack_outputs (hecks deploy project, above the heredocs) is the ONE
|
|
174
|
+
# place these four names live — DatabaseEndpoint/DatabaseSecretArn
|
|
175
|
+
# feed `make mint-era`'s own boot step directly; VpcId/
|
|
176
|
+
# DbSecurityGroupId ALSO feed bastion.yaml's own Parameters (a
|
|
177
|
+
# separate, sibling stack, created only for the few minutes a mint
|
|
178
|
+
# takes and destroyed right after, attaching into the SAME private
|
|
179
|
+
# network without this main template ever knowing a bastion
|
|
180
|
+
# exists) and the Makefile's own --parameter-overrides. Rename a
|
|
181
|
+
# key in that table and every consumer follows; reference one that
|
|
182
|
+
# doesn't exist there and hecks deploy project refuses before
|
|
183
|
+
# writing a single file, instead of a bastion.yaml whose Parameter
|
|
184
|
+
# nothing could ever fill. (`PrivateSubnetId` used to sit here too
|
|
185
|
+
# — dropped, nothing ever consumed it; bastion.yaml mints its own
|
|
186
|
+
# subnet instead.)
|
|
187
|
+
@@output_lines@@
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
@@db_env_guard@@
|
|
2
|
+
@echo "Looking up $(STACK)'s VPC/security group..."
|
|
3
|
+
@@eval_lines@@
|
|
4
|
+
@echo "Deploying the temporary bastion stack $(BASTION_STACK)..."
|
|
5
|
+
aws cloudformation deploy --template-file bastion.yaml --stack-name $(BASTION_STACK) \
|
|
6
|
+
--parameter-overrides @@parameter_overrides@@ \
|
|
7
|
+
--capabilities CAPABILITY_IAM
|
|
8
|
+
# DB_PASS_URLENC -- same percent-encoding fix as mint_era_recipe's
|
|
9
|
+
# own comment above the equivalent line in that recipe (libpq's URI
|
|
10
|
+
# parser rejects a bare `%`, which a generated RDS password isn't
|
|
11
|
+
# guaranteed to be free of); this recipe's DATABASE_URL below uses
|
|
12
|
+
# the encoded form for the same reason, even though the script it
|
|
13
|
+
# feeds doesn't currently read it (see db_env_blind above).
|
|
14
|
+
@INSTANCE_ID=$$(aws cloudformation describe-stacks --stack-name $(BASTION_STACK) --query "Stacks[0].Outputs[?OutputKey=='InstanceId'].OutputValue" --output text); \
|
|
15
|
+
echo "Waiting for $$INSTANCE_ID to register with SSM..."; \
|
|
16
|
+
for i in $$(seq 1 30); do \
|
|
17
|
+
STATUS=$$(aws ssm describe-instance-information --filters "Key=InstanceIds,Values=$$INSTANCE_ID" --query "InstanceInformationList[0].PingStatus" --output text 2>/dev/null); \
|
|
18
|
+
if [ "$$STATUS" = "Online" ]; then break; fi; \
|
|
19
|
+
sleep 5; \
|
|
20
|
+
done; \
|
|
21
|
+
DB_PASS=$$(aws secretsmanager get-secret-value --secret-id $(DB_SECRET_ARN) --query SecretString --output text | ruby -rjson -e 'print JSON.parse(STDIN.read)["password"]'); \
|
|
22
|
+
DB_PASS_URLENC=$$(ruby -rerb -e 'print ERB::Util.url_encode(ARGV[0])' "$$DB_PASS"); \
|
|
23
|
+
RUN_STATUS=1; \
|
|
24
|
+
for attempt in 1 2 3 4 5; do \
|
|
25
|
+
kill $$TUNNEL_PID 2>/dev/null; \
|
|
26
|
+
echo "Opening an SSM tunnel to $(DB_HOST):5432 and running @@verb@@ (attempt $$attempt/5)..."; \
|
|
27
|
+
aws ssm start-session --target $$INSTANCE_ID \
|
|
28
|
+
--document-name AWS-StartPortForwardingSessionToRemoteHost \
|
|
29
|
+
--parameters "{\"host\":[\"$(DB_HOST)\"],\"portNumber\":[\"5432\"],\"localPortNumber\":[\"15432\"]}" \
|
|
30
|
+
>/tmp/$(BASTION_STACK)-tunnel-$$attempt.log 2>&1 & \
|
|
31
|
+
TUNNEL_PID=$$!; \
|
|
32
|
+
for i in $$(seq 1 15); do \
|
|
33
|
+
nc -z localhost 15432 2>/dev/null && break; \
|
|
34
|
+
sleep 1; \
|
|
35
|
+
done; \
|
|
36
|
+
cd @@cwd@@ && DATABASE_URL="postgres://postgres:$$DB_PASS_URLENC@localhost:15432/@@db_name@@" HECKS_SCHEMA="@@hecks_schema@@" @@run_prefix@@ @@script@@ @@domain_arg_part@@@@extra_args@@&& { RUN_STATUS=0; break; }; \
|
|
37
|
+
RUN_STATUS=$$?; \
|
|
38
|
+
echo "@@verb@@ attempt $$attempt/5 failed (exit $$RUN_STATUS) -- restarting the tunnel and retrying in 3s..."; \
|
|
39
|
+
sleep 3; \
|
|
40
|
+
done; \
|
|
41
|
+
kill $$TUNNEL_PID 2>/dev/null; \
|
|
42
|
+
echo "Tearing down the temporary bastion stack..."; \
|
|
43
|
+
aws cloudformation delete-stack --stack-name $(BASTION_STACK); \
|
|
44
|
+
aws cloudformation wait stack-delete-complete --stack-name $(BASTION_STACK); \
|
|
45
|
+
echo "$(BASTION_STACK) deleted."; \
|
|
46
|
+
exit $$RUN_STATUS
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
# THE WEB APP'S OWN LAMBDA — opt-in, see `web_handler_present` above.
|
|
2
|
+
# VPC-attached for the SAME reason @@logical_id@@ is (Member's own
|
|
3
|
+
# persistence needs the private RDS instance directly, permanently —
|
|
4
|
+
# the hecksagon's own comment on why), sharing
|
|
5
|
+
# @@logical_id@@SecurityGroup rather than minting a second one, since
|
|
6
|
+
# both need the identical egress-to-DB rule. That VPC attachment
|
|
7
|
+
# ALSO cuts off the public internet by default (this stack's own "NO
|
|
8
|
+
# NAT GATEWAY" design) — but this function has to reach
|
|
9
|
+
# @@logical_id@@ itself via `lambda:InvokeFunction`, a public AWS API
|
|
10
|
+
# call. @@web_logical_id@@LambdaEndpoint below is the targeted fix: a
|
|
11
|
+
# VPC Interface Endpoint for the Lambda service ONLY (not a NAT
|
|
12
|
+
# Gateway) — a few dollars a month, not a general internet route.
|
|
13
|
+
@@db_id@@LambdaEndpointSecurityGroup:
|
|
14
|
+
Type: AWS::EC2::SecurityGroup
|
|
15
|
+
Properties:
|
|
16
|
+
VpcId: !Ref @@db_id@@Vpc
|
|
17
|
+
# EC2's own GroupDescription character set excludes apostrophes
|
|
18
|
+
# too, not just em-dashes -- "this stack's own" was a real,
|
|
19
|
+
# live rejection ("Invalid security group description").
|
|
20
|
+
GroupDescription: @@db_id@@LambdaEndpoint - HTTPS from this stacks own Lambdas only
|
|
21
|
+
|
|
22
|
+
@@db_id@@LambdaEndpointIngress:
|
|
23
|
+
Type: AWS::EC2::SecurityGroupIngress
|
|
24
|
+
Properties:
|
|
25
|
+
GroupId: !Ref @@db_id@@LambdaEndpointSecurityGroup
|
|
26
|
+
IpProtocol: tcp
|
|
27
|
+
FromPort: 443
|
|
28
|
+
ToPort: 443
|
|
29
|
+
SourceSecurityGroupId: !Ref @@logical_id@@SecurityGroup
|
|
30
|
+
|
|
31
|
+
@@db_id@@LambdaEndpoint:
|
|
32
|
+
Type: AWS::EC2::VPCEndpoint
|
|
33
|
+
Properties:
|
|
34
|
+
VpcId: !Ref @@db_id@@Vpc
|
|
35
|
+
ServiceName: !Sub "com.amazonaws.${AWS::Region}.lambda"
|
|
36
|
+
VpcEndpointType: Interface
|
|
37
|
+
PrivateDnsEnabled: true
|
|
38
|
+
SubnetIds: [!Ref @@db_id@@SubnetA, !Ref @@db_id@@SubnetB]
|
|
39
|
+
SecurityGroupIds: [!Ref @@db_id@@LambdaEndpointSecurityGroup]
|
|
40
|
+
|
|
41
|
+
# Auto-generated, never typed or seen — the SAME
|
|
42
|
+
# ManageMasterUserPassword pattern @@db_id@@ already uses for its own
|
|
43
|
+
# password, applied to Sinatra's own session-signing secret instead.
|
|
44
|
+
@@web_logical_id@@SessionSecret:
|
|
45
|
+
Type: AWS::SecretsManager::Secret
|
|
46
|
+
Properties:
|
|
47
|
+
GenerateSecretString:
|
|
48
|
+
SecretStringTemplate: '{}'
|
|
49
|
+
GenerateStringKey: session_secret
|
|
50
|
+
PasswordLength: 64
|
|
51
|
+
ExcludePunctuation: true
|
|
52
|
+
|
|
53
|
+
@@webhook_secret_resource@@
|
|
54
|
+
@@web_logical_id@@:
|
|
55
|
+
Type: AWS::Serverless::Function
|
|
56
|
+
# NO Metadata.BuildMethod — "bundler" isn't a real SAM value (a
|
|
57
|
+
# real, live UnsupportedBuilderException caught this); `Runtime:
|
|
58
|
+
# ruby3.2` alone is enough for SAM to select its own built-in Ruby
|
|
59
|
+
# bundler workflow automatically. @@logical_id@@'s own `BuildMethod:
|
|
60
|
+
# makefile` above is different: rust/host isn't a runtime SAM
|
|
61
|
+
# knows how to build at all, so it needs an explicit custom
|
|
62
|
+
# workflow — this function doesn't. STAYS `ruby3.2` deliberately,
|
|
63
|
+
# even though `sam validate --lint` now flags it deprecated
|
|
64
|
+
# (2026-03-31, creation disabled 2027-02-01, still comfortably
|
|
65
|
+
# ahead of today) — `patch-pg-native`'s own build-ruby3.2 container
|
|
66
|
+
# image and `lib/3.2/pg_ext.so` path glob (this Makefile, below)
|
|
67
|
+
# are BOTH hardcoded to this exact runtime; bumping Runtime alone
|
|
68
|
+
# without reworking that whole from-source pg build for a newer
|
|
69
|
+
# image is a real, separate undertaking (untested container image
|
|
70
|
+
# availability, a different vendor/bundle native-extension path)
|
|
71
|
+
# out of scope here. Matches the live, currently-
|
|
72
|
+
# deployed choice exactly, so both consumers of this one shared
|
|
73
|
+
# WebFunction code path stay on the same, PROVEN runtime.
|
|
74
|
+
Properties:
|
|
75
|
+
FunctionName: @@stack_name@@-web
|
|
76
|
+
Runtime: ruby3.2
|
|
77
|
+
Architectures: [arm64]
|
|
78
|
+
# THREE parts (file.Class.method), not two — aws-lambda-ric's own
|
|
79
|
+
# 2-part form calls a plain TOP-LEVEL function via __send__, not
|
|
80
|
+
# a module method; @@web_handler_relpath@@.rb's own comment on
|
|
81
|
+
# why its module is named the way it is explains the rest — a
|
|
82
|
+
# real, live "LambdaHandler is not a module" caught both halves
|
|
83
|
+
# of this the hard way. `web_handler_relpath` (not a bare
|
|
84
|
+
# "lambda_handler") whenever `dispatch "None"` moved CodeUri off
|
|
85
|
+
# @@domain@@ itself — see that variable's own comment, above.
|
|
86
|
+
Handler: @@web_handler_relpath@@.@@webhook_handler_module@@.lambda_handler
|
|
87
|
+
CodeUri: @@web_code_uri@@
|
|
88
|
+
MemorySize: 512
|
|
89
|
+
Timeout: 15
|
|
90
|
+
Environment:
|
|
91
|
+
Variables:
|
|
92
|
+
DOMAIN_ROOT: /var/task
|
|
93
|
+
# NOT `declared_domain_name` — `Adapters::Lambda`/
|
|
94
|
+
# `RemoteDispatcher` both read this to compute WHICH
|
|
95
|
+
# deployed Lambda function to invoke (`hecks-#{...}`,
|
|
96
|
+
# matching this stack's own name), a question `infra_name`
|
|
97
|
+
# answers and a domain's own business identity does not.
|
|
98
|
+
# Real, live, and confirmed the hard way: this was still
|
|
99
|
+
# wired to `declared_domain_name` when a client app
|
|
100
|
+
# first deployed, and WebFunction immediately threw
|
|
101
|
+
# `ResourceNotFoundException: Function not found:
|
|
102
|
+
# hecks-<domain>` on every read AND on the
|
|
103
|
+
# Google OAuth callback itself — a real signed-in user hit
|
|
104
|
+
# this within minutes of the deploy that introduced it.
|
|
105
|
+
DOMAIN_NAME: @@infra_name@@
|
|
106
|
+
HECKS_LAMBDA_ROUTING: "true"
|
|
107
|
+
HECKS_LAMBDA_REGION: @@region@@@@web_schema_env@@
|
|
108
|
+
# SAME setting @@domain@@'s own fly.toml/Dockerfile already
|
|
109
|
+
# sets for the Fly deployment this one replaces — Sinatra's
|
|
110
|
+
# own `host_authorization` default is only PERMISSIVE in
|
|
111
|
+
# production mode (an empty `permitted_hosts` list means
|
|
112
|
+
# "allow any host" — checked directly in rack-protection's
|
|
113
|
+
# own source); its DEVELOPMENT default is the restrictive
|
|
114
|
+
# one (only localhost/.test), which is what Sinatra falls
|
|
115
|
+
# back to when NEITHER RACK_ENV nor APP_ENV is set. A real,
|
|
116
|
+
# live "Host not permitted" 403 against this function's own
|
|
117
|
+
# unpredictable *.lambda-url.*.on.aws hostname caught the
|
|
118
|
+
# gap — this function's Environment never set either var.
|
|
119
|
+
RACK_ENV: production
|
|
120
|
+
# The precompiled `pg` gem's aarch64-linux native extension
|
|
121
|
+
# needs GLIBC 2.29+; Lambda's ruby3.2 MANAGED runtime is
|
|
122
|
+
# Amazon Linux 2 (glibc 2.26) -- a real, live "Init<NameError>:
|
|
123
|
+
# uninitialized constant PG::Error" caught this (rescuing
|
|
124
|
+
# PG::Error itself failed to resolve, because pg's own
|
|
125
|
+
# require died before reaching the file that defines it).
|
|
126
|
+
# `make deploy`'s own `patch-pg-native` step (this directory's
|
|
127
|
+
# Makefile) replaces the broken precompiled extension with one
|
|
128
|
+
# compiled from source, in-container, against a real
|
|
129
|
+
# SSL-enabled libpq -- and drops that libpq's .so beside it at
|
|
130
|
+
# /var/task/lib, found by the dynamic loader with NO explicit
|
|
131
|
+
# LD_LIBRARY_PATH override needed: the base ruby3.2 image's
|
|
132
|
+
# own baked-in default (`docker inspect
|
|
133
|
+
# public.ecr.aws/lambda/ruby:3.2-arm64`) is already
|
|
134
|
+
# "/var/lang/lib:/lib64:/usr/lib64:/var/runtime:/var/runtime/lib:/var/task:/var/task/lib:/opt/lib"
|
|
135
|
+
# -- setting LD_LIBRARY_PATH here as a Lambda env var
|
|
136
|
+
# REPLACES that whole list rather than extending it (a real,
|
|
137
|
+
# live gotcha: Lambda env vars always fully override a
|
|
138
|
+
# same-named baked-in image env, never merge with it), which
|
|
139
|
+
# is exactly what broke Ruby's OWN interpreter startup
|
|
140
|
+
# ("libcrypt.so.1: cannot open shared object file") the one
|
|
141
|
+
# time this was set explicitly, before libpq.so.5.16 itself
|
|
142
|
+
# ever got a chance to matter.
|
|
143
|
+
# Member's own permanent Postgres connection — the SAME RDS
|
|
144
|
+
# instance @@logical_id@@ itself writes rust/host's flat
|
|
145
|
+
# journal into, different database engine role (Ruby's own
|
|
146
|
+
# era/lineage schema, not rust/host's), never the real
|
|
147
|
+
# Fly-hosted Postgres this whole effort is retiring away from.
|
|
148
|
+
#
|
|
149
|
+
# GENERATOR-ONLY FIX, NOT YET SAFE TO DEPLOY — DB_HOST/DB_NAME/
|
|
150
|
+
# DB_SECRET_ARN/SESSION_SECRET_ARN/GOOGLE_OAUTH_SECRET_ID below
|
|
151
|
+
# replace the SAME `{{resolve:secretsmanager:...}}`-into-
|
|
152
|
+
# Environment.Variables shape rust/host's own main.rs (this
|
|
153
|
+
# template's own @@logical_id@@) used to have -- readable in
|
|
154
|
+
# plaintext by any read-only account principal via
|
|
155
|
+
# lambda:GetFunctionConfiguration, the exact exposure
|
|
156
|
+
# @@logical_id@@'s own comment above the Policies section
|
|
157
|
+
# documents. But THIS function's consumer (`lambda_handler.rb`)
|
|
158
|
+
# is not a file this generator writes or this repo carries --
|
|
159
|
+
# it lives in the deploying app's own domain directory (real,
|
|
160
|
+
# live example: a Sinatra app), outside this
|
|
161
|
+
# codebase entirely. Redeploying a domain with an existing
|
|
162
|
+
# `lambda_handler.rb` BEFORE that handler is updated to fetch
|
|
163
|
+
# these itself (`aws-sdk-secretsmanager`, not yet in this
|
|
164
|
+
# project's own Gemfile) breaks it: it still expects
|
|
165
|
+
# `ENV["DATABASE_URL"]`/`ENV["SESSION_SECRET"]`/
|
|
166
|
+
# `ENV["GOOGLE_CLIENT_ID"]`/`ENV["GOOGLE_CLIENT_SECRET"]`
|
|
167
|
+
# already resolved, and none of those keys exist below anymore.
|
|
168
|
+
DB_HOST: !GetAtt @@db_ref_id@@.Endpoint.Address
|
|
169
|
+
DB_NAME: @@db_name@@
|
|
170
|
+
DB_SECRET_ARN: !Sub "${@@secret_sub@@}"
|
|
171
|
+
SESSION_SECRET_ARN: !Sub "${@@web_logical_id@@SessionSecret}"@@web_webhook_env@@
|
|
172
|
+
@@web_google_oauth_env_yaml@@
|
|
173
|
+
VpcConfig:
|
|
174
|
+
SubnetIds: [!Ref @@db_id@@SubnetA, !Ref @@db_id@@SubnetB]
|
|
175
|
+
SecurityGroupIds: [!Ref @@logical_id@@SecurityGroup]
|
|
176
|
+
# LEAST-PRIVILEGE, scoped to @@logical_id@@'s own ARN specifically
|
|
177
|
+
# (SAM's own LambdaInvokePolicy template) — WebFunctionRole is
|
|
178
|
+
# otherwise SAM's bare default execution role (logging only), and
|
|
179
|
+
# had NO lambda:InvokeFunction permission at all until this: a
|
|
180
|
+
# real, live AccessDeniedException caught it, the same request
|
|
181
|
+
# that also caught the wrong-function-name bug just above
|
|
182
|
+
# (WebFunctionRole is not authorized... on resource
|
|
183
|
+
# hecks-task — this stack has never had ANY policy granting
|
|
184
|
+
# that action, so the fix isn't complete without adding one).
|
|
185
|
+
# THE SAME secretsmanager:GetSecretValue GRANTS @@logical_id@@'s
|
|
186
|
+
# own Policies section (above) needed, once this function's own
|
|
187
|
+
# `lambda_handler.rb` fetches DB_SECRET_ARN/SESSION_SECRET_ARN/
|
|
188
|
+
# GOOGLE_OAUTH_SECRET_ID itself instead of relying on a resolved
|
|
189
|
+
# Environment.Variables value -- see this Environment block's own
|
|
190
|
+
# comment for why that consumer-side change isn't in this repo.
|
|
191
|
+
Policies:
|
|
192
|
+
- LambdaInvokePolicy:
|
|
193
|
+
FunctionName: !Ref @@logical_id@@
|
|
194
|
+
- Statement:
|
|
195
|
+
- Effect: Allow
|
|
196
|
+
Action: secretsmanager:GetSecretValue
|
|
197
|
+
Resource: !Sub "${@@secret_sub@@}"
|
|
198
|
+
- Statement:
|
|
199
|
+
- Effect: Allow
|
|
200
|
+
Action: secretsmanager:GetSecretValue
|
|
201
|
+
Resource: !Sub "${@@web_logical_id@@SessionSecret}"@@web_webhook_policy@@
|
|
202
|
+
@@web_oauth_policy@@
|
|
203
|
+
# NONE, not AWS_IAM — real users need to reach sign-in over
|
|
204
|
+
# plain HTTPS, unlike @@logical_id@@'s own AWS_IAM-protected URL
|
|
205
|
+
# (this function is the ONLY thing meant to call that one).
|
|
206
|
+
FunctionUrlConfig:
|
|
207
|
+
AuthType: NONE
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# BY NAME, not `!Ref`/`!GetAtt` -- @@web_logical_id@@GoogleOauth
|
|
2
|
+
# is deliberately NOT declared as a CloudFormation resource
|
|
3
|
+
# here (would need either GenerateSecretString, which can't
|
|
4
|
+
# invent a real Google client_id/secret, or a value baked
|
|
5
|
+
# into this git-TRACKED template as plaintext). `make
|
|
6
|
+
# sync-google-oauth` owns this secret's whole lifecycle
|
|
7
|
+
# instead, straight from @@domain@@'s own gitignored
|
|
8
|
+
# .env.local, outside CloudFormation entirely. GetSecretValue
|
|
9
|
+
# accepts a bare name directly, no ARN needed -- same
|
|
10
|
+
# generator-only caveat as DB_SECRET_ARN's own comment above.
|
|
11
|
+
GOOGLE_OAUTH_SECRET_ID: @@stack_name@@-web-google-oauth
|
|
12
|
+
GOOGLE_REDIRECT_URI: !Sub "${WebRedirectBaseUrl}/auth/google/callback"
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# GOOGLE_CLIENT_ID/GOOGLE_CLIENT_SECRET/GOOGLE_REDIRECT_URI
|
|
2
|
+
# deliberately NOT set here — @@domain@@'s own .env.local has
|
|
3
|
+
# no real GOOGLE_CLIENT_ID yet, matching Fly's own current
|
|
4
|
+
# reality (its secrets list holds only
|
|
5
|
+
# DATABASE_URL and SESSION_SECRET) that nobody has configured
|
|
6
|
+
# OAuth for this app at all. Drop real credentials into
|
|
7
|
+
# .env.local and regenerate to wire this up.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Auto-generated, never typed or seen — the SAME
|
|
2
|
+
# ManageMasterUserPassword/SessionSecret pattern above, applied to
|
|
3
|
+
# `secret_env`'s own webhook secret instead (deploy_settings' own
|
|
4
|
+
# `secret_env`, read far above). @@web_logical_id@@'s own
|
|
5
|
+
# `lambda_handler.rb` fetches this by ARN at cold start (the
|
|
6
|
+
# `@@webhook_secret_env@@_ARN` Environment variable below) and exposes
|
|
7
|
+
# its plaintext under `ENV["@@webhook_secret_env@@"]` itself — the
|
|
8
|
+
# SAME two-step indirection DB_SECRET_ARN/SESSION_SECRET_ARN already
|
|
9
|
+
# use, and for the identical reason (this Environment block's own
|
|
10
|
+
# header comment on why a resolved plaintext must never land in
|
|
11
|
+
# Lambda's own configuration).
|
|
12
|
+
@@web_logical_id@@WebhookSecret:
|
|
13
|
+
Type: AWS::SecretsManager::Secret
|
|
14
|
+
Properties:
|
|
15
|
+
GenerateSecretString:
|
|
16
|
+
SecretStringTemplate: '{}'
|
|
17
|
+
GenerateStringKey: value
|
|
18
|
+
PasswordLength: 64
|
|
19
|
+
ExcludePunctuation: true
|
|
20
|
+
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
AlbSecurityGroup:
|
|
2
|
+
Type: AWS::EC2::SecurityGroup
|
|
3
|
+
Properties:
|
|
4
|
+
VpcId: !Ref OwningVpcId
|
|
5
|
+
GroupDescription: !Sub "@@infra_name@@ preview ${EnvName} ALB - HTTP ingress from CloudFront only"
|
|
6
|
+
SecurityGroupIngress:
|
|
7
|
+
# The AWS-managed com.amazonaws.global.cloudfront.origin-facing prefix list.
|
|
8
|
+
- IpProtocol: tcp
|
|
9
|
+
FromPort: 80
|
|
10
|
+
ToPort: 80
|
|
11
|
+
SourcePrefixListId: @@prefix_list@@
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
EnvName:
|
|
2
|
+
Type: String
|
|
3
|
+
AllowedPattern: '^[a-z0-9]([a-z0-9-]{0,18}[a-z0-9])?$'
|
|
4
|
+
ConstraintDescription: lowercase letters, digits and hyphens, at most 20 characters, not ending in a hyphen (the ALB name limit is 32).
|
|
5
|
+
DbName:
|
|
6
|
+
Type: String
|
|
7
|
+
AllowedPattern: '^[a-z][a-z0-9_]{0,62}$'
|
|
8
|
+
Description: This preview's own database on the shared instance, created by the one-shot DbInit task before the service starts.
|
|
9
|
+
OwningVpcId:
|
|
10
|
+
Type: AWS::EC2::VPC::Id
|
|
11
|
+
OwningSubnetAId:
|
|
12
|
+
Type: AWS::EC2::Subnet::Id
|
|
13
|
+
OwningSubnetBId:
|
|
14
|
+
Type: AWS::EC2::Subnet::Id
|
|
15
|
+
OwningPublicSubnetAId:
|
|
16
|
+
Type: AWS::EC2::Subnet::Id
|
|
17
|
+
OwningPublicSubnetBId:
|
|
18
|
+
Type: AWS::EC2::Subnet::Id
|
|
19
|
+
OwningSecurityGroupId:
|
|
20
|
+
Type: AWS::EC2::SecurityGroup::Id
|
|
21
|
+
OwningDatabaseEndpoint:
|
|
22
|
+
Type: String
|
|
23
|
+
OwningDatabaseSecretArn:
|
|
24
|
+
Type: String
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
@@id@@:
|
|
2
|
+
Type: AWS::SecretsManager::Secret
|
|
3
|
+
Properties:
|
|
4
|
+
Description: !Sub "@@name@@ of the ${EnvName} preview's @@container@@ container."
|
|
5
|
+
GenerateSecretString:
|
|
6
|
+
SecretStringTemplate: '{}'
|
|
7
|
+
GenerateStringKey: secret
|
|
8
|
+
PasswordLength: 64
|
|
9
|
+
ExcludePunctuation: true
|