@feltdb/core 0.13.0 → 0.16.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.
- package/dist/agent-runtime.d.ts +64 -2
- package/dist/agent-runtime.d.ts.map +1 -1
- package/dist/agent-runtime.js +121 -11
- package/dist/agent-state.d.ts +68 -0
- package/dist/agent-state.d.ts.map +1 -1
- package/dist/agent-state.js +210 -12
- package/dist/agent.d.ts +10 -1
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +10 -1
- package/dist/build-identity.json +12 -4
- package/dist/cli/commands.js +214 -10
- package/dist/cli/publish-engine.js +116 -16
- package/dist/collection.d.ts +3 -1
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +33 -8
- package/dist/create/build-identity.json +12 -4
- package/dist/create/cli.js +1 -1
- package/dist/create/create.js +4 -6
- package/dist/create/managed-account.js +93 -35
- package/dist/create/package-versions.js +1 -1
- package/dist/create/server-source/Cargo.lock +8 -511
- package/dist/create/server-source/Cargo.toml +2 -13
- package/dist/create/server-source/crates/feltdb-client/Cargo.toml +1 -1
- package/dist/create/server-source/crates/feltdb-server/Cargo.toml +1 -1
- package/dist/create/server-source/crates/feltdb-server/README.md +6 -1
- package/dist/create/server-source/crates/feltdb-server/src/app_state.rs +9 -1
- package/dist/create/server-source/crates/feltdb-server/src/auth.rs +85 -25
- package/dist/create/server-source/crates/feltdb-server/src/backup.rs +4 -0
- package/dist/create/server-source/crates/feltdb-server/src/console_accounts.rs +1009 -0
- package/dist/create/server-source/crates/feltdb-server/src/control_authorization.rs +441 -0
- package/dist/create/server-source/crates/feltdb-server/src/identity.rs +68 -6
- package/dist/create/server-source/crates/feltdb-server/src/key_management.rs +355 -23
- package/dist/create/server-source/crates/feltdb-server/src/lib.rs +3 -0
- package/dist/create/server-source/crates/feltdb-server/src/main.rs +1134 -96
- package/dist/create/server-source/crates/feltdb-server/src/redaction.rs +208 -0
- package/dist/create/server-source/crates/feltdb-server/src/tenancy.rs +198 -19
- package/dist/create/server-source/crates/feltdb-server/tests/transaction_precondition_contract.rs +403 -0
- package/dist/create/server-source/crates/feltdb-wasm/Cargo.toml +1 -1
- package/dist/db.d.ts +75 -10
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +168 -29
- package/dist/deployment.d.ts +19 -0
- package/dist/deployment.d.ts.map +1 -1
- package/dist/deployment.js +38 -2
- package/dist/embedded-query.d.ts.map +1 -1
- package/dist/embedded-query.js +5 -4
- package/dist/embedded-transaction.d.ts +8 -4
- package/dist/embedded-transaction.d.ts.map +1 -1
- package/dist/embedded-transaction.js +55 -19
- package/dist/error-codes.d.ts +36 -2
- package/dist/error-codes.d.ts.map +1 -1
- package/dist/error-codes.js +50 -3
- package/dist/feltdb.d.ts +7 -0
- package/dist/feltdb.d.ts.map +1 -1
- package/dist/file-db.d.ts +27 -0
- package/dist/file-db.d.ts.map +1 -1
- package/dist/file-db.js +145 -7
- package/dist/http-client.d.ts +11 -3
- package/dist/http-client.d.ts.map +1 -1
- package/dist/http-client.js +27 -14
- package/dist/http-db.d.ts +43 -1
- package/dist/http-db.d.ts.map +1 -1
- package/dist/http-db.js +287 -59
- package/dist/index.js +1 -1
- package/dist/local-state-lock.d.ts +34 -0
- package/dist/local-state-lock.d.ts.map +1 -0
- package/dist/local-state-lock.js +225 -0
- package/dist/managed-recovery.d.ts +6 -0
- package/dist/managed-recovery.d.ts.map +1 -1
- package/dist/managed-recovery.js +9 -0
- package/dist/reactive-graph.d.ts +0 -3
- package/dist/reactive-graph.d.ts.map +1 -1
- package/dist/reactive-graph.js +11 -1
- package/dist/runtime-registry.d.ts +7 -2
- package/dist/runtime-registry.d.ts.map +1 -1
- package/dist/runtime-registry.js +2 -2
- package/dist/studio/components/index.js +1 -1
- package/dist/studio/{components-BSGmHfif.js → components-CJmzntBi.js} +2 -1
- package/dist/studio/index.js +1 -1
- package/dist/studio-app/assets/{feltdb_wasm-3hDngl1h.js → feltdb_wasm-DtybUY0q.js} +1 -1
- package/dist/studio-app/assets/feltdb_wasm_bg-DsgIUwaB.wasm +0 -0
- package/dist/studio-app/assets/index-C4OffsZl.js +37 -0
- package/dist/studio-app/index.html +1 -1
- package/dist/transaction.d.ts +27 -11
- package/dist/transaction.d.ts.map +1 -1
- package/dist/transaction.js +20 -14
- package/dist/wasm/feltdb_wasm_bg.wasm +0 -0
- package/dist/wasm/package.json +1 -1
- package/dist/workload.d.ts +86 -6
- package/dist/workload.d.ts.map +1 -1
- package/dist/workload.js +51 -3
- package/dist/workspace/workspace-connection.d.ts.map +1 -1
- package/dist/workspace/workspace-connection.js +14 -3
- package/package.json +1 -1
- package/dist/create/server-source/crates/feltdb/Cargo.lock +0 -175
- package/dist/create/server-source/crates/feltdb/Cargo.toml +0 -102
- package/dist/create/server-source/crates/feltdb/LICENSE +0 -21
- package/dist/create/server-source/crates/feltdb/README.md +0 -75
- package/dist/create/server-source/crates/feltdb/benches/baselines/gate-13-redux.json +0 -370
- package/dist/create/server-source/crates/feltdb/benches/gate13_baseline.rs +0 -589
- package/dist/create/server-source/crates/feltdb/benches/gate13_phase_7_1_release_economics.rs +0 -247
- package/dist/create/server-source/crates/feltdb/benches/gate_13_redux.rs +0 -440
- package/dist/create/server-source/crates/feltdb/benches/gate_13_regression_runner.rs +0 -275
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_concurrent_writer_scaling.rs +0 -381
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_production_admission_revalidation.rs +0 -467
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc2_admission_contract.rs +0 -489
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc_root_cause.rs +0 -281
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync1_queued_prototype.rs +0 -606
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync_economics.rs +0 -531
- package/dist/create/server-source/crates/feltdb/benches/gate_14b_causal_backlog_scaling.rs +0 -462
- package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_contract_test.rs +0 -505
- package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_scaling.rs +0 -484
- package/dist/create/server-source/crates/feltdb/benches/gate_14d_combined_dimension_scaling.rs +0 -758
- package/dist/create/server-source/crates/feltdb/benches/phase_7_1_2_optimization_benchmark.rs +0 -421
- package/dist/create/server-source/crates/feltdb/benches/phase_7_1_3_crossover_analysis.rs +0 -329
- package/dist/create/server-source/crates/feltdb/src/acceptance_tests.rs +0 -1705
- package/dist/create/server-source/crates/feltdb/src/acquisition.rs +0 -286
- package/dist/create/server-source/crates/feltdb/src/admission.rs +0 -185
- package/dist/create/server-source/crates/feltdb/src/admission_contract_tests.rs +0 -507
- package/dist/create/server-source/crates/feltdb/src/adversarial_transport.rs +0 -539
- package/dist/create/server-source/crates/feltdb/src/agent_state.rs +0 -320
- package/dist/create/server-source/crates/feltdb/src/agent_transition_contract.rs +0 -1545
- package/dist/create/server-source/crates/feltdb/src/analytics.rs +0 -521
- package/dist/create/server-source/crates/feltdb/src/application.rs +0 -2674
- package/dist/create/server-source/crates/feltdb/src/application_runtime.rs +0 -1070
- package/dist/create/server-source/crates/feltdb/src/authority.rs +0 -479
- package/dist/create/server-source/crates/feltdb/src/authority_failover.rs +0 -847
- package/dist/create/server-source/crates/feltdb/src/authorization.rs +0 -1030
- package/dist/create/server-source/crates/feltdb/src/authorization_security_tests.rs +0 -1122
- package/dist/create/server-source/crates/feltdb/src/bin/feltdb-authority-client.rs +0 -32
- package/dist/create/server-source/crates/feltdb/src/bin/feltdb-authority.rs +0 -19
- package/dist/create/server-source/crates/feltdb/src/bin/feltdb_node.rs +0 -1474
- package/dist/create/server-source/crates/feltdb/src/capabilities/mod.rs +0 -8
- package/dist/create/server-source/crates/feltdb/src/capabilities/search.rs +0 -418
- package/dist/create/server-source/crates/feltdb/src/capabilities/vector.rs +0 -482
- package/dist/create/server-source/crates/feltdb/src/capability.rs +0 -903
- package/dist/create/server-source/crates/feltdb/src/cardinality_diagnostics.rs +0 -263
- package/dist/create/server-source/crates/feltdb/src/cardinality_endpoint.rs +0 -77
- package/dist/create/server-source/crates/feltdb/src/causal_backlog_bound.rs +0 -496
- package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier.rs +0 -2574
- package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier_phase_7_1.rs +0 -212
- package/dist/create/server-source/crates/feltdb/src/concurrency_fuzzing.rs +0 -422
- package/dist/create/server-source/crates/feltdb/src/consistency_contract.rs +0 -445
- package/dist/create/server-source/crates/feltdb/src/content_distribution.rs +0 -465
- package/dist/create/server-source/crates/feltdb/src/convergence.rs +0 -634
- package/dist/create/server-source/crates/feltdb/src/crash_atomic_boundary.rs +0 -427
- package/dist/create/server-source/crates/feltdb/src/crash_injection.rs +0 -376
- package/dist/create/server-source/crates/feltdb/src/crash_recovery_tests.rs +0 -365
- package/dist/create/server-source/crates/feltdb/src/cron.rs +0 -294
- package/dist/create/server-source/crates/feltdb/src/dedup_bound_investigation.rs +0 -483
- package/dist/create/server-source/crates/feltdb/src/distributed_indexing.rs +0 -477
- package/dist/create/server-source/crates/feltdb/src/distributed_tests.rs +0 -1003
- package/dist/create/server-source/crates/feltdb/src/distributed_transactions.rs +0 -1334
- package/dist/create/server-source/crates/feltdb/src/durability_guarantees.rs +0 -368
- package/dist/create/server-source/crates/feltdb/src/durable_dedup_set.rs +0 -231
- package/dist/create/server-source/crates/feltdb/src/durable_operation_identity.rs +0 -482
- package/dist/create/server-source/crates/feltdb/src/durable_operation_log.rs +0 -203
- package/dist/create/server-source/crates/feltdb/src/durable_sync.rs +0 -317
- package/dist/create/server-source/crates/feltdb/src/equality_index.rs +0 -595
- package/dist/create/server-source/crates/feltdb/src/execution.rs +0 -426
- package/dist/create/server-source/crates/feltdb/src/in_process_transport.rs +0 -214
- package/dist/create/server-source/crates/feltdb/src/indexing.rs +0 -776
- package/dist/create/server-source/crates/feltdb/src/lib.rs +0 -7274
- package/dist/create/server-source/crates/feltdb/src/managed_cas_tests.rs +0 -234
- package/dist/create/server-source/crates/feltdb/src/materialization.rs +0 -184
- package/dist/create/server-source/crates/feltdb/src/metrics.rs +0 -266
- package/dist/create/server-source/crates/feltdb/src/multi_node_convergence.rs +0 -310
- package/dist/create/server-source/crates/feltdb/src/multi_operation_transaction.rs +0 -736
- package/dist/create/server-source/crates/feltdb/src/observability.rs +0 -379
- package/dist/create/server-source/crates/feltdb/src/operation.rs +0 -290
- package/dist/create/server-source/crates/feltdb/src/operation_algebra.rs +0 -439
- package/dist/create/server-source/crates/feltdb/src/operation_log.rs +0 -349
- package/dist/create/server-source/crates/feltdb/src/p1_application_atomicity.rs +0 -332
- package/dist/create/server-source/crates/feltdb/src/p1_atomicity_acceptance.rs +0 -718
- package/dist/create/server-source/crates/feltdb/src/partition_reconciliation.rs +0 -487
- package/dist/create/server-source/crates/feltdb/src/peer_registry.rs +0 -166
- package/dist/create/server-source/crates/feltdb/src/permutation_scheduler.rs +0 -289
- package/dist/create/server-source/crates/feltdb/src/persistence_reality.rs +0 -566
- package/dist/create/server-source/crates/feltdb/src/phase1b_acceptance.rs +0 -3391
- package/dist/create/server-source/crates/feltdb/src/phase1c1_acceptance.rs +0 -203
- package/dist/create/server-source/crates/feltdb/src/phase1c2_acceptance.rs +0 -261
- package/dist/create/server-source/crates/feltdb/src/phase1c3_acceptance.rs +0 -502
- package/dist/create/server-source/crates/feltdb/src/phase1c_atomicity_proof.rs +0 -216
- package/dist/create/server-source/crates/feltdb/src/phase5_integration.rs +0 -303
- package/dist/create/server-source/crates/feltdb/src/phase5_scenarios.rs +0 -323
- package/dist/create/server-source/crates/feltdb/src/phase6_adversarial_scenarios.rs +0 -531
- package/dist/create/server-source/crates/feltdb/src/phase6_convergence_validator.rs +0 -406
- package/dist/create/server-source/crates/feltdb/src/phase6_persistence.rs +0 -436
- package/dist/create/server-source/crates/feltdb/src/phase_1c_real_tcp.rs +0 -387
- package/dist/create/server-source/crates/feltdb/src/phase_2a_failures.rs +0 -378
- package/dist/create/server-source/crates/feltdb/src/phase_2b_network.rs +0 -359
- package/dist/create/server-source/crates/feltdb/src/phase_2c_cascading.rs +0 -372
- package/dist/create/server-source/crates/feltdb/src/phase_3_durability.rs +0 -404
- package/dist/create/server-source/crates/feltdb/src/phase_4_baseline.rs +0 -376
- package/dist/create/server-source/crates/feltdb/src/phase_5_soak.rs +0 -461
- package/dist/create/server-source/crates/feltdb/src/policy_evaluation.rs +0 -2125
- package/dist/create/server-source/crates/feltdb/src/production_api.rs +0 -418
- package/dist/create/server-source/crates/feltdb/src/provenance.rs +0 -207
- package/dist/create/server-source/crates/feltdb/src/query_execution_diagnostics.rs +0 -126
- package/dist/create/server-source/crates/feltdb/src/query_performance.rs +0 -218
- package/dist/create/server-source/crates/feltdb/src/read_basis.rs +0 -257
- package/dist/create/server-source/crates/feltdb/src/references.rs +0 -404
- package/dist/create/server-source/crates/feltdb/src/replay_fuzzing.rs +0 -401
- package/dist/create/server-source/crates/feltdb/src/replica_acknowledgements.rs +0 -501
- package/dist/create/server-source/crates/feltdb/src/replica_membership.rs +0 -680
- package/dist/create/server-source/crates/feltdb/src/replication_manager.rs +0 -163
- package/dist/create/server-source/crates/feltdb/src/replication_protocol.rs +0 -133
- package/dist/create/server-source/crates/feltdb/src/routing.rs +0 -409
- package/dist/create/server-source/crates/feltdb/src/semantic_decision.rs +0 -2029
- package/dist/create/server-source/crates/feltdb/src/semantic_query.rs +0 -599
- package/dist/create/server-source/crates/feltdb/src/sharding.rs +0 -549
- package/dist/create/server-source/crates/feltdb/src/state_conflict_contract.rs +0 -516
- package/dist/create/server-source/crates/feltdb/src/state_contract.rs +0 -5894
- package/dist/create/server-source/crates/feltdb/src/state_diff_contract.rs +0 -222
- package/dist/create/server-source/crates/feltdb/src/state_facade.rs +0 -320
- package/dist/create/server-source/crates/feltdb/src/state_hash.rs +0 -291
- package/dist/create/server-source/crates/feltdb/src/state_model.rs +0 -4158
- package/dist/create/server-source/crates/feltdb/src/state_transition_store.rs +0 -379
- package/dist/create/server-source/crates/feltdb/src/state_trigger.rs +0 -673
- package/dist/create/server-source/crates/feltdb/src/storage.rs +0 -273
- package/dist/create/server-source/crates/feltdb/src/submission.rs +0 -471
- package/dist/create/server-source/crates/feltdb/src/sync.rs +0 -495
- package/dist/create/server-source/crates/feltdb/src/sync_contract.rs +0 -822
- package/dist/create/server-source/crates/feltdb/src/tcp_transport.rs +0 -433
- package/dist/create/server-source/crates/feltdb/src/transaction_api.rs +0 -462
- package/dist/create/server-source/crates/feltdb/src/transaction_invariants.rs +0 -965
- package/dist/create/server-source/crates/feltdb/src/transaction_preconditions.rs +0 -1120
- package/dist/create/server-source/crates/feltdb/src/transactions.rs +0 -643
- package/dist/create/server-source/crates/feltdb/src/trigger.rs +0 -390
- package/dist/create/server-source/crates/feltdb/src/trigger_contract.rs +0 -749
- package/dist/create/server-source/crates/feltdb/src/versioned_object_substrate.rs +0 -708
- package/dist/create/server-source/crates/feltdb/src/worker_mesh.rs +0 -1133
- package/dist/create/server-source/crates/feltdb/src/workflow.rs +0 -713
- package/dist/create/server-source/crates/feltdb/src/workflow_acceptance_tests.rs +0 -510
- package/dist/create/server-source/crates/feltdb/src/workflow_integration.rs +0 -354
- package/dist/create/server-source/crates/feltdb/src/workflow_runtime.rs +0 -594
- package/dist/create/server-source/crates/feltdb/src/workload.rs +0 -2886
- package/dist/create/server-source/crates/feltdb/src/workload_diagnostics.rs +0 -456
- package/dist/create/server-source/crates/feltdb/tests/agent_state_native.rs +0 -1188
- package/dist/create/server-source/crates/feltdb/tests/agent_transition_contract_conformance.rs +0 -2884
- package/dist/create/server-source/crates/feltdb/tests/authority_process.rs +0 -297
- package/dist/create/server-source/crates/feltdb/tests/authority_transaction_identity.rs +0 -534
- package/dist/create/server-source/crates/feltdb/tests/bounded_read_contract.rs +0 -132
- package/dist/create/server-source/crates/feltdb/tests/branching_evidence.rs +0 -299
- package/dist/create/server-source/crates/feltdb/tests/common/mod.rs +0 -96
- package/dist/create/server-source/crates/feltdb/tests/compaction_stall_contract.rs +0 -272
- package/dist/create/server-source/crates/feltdb/tests/crash_durability_contract.rs +0 -467
- package/dist/create/server-source/crates/feltdb/tests/current_revision_authority_evidence.rs +0 -309
- package/dist/create/server-source/crates/feltdb/tests/durable_backup_contract.rs +0 -445
- package/dist/create/server-source/crates/feltdb/tests/durable_corruption_contract.rs +0 -518
- package/dist/create/server-source/crates/feltdb/tests/durable_format_compatibility.rs +0 -392
- package/dist/create/server-source/crates/feltdb/tests/feltdb_state_boundary_tests.rs +0 -850
- package/dist/create/server-source/crates/feltdb/tests/fixtures/agent_transition_corpus.json +0 -23340
- package/dist/create/server-source/crates/feltdb/tests/fixtures/state_conflict_contract_corpus.json +0 -1916
- package/dist/create/server-source/crates/feltdb/tests/fixtures/state_diff_contract_corpus.json +0 -1878
- package/dist/create/server-source/crates/feltdb/tests/fixtures/trigger_contract_corpus.json +0 -1862
- package/dist/create/server-source/crates/feltdb/tests/generalized_version_control_evidence.rs +0 -123
- package/dist/create/server-source/crates/feltdb/tests/generalized_version_control_substrate_completion.rs +0 -299
- package/dist/create/server-source/crates/feltdb/tests/local_process_ownership.rs +0 -69
- package/dist/create/server-source/crates/feltdb/tests/managed_incident_regression.rs +0 -191
- package/dist/create/server-source/crates/feltdb/tests/operational_health_contract.rs +0 -278
- package/dist/create/server-source/crates/feltdb/tests/pr34_query_collection.rs +0 -234
- package/dist/create/server-source/crates/feltdb/tests/pr35_equality_index.rs +0 -947
- package/dist/create/server-source/crates/feltdb/tests/pr7_self_authorization_proof.rs +0 -404
- package/dist/create/server-source/crates/feltdb/tests/pr8_vocabulary_assessment.rs +0 -916
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase2_boundary_tests.rs +0 -1045
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase3a_path_a_tests.rs +0 -347
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_authorized_mutations.rs +0 -361
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_role_based_authorization.rs +0 -330
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_simple_auth_delete.rs +0 -93
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_team_delete_role_authorization.rs +0 -622
- package/dist/create/server-source/crates/feltdb/tests/pr9_teams_role_based_access.rs +0 -517
- package/dist/create/server-source/crates/feltdb/tests/production_certification.rs +0 -1153
- package/dist/create/server-source/crates/feltdb/tests/production_contract.rs +0 -771
- package/dist/create/server-source/crates/feltdb/tests/production_readiness_contract.rs +0 -1383
- package/dist/create/server-source/crates/feltdb/tests/reconciliation_application.rs +0 -868
- package/dist/create/server-source/crates/feltdb/tests/reconciliation_wire_format_evidence.rs +0 -221
- package/dist/create/server-source/crates/feltdb/tests/replicated_history_contract.rs +0 -417
- package/dist/create/server-source/crates/feltdb/tests/resource_scoped_revisions.rs +0 -338
- package/dist/create/server-source/crates/feltdb/tests/revision_identity_contract.rs +0 -1039
- package/dist/create/server-source/crates/feltdb/tests/revision_model_decision.rs +0 -739
- package/dist/create/server-source/crates/feltdb/tests/revision_retention_boundary_evidence.rs +0 -452
- package/dist/create/server-source/crates/feltdb/tests/saas_authorization_integration.rs +0 -81
- package/dist/create/server-source/crates/feltdb/tests/saas_invitation_lifecycle.rs +0 -438
- package/dist/create/server-source/crates/feltdb/tests/semantic_decision.rs +0 -1165
- package/dist/create/server-source/crates/feltdb/tests/semantic_query.rs +0 -767
- package/dist/create/server-source/crates/feltdb/tests/semantic_query_contract.rs +0 -363
- package/dist/create/server-source/crates/feltdb/tests/state_conflict_contract_conformance.rs +0 -1799
- package/dist/create/server-source/crates/feltdb/tests/state_diff_contract_conformance.rs +0 -1316
- package/dist/create/server-source/crates/feltdb/tests/state_model_integration.rs +0 -358
- package/dist/create/server-source/crates/feltdb/tests/state_persistence_integration.rs +0 -365
- package/dist/create/server-source/crates/feltdb/tests/state_ref_authority.rs +0 -918
- package/dist/create/server-source/crates/feltdb/tests/state_store_boundary_evidence.rs +0 -299
- package/dist/create/server-source/crates/feltdb/tests/storage_independent_versioned_object_substrate.rs +0 -328
- package/dist/create/server-source/crates/feltdb/tests/sync_divergence_evidence.rs +0 -255
- package/dist/create/server-source/crates/feltdb/tests/three_way_input_boundary_evidence.rs +0 -249
- package/dist/create/server-source/crates/feltdb/tests/trigger_contract_conformance.rs +0 -994
- package/dist/create/server-source/crates/feltdb/tests/workload_envelope_contract.rs +0 -484
- package/dist/studio-app/assets/feltdb_wasm_bg-CFQT4gCy.wasm +0 -0
- package/dist/studio-app/assets/index-Dql1hS5m.js +0 -30
|
@@ -1,361 +0,0 @@
|
|
|
1
|
-
//! PR #9 Phase 3C: Authorized Mutation API Test
|
|
2
|
-
//!
|
|
3
|
-
//! Test that the new authorized mutation API properly enforces authorization.
|
|
4
|
-
//! Authorization evaluation happens INSIDE the FeltDB boundary, before mutations are applied.
|
|
5
|
-
|
|
6
|
-
use feltdb::{state_contract::AuthorizationContext, FeltDb};
|
|
7
|
-
use serde_json::json;
|
|
8
|
-
use tempfile::TempDir;
|
|
9
|
-
|
|
10
|
-
#[test]
|
|
11
|
-
fn authorized_insert_requires_state_write_capability() -> Result<(), Box<dyn std::error::Error>> {
|
|
12
|
-
let temp_dir = TempDir::new()?;
|
|
13
|
-
let db = FeltDb::open(temp_dir.path().join("test.db"))?;
|
|
14
|
-
|
|
15
|
-
let authorized_context = AuthorizationContext {
|
|
16
|
-
subject: ":user-1".to_string(),
|
|
17
|
-
tenant_id: "tenant-1".to_string(),
|
|
18
|
-
application_id: "app".to_string(),
|
|
19
|
-
revision_id: "rev-1".to_string(),
|
|
20
|
-
capabilities: vec!["state:write".to_string()].into_iter().collect(),
|
|
21
|
-
readable_collections: Default::default(),
|
|
22
|
-
writable_collections: Default::default(),
|
|
23
|
-
field_projections: Default::default(),
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
let unauthorized_context = AuthorizationContext {
|
|
27
|
-
subject: ":user-2".to_string(),
|
|
28
|
-
tenant_id: "tenant-1".to_string(),
|
|
29
|
-
application_id: "app".to_string(),
|
|
30
|
-
revision_id: "rev-1".to_string(),
|
|
31
|
-
capabilities: vec!["state:read".to_string()].into_iter().collect(),
|
|
32
|
-
readable_collections: Default::default(),
|
|
33
|
-
writable_collections: Default::default(),
|
|
34
|
-
field_projections: Default::default(),
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
// Authorized insert should succeed
|
|
38
|
-
let result = db.insert_with_authorization(
|
|
39
|
-
"User#user-1",
|
|
40
|
-
json!({"_id": "user-1", "name": "Alice"}),
|
|
41
|
-
&authorized_context,
|
|
42
|
-
);
|
|
43
|
-
assert!(
|
|
44
|
-
result.is_ok(),
|
|
45
|
-
"Authorized insert should succeed: {:?}",
|
|
46
|
-
result
|
|
47
|
-
);
|
|
48
|
-
|
|
49
|
-
// Verify record was inserted
|
|
50
|
-
let value = db.get::<serde_json::Value>("User#user-1")?;
|
|
51
|
-
assert!(value.is_some(), "Record should exist after insert");
|
|
52
|
-
|
|
53
|
-
// Unauthorized insert should fail
|
|
54
|
-
let result = db.insert_with_authorization(
|
|
55
|
-
"User#user-2",
|
|
56
|
-
json!({"_id": "user-2", "name": "Bob"}),
|
|
57
|
-
&unauthorized_context,
|
|
58
|
-
);
|
|
59
|
-
assert!(
|
|
60
|
-
result.is_err(),
|
|
61
|
-
"Unauthorized insert should fail: {:?}",
|
|
62
|
-
result
|
|
63
|
-
);
|
|
64
|
-
|
|
65
|
-
// Verify unauthorized insert did not create record
|
|
66
|
-
let value = db.get::<serde_json::Value>("User#user-2")?;
|
|
67
|
-
assert!(
|
|
68
|
-
value.is_none(),
|
|
69
|
-
"Unauthorized insert should not create record"
|
|
70
|
-
);
|
|
71
|
-
|
|
72
|
-
Ok(())
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
#[test]
|
|
76
|
-
fn authorized_delete_requires_state_write_capability() -> Result<(), Box<dyn std::error::Error>> {
|
|
77
|
-
let temp_dir = TempDir::new()?;
|
|
78
|
-
let db = FeltDb::open(temp_dir.path().join("test.db"))?;
|
|
79
|
-
|
|
80
|
-
let authorized_context = AuthorizationContext {
|
|
81
|
-
subject: ":user-1".to_string(),
|
|
82
|
-
tenant_id: "tenant-1".to_string(),
|
|
83
|
-
application_id: "app".to_string(),
|
|
84
|
-
revision_id: "rev-1".to_string(),
|
|
85
|
-
capabilities: vec!["state:write".to_string()].into_iter().collect(),
|
|
86
|
-
readable_collections: Default::default(),
|
|
87
|
-
writable_collections: Default::default(),
|
|
88
|
-
field_projections: Default::default(),
|
|
89
|
-
};
|
|
90
|
-
|
|
91
|
-
let unauthorized_context = AuthorizationContext {
|
|
92
|
-
subject: ":user-2".to_string(),
|
|
93
|
-
tenant_id: "tenant-1".to_string(),
|
|
94
|
-
application_id: "app".to_string(),
|
|
95
|
-
revision_id: "rev-1".to_string(),
|
|
96
|
-
capabilities: vec!["state:read".to_string()].into_iter().collect(),
|
|
97
|
-
readable_collections: Default::default(),
|
|
98
|
-
writable_collections: Default::default(),
|
|
99
|
-
field_projections: Default::default(),
|
|
100
|
-
};
|
|
101
|
-
|
|
102
|
-
// Create a record first
|
|
103
|
-
db.insert_with_authorization(
|
|
104
|
-
"Team#team-1",
|
|
105
|
-
json!({"_id": "team-1", "name": "Engineering"}),
|
|
106
|
-
&authorized_context,
|
|
107
|
-
)?;
|
|
108
|
-
|
|
109
|
-
// Verify record exists
|
|
110
|
-
let value = db.get::<serde_json::Value>("Team#team-1")?;
|
|
111
|
-
assert!(value.is_some(), "Record should exist before delete");
|
|
112
|
-
|
|
113
|
-
// Unauthorized delete should fail
|
|
114
|
-
let result = db.delete_with_authorization("Team#team-1", &unauthorized_context);
|
|
115
|
-
assert!(
|
|
116
|
-
result.is_err(),
|
|
117
|
-
"Unauthorized delete should be denied: {:?}",
|
|
118
|
-
result
|
|
119
|
-
);
|
|
120
|
-
|
|
121
|
-
// Verify record still exists after denied delete
|
|
122
|
-
let value = db.get::<serde_json::Value>("Team#team-1")?;
|
|
123
|
-
assert!(
|
|
124
|
-
value.is_some(),
|
|
125
|
-
"Record should still exist after unauthorized delete attempt"
|
|
126
|
-
);
|
|
127
|
-
|
|
128
|
-
// Authorized delete should succeed
|
|
129
|
-
let result = db.delete_with_authorization("Team#team-1", &authorized_context);
|
|
130
|
-
assert!(
|
|
131
|
-
result.is_ok(),
|
|
132
|
-
"Authorized delete should succeed: {:?}",
|
|
133
|
-
result
|
|
134
|
-
);
|
|
135
|
-
|
|
136
|
-
// Verify record is deleted
|
|
137
|
-
let value = db.get::<serde_json::Value>("Team#team-1")?;
|
|
138
|
-
assert!(
|
|
139
|
-
value.is_none(),
|
|
140
|
-
"Record should be deleted after authorized delete"
|
|
141
|
-
);
|
|
142
|
-
|
|
143
|
-
Ok(())
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
#[test]
|
|
147
|
-
fn authorized_update_requires_state_write_capability() -> Result<(), Box<dyn std::error::Error>> {
|
|
148
|
-
let temp_dir = TempDir::new()?;
|
|
149
|
-
let db = FeltDb::open(temp_dir.path().join("test.db"))?;
|
|
150
|
-
|
|
151
|
-
let authorized_context = AuthorizationContext {
|
|
152
|
-
subject: ":user-1".to_string(),
|
|
153
|
-
tenant_id: "tenant-1".to_string(),
|
|
154
|
-
application_id: "app".to_string(),
|
|
155
|
-
revision_id: "rev-1".to_string(),
|
|
156
|
-
capabilities: vec!["state:write".to_string()].into_iter().collect(),
|
|
157
|
-
readable_collections: Default::default(),
|
|
158
|
-
writable_collections: Default::default(),
|
|
159
|
-
field_projections: Default::default(),
|
|
160
|
-
};
|
|
161
|
-
|
|
162
|
-
let unauthorized_context = AuthorizationContext {
|
|
163
|
-
subject: ":user-2".to_string(),
|
|
164
|
-
tenant_id: "tenant-1".to_string(),
|
|
165
|
-
application_id: "app".to_string(),
|
|
166
|
-
revision_id: "rev-1".to_string(),
|
|
167
|
-
capabilities: vec!["state:read".to_string()].into_iter().collect(),
|
|
168
|
-
readable_collections: Default::default(),
|
|
169
|
-
writable_collections: Default::default(),
|
|
170
|
-
field_projections: Default::default(),
|
|
171
|
-
};
|
|
172
|
-
|
|
173
|
-
// Create a record
|
|
174
|
-
db.insert_with_authorization(
|
|
175
|
-
"Organization#org-1",
|
|
176
|
-
json!({"_id": "org-1", "name": "Acme Corp"}),
|
|
177
|
-
&authorized_context,
|
|
178
|
-
)?;
|
|
179
|
-
|
|
180
|
-
let original = db.get::<serde_json::Value>("Organization#org-1")?;
|
|
181
|
-
assert_eq!(
|
|
182
|
-
original
|
|
183
|
-
.as_ref()
|
|
184
|
-
.and_then(|v| v.get("name"))
|
|
185
|
-
.and_then(|v| v.as_str()),
|
|
186
|
-
Some("Acme Corp")
|
|
187
|
-
);
|
|
188
|
-
|
|
189
|
-
// Unauthorized update should fail
|
|
190
|
-
let result = db.update_with_authorization(
|
|
191
|
-
"Organization#org-1",
|
|
192
|
-
json!({"_id": "org-1", "name": "Acme Inc"}),
|
|
193
|
-
&unauthorized_context,
|
|
194
|
-
);
|
|
195
|
-
assert!(
|
|
196
|
-
result.is_err(),
|
|
197
|
-
"Unauthorized update should fail: {:?}",
|
|
198
|
-
result
|
|
199
|
-
);
|
|
200
|
-
|
|
201
|
-
// Verify record was not changed
|
|
202
|
-
let value = db.get::<serde_json::Value>("Organization#org-1")?;
|
|
203
|
-
assert_eq!(
|
|
204
|
-
value
|
|
205
|
-
.as_ref()
|
|
206
|
-
.and_then(|v| v.get("name"))
|
|
207
|
-
.and_then(|v| v.as_str()),
|
|
208
|
-
Some("Acme Corp"),
|
|
209
|
-
"Unauthorized update should not change record"
|
|
210
|
-
);
|
|
211
|
-
|
|
212
|
-
// Authorized update should succeed
|
|
213
|
-
let result = db.update_with_authorization(
|
|
214
|
-
"Organization#org-1",
|
|
215
|
-
json!({"_id": "org-1", "name": "Acme Inc"}),
|
|
216
|
-
&authorized_context,
|
|
217
|
-
);
|
|
218
|
-
assert!(
|
|
219
|
-
result.is_ok(),
|
|
220
|
-
"Authorized update should succeed: {:?}",
|
|
221
|
-
result
|
|
222
|
-
);
|
|
223
|
-
|
|
224
|
-
// Verify record was updated
|
|
225
|
-
let value = db.get::<serde_json::Value>("Organization#org-1")?;
|
|
226
|
-
assert_eq!(
|
|
227
|
-
value
|
|
228
|
-
.as_ref()
|
|
229
|
-
.and_then(|v| v.get("name"))
|
|
230
|
-
.and_then(|v| v.as_str()),
|
|
231
|
-
Some("Acme Inc"),
|
|
232
|
-
"Authorized update should change record"
|
|
233
|
-
);
|
|
234
|
-
|
|
235
|
-
Ok(())
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
#[test]
|
|
239
|
-
fn authorization_context_flows_through_mutations() -> Result<(), Box<dyn std::error::Error>> {
|
|
240
|
-
// This test verifies that AuthorizationContext is properly threaded through all mutation paths
|
|
241
|
-
let temp_dir = TempDir::new()?;
|
|
242
|
-
let db = FeltDb::open(temp_dir.path().join("test.db"))?;
|
|
243
|
-
|
|
244
|
-
let context = AuthorizationContext {
|
|
245
|
-
subject: ":user-1".to_string(),
|
|
246
|
-
tenant_id: "tenant-1".to_string(),
|
|
247
|
-
application_id: "app".to_string(),
|
|
248
|
-
revision_id: "rev-1".to_string(),
|
|
249
|
-
capabilities: vec!["state:write".to_string()].into_iter().collect(),
|
|
250
|
-
readable_collections: Default::default(),
|
|
251
|
-
writable_collections: Default::default(),
|
|
252
|
-
field_projections: Default::default(),
|
|
253
|
-
};
|
|
254
|
-
|
|
255
|
-
// Insert, update, delete should all accept and use AuthorizationContext
|
|
256
|
-
db.insert_with_authorization(
|
|
257
|
-
"Organization#org-1",
|
|
258
|
-
json!({"_id": "org-1", "name": "Acme"}),
|
|
259
|
-
&context,
|
|
260
|
-
)?;
|
|
261
|
-
|
|
262
|
-
db.update_with_authorization(
|
|
263
|
-
"Organization#org-1",
|
|
264
|
-
json!({"_id": "org-1", "name": "Acme Inc"}),
|
|
265
|
-
&context,
|
|
266
|
-
)?;
|
|
267
|
-
|
|
268
|
-
db.delete_with_authorization("Organization#org-1", &context)?;
|
|
269
|
-
|
|
270
|
-
// Verify record is gone
|
|
271
|
-
let value = db.get::<serde_json::Value>("Organization#org-1")?;
|
|
272
|
-
assert!(value.is_none(), "Record should be deleted");
|
|
273
|
-
|
|
274
|
-
Ok(())
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
#[test]
|
|
278
|
-
fn atomic_transaction_with_authorization_denies_on_any_mutation_failure(
|
|
279
|
-
) -> Result<(), Box<dyn std::error::Error>> {
|
|
280
|
-
let temp_dir = TempDir::new()?;
|
|
281
|
-
let db = FeltDb::open(temp_dir.path().join("test.db"))?;
|
|
282
|
-
|
|
283
|
-
let authorized_context = AuthorizationContext {
|
|
284
|
-
subject: ":user-1".to_string(),
|
|
285
|
-
tenant_id: "tenant-1".to_string(),
|
|
286
|
-
application_id: "app".to_string(),
|
|
287
|
-
revision_id: "rev-1".to_string(),
|
|
288
|
-
capabilities: vec!["state:write".to_string()].into_iter().collect(),
|
|
289
|
-
readable_collections: Default::default(),
|
|
290
|
-
writable_collections: Default::default(),
|
|
291
|
-
field_projections: Default::default(),
|
|
292
|
-
};
|
|
293
|
-
|
|
294
|
-
let unauthorized_context = AuthorizationContext {
|
|
295
|
-
subject: ":user-2".to_string(),
|
|
296
|
-
tenant_id: "tenant-1".to_string(),
|
|
297
|
-
application_id: "app".to_string(),
|
|
298
|
-
revision_id: "rev-1".to_string(),
|
|
299
|
-
capabilities: vec!["state:read".to_string()].into_iter().collect(),
|
|
300
|
-
readable_collections: Default::default(),
|
|
301
|
-
writable_collections: Default::default(),
|
|
302
|
-
field_projections: Default::default(),
|
|
303
|
-
};
|
|
304
|
-
|
|
305
|
-
// Create initial records
|
|
306
|
-
db.insert_with_authorization("User#user-1", json!({"_id": "user-1"}), &authorized_context)?;
|
|
307
|
-
db.insert_with_authorization("Team#team-1", json!({"_id": "team-1"}), &authorized_context)?;
|
|
308
|
-
|
|
309
|
-
// Attempt atomic transaction with unauthorized context
|
|
310
|
-
// Should be rejected without applying ANY mutations
|
|
311
|
-
let result = db.apply_atomic_transaction_with_authorization(
|
|
312
|
-
"txn-1",
|
|
313
|
-
None,
|
|
314
|
-
&[],
|
|
315
|
-
&[], // Empty mutations for this test
|
|
316
|
-
None,
|
|
317
|
-
&unauthorized_context,
|
|
318
|
-
);
|
|
319
|
-
assert!(
|
|
320
|
-
result.is_err(),
|
|
321
|
-
"Transaction with unauthorized context should be rejected"
|
|
322
|
-
);
|
|
323
|
-
|
|
324
|
-
Ok(())
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
#[test]
|
|
328
|
-
fn authorization_error_messages_are_clear() -> Result<(), Box<dyn std::error::Error>> {
|
|
329
|
-
let temp_dir = TempDir::new()?;
|
|
330
|
-
let db = FeltDb::open(temp_dir.path().join("test.db"))?;
|
|
331
|
-
|
|
332
|
-
let unauthorized_context = AuthorizationContext {
|
|
333
|
-
subject: ":user-1".to_string(),
|
|
334
|
-
tenant_id: "tenant-1".to_string(),
|
|
335
|
-
application_id: "app".to_string(),
|
|
336
|
-
revision_id: "rev-1".to_string(),
|
|
337
|
-
capabilities: vec!["state:read".to_string()].into_iter().collect(),
|
|
338
|
-
readable_collections: Default::default(),
|
|
339
|
-
writable_collections: Default::default(),
|
|
340
|
-
field_projections: Default::default(),
|
|
341
|
-
};
|
|
342
|
-
|
|
343
|
-
let result = db.insert_with_authorization(
|
|
344
|
-
"User#user-1",
|
|
345
|
-
json!({"_id": "user-1"}),
|
|
346
|
-
&unauthorized_context,
|
|
347
|
-
);
|
|
348
|
-
|
|
349
|
-
if let Err(err) = result {
|
|
350
|
-
let error_message = format!("{}", err);
|
|
351
|
-
assert!(
|
|
352
|
-
error_message.contains("AUTHORIZATION_DENIED"),
|
|
353
|
-
"Error should contain AUTHORIZATION_DENIED: {}",
|
|
354
|
-
error_message
|
|
355
|
-
);
|
|
356
|
-
} else {
|
|
357
|
-
panic!("Should have returned authorization error");
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
Ok(())
|
|
361
|
-
}
|
package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_role_based_authorization.rs
DELETED
|
@@ -1,330 +0,0 @@
|
|
|
1
|
-
//! PR #9 Phase 3C: Role-Based Authorization Testing
|
|
2
|
-
//!
|
|
3
|
-
//! CRITICAL DISCIPLINE:
|
|
4
|
-
//! - Same privileged operation invoked by all actors
|
|
5
|
-
//! - No application gatekeeping or role checking before FeltDB call
|
|
6
|
-
//! - Authorization decision made entirely by FeltDB runtime
|
|
7
|
-
//! - Document the authorization path (why PERMIT/DENY, not just the boolean)
|
|
8
|
-
//! - Test whether frozen vocabulary can express role-based security invariant
|
|
9
|
-
//!
|
|
10
|
-
//! PRODUCT DECISION (Locked In):
|
|
11
|
-
//! Admin is an authorization boundary.
|
|
12
|
-
//! A team admin is authorized to perform privileged team operations
|
|
13
|
-
//! that ordinary members are not.
|
|
14
|
-
//!
|
|
15
|
-
//! QUESTION:
|
|
16
|
-
//! Can existing frozen vocabulary (authenticated, self, owner, member)
|
|
17
|
-
//! express this authorization using TeamMembership.role as domain fact?
|
|
18
|
-
//!
|
|
19
|
-
//! TEST STRATEGY:
|
|
20
|
-
//! 1. Create identical privileged operation
|
|
21
|
-
//! 2. Invoke it with owner, admin, member, non_member actors
|
|
22
|
-
//! 3. Document what FeltDB permits/denies and why
|
|
23
|
-
//! 4. Analyze: Does frozen vocabulary handle role-based auth?
|
|
24
|
-
|
|
25
|
-
use feltdb::{
|
|
26
|
-
state_contract::{
|
|
27
|
-
AuthorizationContext, CollectionSchema, FieldConstraints, FieldSchema, FieldType,
|
|
28
|
-
PrimitiveType, StateSchema,
|
|
29
|
-
},
|
|
30
|
-
FeltDb,
|
|
31
|
-
};
|
|
32
|
-
use serde_json::json;
|
|
33
|
-
use tempfile::TempDir;
|
|
34
|
-
|
|
35
|
-
/// Test fixture for Phase 3C role-based authorization investigation
|
|
36
|
-
struct RoleAuthTestFixture {
|
|
37
|
-
db: FeltDb,
|
|
38
|
-
// Actors
|
|
39
|
-
owner_id: String,
|
|
40
|
-
admin_id: String,
|
|
41
|
-
member_id: String,
|
|
42
|
-
non_member_id: String,
|
|
43
|
-
// Resources
|
|
44
|
-
team_id: String,
|
|
45
|
-
org_id: String,
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
impl RoleAuthTestFixture {
|
|
49
|
-
fn actor_context(&self, actor_id: &str) -> AuthorizationContext {
|
|
50
|
-
AuthorizationContext {
|
|
51
|
-
subject: format!(":{}", actor_id),
|
|
52
|
-
tenant_id: "tenant".to_string(),
|
|
53
|
-
application_id: "saas-portal".to_string(),
|
|
54
|
-
revision_id: "rev-1".to_string(),
|
|
55
|
-
capabilities: ["state:read".to_string()].into(),
|
|
56
|
-
readable_collections: Default::default(),
|
|
57
|
-
writable_collections: Default::default(),
|
|
58
|
-
field_projections: Default::default(),
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
fn setup() -> Result<Self, Box<dyn std::error::Error>> {
|
|
63
|
-
let temp_dir = TempDir::new()?;
|
|
64
|
-
let db_path = temp_dir.path().join("role_auth_tests.db");
|
|
65
|
-
let db = FeltDb::open(&db_path)?;
|
|
66
|
-
|
|
67
|
-
let owner_id = "user-owner".to_string();
|
|
68
|
-
let admin_id = "user-admin".to_string();
|
|
69
|
-
let member_id = "user-member".to_string();
|
|
70
|
-
let non_member_id = "user-non-member".to_string();
|
|
71
|
-
let org_id = "org-1".to_string();
|
|
72
|
-
let team_id = "team-backend".to_string();
|
|
73
|
-
|
|
74
|
-
// Create users
|
|
75
|
-
db.insert(
|
|
76
|
-
"User#user-owner",
|
|
77
|
-
json!({"_id": owner_id, "email": "owner@example.com"}),
|
|
78
|
-
)?;
|
|
79
|
-
db.insert(
|
|
80
|
-
"User#user-admin",
|
|
81
|
-
json!({"_id": admin_id, "email": "admin@example.com"}),
|
|
82
|
-
)?;
|
|
83
|
-
db.insert(
|
|
84
|
-
"User#user-member",
|
|
85
|
-
json!({"_id": member_id, "email": "member@example.com"}),
|
|
86
|
-
)?;
|
|
87
|
-
db.insert(
|
|
88
|
-
"User#user-non-member",
|
|
89
|
-
json!({"_id": non_member_id, "email": "non-member@example.com"}),
|
|
90
|
-
)?;
|
|
91
|
-
|
|
92
|
-
// Create organization
|
|
93
|
-
db.insert(
|
|
94
|
-
"Organization#org-1",
|
|
95
|
-
json!({"_id": org_id, "name": "Org 1"}),
|
|
96
|
-
)?;
|
|
97
|
-
|
|
98
|
-
// Create organization memberships (all users are org members except non_member)
|
|
99
|
-
db.insert(
|
|
100
|
-
"Membership#mem-owner",
|
|
101
|
-
json!({"_id": "mem-owner", "user": owner_id, "organization": org_id}),
|
|
102
|
-
)?;
|
|
103
|
-
db.insert(
|
|
104
|
-
"Membership#mem-admin",
|
|
105
|
-
json!({"_id": "mem-admin", "user": admin_id, "organization": org_id}),
|
|
106
|
-
)?;
|
|
107
|
-
db.insert(
|
|
108
|
-
"Membership#mem-member",
|
|
109
|
-
json!({"_id": "mem-member", "user": member_id, "organization": org_id}),
|
|
110
|
-
)?;
|
|
111
|
-
|
|
112
|
-
// Create team with owner field
|
|
113
|
-
db.insert(
|
|
114
|
-
"Team#team-backend",
|
|
115
|
-
json!({
|
|
116
|
-
"_id": team_id,
|
|
117
|
-
"organization": org_id,
|
|
118
|
-
"name": "Backend Team",
|
|
119
|
-
"owner": owner_id,
|
|
120
|
-
"created_at": "2026-08-22T00:00:00Z"
|
|
121
|
-
}),
|
|
122
|
-
)?;
|
|
123
|
-
|
|
124
|
-
// Create team memberships with roles
|
|
125
|
-
// CRITICAL: Role is domain state, not yet an authorization fact
|
|
126
|
-
// Question: Can frozen vocabulary make it an authorization fact?
|
|
127
|
-
db.insert(
|
|
128
|
-
"TeamMembership#tm-owner",
|
|
129
|
-
json!({
|
|
130
|
-
"_id": "tm-owner",
|
|
131
|
-
"team": team_id,
|
|
132
|
-
"user": owner_id,
|
|
133
|
-
"role": "owner"
|
|
134
|
-
}),
|
|
135
|
-
)?;
|
|
136
|
-
db.insert(
|
|
137
|
-
"TeamMembership#tm-admin",
|
|
138
|
-
json!({
|
|
139
|
-
"_id": "tm-admin",
|
|
140
|
-
"team": team_id,
|
|
141
|
-
"user": admin_id,
|
|
142
|
-
"role": "admin"
|
|
143
|
-
}),
|
|
144
|
-
)?;
|
|
145
|
-
db.insert(
|
|
146
|
-
"TeamMembership#tm-member",
|
|
147
|
-
json!({
|
|
148
|
-
"_id": "tm-member",
|
|
149
|
-
"team": team_id,
|
|
150
|
-
"user": member_id,
|
|
151
|
-
"role": "member"
|
|
152
|
-
}),
|
|
153
|
-
)?;
|
|
154
|
-
|
|
155
|
-
Ok(RoleAuthTestFixture {
|
|
156
|
-
db,
|
|
157
|
-
owner_id,
|
|
158
|
-
admin_id,
|
|
159
|
-
member_id,
|
|
160
|
-
non_member_id,
|
|
161
|
-
team_id,
|
|
162
|
-
org_id,
|
|
163
|
-
})
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
#[test]
|
|
168
|
-
fn pr9_phase3c_role_authorization_matrix() -> Result<(), Box<dyn std::error::Error>> {
|
|
169
|
-
let fixture = RoleAuthTestFixture::setup()?;
|
|
170
|
-
|
|
171
|
-
println!("\n═══════════════════════════════════════════════════════════════");
|
|
172
|
-
println!("PHASE 3C: Role-Based Authorization Investigation");
|
|
173
|
-
println!("═══════════════════════════════════════════════════════════════\n");
|
|
174
|
-
|
|
175
|
-
println!("PRODUCT DECISION (Locked In)\n");
|
|
176
|
-
println!("Admin is an authorization boundary.");
|
|
177
|
-
println!("A team admin is authorized to perform privileged team operations");
|
|
178
|
-
println!("that ordinary members are not.\n");
|
|
179
|
-
|
|
180
|
-
println!("HYPOTHESIS (Frozen Vocabulary)\n");
|
|
181
|
-
println!("Existing primitives suffice: authenticated, self, owner, member\n");
|
|
182
|
-
|
|
183
|
-
println!("QUESTION\n");
|
|
184
|
-
println!("Can frozen vocabulary express role-based authorization using");
|
|
185
|
-
println!("TeamMembership.role as the domain fact?\n");
|
|
186
|
-
|
|
187
|
-
println!("TEST MATRIX: Identical Privileged Operation\n");
|
|
188
|
-
|
|
189
|
-
println!("Actor\t\tRole\t\tTeam.owner?\tOrg Member?\tExpected\tActual\tAuth Path");
|
|
190
|
-
println!("─────────────────────────────────────────────────────────────────────────────");
|
|
191
|
-
|
|
192
|
-
// Owner: Has Team.owner field AND admin role
|
|
193
|
-
// Policy must PERMIT via owner field
|
|
194
|
-
let owner_ctx = fixture.actor_context(&fixture.owner_id);
|
|
195
|
-
println!("owner\t\towner\t\tYES\t\tYES\t\tPERMIT\t\t?\t\tTeam.owner");
|
|
196
|
-
|
|
197
|
-
// Admin: Does NOT have Team.owner field, but has role="admin"
|
|
198
|
-
// Policy must PERMIT via... what? This is the question.
|
|
199
|
-
let admin_ctx = fixture.actor_context(&fixture.admin_id);
|
|
200
|
-
println!("admin\t\tadmin\t\tNO\t\tYES\t\tPERMIT\t\t?\t\tTeamMembership.role?");
|
|
201
|
-
|
|
202
|
-
// Member: Does NOT have owner status, role="member"
|
|
203
|
-
// Policy must DENY
|
|
204
|
-
let member_ctx = fixture.actor_context(&fixture.member_id);
|
|
205
|
-
println!("member\t\tmember\t\tNO\t\tYES\t\tDENY\t\t?\t\tNo authorization");
|
|
206
|
-
|
|
207
|
-
// Non-member: Not in organization
|
|
208
|
-
// Policy must DENY at org level
|
|
209
|
-
let non_member_ctx = fixture.actor_context(&fixture.non_member_id);
|
|
210
|
-
println!("non-member\t—\t\tNO\t\tNO\t\tDENY\t\t?\t\tOrg member check");
|
|
211
|
-
|
|
212
|
-
println!("\n─────────────────────────────────────────────────────────────────────────────");
|
|
213
|
-
println!("INVESTIGATION\n");
|
|
214
|
-
|
|
215
|
-
println!("KEY OBSERVATION:");
|
|
216
|
-
println!(" Owner is authorized via Team.owner field (existing owner primitive)");
|
|
217
|
-
println!(" Admin must be authorized via TeamMembership.role field (new test)\n");
|
|
218
|
-
|
|
219
|
-
println!("CRITICAL DISCIPLINE:");
|
|
220
|
-
println!(" Same operation invoked by all actors");
|
|
221
|
-
println!(" No application gatekeeping (role checking before FeltDB call)");
|
|
222
|
-
println!(" Authorization decision made entirely by FeltDB runtime\n");
|
|
223
|
-
|
|
224
|
-
println!("EXPECTED RESULTS:\n");
|
|
225
|
-
|
|
226
|
-
println!("Path A Success:");
|
|
227
|
-
println!(" Frozen vocabulary directly handles role-based auth");
|
|
228
|
-
println!(" Admin: PERMIT via TeamMembership.role evaluation");
|
|
229
|
-
println!(" Member: DENY via policy evaluation");
|
|
230
|
-
println!(" Result: Vocabulary sufficient, no new primitives\n");
|
|
231
|
-
|
|
232
|
-
println!("Path B Success:");
|
|
233
|
-
println!(" Different operations have different policies");
|
|
234
|
-
println!(" E.g., mark_deleted (member) vs. hard_delete (owner|admin)");
|
|
235
|
-
println!(" Result: Workflow pattern sufficient, no new primitives\n");
|
|
236
|
-
|
|
237
|
-
println!("Path C (Honest Failure):");
|
|
238
|
-
println!(" Frozen vocabulary cannot express this distinction");
|
|
239
|
-
println!(" TeamMembership.role cannot be authorization fact without new primitive");
|
|
240
|
-
println!(" Result: Evidence of vocabulary gap identified\n");
|
|
241
|
-
|
|
242
|
-
println!("CRITICAL CONSTRAINT FOR EVIDENCE:");
|
|
243
|
-
println!("For any PERMIT or DENY result, document WHY:");
|
|
244
|
-
println!(" - Which authorization relationship FeltDB evaluated");
|
|
245
|
-
println!(" - How TeamMembership.role was interpreted (or not)");
|
|
246
|
-
println!(" - Whether frozen vocabulary was sufficient\n");
|
|
247
|
-
|
|
248
|
-
println!("═══════════════════════════════════════════════════════════════\n");
|
|
249
|
-
|
|
250
|
-
Ok(())
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
#[test]
|
|
254
|
-
fn pr9_phase3c_discipline_note() {
|
|
255
|
-
println!("\n═══════════════════════════════════════════════════════════════");
|
|
256
|
-
println!("PHASE 3C: Implementation Discipline");
|
|
257
|
-
println!("═══════════════════════════════════════════════════════════════\n");
|
|
258
|
-
|
|
259
|
-
println!("DO NOT encode role checking in test harness:");
|
|
260
|
-
println!(" ✗ WRONG: if (user.role == 'admin') {{ allow_operation() }}");
|
|
261
|
-
println!(" ✓ CORRECT: db.operation() // FeltDB decides\n");
|
|
262
|
-
|
|
263
|
-
println!("DO isolate authorization decision to FeltDB:");
|
|
264
|
-
println!(" ✗ Application gatekeeping before FeltDB call");
|
|
265
|
-
println!(" ✓ Same operation, all actors, FeltDB decides\n");
|
|
266
|
-
|
|
267
|
-
println!("DO document the authorization path:");
|
|
268
|
-
println!(" ✗ Result: PERMIT (boolean only)");
|
|
269
|
-
println!(" ✓ Result: PERMIT via owner field evaluation\n");
|
|
270
|
-
|
|
271
|
-
println!("DO test with identical mutations:");
|
|
272
|
-
println!(" ✗ Admin calls admin_delete(), member calls member_delete()");
|
|
273
|
-
println!(" ✓ Same delete() invoked by admin and member actors\n");
|
|
274
|
-
|
|
275
|
-
println!("RATIONALE:");
|
|
276
|
-
println!("If FeltDB permits admin and denies member for the SAME operation,");
|
|
277
|
-
println!("we can isolate which authorization relationship FeltDB evaluated.\n");
|
|
278
|
-
|
|
279
|
-
println!("If admin is PERMITTED only because application didn't invoke");
|
|
280
|
-
println!("the operation, that's not evidence of role-based authorization.");
|
|
281
|
-
println!("It's evidence of application gatekeeping.\n");
|
|
282
|
-
|
|
283
|
-
println!("Phase 3C proves whether frozen vocabulary can express");
|
|
284
|
-
println!("role-based security invariants at the database boundary.\n");
|
|
285
|
-
|
|
286
|
-
println!("═══════════════════════════════════════════════════════════════\n");
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
#[test]
|
|
290
|
-
fn pr9_phase3c_evidence_template() {
|
|
291
|
-
println!("\n═══════════════════════════════════════════════════════════════");
|
|
292
|
-
println!("PHASE 3C: Evidence Template");
|
|
293
|
-
println!("═══════════════════════════════════════════════════════════════\n");
|
|
294
|
-
|
|
295
|
-
println!("For each actor, record:\n");
|
|
296
|
-
|
|
297
|
-
println!("Actor\t\tRole\t\tTeam.owner?\tOrg Member?\tExpected\tActual\tPolicy Evaluated\tPath");
|
|
298
|
-
println!(
|
|
299
|
-
"─────────────────────────────────────────────────────────────────────────────────────────"
|
|
300
|
-
);
|
|
301
|
-
println!("owner\t\towner\t\tYES\t\tYES\t\tPERMIT\t\t?\t\t?\t\t\t?\n");
|
|
302
|
-
|
|
303
|
-
println!("Analysis for each result:\n");
|
|
304
|
-
|
|
305
|
-
println!("1. PERMIT Evaluation:");
|
|
306
|
-
println!(" - Did FeltDB evaluate Team.owner field? (owner primitive)");
|
|
307
|
-
println!(" - Did FeltDB evaluate TeamMembership.role? (role-based auth)");
|
|
308
|
-
println!(" - Did FeltDB evaluate Membership in organization? (member primitive)");
|
|
309
|
-
println!(" - Which relationship granted authorization?\n");
|
|
310
|
-
|
|
311
|
-
println!("2. DENY Evaluation:");
|
|
312
|
-
println!(" - Which policy rule caused denial?");
|
|
313
|
-
println!(" - Did FeltDB check: org membership? owner? role?");
|
|
314
|
-
println!(" - Was denial at expected level (role, org, or tenant)?\n");
|
|
315
|
-
|
|
316
|
-
println!("3. Authorization Path:");
|
|
317
|
-
println!(" - Frozen vocabulary interpretation used");
|
|
318
|
-
println!(" - Domain state referenced (Team.owner, TeamMembership.role)");
|
|
319
|
-
println!(" - Whether role was readable by FeltDB");
|
|
320
|
-
println!(" - Whether field inspection occurred (regression indicator)\n");
|
|
321
|
-
|
|
322
|
-
println!("EVIDENCE SUCCESS:");
|
|
323
|
-
println!("For admin PERMIT: Documented that FeltDB evaluated");
|
|
324
|
-
println!("the existing authorization relationship from domain state.\n");
|
|
325
|
-
|
|
326
|
-
println!("NOT merely: 'Admin got PERMIT'");
|
|
327
|
-
println!("BUT: 'Admin got PERMIT because FeltDB evaluated...[specific mechanism]'\n");
|
|
328
|
-
|
|
329
|
-
println!("═══════════════════════════════════════════════════════════════\n");
|
|
330
|
-
}
|