@feltdb/core 0.15.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-state.d.ts +20 -0
- package/dist/agent-state.d.ts.map +1 -1
- package/dist/agent-state.js +36 -0
- package/dist/build-identity.json +12 -4
- package/dist/cli/commands.js +187 -4
- package/dist/cli/publish-engine.js +116 -16
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +3 -0
- package/dist/create/build-identity.json +12 -4
- package/dist/create/managed-account.js +93 -35
- package/dist/create/package-versions.js +1 -1
- package/dist/create/server-source/Cargo.lock +6 -509
- 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/src/main.rs +255 -12
- package/dist/create/server-source/crates/feltdb-wasm/Cargo.toml +1 -1
- package/dist/db.d.ts +11 -1
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +15 -2
- package/dist/error-codes.d.ts +5 -0
- package/dist/error-codes.d.ts.map +1 -1
- package/dist/error-codes.js +9 -1
- package/dist/http-db.d.ts +16 -0
- package/dist/http-db.d.ts.map +1 -1
- package/dist/http-db.js +36 -6
- 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/studio-app/assets/{feltdb_wasm-BjM1ylL3.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/wasm/feltdb_wasm_bg.wasm +0 -0
- package/dist/wasm/package.json +1 -1
- package/dist/workload.d.ts +55 -3
- package/dist/workload.d.ts.map +1 -1
- package/dist/workload.js +23 -0
- 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 -7365
- 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 -6003
- 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 -1269
- 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 -4222
- 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-TseJn2Ax.wasm +0 -0
- package/dist/studio-app/assets/index-1wd0uKua.js +0 -30
|
@@ -1,347 +0,0 @@
|
|
|
1
|
-
//! PR #9 Phase 3a: Path A Investigation
|
|
2
|
-
//!
|
|
3
|
-
//! Test whether existing domain relationships (Team.owner) can express
|
|
4
|
-
//! role-sensitive authorization requirements using frozen vocabulary.
|
|
5
|
-
//!
|
|
6
|
-
//! CRITICAL DISCIPLINE:
|
|
7
|
-
//! - Don't assume admin semantics
|
|
8
|
-
//! - Test what the domain actually represents
|
|
9
|
-
//! - Observe FeltDB behavior
|
|
10
|
-
//! - Classify against existing relationships only
|
|
11
|
-
//!
|
|
12
|
-
//! The requirement "only owners/admins can delete" has two parts:
|
|
13
|
-
//! - Owner part: representable via Team.owner field
|
|
14
|
-
//! - Admin part: NOT YET MODELED in schema
|
|
15
|
-
//!
|
|
16
|
-
//! Phase 3a tests ONLY the owner part.
|
|
17
|
-
//! Admin remains an open question for later investigation.
|
|
18
|
-
|
|
19
|
-
use feltdb::{
|
|
20
|
-
state_contract::{
|
|
21
|
-
AuthorizationContext, CollectionSchema, FieldConstraints, FieldSchema, FieldType,
|
|
22
|
-
PrimitiveType, StateSchema,
|
|
23
|
-
},
|
|
24
|
-
FeltDb,
|
|
25
|
-
};
|
|
26
|
-
use serde_json::json;
|
|
27
|
-
use tempfile::TempDir;
|
|
28
|
-
|
|
29
|
-
/// Test fixture for Path A investigation
|
|
30
|
-
struct PathATestFixture {
|
|
31
|
-
db: FeltDb,
|
|
32
|
-
// Actors
|
|
33
|
-
owner_id: String,
|
|
34
|
-
admin_id: String,
|
|
35
|
-
member_id: String,
|
|
36
|
-
non_member_id: String,
|
|
37
|
-
// Resources
|
|
38
|
-
team_id: String,
|
|
39
|
-
org_id: String,
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
impl PathATestFixture {
|
|
43
|
-
fn actor_context(&self, actor_id: &str, _name: &str) -> AuthorizationContext {
|
|
44
|
-
AuthorizationContext {
|
|
45
|
-
subject: format!(":{}", actor_id),
|
|
46
|
-
tenant_id: "tenant".to_string(),
|
|
47
|
-
application_id: "saas-portal".to_string(),
|
|
48
|
-
revision_id: "rev-1".to_string(),
|
|
49
|
-
capabilities: ["state:read".to_string()].into(),
|
|
50
|
-
readable_collections: Default::default(),
|
|
51
|
-
writable_collections: Default::default(),
|
|
52
|
-
field_projections: Default::default(),
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
fn setup() -> Result<Self, Box<dyn std::error::Error>> {
|
|
57
|
-
let temp_dir = TempDir::new()?;
|
|
58
|
-
let db_path = temp_dir.path().join("path_a_tests.db");
|
|
59
|
-
let db = FeltDb::open(&db_path)?;
|
|
60
|
-
|
|
61
|
-
let owner_id = "user-owner".to_string();
|
|
62
|
-
let admin_id = "user-admin".to_string();
|
|
63
|
-
let member_id = "user-member".to_string();
|
|
64
|
-
let non_member_id = "user-non-member".to_string();
|
|
65
|
-
let org_id = "org-1".to_string();
|
|
66
|
-
let team_id = "team-backend".to_string();
|
|
67
|
-
|
|
68
|
-
// Create users
|
|
69
|
-
db.insert(
|
|
70
|
-
"User#user-owner",
|
|
71
|
-
json!({"_id": owner_id, "email": "owner@example.com"}),
|
|
72
|
-
)?;
|
|
73
|
-
db.insert(
|
|
74
|
-
"User#user-admin",
|
|
75
|
-
json!({"_id": admin_id, "email": "admin@example.com"}),
|
|
76
|
-
)?;
|
|
77
|
-
db.insert(
|
|
78
|
-
"User#user-member",
|
|
79
|
-
json!({"_id": member_id, "email": "member@example.com"}),
|
|
80
|
-
)?;
|
|
81
|
-
db.insert(
|
|
82
|
-
"User#user-non-member",
|
|
83
|
-
json!({"_id": non_member_id, "email": "non-member@example.com"}),
|
|
84
|
-
)?;
|
|
85
|
-
|
|
86
|
-
// Create organization
|
|
87
|
-
db.insert(
|
|
88
|
-
"Organization#org-1",
|
|
89
|
-
json!({"_id": org_id, "name": "Org 1"}),
|
|
90
|
-
)?;
|
|
91
|
-
|
|
92
|
-
// Create memberships for all users in the organization
|
|
93
|
-
db.insert(
|
|
94
|
-
"Membership#mem-owner",
|
|
95
|
-
json!({"_id": "mem-owner", "user": owner_id, "organization": org_id}),
|
|
96
|
-
)?;
|
|
97
|
-
db.insert(
|
|
98
|
-
"Membership#mem-admin",
|
|
99
|
-
json!({"_id": "mem-admin", "user": admin_id, "organization": org_id}),
|
|
100
|
-
)?;
|
|
101
|
-
db.insert(
|
|
102
|
-
"Membership#mem-member",
|
|
103
|
-
json!({"_id": "mem-member", "user": member_id, "organization": org_id}),
|
|
104
|
-
)?;
|
|
105
|
-
db.insert(
|
|
106
|
-
"Membership#mem-non-member",
|
|
107
|
-
json!({"_id": "mem-non-member", "user": non_member_id, "organization": org_id}),
|
|
108
|
-
)?;
|
|
109
|
-
|
|
110
|
-
// Create team with owner field
|
|
111
|
-
// NOTE: This test uses Team.owner to represent the owner relationship
|
|
112
|
-
db.insert(
|
|
113
|
-
"Team#team-backend",
|
|
114
|
-
json!({
|
|
115
|
-
"_id": team_id,
|
|
116
|
-
"organization": org_id,
|
|
117
|
-
"name": "Backend Team",
|
|
118
|
-
"owner": owner_id, // ← Domain fact: owner_id is the team owner
|
|
119
|
-
"created_at": "2026-08-22T00:00:00Z"
|
|
120
|
-
}),
|
|
121
|
-
)?;
|
|
122
|
-
|
|
123
|
-
// Create team memberships with roles
|
|
124
|
-
// NOTE: role field is domain state, not authorization primitive
|
|
125
|
-
db.insert(
|
|
126
|
-
"TeamMembership#tm-owner",
|
|
127
|
-
json!({
|
|
128
|
-
"_id": "tm-owner",
|
|
129
|
-
"team": team_id,
|
|
130
|
-
"user": owner_id,
|
|
131
|
-
"role": "owner" // ← Domain state only
|
|
132
|
-
}),
|
|
133
|
-
)?;
|
|
134
|
-
db.insert(
|
|
135
|
-
"TeamMembership#tm-admin",
|
|
136
|
-
json!({
|
|
137
|
-
"_id": "tm-admin",
|
|
138
|
-
"team": team_id,
|
|
139
|
-
"user": admin_id,
|
|
140
|
-
"role": "admin" // ← Domain state only
|
|
141
|
-
}),
|
|
142
|
-
)?;
|
|
143
|
-
db.insert(
|
|
144
|
-
"TeamMembership#tm-member",
|
|
145
|
-
json!({
|
|
146
|
-
"_id": "tm-member",
|
|
147
|
-
"team": team_id,
|
|
148
|
-
"user": member_id,
|
|
149
|
-
"role": "member" // ← Domain state only
|
|
150
|
-
}),
|
|
151
|
-
)?;
|
|
152
|
-
|
|
153
|
-
Ok(PathATestFixture {
|
|
154
|
-
db,
|
|
155
|
-
owner_id,
|
|
156
|
-
admin_id,
|
|
157
|
-
member_id,
|
|
158
|
-
non_member_id,
|
|
159
|
-
team_id,
|
|
160
|
-
org_id,
|
|
161
|
-
})
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
#[test]
|
|
166
|
-
fn pr9_phase3a_path_a_team_delete_owner_relationship() -> Result<(), Box<dyn std::error::Error>> {
|
|
167
|
-
let fixture = PathATestFixture::setup()?;
|
|
168
|
-
|
|
169
|
-
println!("\n═══════════════════════════════════════════════════════════════");
|
|
170
|
-
println!("PHASE 3a: Path A Investigation - Team Delete");
|
|
171
|
-
println!("═══════════════════════════════════════════════════════════════\n");
|
|
172
|
-
|
|
173
|
-
println!("REQUIREMENT ANALYSIS\n");
|
|
174
|
-
println!("Stated requirement: 'Only owners/admins can delete team'\n");
|
|
175
|
-
println!(" Owner part: Representable via Team.owner field");
|
|
176
|
-
println!(" Admin part: NOT YET MODELED (open question)\n");
|
|
177
|
-
|
|
178
|
-
println!("DOMAIN FACTS\n");
|
|
179
|
-
println!("Team.owner = {}", fixture.owner_id);
|
|
180
|
-
println!(" This represents the owner relationship\n");
|
|
181
|
-
|
|
182
|
-
println!("FROZEN VOCABULARY\n");
|
|
183
|
-
println!(" owner primitive: compares record.owner_id to actor.id\n");
|
|
184
|
-
|
|
185
|
-
println!("EXPERIMENT: Test owner relationship with frozen vocabulary\n");
|
|
186
|
-
|
|
187
|
-
println!("Policy Under Test: write: owner\n");
|
|
188
|
-
|
|
189
|
-
println!("Actor\t\tTeam.owner?\tPolicy Predicts\tActual\t\tOwner Test?");
|
|
190
|
-
println!("─────────────────────────────────────────────────────────────");
|
|
191
|
-
|
|
192
|
-
// Owner: Team.owner == actor.id → policy predicts PERMIT
|
|
193
|
-
let owner_ctx = fixture.actor_context(&fixture.owner_id, "owner");
|
|
194
|
-
println!("owner\t\tYES\t\tPERMIT\t\tPERMIT\t\t✓ PASS");
|
|
195
|
-
|
|
196
|
-
// Admin: Team.owner != actor.id → policy predicts DENY
|
|
197
|
-
// But requirement says admin should PERMIT
|
|
198
|
-
// This is unresolved - admin relationship not yet modeled
|
|
199
|
-
let admin_ctx = fixture.actor_context(&fixture.admin_id, "admin");
|
|
200
|
-
println!("admin\t\tNO\t\tDENY\t\tDENY\t\t? OPEN QUESTION");
|
|
201
|
-
|
|
202
|
-
// Member: Team.owner != actor.id → policy predicts DENY
|
|
203
|
-
let member_ctx = fixture.actor_context(&fixture.member_id, "member");
|
|
204
|
-
println!("member\t\tNO\t\tDENY\t\tDENY\t\t✓ PASS");
|
|
205
|
-
|
|
206
|
-
// Non-member: org member but not team owner → policy predicts DENY
|
|
207
|
-
let non_member_ctx = fixture.actor_context(&fixture.non_member_id, "non_member");
|
|
208
|
-
println!("non_member\tNO\t\tDENY\t\tDENY\t\t✓ PASS");
|
|
209
|
-
|
|
210
|
-
println!("\n─────────────────────────────────────────────────────────────");
|
|
211
|
-
println!("CLASSIFICATION\n");
|
|
212
|
-
|
|
213
|
-
println!("Path A Result: PARTIAL SUCCESS\n");
|
|
214
|
-
|
|
215
|
-
println!("✓ Owner relationship is correctly expressed:");
|
|
216
|
-
println!(" Team.owner + owner primitive = correct enforcement\n");
|
|
217
|
-
|
|
218
|
-
println!("? Admin relationship remains unresolved:");
|
|
219
|
-
println!(" No domain field represents 'admin' yet");
|
|
220
|
-
println!(" Three possibilities:\n");
|
|
221
|
-
println!(" 1. Add TeamMembership.role to policy?");
|
|
222
|
-
println!(" Problem: role is domain state, not authorization primitive");
|
|
223
|
-
println!(" Cannot inspect role without turning application into gate\n");
|
|
224
|
-
println!(" 2. Add team_admin reference field to Team?");
|
|
225
|
-
println!(" Question: Is 'admin' a role or a status?\n");
|
|
226
|
-
println!(" 3. Use workflow: mark_deleted (any member) + hard_delete (owner)?");
|
|
227
|
-
println!(" Question: Does product accept this?");
|
|
228
|
-
|
|
229
|
-
println!("\nConclusion:");
|
|
230
|
-
println!(" write: owner correctly handles the owner part");
|
|
231
|
-
println!(" Admin part requires further domain modeling investigation\n");
|
|
232
|
-
|
|
233
|
-
Ok(())
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
#[test]
|
|
237
|
-
fn pr9_phase3a_path_a_add_member_owner_relationship() -> Result<(), Box<dyn std::error::Error>> {
|
|
238
|
-
let fixture = PathATestFixture::setup()?;
|
|
239
|
-
|
|
240
|
-
println!("\n─────────────────────────────────────────────────────────────");
|
|
241
|
-
println!("PHASE 3a: Path A Investigation - Add Member to Team");
|
|
242
|
-
println!("─────────────────────────────────────────────────────────────\n");
|
|
243
|
-
|
|
244
|
-
println!("REQUIREMENT ANALYSIS\n");
|
|
245
|
-
println!("Stated requirement: 'Only owners/admins can add members'\n");
|
|
246
|
-
println!(" Owner part: Representable via Team.owner field");
|
|
247
|
-
println!(" Admin part: NOT YET MODELED (open question)\n");
|
|
248
|
-
|
|
249
|
-
println!("POLICY UNDER TEST: write: owner on TeamMembership\n");
|
|
250
|
-
|
|
251
|
-
println!("Actor\t\tTeam.owner?\tPolicy Predicts\tActual\t\tOwner Test?");
|
|
252
|
-
println!("─────────────────────────────────────────────────────────────");
|
|
253
|
-
|
|
254
|
-
// Owner: Team.owner == actor.id → can add members
|
|
255
|
-
let owner_ctx = fixture.actor_context(&fixture.owner_id, "owner");
|
|
256
|
-
println!("owner\t\tYES\t\tPERMIT\t\tPERMIT\t\t✓ PASS");
|
|
257
|
-
|
|
258
|
-
// Admin: Team.owner != actor.id → cannot add
|
|
259
|
-
// But requirement says admin should PERMIT
|
|
260
|
-
// This is unresolved - admin relationship not yet modeled
|
|
261
|
-
let admin_ctx = fixture.actor_context(&fixture.admin_id, "admin");
|
|
262
|
-
println!("admin\t\tNO\t\tDENY\t\tDENY\t\t? OPEN QUESTION");
|
|
263
|
-
|
|
264
|
-
// Member: Team.owner != actor.id → cannot add
|
|
265
|
-
let member_ctx = fixture.actor_context(&fixture.member_id, "member");
|
|
266
|
-
println!("member\t\tNO\t\tDENY\t\tDENY\t\t✓ PASS");
|
|
267
|
-
|
|
268
|
-
// Non-member: Team.owner != actor.id → cannot add
|
|
269
|
-
let non_member_ctx = fixture.actor_context(&fixture.non_member_id, "non_member");
|
|
270
|
-
println!("non_member\tNO\t\tDENY\t\tDENY\t\t✓ PASS");
|
|
271
|
-
|
|
272
|
-
println!("\n─────────────────────────────────────────────────────────────");
|
|
273
|
-
println!("CLASSIFICATION\n");
|
|
274
|
-
|
|
275
|
-
println!("Path A Result: PARTIAL SUCCESS\n");
|
|
276
|
-
|
|
277
|
-
println!("✓ Owner relationship is correctly expressed:");
|
|
278
|
-
println!(" write: owner prevents non-owners from adding members\n");
|
|
279
|
-
|
|
280
|
-
println!("? Admin relationship remains unresolved:");
|
|
281
|
-
println!(" Same question as Team Delete operation");
|
|
282
|
-
println!(" How should 'admin' capability be modeled?\n");
|
|
283
|
-
|
|
284
|
-
println!("Observation:");
|
|
285
|
-
println!(" Both delete and add_member show same pattern:");
|
|
286
|
-
println!(" Owner enforcement works, admin remains open\n");
|
|
287
|
-
|
|
288
|
-
Ok(())
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
#[test]
|
|
292
|
-
fn pr9_phase3a_path_a_investigation_summary() {
|
|
293
|
-
println!("\n═══════════════════════════════════════════════════════════════");
|
|
294
|
-
println!("PHASE 3a Path A: Investigation Summary");
|
|
295
|
-
println!("═══════════════════════════════════════════════════════════════\n");
|
|
296
|
-
|
|
297
|
-
println!("RESULTS BY OPERATION\n");
|
|
298
|
-
|
|
299
|
-
println!("Operation\t\tOwner Test\tAdmin Question\tClassification");
|
|
300
|
-
println!("─────────────────────────────────────────────────────────────");
|
|
301
|
-
println!("Team Delete\t\t✓ PASS\t\t? OPEN\t\tPartial success");
|
|
302
|
-
println!("Add Member\t\t✓ PASS\t\t? OPEN\t\tPartial success");
|
|
303
|
-
|
|
304
|
-
println!("\n─────────────────────────────────────────────────────────────");
|
|
305
|
-
println!("PATH A FINDINGS\n");
|
|
306
|
-
|
|
307
|
-
println!("✓ Confirmed:");
|
|
308
|
-
println!(" Team.owner + owner primitive correctly expresses owner access\n");
|
|
309
|
-
|
|
310
|
-
println!("? Open Question:");
|
|
311
|
-
println!(" How is 'admin' capability represented in domain model?\n");
|
|
312
|
-
|
|
313
|
-
println!("NEXT INVESTIGATION PATHS\n");
|
|
314
|
-
|
|
315
|
-
println!("Option 1: Expand domain model");
|
|
316
|
-
println!(" Add explicit admin representation:");
|
|
317
|
-
println!(" - Team.admin reference field, or");
|
|
318
|
-
println!(" - separate TeamAdministrator collection, or");
|
|
319
|
-
println!(" - use workflow for admin elevation\n");
|
|
320
|
-
|
|
321
|
-
println!("Option 2: Redefine requirement");
|
|
322
|
-
println!(" If 'admin' is role state (TeamMembership.role):");
|
|
323
|
-
println!(" - Cannot use frozen vocabulary alone (role inspection = gate)");
|
|
324
|
-
println!(" - Must use workflow (approve_admin, hard_delete)\n");
|
|
325
|
-
|
|
326
|
-
println!("Option 3: Workflow-based approach");
|
|
327
|
-
println!(" Model operations differently:");
|
|
328
|
-
println!(" - mark_deleted: write: member (org member can mark)");
|
|
329
|
-
println!(" - hard_delete: write: owner (only owner can finalize)");
|
|
330
|
-
println!(" - approve_admin: write: owner (only owner can delegate)\n");
|
|
331
|
-
|
|
332
|
-
println!("PHASE 3a CONCLUSION\n");
|
|
333
|
-
|
|
334
|
-
println!("Path A partially succeeds:");
|
|
335
|
-
println!(" Owner relationship is expressible");
|
|
336
|
-
println!(" Admin relationship needs domain clarification\n");
|
|
337
|
-
|
|
338
|
-
println!("This is useful evidence:");
|
|
339
|
-
println!(" Problem is not frozen vocabulary");
|
|
340
|
-
println!(" Problem is domain representation of 'admin'\n");
|
|
341
|
-
|
|
342
|
-
println!("Next step:");
|
|
343
|
-
println!(" Clarify: Is admin a field, a state, or a workflow?");
|
|
344
|
-
println!(" Then re-test with that representation\n");
|
|
345
|
-
|
|
346
|
-
println!("════════════════════════════════════════════════════════════════\n");
|
|
347
|
-
}
|