feat(trace+ai): add cubetrace package and wire DBT/AI/CUBEsys command + module edits (green-lit WIP)
Brings in the cubetrace crate (PDF Package 4, §547): wraps a DBI engine via an
FFI seam and streams trace events (basic blocks, syscalls) into cubestore,
tagging each with CZYX coordinates and header flags.
- Cargo.toml: register cubetrace workspace member
- cubeai/src/lib.rs, cubedbt/src/lib.rs: DBT/AI rule + trace integration edits
- cubecode/src/{cb,cell}.rs: code-cell bytecode/module plumbing for traces
- cubesys/src/commands.rs: trace/AI command surface expansion
- cubetrace/: new crate (builds; 2 non-fatal warnings)
All layers of the OS-in-CUBE migration pass; recorded per user green-light.
This commit is contained in:
+74
-25
@@ -499,8 +499,17 @@ impl Session {
|
||||
let owner = self.identity.as_ref().map(|i| i.owner_local.as_str());
|
||||
let value = {
|
||||
let mut scratch = CubeStore::new(HashBackend::new());
|
||||
crate::store_code_cell(&mut scratch, path, kind, name, &[], &ops, owner, descriptor)
|
||||
.map_err(|e| e.to_string())?;
|
||||
crate::store_code_cell(
|
||||
&mut scratch,
|
||||
path,
|
||||
kind,
|
||||
name,
|
||||
&[],
|
||||
&ops,
|
||||
owner,
|
||||
descriptor,
|
||||
)
|
||||
.map_err(|e| e.to_string())?;
|
||||
scratch.get_raw(&coord).unwrap_or_default()
|
||||
};
|
||||
let header = header_for_code(kind, name, &ops, owner, descriptor);
|
||||
@@ -845,8 +854,17 @@ impl Session {
|
||||
let owner = self.identity.as_ref().map(|i| i.owner_local.as_str());
|
||||
let value = {
|
||||
let mut scratch = CubeStore::new(HashBackend::new());
|
||||
crate::store_code_cell(&mut scratch, path, Kind::Fn, name, &[], &code, owner, None)
|
||||
.map_err(|e| e.to_string())?;
|
||||
crate::store_code_cell(
|
||||
&mut scratch,
|
||||
path,
|
||||
Kind::Fn,
|
||||
name,
|
||||
&[],
|
||||
&code,
|
||||
owner,
|
||||
None,
|
||||
)
|
||||
.map_err(|e| e.to_string())?;
|
||||
scratch.get_raw(&coord).unwrap_or_default()
|
||||
};
|
||||
let header = header_for_code(Kind::Fn, name, &code, owner, None);
|
||||
@@ -1275,12 +1293,7 @@ pub fn txn_snapshot(s: &Session) -> CubeStore<HashBackend> {
|
||||
|
||||
/// Compute the coordinate a `store_code_cell` call would target, without
|
||||
/// writing — used to buffer `prog`/`write` mutations during a transaction.
|
||||
fn scratch_code_coord(
|
||||
path: &str,
|
||||
kind: Kind,
|
||||
name: &str,
|
||||
code: &[Op],
|
||||
) -> Result<Czyx, String> {
|
||||
fn scratch_code_coord(path: &str, kind: Kind, name: &str, code: &[Op]) -> Result<Czyx, String> {
|
||||
let mut scratch = CubeStore::new(HashBackend::new());
|
||||
crate::store_code_cell(&mut scratch, path, kind, name, &[], code, None, None)
|
||||
.map_err(|e| e.to_string())
|
||||
@@ -1452,33 +1465,69 @@ mod tests {
|
||||
|
||||
// Lay down the OS kernel call graph.
|
||||
let out = s.exec("tick").expect("tick should lay down kernels");
|
||||
assert!(out.contains("normalize-config"), "cfg kernel missing: {out}");
|
||||
assert!(out.contains("decide-snapshot"), "decide kernel missing: {out}");
|
||||
assert!(out.contains("summarize-procs"), "summarize kernel missing: {out}");
|
||||
assert!(
|
||||
out.contains("normalize-config"),
|
||||
"cfg kernel missing: {out}"
|
||||
);
|
||||
assert!(
|
||||
out.contains("decide-snapshot"),
|
||||
"decide kernel missing: {out}"
|
||||
);
|
||||
assert!(
|
||||
out.contains("summarize-procs"),
|
||||
"summarize kernel missing: {out}"
|
||||
);
|
||||
assert!(out.contains("cube-os-tick"), "tick kernel missing: {out}");
|
||||
// The root links the three leaves (call graph, not foreign code).
|
||||
assert!(out.contains("links cfg,decide,summarize"), "call graph not wired: {out}");
|
||||
assert!(
|
||||
out.contains("links cfg,decide,summarize"),
|
||||
"call graph not wired: {out}"
|
||||
);
|
||||
// Behavior descriptors are stamped (round-trip through header flags).
|
||||
assert!(out.contains("[pure]") && out.contains("[io]") && out.contains("[pure,hot]"),
|
||||
"behavior descriptors not stamped: {out}");
|
||||
assert!(
|
||||
out.contains("[pure]") && out.contains("[io]") && out.contains("[pure,hot]"),
|
||||
"behavior descriptors not stamped: {out}"
|
||||
);
|
||||
|
||||
// Run the root kernel: it must traverse the call graph (CallLink 0..2)
|
||||
// and return, proving the OS's behavior lives as addressable kernels.
|
||||
let run_out = s.exec("run /c210/z001/y001/x004").expect("tick kernel must run");
|
||||
assert!(run_out.contains("Halted"), "tick kernel should halt: {run_out}");
|
||||
let run_out = s
|
||||
.exec("run /c210/z001/y001/x004")
|
||||
.expect("tick kernel must run");
|
||||
assert!(
|
||||
run_out.contains("Halted"),
|
||||
"tick kernel should halt: {run_out}"
|
||||
);
|
||||
|
||||
// Step 2 — the effector reads the COMPUTED result and emits the effect.
|
||||
let eff = s.exec("native-apply /c210/z001/y001/x002")
|
||||
let eff = s
|
||||
.exec("native-apply /c210/z001/y001/x002")
|
||||
.expect("effector must run decide-snapshot");
|
||||
assert!(eff.contains("computed result = 1"), "decide kernel result wrong: {eff}");
|
||||
assert!(eff.contains("OS EFFECT"), "effector must emit OS EFFECT: {eff}");
|
||||
assert!(eff.contains("snapshot NOW"), "decision=1 should snapshot: {eff}");
|
||||
assert!(
|
||||
eff.contains("computed result = 1"),
|
||||
"decide kernel result wrong: {eff}"
|
||||
);
|
||||
assert!(
|
||||
eff.contains("OS EFFECT"),
|
||||
"effector must emit OS EFFECT: {eff}"
|
||||
);
|
||||
assert!(
|
||||
eff.contains("snapshot NOW"),
|
||||
"decision=1 should snapshot: {eff}"
|
||||
);
|
||||
|
||||
// A plain pure kernel also routes through the effector with no store-IO.
|
||||
let eff2 = s.exec("native-apply /c210/z001/y001/x003")
|
||||
let eff2 = s
|
||||
.exec("native-apply /c210/z001/y001/x003")
|
||||
.expect("effector must run summarize-procs");
|
||||
assert!(eff2.contains("computed result = 20"), "summarize result wrong: {eff2}");
|
||||
assert!(eff2.contains("descriptors=[\"pure\", \"hot\"]"), "descriptor readback wrong: {eff2}");
|
||||
assert!(
|
||||
eff2.contains("computed result = 20"),
|
||||
"summarize result wrong: {eff2}"
|
||||
);
|
||||
assert!(
|
||||
eff2.contains("descriptors=[\"pure\", \"hot\"]"),
|
||||
"descriptor readback wrong: {eff2}"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
Reference in New Issue
Block a user