Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
2623379
feat(cel): add CEL conformance oracle harness (#90)
rrrodzilla May 29, 2026
a675303
feat(cel): add CEL lexer + parser → typed AST (#107)
rrrodzilla May 29, 2026
31c531e
feat(cel): add tree-walking evaluator core (#108)
rrrodzilla May 29, 2026
62b4419
feat(cel): add standard function library (#109)
rrrodzilla May 29, 2026
8f54e4f
fix(cel): parse -9223372036854775808 as i64::MIN (#114)
rrrodzilla May 29, 2026
9550c88
feat(cel): add two-variable comprehension macros (#113)
rrrodzilla May 29, 2026
64e00d6
feat(dsl): parse CEL rule annotations @require/@compute/@default (#103)
rrrodzilla May 29, 2026
6d44230
feat(rules): enforce @require CEL predicates → 422 (#92)
rrrodzilla May 29, 2026
0454fb0
feat(rules): derive @compute fields at write time (#93)
rrrodzilla May 29, 2026
1a8077b
feat(rules): expression-valued @default on insert (#94)
rrrodzilla May 29, 2026
b6856e0
feat(cel): type-check rule expressions against field types at parse (…
rrrodzilla May 29, 2026
8a74fb6
docs(adr): decide uint type vs unsigned constraint (#98)
rrrodzilla May 29, 2026
f747625
feat(rules): run @default/@compute/@require ahead of before_* hooks (…
rrrodzilla May 29, 2026
5b845f0
test(signing): prove tampering a signed rule annotation is rejected (…
rrrodzilla May 29, 2026
c8e567f
feat(cel): add optional-type navigation and stdlib (#100)
rrrodzilla May 29, 2026
c1a9616
test(cel): lock in timestamp/duration overflow rules (#101)
rrrodzilla May 29, 2026
3a9bc47
feat(types): add first-class duration field type (#96)
rrrodzilla May 29, 2026
e4d1f8e
feat(types): add first-class bytes field type (#97)
rrrodzilla May 29, 2026
551dfba
feat(types): add typed map<K,V> field type (#99)
rrrodzilla May 29, 2026
07bcb91
docs(adr): record CEL expression substrate decision (#91)
rrrodzilla May 29, 2026
d9f896f
feat(cel): project enum/ref/file into the value lattice (#102)
rrrodzilla May 29, 2026
27f3a58
docs(dsl): document duration/bytes/map types and CEL rule annotations
rrrodzilla May 29, 2026
870f9a2
feat(cel): constrained single-hop cross-entity reads in @require (#95)
rrrodzilla May 29, 2026
a8437f1
docs(skill): bring schemaforge skill references current with the rule…
rrrodzilla May 29, 2026
c0b25b3
docs(skill): track 5 installed-only references and bring them current
rrrodzilla May 29, 2026
bbbff62
Merge main into dev (demo-console PRs #110-112) ahead of releasing ep…
rrrodzilla May 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 52 additions & 5 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ members = [
"crates/schema-forge-cli",
"crates/schema-forge-postgres",
"crates/schema-forge-signing",
"crates/schema-forge-cel",
]
3 changes: 2 additions & 1 deletion crates/schema-forge-acton/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "schema-forge-acton"
version = "0.32.0"
version = "0.34.0"
edition = "2021"

[dependencies]
Expand Down Expand Up @@ -44,6 +44,7 @@ aws-lc-rs = { version = "1", features = ["fips"], optional = true }
rustls = { version = "0.23", default-features = false, features = ["std", "aws_lc_rs", "logging"] }
schema-forge-signing = { version = "0.1.0", path = "../schema-forge-signing" }
lettre = { version = "0.11.22", default-features = false, features = ["tokio1-rustls", "aws-lc-rs", "webpki-roots", "smtp-transport", "builder", "pool", "hostname"] }
schema-forge-cel = { version = "0.9.0", path = "../schema-forge-cel" }


[features]
Expand Down
10 changes: 9 additions & 1 deletion crates/schema-forge-acton/src/conversions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,20 @@ pub fn dynamic_value_to_json(value: &DynamicValue) -> serde_json::Value {
DynamicValue::DateTime(dt) => {
serde_json::Value::String(dt.to_rfc3339_opts(SecondsFormat::Millis, true))
}
DynamicValue::Duration(d) => {
serde_json::Value::String(schema_forge_core::types::format_go_duration(d))
}
DynamicValue::Bytes(b) => {
serde_json::Value::String(schema_forge_core::types::encode_standard(b))
}
DynamicValue::Enum(s) => serde_json::Value::String(s.clone()),
DynamicValue::Json(v) => v.clone(),
DynamicValue::Array(arr) => {
serde_json::Value::Array(arr.iter().map(dynamic_value_to_json).collect())
}
DynamicValue::Composite(map) => {
DynamicValue::Composite(map) | DynamicValue::Map(map) => {
// Both a fixed-field Composite and an open-key typed Map serialize
// to a JSON object on the wire.
let obj: serde_json::Map<String, serde_json::Value> = map
.iter()
.map(|(k, v)| (k.clone(), dynamic_value_to_json(v)))
Expand Down
5 changes: 5 additions & 0 deletions crates/schema-forge-acton/src/hooks/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@
//! response before persisting. If `abort_reason` is set, the request
//! aborts with [`crate::error::ForgeError::HookAborted`]. If the
//! response carries modified fields, they replace the entity payload.
//! `before_*` hooks run *after* the in-transaction rule phases
//! (`@default` → `@compute` → `@require`; see [`crate::rules`]), so they
//! operate on the already-defaulted/computed/validated field set and a
//! `@require` rejection short-circuits the write before any hook
//! round-trip.
//! 2. **Detached (`after_*`)**: the route handler queues a
//! [`dispatch_actor::DispatchHook`] message on the
//! [`dispatch_actor::HookDispatchActor`] and returns immediately to
Expand Down
1 change: 1 addition & 0 deletions crates/schema-forge-acton/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ pub mod hooks;
pub mod messages;
pub mod middleware;
pub mod routes;
pub mod rules;
pub mod shared;
pub mod shared_auth;
pub mod state;
Expand Down
Loading
Loading