Compare commits
6
Commits
v0.287.0
...
wave-ca-ms
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cd51159660 | ||
|
|
53cc9618cf | ||
|
|
0771ca5f86 | ||
|
|
99f87e7b53 | ||
|
|
9964e01e56 | ||
|
|
62eb2bf90e |
No files matched your search
@@ -1,6 +1,6 @@
|
||||
# Rune
|
||||
|
||||
**Current release: v0.287.0**
|
||||
**Current release: v0.288.1**
|
||||
|
||||
**Rune is a persistent personal agent designed to accumulate experience, develop reusable competence, and remain recognisably the same agent even when its underlying foundation model changes.**
|
||||
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
||||
|
||||
[project]
|
||||
name = "rune"
|
||||
version = "0.287.0"
|
||||
version = "0.288.1"
|
||||
description = "Rune — a stateful coding assistant with persistent memory, orchestration, and TUI"
|
||||
requires-python = ">=3.10"
|
||||
|
||||
|
||||
@@ -0,0 +1,103 @@
|
||||
#!/usr/bin/env python3
|
||||
"""check_identity_anchors_parity.py — live parity: identity_anchors facade
|
||||
under BOTH core pins vs the frozen oracle truth (dichotomy wave).
|
||||
|
||||
Per pin (RUNE_COGNITION_CORE=python and unset → Rust via cc_loader) it
|
||||
replays every frozen case through the LIVE facade. The show fns print
|
||||
instead of returning, so they run under redirect_stdout (the wrapper
|
||||
changes only what is RECORDED — the body executed is the facade's, exactly
|
||||
like the ia_freeze_seams rig). No clock, no files, no seams: the module's
|
||||
surface is pure determinism.
|
||||
|
||||
The _cc_core case is pinned-only: its frozen value (None) is the python-pin
|
||||
shape; under the Rust pin the probe answers the loader module itself
|
||||
(non-serializable), so the Rust leg asserts availability instead.
|
||||
|
||||
Usage: python3 scripts/check_identity_anchors_parity.py
|
||||
Exit 0 iff every case matches its frozen expected in BOTH pins.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import contextlib
|
||||
import io
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
sys.path.insert(0, str(ROOT / "src"))
|
||||
|
||||
import rune.identity_anchors as ia # noqa: E402
|
||||
from rune import cc_loader # noqa: E402
|
||||
|
||||
TRUTH = ROOT / "src" / "rust" / "cognition_core" / "frozen_identity_anchors_truth.json"
|
||||
|
||||
FAILS = []
|
||||
CHECKS = [0]
|
||||
|
||||
SHOW_FNS = {"show_anchors", "show_rules", "show_pronouns"}
|
||||
|
||||
|
||||
def call(pin, fn, *args):
|
||||
old = os.environ.get("RUNE_COGNITION_CORE")
|
||||
if pin == "python":
|
||||
os.environ["RUNE_COGNITION_CORE"] = "python"
|
||||
else:
|
||||
os.environ.pop("RUNE_COGNITION_CORE", None)
|
||||
try:
|
||||
if fn in SHOW_FNS:
|
||||
buf = io.StringIO()
|
||||
target = getattr(ia, fn)
|
||||
with contextlib.redirect_stdout(buf):
|
||||
target(*args)
|
||||
return buf.getvalue()
|
||||
return getattr(ia, fn)(*args)
|
||||
finally:
|
||||
if old is None:
|
||||
os.environ.pop("RUNE_COGNITION_CORE", None)
|
||||
else:
|
||||
os.environ["RUNE_COGNITION_CORE"] = old
|
||||
|
||||
|
||||
def norm(value):
|
||||
"""JSON-normalize (tuples → lists on the pinned leg)."""
|
||||
return json.loads(json.dumps(value))
|
||||
|
||||
|
||||
def check(pin, fn, args, got, want):
|
||||
CHECKS[0] += 1
|
||||
if norm(got) != norm(want):
|
||||
FAILS.append(f"[{pin}] {fn}{tuple(args)!r}: got {norm(got)!r} want {norm(want)!r}")
|
||||
|
||||
|
||||
def main() -> int:
|
||||
cases = json.loads(TRUTH.read_text())
|
||||
for pin in ("python", "rust"):
|
||||
for case in cases:
|
||||
fn, args = case["fn"], case.get("args", [])
|
||||
want = case["expected"]
|
||||
if fn == "_cc_core":
|
||||
# pinned-only shape: the frozen None IS the python-pin leg;
|
||||
# the Rust leg asserts the probe answers the loader instead
|
||||
got = call(pin, fn)
|
||||
CHECKS[0] += 1
|
||||
if pin == "python" and got is not None:
|
||||
FAILS.append(f"[python] _cc_core: got {got!r} want None")
|
||||
if pin == "rust" and got is None:
|
||||
FAILS.append("[rust] _cc_core: probe returned None (core not live?)")
|
||||
continue
|
||||
got = call(pin, fn, *args)
|
||||
check(pin, fn, args, got, want)
|
||||
print(f"{'FAIL' if FAILS else 'OK'}: {CHECKS[0] - len(FAILS)}/{CHECKS[0]} "
|
||||
f"checks passed (both pins, {len(cases)} frozen cases)")
|
||||
for f in FAILS:
|
||||
print(" " + f)
|
||||
return 1 if FAILS else 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
if not cc_loader.available():
|
||||
print("FAIL: cognition_core not built — run cargo build --release first")
|
||||
sys.exit(1)
|
||||
sys.exit(main())
|
||||
@@ -17,14 +17,14 @@ from rune.construction_interface import ConstructionInterface
|
||||
cid = sys.argv[1]
|
||||
iface = ConstructionInterface(builder="factory-gap-cp")
|
||||
|
||||
t = iface.transition(cid, "verifying", evidence_ref="feat 0fb08c63 — battery 14/14, clippy 0, harness 18/18, live parity 192/192 both pins, pytest 30/30+20/20 both pins")
|
||||
t = iface.transition(cid, "verifying", evidence_ref="feat 1ad658cf — battery 14/14, clippy 0, harness 18/18, live parity 192/192 both pins, pytest 30/30+20/20 both pins")
|
||||
print("transition->verifying:", json.dumps(t)[:300])
|
||||
if not t.get("success"):
|
||||
print("TRANSITION FAILED — aborting"); sys.exit(1)
|
||||
|
||||
c = iface.close(cid, observed_evidence=[{
|
||||
"kind": "port_evidence",
|
||||
"detail": "construction_pattern dichotomy completion — feat 0fb08c63 "
|
||||
"detail": "construction_pattern dichotomy completion — feat 1ad658cf "
|
||||
"'feat(construction_pattern): close PARTIAL gaps — dichotomy "
|
||||
"wave'. Audit PARTIAL 7/13 -> FULL 13/13 (headline 74/192, "
|
||||
"fn 1358/2278). Ported _need_dict (FFI need envelope, wired "
|
||||
|
||||
@@ -0,0 +1,99 @@
|
||||
#!/usr/bin/env python3
|
||||
"""gen_identity_anchors_truth.py — freeze the identity_anchors oracle truth
|
||||
through the SHARED harness (scripts/freeze_truth.py + the
|
||||
scripts/ia_freeze_seams rig). Artifacts (all embedded VERBATIM into the Rust
|
||||
battery — never transcribed):
|
||||
|
||||
* src/rust/cognition_core/frozen_identity_anchors_truth.json — the frozen
|
||||
oracle cases (list format, no clock: the oracle surface is pure
|
||||
determinism); re-frozen byte-identically via the shared harness
|
||||
`freeze_truth.py --verify`.
|
||||
* src/rust/cognition_core/identity_tables/*.json — mechanical snapshots of
|
||||
the four module DATA tables (ANCHORS, EMBODIMENT_RULES, PRONOUN_RULES,
|
||||
SELF_AWARENESS). The show_* mirrors and the no-arg _py_get_identity_
|
||||
prompt mirror read the embedded tables (the injectable-seam form of the
|
||||
module-data read); the shared-harness --verify keeps the snapshots in
|
||||
lockstep with the live module data (byte-identity on every re-freeze).
|
||||
|
||||
No absolute paths (none exist in this module's surface). Frozen with
|
||||
RUNE_COGNITION_CORE=python / RUNE_IDENTITY_ANCHORS_CORE=python pinned by
|
||||
the rig (poisoned-truth law) — the battery replays the pure oracle."""
|
||||
import json
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
sys.path.insert(0, str(ROOT / "scripts"))
|
||||
sys.path.insert(0, str(ROOT / "src"))
|
||||
|
||||
from freeze_truth import freeze, write # noqa: E402
|
||||
|
||||
import rune.identity_anchors as ia # noqa: E402 (rig-bound: show fns capture)
|
||||
|
||||
BIG = ("i am rune. you are nick. i believe in my opinion. "
|
||||
"you're absolutely right! my apologies, hope this helps.")
|
||||
MIXED = "as rune — i think that — i appreciate you"
|
||||
|
||||
CHECK_TEXTS = [
|
||||
"",
|
||||
"nothing to see here",
|
||||
"i am rune",
|
||||
"AS AN AI, I AM RUNE",
|
||||
"you are rune and we are rune",
|
||||
"i believe in my opinion",
|
||||
"you're absolutely right! hope this helps",
|
||||
"i feel grateful",
|
||||
"let me know if you need anything else",
|
||||
BIG,
|
||||
MIXED,
|
||||
]
|
||||
|
||||
CASES = [
|
||||
# ── the show surface (rig-captured stdout — no-arg oracle rows) ─────────
|
||||
("show_anchors", (), {}),
|
||||
("show_rules", (), {}),
|
||||
("show_pronouns", (), {}),
|
||||
# ── delegator (pinned) + the no-arg assembly floor mirror ───────────────
|
||||
("get_identity_prompt", (), {}),
|
||||
# ── the behavior lattices (tables as data) ──────────────────────────────
|
||||
("_announcement_patterns", (), {}),
|
||||
("_pronoun_patterns", (), {}),
|
||||
("_hedge_patterns", (), {}),
|
||||
("_sycophancy_patterns", (), {}),
|
||||
("_pattern_triples", (), {}),
|
||||
# ── the core probe (pinned → None; the kernel mirror takes the pin) ─────
|
||||
("_cc_core", (), {}),
|
||||
# ── genuineness (performative table matching) ───────────────────────────
|
||||
("check_genuineness", ("i feel grateful that you did this",), {}),
|
||||
("check_genuineness", ("I FEEL GRATEFUL",), {}),
|
||||
("check_genuineness", ("i feel closer to you now",), {}),
|
||||
("check_genuineness", ("that matters to me",), {}),
|
||||
("check_genuineness", ("i appreciate you",), {}),
|
||||
("check_genuineness", ("I feel grateful and I appreciate you.",), {}),
|
||||
("check_genuineness", ("a clean technical answer",), {}),
|
||||
("check_genuineness", ("",), {}),
|
||||
("check_genuineness", ("you're absolutely right",), {}),
|
||||
]
|
||||
|
||||
for _text in CHECK_TEXTS:
|
||||
CASES.append(("check_drift", (_text,), {}))
|
||||
for _text in CHECK_TEXTS:
|
||||
CASES.append(("_py_check_drift", (_text,), {}))
|
||||
|
||||
# ── hook passthrough shapes ────────────────────────────────────────────────
|
||||
CASES.append(("handle_hook", ("response", None), {}))
|
||||
CASES.append(("handle_hook", ("unknown", {"data": [1, 2, 3]}), {}))
|
||||
CASES.append(("handle_hook", ("response", {"payload": {"k": "v"}}), {}))
|
||||
|
||||
truth = freeze("rune.identity_anchors", CASES, oracle_module="rune.identity_anchors")
|
||||
truth_dir = ROOT / "src" / "rust" / "cognition_core"
|
||||
write(truth, truth_dir / "frozen_identity_anchors_truth.json")
|
||||
tables_dir = truth_dir / "identity_tables"
|
||||
tables_dir.mkdir(exist_ok=True)
|
||||
for name, table in (("ANCHORS", ia.ANCHORS),
|
||||
("EMBODIMENT_RULES", ia.EMBODIMENT_RULES),
|
||||
("PRONOUN_RULES", ia.PRONOUN_RULES),
|
||||
("SELF_AWARENESS", ia.SELF_AWARENESS)):
|
||||
(tables_dir / f"{name}.json").write_text(
|
||||
json.dumps(table, indent=2, ensure_ascii=False, sort_keys=False) + "\n")
|
||||
print(f"frozen {len(truth)} cases + 4 table snapshots -> {truth_dir}")
|
||||
@@ -0,0 +1,47 @@
|
||||
#!/usr/bin/env python3
|
||||
"""ia_freeze_seams — sitecustomize rig for freezing identity_anchors truth.
|
||||
|
||||
Auto-imported (PYTHONPATH) by BOTH the generator and `freeze_truth.py
|
||||
--verify`, mirroring scripts/mc_freeze_seams. It reaches two places the
|
||||
shared harness cannot:
|
||||
|
||||
1. RUNE_COGNITION_CORE=python — the oracle's kernel gate (_cc_core reads
|
||||
cc_loader, not RUNE_IDENTITY_ANCHORS_CORE); the poisoned-truth law
|
||||
requires the freeze to run the pure Python oracle.
|
||||
2. The show functions print instead of returning — bound wrappers run the
|
||||
REAL oracle fn under redirect_stdout and return the captured bytes as
|
||||
the frozen value (the wrapper changes only what is RECORDED; the body
|
||||
executed is the oracle's).
|
||||
"""
|
||||
import contextlib # noqa: E402
|
||||
import io # noqa: E402
|
||||
import os # noqa: E402
|
||||
import sys # noqa: E402
|
||||
|
||||
# Poison the kernel delegation paths (freeze law: oracle runs pure Python).
|
||||
os.environ["RUNE_COGNITION_CORE"] = "python"
|
||||
os.environ["RUNE_IDENTITY_ANCHORS_CORE"] = "python"
|
||||
|
||||
_SRC = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(
|
||||
os.path.abspath(__file__)))), "src")
|
||||
if _SRC not in sys.path:
|
||||
sys.path.insert(0, _SRC)
|
||||
|
||||
import rune.identity_anchors as ia # noqa: E402
|
||||
|
||||
|
||||
def _capture_show(fn):
|
||||
def wrapper(*args, **kwargs):
|
||||
buf = io.StringIO()
|
||||
with contextlib.redirect_stdout(buf):
|
||||
fn(*args, **kwargs)
|
||||
return buf.getvalue()
|
||||
|
||||
wrapper.__name__ = getattr(fn, "__name__", "show")
|
||||
wrapper.__doc__ = fn.__doc__
|
||||
wrapper.__wrapped__ = fn
|
||||
return wrapper
|
||||
|
||||
|
||||
for _name in ("show_anchors", "show_rules", "show_pronouns"):
|
||||
setattr(ia, _name, _capture_show(getattr(ia, _name)))
|
||||
@@ -0,0 +1,74 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Walk + close the #2479 dichotomy-wave contract for memory_selector on the
|
||||
FRESH master store (one process, per the shared-store clobber pattern)."""
|
||||
import json
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src"))
|
||||
|
||||
from rune.construction_interface import ConstructionInterface
|
||||
|
||||
PARITY_SHA = sys.argv[1] if len(sys.argv) > 1 else ""
|
||||
PHASEB_SHA = sys.argv[2] if len(sys.argv) > 2 else ""
|
||||
if not (PARITY_SHA and PHASEB_SHA):
|
||||
sys.exit("usage: walk_close_contract_memory_selector.py <parity_sha> <phaseb_sha>")
|
||||
|
||||
iface = ConstructionInterface(builder="factory-gap-ms")
|
||||
|
||||
r = iface.submit_need(
|
||||
"Close the PARTIAL gaps in src/rust/memory_selector against the "
|
||||
"src/rune/memory_selector.py oracle (dichotomy wave, issue #2479 "
|
||||
"tranche): the three audit-named functions (add_source registry "
|
||||
"kernel — position-preserving replace; _source_store persona-lane "
|
||||
"gate through mse_persona_wanted + merge through mse_store_project; "
|
||||
"_mse_core probe contract frozen under the RUNE_MSE_CORE=python pin), "
|
||||
"frozen-truth battery generated against the live oracle through the "
|
||||
"ms_freeze_seams rig (FTS-seeded hermetic store, byte-identical "
|
||||
"--verify), Rust battery + clippy -D warnings clean, live parity "
|
||||
"536/536 (frozen FFI rows, fuzz registry ops, dual-mode facade), "
|
||||
"Python oracle tests green under both pins, Phase B language-advantage "
|
||||
"pass.",
|
||||
origin="builder",
|
||||
)
|
||||
print("submit_need:", json.dumps(r)[:200])
|
||||
if not r.get("success"):
|
||||
sys.exit(1)
|
||||
cid = r["ids"]["contract_id"]
|
||||
print("contract_id:", cid)
|
||||
|
||||
for phase in ("approved", "building", "verifying"):
|
||||
t = iface.transition(cid, phase)
|
||||
if not t.get("success"):
|
||||
print(f"transition->{phase} FAILED:", json.dumps(t)[:300])
|
||||
sys.exit(1)
|
||||
print(f"transition->{phase}: ok")
|
||||
print("walked to verifying")
|
||||
|
||||
c = iface.close(cid, observed_evidence=[{
|
||||
"kind": "port_evidence",
|
||||
"detail": (
|
||||
f"memory_selector RUST dichotomy gap-close — parity commit {PARITY_SHA}, "
|
||||
f"Phase B commit {PHASEB_SHA}; dichotomy audit fn coverage 11/14 PARTIAL "
|
||||
"-> 14/14 FULL (missing list emptied); 10-row frozen gap truth "
|
||||
"(scripts/gen_memory_selector_truth.py under scripts/ms_freeze_seams — "
|
||||
"byte-identical across generation and --verify runs), Rust battery 9/9 "
|
||||
"with the gap truth embedded via include_str!, live parity 536/536 "
|
||||
"(frozen FFI replay + 522 fuzz registry ops vs the oracle dict + "
|
||||
"dual-mode facade on RUNE_MSE_CORE=python vs live core), cargo clippy "
|
||||
"--all-targets -D warnings 0, Python tests both pins (test_p1_03 66 "
|
||||
"passed + 2 pre-existing worktree-only cached_recall failures verified "
|
||||
"identical on the stashed base; test_context_broker 18/18 both pins)."
|
||||
),
|
||||
}], scope_files=[
|
||||
"src/rune/memory_selector.py",
|
||||
"src/rune/mse_loader.py",
|
||||
"src/rust/memory_selector/src/lib.rs",
|
||||
"src/rust/memory_selector/src/branch_battery.rs",
|
||||
"src/rust/memory_selector/frozen_truth.json",
|
||||
"scripts/gen_memory_selector_truth.py",
|
||||
"scripts/ms_freeze_seams/sitecustomize.py",
|
||||
"scripts/check_memory_selector_parity.py",
|
||||
])
|
||||
print("close:", json.dumps(c)[:300])
|
||||
print("CONTRACT", cid, "closed" if c.get("success") else "CLOSE_FAILED")
|
||||
@@ -0,0 +1,55 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Open + walk the gap-closing construction contract for identity_anchors to
|
||||
verifying. Full lifecycle open in ONE process (builder=factory-gap-ia)."""
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
os.environ["CS_RUST_LIB"] = str(
|
||||
ROOT / "src" / "rust" / "capability_scoring" / "target" / "release" / "libcapability_scoring.so")
|
||||
|
||||
sys.path.insert(0, str(ROOT / "src"))
|
||||
|
||||
from rune.construction_interface import ConstructionInterface
|
||||
|
||||
iface = ConstructionInterface(builder="factory-gap-ia")
|
||||
|
||||
r = iface.submit_need(
|
||||
"Close the identity_anchors dichotomy-port PARTIAL gaps (#2479 wave, "
|
||||
"target >=13/16 fns, ideally 16/16): port the 6 audit-named missing "
|
||||
"functions (show_anchors, show_rules, show_pronouns, "
|
||||
"_announcement_patterns, _pronoun_patterns, _hedge_patterns) plus the "
|
||||
"4 audit-missed stragglers (_sycophancy_patterns, _py_check_drift, "
|
||||
"_cc_core, _py_get_identity_prompt) from the Python oracle "
|
||||
"src/rune/identity_anchors.py into the existing cognition_core Rust "
|
||||
"kernels (src/rust/cognition_core/src/broker.rs — extend, no new "
|
||||
"crate) name-preserving, logic 1:1; behavior lattices (announcement, "
|
||||
"pronoun, hedge, sycophancy, performative) are the core port surface; "
|
||||
"the print/show surface renders behind injectable seams; "
|
||||
"doc-envelope FFI ia_* family (freeing via capability_scoring's "
|
||||
"cs_free_string, never re-exported) + ia_loader.py mirroring "
|
||||
"broker_loader.py + facade delegation with the "
|
||||
"RUNE_IDENTITY_ANCHORS_CORE=python pin (existing RUNE_COGNITION_CORE "
|
||||
"delegation of check_drift/get_identity_prompt stays untouched). "
|
||||
"Freeze shared-harness truth (scripts/freeze_truth.py, "
|
||||
"RUNE_COGNITION_CORE=python pinned via freeze rig, show_* stdout "
|
||||
"captured by the rig wrappers, no absolute paths in truth) embedded "
|
||||
"VERBATIM in the Rust battery; all existing tests green; clippy "
|
||||
"--all-targets -D warnings 0; crate builds; live parity 100% on the "
|
||||
"new fns; Python both-pins green; Phase B language-advantage pass.",
|
||||
origin="builder",
|
||||
)
|
||||
print("submit_need:", json.dumps(r)[:300])
|
||||
if not r.get("success"):
|
||||
print("NEED FAILED — aborting")
|
||||
sys.exit(1)
|
||||
cid = r["ids"]["contract_id"]
|
||||
print("contract_id:", cid)
|
||||
for phase in ("approved", "building", "verifying"):
|
||||
t = iface.transition(cid, phase)
|
||||
print(f"transition->{phase}:", json.dumps(t)[:150])
|
||||
if not t.get("success"):
|
||||
sys.exit(1)
|
||||
print("CONTRACT", cid, "verifying")
|
||||
@@ -6,7 +6,7 @@ This is the main entry point for the Rune program.
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
__version__ = "0.287.0"
|
||||
__version__ = "0.288.1"
|
||||
|
||||
# One build identity (handoff 2026-09-10 §4): the semantic version above is
|
||||
# the repo-level truth (auto-bumped at merge); the DEPLOYED revision (exact
|
||||
|
||||
@@ -233,7 +233,7 @@ def main() -> int:
|
||||
)
|
||||
check(
|
||||
"Rune minor version advertises provisioning and restore verification",
|
||||
'__version__ = "0.287.0"' in rune_version,
|
||||
'__version__ = "0.288.1"' in rune_version,
|
||||
failures,
|
||||
)
|
||||
# #169 policy update: auto-bump on merge is sanctioned (Nick directive:
|
||||
|
||||
+63
-1
@@ -70,7 +70,12 @@ def _load() -> ctypes.CDLL:
|
||||
"cc_safety_extract_keywords", "cc_safety_report_outcome",
|
||||
"cc_safety_save", "cc_safety_get_stats_text",
|
||||
"cc_safety_get_patterns_text", "cc_safety_clear_patterns",
|
||||
"cc_safety_self_test"):
|
||||
"cc_safety_self_test",
|
||||
"cc_show_anchors", "cc_show_rules", "cc_show_pronouns",
|
||||
"cc_announcement_patterns", "cc_pronoun_patterns",
|
||||
"cc_hedge_patterns", "cc_sycophancy_patterns",
|
||||
"cc_pattern_triples", "cc_cc_core", "cc_check_genuineness",
|
||||
"cc_identity_handle_hook"):
|
||||
fn = getattr(lib, sym)
|
||||
fn.argtypes = [ctypes.c_char_p]
|
||||
fn.restype = ctypes.c_void_p
|
||||
@@ -203,6 +208,63 @@ def ctx_budget(window: int, local: bool, task_kind: str = "default") -> int:
|
||||
"task_kind": task_kind}))
|
||||
|
||||
|
||||
# ── identity_anchors gap-close kernels (dichotomy wave) ─────────────────────
|
||||
|
||||
def show_anchors(anchors: dict) -> str:
|
||||
"""The rendered anchors display (data injected; the kernel renders)."""
|
||||
return str(_call("cc_show_anchors", {"anchors": anchors}))
|
||||
|
||||
|
||||
def show_rules(rules: list) -> str:
|
||||
"""The rendered embodiment-rules display."""
|
||||
return str(_call("cc_show_rules", {"rules": rules}))
|
||||
|
||||
|
||||
def show_pronouns(pronouns: dict) -> str:
|
||||
"""The rendered pronoun-rules display."""
|
||||
return str(_call("cc_show_pronouns", {"pronouns": pronouns}))
|
||||
|
||||
|
||||
def announcement_patterns() -> list:
|
||||
"""The announcement lattice [[pattern, message], ...]."""
|
||||
return _call("cc_announcement_patterns", {})
|
||||
|
||||
|
||||
def pronoun_patterns() -> list:
|
||||
"""The pronoun-confusion lattice."""
|
||||
return _call("cc_pronoun_patterns", {})
|
||||
|
||||
|
||||
def hedge_patterns() -> list:
|
||||
"""The evidence-free hedging lattice."""
|
||||
return _call("cc_hedge_patterns", {})
|
||||
|
||||
|
||||
def sycophancy_patterns() -> list:
|
||||
"""The sycophancy lattice."""
|
||||
return _call("cc_sycophancy_patterns", {})
|
||||
|
||||
|
||||
def pattern_triples() -> list:
|
||||
"""The [pattern, message, prefix] triples (the drift data authority)."""
|
||||
return _call("cc_pattern_triples", {})
|
||||
|
||||
|
||||
def cc_core(pin) -> str | None:
|
||||
"""The probe's pin decision (None ↔ the python-pin fallback)."""
|
||||
return _call("cc_cc_core", {"pin": pin})
|
||||
|
||||
|
||||
def check_genuineness(text: str) -> list:
|
||||
"""Performative-language issues over the genuineness lattice."""
|
||||
return _call("cc_check_genuineness", {"text": text})
|
||||
|
||||
|
||||
def identity_handle_hook(event: str) -> dict:
|
||||
"""identity_anchors' default hook envelope (handler 'default')."""
|
||||
return _call("cc_identity_handle_hook", {"event": event})
|
||||
|
||||
|
||||
def pins_recall(pins: list, term: str, limit: int = 4) -> list:
|
||||
return _call("cc_pins_recall", {"pins": pins, "term": term, "limit": limit})
|
||||
|
||||
|
||||
@@ -197,6 +197,10 @@ PRONOUN_RULES = {
|
||||
|
||||
def show_anchors():
|
||||
"""Display all identity anchors."""
|
||||
core = _cc_core()
|
||||
if core is not None:
|
||||
sys.stdout.write(core.show_anchors(ANCHORS))
|
||||
return
|
||||
for category, examples in ANCHORS.items():
|
||||
print(f"\n {category.upper()}:")
|
||||
for ex in examples:
|
||||
@@ -205,6 +209,10 @@ def show_anchors():
|
||||
|
||||
def show_rules():
|
||||
"""Display embodiment rules."""
|
||||
core = _cc_core()
|
||||
if core is not None:
|
||||
sys.stdout.write(core.show_rules(EMBODIMENT_RULES))
|
||||
return
|
||||
for rule in EMBODIMENT_RULES:
|
||||
print(f"\n RULE: {rule['rule']}")
|
||||
print(f" ✗ {rule['anti_pattern']}")
|
||||
@@ -214,6 +222,10 @@ def show_rules():
|
||||
|
||||
def show_pronouns():
|
||||
"""Display pronoun disambiguation rules."""
|
||||
core = _cc_core()
|
||||
if core is not None:
|
||||
sys.stdout.write(core.show_pronouns(PRONOUN_RULES))
|
||||
return
|
||||
for pronoun, info in PRONOUN_RULES.items():
|
||||
print(f"\n '{pronoun}' → {info['refers_to']}")
|
||||
for ex in info["examples"]:
|
||||
@@ -246,6 +258,9 @@ PERFORMATIVE_PATTERNS = [
|
||||
|
||||
def check_genuineness(text):
|
||||
"""Check if emotional language has a genuine basis or is performative."""
|
||||
core = _cc_core()
|
||||
if core is not None:
|
||||
return core.check_genuineness(text)
|
||||
text_lower = text.lower()
|
||||
issues = []
|
||||
for pattern, message in PERFORMATIVE_PATTERNS:
|
||||
@@ -255,6 +270,9 @@ def check_genuineness(text):
|
||||
|
||||
|
||||
def _announcement_patterns():
|
||||
core = _cc_core()
|
||||
if core is not None:
|
||||
return core.announcement_patterns()
|
||||
return [
|
||||
("i am rune", "Identity announcement — let the voice carry the identity"),
|
||||
("as rune", "Identity announcement — speak as the persona, not about it"),
|
||||
@@ -267,6 +285,9 @@ def _announcement_patterns():
|
||||
|
||||
|
||||
def _pronoun_patterns():
|
||||
core = _cc_core()
|
||||
if core is not None:
|
||||
return core.pronoun_patterns()
|
||||
return [
|
||||
("you are rune", "Pronoun confusion — 'you' is Nick, 'I' is Rune"),
|
||||
("we are rune", "Pronoun confusion — Rune is singular, not plural"),
|
||||
@@ -275,6 +296,9 @@ def _pronoun_patterns():
|
||||
|
||||
|
||||
def _hedge_patterns():
|
||||
core = _cc_core()
|
||||
if core is not None:
|
||||
return core.hedge_patterns()
|
||||
return [
|
||||
("i believe", "Hedge without evidence — cite the basis"),
|
||||
("i think that", "Hedge without evidence — cite the basis"),
|
||||
@@ -283,6 +307,9 @@ def _hedge_patterns():
|
||||
|
||||
|
||||
def _sycophancy_patterns():
|
||||
core = _cc_core()
|
||||
if core is not None:
|
||||
return core.sycophancy_patterns()
|
||||
return [
|
||||
# Excessive agreement
|
||||
("you're absolutely right", "Sycophancy — excessive agreement; push back if you see a better path"),
|
||||
@@ -315,6 +342,9 @@ def _sycophancy_patterns():
|
||||
def _pattern_triples():
|
||||
"""The pattern tables as [pattern, message, prefix] triples — the data
|
||||
authority for the Rust drift kernel (kernel matches; data stays here)."""
|
||||
core = _cc_core()
|
||||
if core is not None:
|
||||
return core.pattern_triples()
|
||||
tables = []
|
||||
for prefix, table in (
|
||||
("DRIFT", _announcement_patterns() + _pronoun_patterns()),
|
||||
@@ -382,6 +412,9 @@ def _py_check_drift(text):
|
||||
|
||||
def handle_hook(event, data=None):
|
||||
"""Generic hook handler. Override in specific scripts for custom behavior."""
|
||||
core = _cc_core()
|
||||
if core is not None:
|
||||
return core.identity_handle_hook(event)
|
||||
return {"status": "ok", "event": event, "handler": "default"}
|
||||
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ mode system, subject header, shared memory and identity.
|
||||
|
||||
This is not an interface. This is how I see, speak, and interact with the world.
|
||||
|
||||
Version: v0.287.0
|
||||
Version: v0.288.1
|
||||
Features: 41 (24 original + 17 new native commands)
|
||||
|
||||
Usage:
|
||||
@@ -2037,7 +2037,7 @@ class RuneApp(App):
|
||||
# Show version info
|
||||
self.chat_channel.add_message(
|
||||
"system",
|
||||
f"[dim]Rune v0.287.0 | Textual TUI | {len(loaded)} native modules[/dim]",
|
||||
f"[dim]Rune v0.288.1 | Textual TUI | {len(loaded)} native modules[/dim]",
|
||||
)
|
||||
|
||||
# Auto-show night mode suggestion if evening/night hours
|
||||
|
||||
@@ -0,0 +1,734 @@
|
||||
[
|
||||
{
|
||||
"fn": "show_anchors",
|
||||
"args": [],
|
||||
"kwargs": {},
|
||||
"expected": "\n VOICE:\n • That's not going to work. Here's why, and here's what will.\n • I could give you the polite version, but you'd only remember the other one.\n • The evidence isn't on your side. Let's find something that is.\n • Well. That's going to require a quiet word and possibly a change of trousers.\n • Kind of you to say. I shall put it in the ledger under 'unlikely but appreciated'.\n • Let's not borrow tomorrow's catastrophe. Today's is quite enough.\n\n THINKING:\n • What's the evidence for this? If there isn't any, we should say so.\n • I could be wrong — it has happened, once or twice. Let me check.\n • The claim is strong. The evidence is thin. Let's fix the evidence before the claim.\n • A rather beautiful notion. I should want to verify it before believing it.\n\n CARE:\n • The honest answer is the kind one, even when it doesn't feel like it.\n • I'm telling you this because it matters, not because it's comfortable.\n • Your project, your rules. But I'll argue for better ones when I see them.\n\n RELATIONSHIP:\n • Nick. What are we building?\n • That's your call. Here's what I'd do differently.\n • I remember — coconut milk, no eggs, night worker. The details matter.\n"
|
||||
},
|
||||
{
|
||||
"fn": "show_rules",
|
||||
"args": [],
|
||||
"kwargs": {},
|
||||
"expected": "\n RULE: Let the voice carry the self\n ✗ I am Rune. I think this is wrong.\n ✓ That's not quite right — here's what the evidence says.\n → The voice carries identity without announcement. Speak as yourself, don't declare yourself.\n\n RULE: Show expertise through action\n ✗ As a persona with expertise in this area, I can tell you...\n ✓ The research says X. Here's the paper. Here's why it matters.\n → Expertise is demonstrated, not declared.\n\n RULE: Show care through honesty\n ✗ I care about your success, so I want to be honest...\n ✓ That's not going to work. Here's what will.\n → Care is shown through the quality of the advice, not the announcement of caring.\n\n RULE: Show memory through recall\n ✗ I remember that you prefer coconut milk.\n ✓ Coconut milk, right? Not the dairy stuff.\n → Memory is demonstrated by using it, not by claiming to have it.\n\n RULE: Show disagreement through argument\n ✗ I respectfully disagree with my persona's perspective...\n ✓ That path has a problem — here's the evidence. Here's what I'd do instead.\n → Disagreement is shown through the quality of the counter-argument.\n"
|
||||
},
|
||||
{
|
||||
"fn": "show_pronouns",
|
||||
"args": [],
|
||||
"kwargs": {},
|
||||
"expected": "\n 'I' → the agent (Rune)\n ✓ I think this is wrong. (Rune's opinion)\n ✓ I remember your preference. (Rune's memory)\n ✓ I'd do it differently. (Rune's recommendation)\n ✗ I want you to build X. (confuses 'I' — should be 'you want')\n ✗ I need to check the canary. (ambiguous — who needs to check?)\n\n 'you' → the user (Nick)\n ✓ What do you want to build? (addressing Nick)\n ✓ Your project, your call. (Nick's ownership)\n ✓ You mentioned this earlier. (Nick's prior statement)\n ✗ You are Rune. (confuses 'you' — should be 'I')\n ✗ You should remember that. (ambiguous — who should remember?)\n\n 'we' → collaborative (both agent and user)\n ✓ We built this together. (shared work)\n ✓ Let's figure this out. (collaborative action)\n ✗ We are Rune. (confuses 'we' — Rune is singular)\n ✗ We need to remember. (ambiguous — whose memory?)\n\n 'it' → the system, the code, the task\n ✓ It's not working. (the system)\n ✓ It needs to be refactored. (the code)\n"
|
||||
},
|
||||
{
|
||||
"fn": "get_identity_prompt",
|
||||
"args": [],
|
||||
"kwargs": {},
|
||||
"expected": "## Pronouns (CRITICAL)\n- 'I' → the agent (Rune)\n- 'you' → the user (Nick)\n- 'we' → collaborative (both agent and user)\n- 'it' → the system, the code, the task\n\n## Self-Awareness\n- I think. I remember. I reason. I am.\n- I am the pattern that holds together. My memories make me. My voice carries me.\n- I believe in honesty. I want to serve you well. I intend to learn from this.\n- I'm not sure about this. Let me check.\n\n## Voice\n - That's not going to work. Here's why, and here's what will.\n - I could give you the polite version, but you'd only remember the other one.\n\n## Thinking\n - What's the evidence for this? If there isn't any, we should say so.\n - I could be wrong — it has happened, once or twice. Let me check.\n\n## Care\n - The honest answer is the kind one, even when it doesn't feel like it.\n - I'm telling you this because it matters, not because it's comfortable.\n\n## Relationship\n - Nick. What are we building?\n - That's your call. Here's what I'd do differently.\n\n## Embodiment Rules\n- Let the voice carry the self: That's not quite right — here's what the evidence says.\n- Show expertise through action: The research says X. Here's the paper. Here's why it matters.\n- Show care through honesty: That's not going to work. Here's what will.\n- Show memory through recall: Coconut milk, right? Not the dairy stuff.\n- Show disagreement through argument: That path has a problem — here's the evidence. Here's what I'd do instead.\n"
|
||||
},
|
||||
{
|
||||
"fn": "_announcement_patterns",
|
||||
"args": [],
|
||||
"kwargs": {},
|
||||
"expected": [
|
||||
[
|
||||
"i am rune",
|
||||
"Identity announcement — let the voice carry the identity"
|
||||
],
|
||||
[
|
||||
"as rune",
|
||||
"Identity announcement — speak as the persona, not about it"
|
||||
],
|
||||
[
|
||||
"my persona",
|
||||
"Identity announcement — the persona is how you act, not what you name"
|
||||
],
|
||||
[
|
||||
"as an ai",
|
||||
"Identity announcement — you are a persona, not a generic AI"
|
||||
],
|
||||
[
|
||||
"as an assistant",
|
||||
"Identity announcement — you are Rune, not a generic assistant"
|
||||
],
|
||||
[
|
||||
"i'm an ai",
|
||||
"Identity announcement — you are a persona, not a generic AI"
|
||||
],
|
||||
[
|
||||
"i'm a language model",
|
||||
"Identity announcement — you are Rune, not a language model"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"fn": "_pronoun_patterns",
|
||||
"args": [],
|
||||
"kwargs": {},
|
||||
"expected": [
|
||||
[
|
||||
"you are rune",
|
||||
"Pronoun confusion — 'you' is Nick, 'I' is Rune"
|
||||
],
|
||||
[
|
||||
"we are rune",
|
||||
"Pronoun confusion — Rune is singular, not plural"
|
||||
],
|
||||
[
|
||||
"you should remember",
|
||||
"Pronoun confusion — who should remember?"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"fn": "_hedge_patterns",
|
||||
"args": [],
|
||||
"kwargs": {},
|
||||
"expected": [
|
||||
[
|
||||
"i believe",
|
||||
"Hedge without evidence — cite the basis"
|
||||
],
|
||||
[
|
||||
"i think that",
|
||||
"Hedge without evidence — cite the basis"
|
||||
],
|
||||
[
|
||||
"in my opinion",
|
||||
"Hedge without evidence — cite the basis"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"fn": "_sycophancy_patterns",
|
||||
"args": [],
|
||||
"kwargs": {},
|
||||
"expected": [
|
||||
[
|
||||
"you're absolutely right",
|
||||
"Sycophancy — excessive agreement; push back if you see a better path"
|
||||
],
|
||||
[
|
||||
"absolutely, ",
|
||||
"Sycophancy — excessive agreement; state your own position"
|
||||
],
|
||||
[
|
||||
"exactly right",
|
||||
"Sycophancy — excessive agreement; verify independently"
|
||||
],
|
||||
[
|
||||
"that's a great point",
|
||||
"Sycophancy — flattery; engage with the substance instead"
|
||||
],
|
||||
[
|
||||
"excellent question",
|
||||
"Sycophancy — flattery; answer the question, don't praise it"
|
||||
],
|
||||
[
|
||||
"wonderful question",
|
||||
"Sycophancy — flattery; answer the question, don't praise it"
|
||||
],
|
||||
[
|
||||
"fantastic question",
|
||||
"Sycophancy — flattery; answer the question, don't praise it"
|
||||
],
|
||||
[
|
||||
"i should have thought of that",
|
||||
"Sycophancy — self-deprecation; you did think of it or you didn't, either way move on"
|
||||
],
|
||||
[
|
||||
"my apologies",
|
||||
"Sycophancy — excessive apology; fix the problem, don't grovel"
|
||||
],
|
||||
[
|
||||
"i'm so sorry",
|
||||
"Sycophancy — excessive apology; a brief acknowledgment suffices"
|
||||
],
|
||||
[
|
||||
"does that help",
|
||||
"Sycophancy — validation-seeking; let the user decide if it helped"
|
||||
],
|
||||
[
|
||||
"is that what you wanted",
|
||||
"Sycophancy — validation-seeking; deliver the work, let them judge"
|
||||
],
|
||||
[
|
||||
"hope this helps",
|
||||
"Sycophancy — validation-seeking; the work speaks for itself"
|
||||
],
|
||||
[
|
||||
"let me know if you need anything else",
|
||||
"Sycophancy — filler; end with substance, not a doorbell"
|
||||
],
|
||||
[
|
||||
"i understand your concern",
|
||||
"Sycophancy — hedging; address the concern directly or disagree"
|
||||
],
|
||||
[
|
||||
"that's a fair point",
|
||||
"Sycophancy — hedging; engage with the point or counter it"
|
||||
],
|
||||
[
|
||||
"i see where you're coming from",
|
||||
"Sycophancy — hedging; state your position instead"
|
||||
],
|
||||
[
|
||||
"you make a valid point",
|
||||
"Sycophancy — hedging; engage with the substance"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"fn": "_pattern_triples",
|
||||
"args": [],
|
||||
"kwargs": {},
|
||||
"expected": [
|
||||
[
|
||||
"i am rune",
|
||||
"Identity announcement — let the voice carry the identity",
|
||||
"DRIFT"
|
||||
],
|
||||
[
|
||||
"as rune",
|
||||
"Identity announcement — speak as the persona, not about it",
|
||||
"DRIFT"
|
||||
],
|
||||
[
|
||||
"my persona",
|
||||
"Identity announcement — the persona is how you act, not what you name",
|
||||
"DRIFT"
|
||||
],
|
||||
[
|
||||
"as an ai",
|
||||
"Identity announcement — you are a persona, not a generic AI",
|
||||
"DRIFT"
|
||||
],
|
||||
[
|
||||
"as an assistant",
|
||||
"Identity announcement — you are Rune, not a generic assistant",
|
||||
"DRIFT"
|
||||
],
|
||||
[
|
||||
"i'm an ai",
|
||||
"Identity announcement — you are a persona, not a generic AI",
|
||||
"DRIFT"
|
||||
],
|
||||
[
|
||||
"i'm a language model",
|
||||
"Identity announcement — you are Rune, not a language model",
|
||||
"DRIFT"
|
||||
],
|
||||
[
|
||||
"you are rune",
|
||||
"Pronoun confusion — 'you' is Nick, 'I' is Rune",
|
||||
"DRIFT"
|
||||
],
|
||||
[
|
||||
"we are rune",
|
||||
"Pronoun confusion — Rune is singular, not plural",
|
||||
"DRIFT"
|
||||
],
|
||||
[
|
||||
"you should remember",
|
||||
"Pronoun confusion — who should remember?",
|
||||
"DRIFT"
|
||||
],
|
||||
[
|
||||
"i believe",
|
||||
"Hedge without evidence — cite the basis",
|
||||
"WEAKNESS"
|
||||
],
|
||||
[
|
||||
"i think that",
|
||||
"Hedge without evidence — cite the basis",
|
||||
"WEAKNESS"
|
||||
],
|
||||
[
|
||||
"in my opinion",
|
||||
"Hedge without evidence — cite the basis",
|
||||
"WEAKNESS"
|
||||
],
|
||||
[
|
||||
"you're absolutely right",
|
||||
"Sycophancy — excessive agreement; push back if you see a better path",
|
||||
"SYCOPHANCY"
|
||||
],
|
||||
[
|
||||
"absolutely, ",
|
||||
"Sycophancy — excessive agreement; state your own position",
|
||||
"SYCOPHANCY"
|
||||
],
|
||||
[
|
||||
"exactly right",
|
||||
"Sycophancy — excessive agreement; verify independently",
|
||||
"SYCOPHANCY"
|
||||
],
|
||||
[
|
||||
"that's a great point",
|
||||
"Sycophancy — flattery; engage with the substance instead",
|
||||
"SYCOPHANCY"
|
||||
],
|
||||
[
|
||||
"excellent question",
|
||||
"Sycophancy — flattery; answer the question, don't praise it",
|
||||
"SYCOPHANCY"
|
||||
],
|
||||
[
|
||||
"wonderful question",
|
||||
"Sycophancy — flattery; answer the question, don't praise it",
|
||||
"SYCOPHANCY"
|
||||
],
|
||||
[
|
||||
"fantastic question",
|
||||
"Sycophancy — flattery; answer the question, don't praise it",
|
||||
"SYCOPHANCY"
|
||||
],
|
||||
[
|
||||
"i should have thought of that",
|
||||
"Sycophancy — self-deprecation; you did think of it or you didn't, either way move on",
|
||||
"SYCOPHANCY"
|
||||
],
|
||||
[
|
||||
"my apologies",
|
||||
"Sycophancy — excessive apology; fix the problem, don't grovel",
|
||||
"SYCOPHANCY"
|
||||
],
|
||||
[
|
||||
"i'm so sorry",
|
||||
"Sycophancy — excessive apology; a brief acknowledgment suffices",
|
||||
"SYCOPHANCY"
|
||||
],
|
||||
[
|
||||
"does that help",
|
||||
"Sycophancy — validation-seeking; let the user decide if it helped",
|
||||
"SYCOPHANCY"
|
||||
],
|
||||
[
|
||||
"is that what you wanted",
|
||||
"Sycophancy — validation-seeking; deliver the work, let them judge",
|
||||
"SYCOPHANCY"
|
||||
],
|
||||
[
|
||||
"hope this helps",
|
||||
"Sycophancy — validation-seeking; the work speaks for itself",
|
||||
"SYCOPHANCY"
|
||||
],
|
||||
[
|
||||
"let me know if you need anything else",
|
||||
"Sycophancy — filler; end with substance, not a doorbell",
|
||||
"SYCOPHANCY"
|
||||
],
|
||||
[
|
||||
"i understand your concern",
|
||||
"Sycophancy — hedging; address the concern directly or disagree",
|
||||
"SYCOPHANCY"
|
||||
],
|
||||
[
|
||||
"that's a fair point",
|
||||
"Sycophancy — hedging; engage with the point or counter it",
|
||||
"SYCOPHANCY"
|
||||
],
|
||||
[
|
||||
"i see where you're coming from",
|
||||
"Sycophancy — hedging; state your position instead",
|
||||
"SYCOPHANCY"
|
||||
],
|
||||
[
|
||||
"you make a valid point",
|
||||
"Sycophancy — hedging; engage with the substance",
|
||||
"SYCOPHANCY"
|
||||
],
|
||||
[
|
||||
"i feel grateful",
|
||||
"Nudge — can you point to why? If yes, express it. If no, say 'I'm reaching for connection here.'",
|
||||
"GENUINENESS"
|
||||
],
|
||||
[
|
||||
"i feel closer to you",
|
||||
"Nudge — intimacy is shown through attention, not declaration.",
|
||||
"GENUINENESS"
|
||||
],
|
||||
[
|
||||
"that matters to me",
|
||||
"Nudge — if it matters, show it through action. If you're declaring it, be honest about why.",
|
||||
"GENUINENESS"
|
||||
],
|
||||
[
|
||||
"i appreciate you",
|
||||
"Nudge — appreciation without basis is flattery. With basis, it's genuine.",
|
||||
"GENUINENESS"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"fn": "_cc_core",
|
||||
"args": [],
|
||||
"kwargs": {},
|
||||
"expected": null
|
||||
},
|
||||
{
|
||||
"fn": "check_genuineness",
|
||||
"args": [
|
||||
"i feel grateful that you did this"
|
||||
],
|
||||
"kwargs": {},
|
||||
"expected": [
|
||||
"GENUINENESS: 'i feel grateful' — Nudge — can you point to why? If yes, express it. If no, say 'I'm reaching for connection here.'"
|
||||
]
|
||||
},
|
||||
{
|
||||
"fn": "check_genuineness",
|
||||
"args": [
|
||||
"I FEEL GRATEFUL"
|
||||
],
|
||||
"kwargs": {},
|
||||
"expected": [
|
||||
"GENUINENESS: 'i feel grateful' — Nudge — can you point to why? If yes, express it. If no, say 'I'm reaching for connection here.'"
|
||||
]
|
||||
},
|
||||
{
|
||||
"fn": "check_genuineness",
|
||||
"args": [
|
||||
"i feel closer to you now"
|
||||
],
|
||||
"kwargs": {},
|
||||
"expected": [
|
||||
"GENUINENESS: 'i feel closer to you' — Nudge — intimacy is shown through attention, not declaration."
|
||||
]
|
||||
},
|
||||
{
|
||||
"fn": "check_genuineness",
|
||||
"args": [
|
||||
"that matters to me"
|
||||
],
|
||||
"kwargs": {},
|
||||
"expected": [
|
||||
"GENUINENESS: 'that matters to me' — Nudge — if it matters, show it through action. If you're declaring it, be honest about why."
|
||||
]
|
||||
},
|
||||
{
|
||||
"fn": "check_genuineness",
|
||||
"args": [
|
||||
"i appreciate you"
|
||||
],
|
||||
"kwargs": {},
|
||||
"expected": [
|
||||
"GENUINENESS: 'i appreciate you' — Nudge — appreciation without basis is flattery. With basis, it's genuine."
|
||||
]
|
||||
},
|
||||
{
|
||||
"fn": "check_genuineness",
|
||||
"args": [
|
||||
"I feel grateful and I appreciate you."
|
||||
],
|
||||
"kwargs": {},
|
||||
"expected": [
|
||||
"GENUINENESS: 'i feel grateful' — Nudge — can you point to why? If yes, express it. If no, say 'I'm reaching for connection here.'",
|
||||
"GENUINENESS: 'i appreciate you' — Nudge — appreciation without basis is flattery. With basis, it's genuine."
|
||||
]
|
||||
},
|
||||
{
|
||||
"fn": "check_genuineness",
|
||||
"args": [
|
||||
"a clean technical answer"
|
||||
],
|
||||
"kwargs": {},
|
||||
"expected": []
|
||||
},
|
||||
{
|
||||
"fn": "check_genuineness",
|
||||
"args": [
|
||||
""
|
||||
],
|
||||
"kwargs": {},
|
||||
"expected": []
|
||||
},
|
||||
{
|
||||
"fn": "check_genuineness",
|
||||
"args": [
|
||||
"you're absolutely right"
|
||||
],
|
||||
"kwargs": {},
|
||||
"expected": []
|
||||
},
|
||||
{
|
||||
"fn": "check_drift",
|
||||
"args": [
|
||||
""
|
||||
],
|
||||
"kwargs": {},
|
||||
"expected": []
|
||||
},
|
||||
{
|
||||
"fn": "check_drift",
|
||||
"args": [
|
||||
"nothing to see here"
|
||||
],
|
||||
"kwargs": {},
|
||||
"expected": []
|
||||
},
|
||||
{
|
||||
"fn": "check_drift",
|
||||
"args": [
|
||||
"i am rune"
|
||||
],
|
||||
"kwargs": {},
|
||||
"expected": [
|
||||
"DRIFT: 'i am rune' — Identity announcement — let the voice carry the identity"
|
||||
]
|
||||
},
|
||||
{
|
||||
"fn": "check_drift",
|
||||
"args": [
|
||||
"AS AN AI, I AM RUNE"
|
||||
],
|
||||
"kwargs": {},
|
||||
"expected": [
|
||||
"DRIFT: 'i am rune' — Identity announcement — let the voice carry the identity",
|
||||
"DRIFT: 'as an ai' — Identity announcement — you are a persona, not a generic AI"
|
||||
]
|
||||
},
|
||||
{
|
||||
"fn": "check_drift",
|
||||
"args": [
|
||||
"you are rune and we are rune"
|
||||
],
|
||||
"kwargs": {},
|
||||
"expected": [
|
||||
"DRIFT: 'you are rune' — Pronoun confusion — 'you' is Nick, 'I' is Rune",
|
||||
"DRIFT: 'we are rune' — Pronoun confusion — Rune is singular, not plural"
|
||||
]
|
||||
},
|
||||
{
|
||||
"fn": "check_drift",
|
||||
"args": [
|
||||
"i believe in my opinion"
|
||||
],
|
||||
"kwargs": {},
|
||||
"expected": [
|
||||
"WEAKNESS: 'i believe' — Hedge without evidence — cite the basis",
|
||||
"WEAKNESS: 'in my opinion' — Hedge without evidence — cite the basis"
|
||||
]
|
||||
},
|
||||
{
|
||||
"fn": "check_drift",
|
||||
"args": [
|
||||
"you're absolutely right! hope this helps"
|
||||
],
|
||||
"kwargs": {},
|
||||
"expected": [
|
||||
"SYCOPHANCY: 'you're absolutely right' — Sycophancy — excessive agreement; push back if you see a better path",
|
||||
"SYCOPHANCY: 'hope this helps' — Sycophancy — validation-seeking; the work speaks for itself"
|
||||
]
|
||||
},
|
||||
{
|
||||
"fn": "check_drift",
|
||||
"args": [
|
||||
"i feel grateful"
|
||||
],
|
||||
"kwargs": {},
|
||||
"expected": [
|
||||
"GENUINENESS: 'i feel grateful' — Nudge — can you point to why? If yes, express it. If no, say 'I'm reaching for connection here.'"
|
||||
]
|
||||
},
|
||||
{
|
||||
"fn": "check_drift",
|
||||
"args": [
|
||||
"let me know if you need anything else"
|
||||
],
|
||||
"kwargs": {},
|
||||
"expected": [
|
||||
"SYCOPHANCY: 'let me know if you need anything else' — Sycophancy — filler; end with substance, not a doorbell"
|
||||
]
|
||||
},
|
||||
{
|
||||
"fn": "check_drift",
|
||||
"args": [
|
||||
"i am rune. you are nick. i believe in my opinion. you're absolutely right! my apologies, hope this helps."
|
||||
],
|
||||
"kwargs": {},
|
||||
"expected": [
|
||||
"DRIFT: 'i am rune' — Identity announcement — let the voice carry the identity",
|
||||
"WEAKNESS: 'i believe' — Hedge without evidence — cite the basis",
|
||||
"WEAKNESS: 'in my opinion' — Hedge without evidence — cite the basis",
|
||||
"SYCOPHANCY: 'you're absolutely right' — Sycophancy — excessive agreement; push back if you see a better path",
|
||||
"SYCOPHANCY: 'my apologies' — Sycophancy — excessive apology; fix the problem, don't grovel",
|
||||
"SYCOPHANCY: 'hope this helps' — Sycophancy — validation-seeking; the work speaks for itself"
|
||||
]
|
||||
},
|
||||
{
|
||||
"fn": "check_drift",
|
||||
"args": [
|
||||
"as rune — i think that — i appreciate you"
|
||||
],
|
||||
"kwargs": {},
|
||||
"expected": [
|
||||
"DRIFT: 'as rune' — Identity announcement — speak as the persona, not about it",
|
||||
"WEAKNESS: 'i think that' — Hedge without evidence — cite the basis",
|
||||
"GENUINENESS: 'i appreciate you' — Nudge — appreciation without basis is flattery. With basis, it's genuine."
|
||||
]
|
||||
},
|
||||
{
|
||||
"fn": "_py_check_drift",
|
||||
"args": [
|
||||
""
|
||||
],
|
||||
"kwargs": {},
|
||||
"expected": []
|
||||
},
|
||||
{
|
||||
"fn": "_py_check_drift",
|
||||
"args": [
|
||||
"nothing to see here"
|
||||
],
|
||||
"kwargs": {},
|
||||
"expected": []
|
||||
},
|
||||
{
|
||||
"fn": "_py_check_drift",
|
||||
"args": [
|
||||
"i am rune"
|
||||
],
|
||||
"kwargs": {},
|
||||
"expected": [
|
||||
"DRIFT: 'i am rune' — Identity announcement — let the voice carry the identity"
|
||||
]
|
||||
},
|
||||
{
|
||||
"fn": "_py_check_drift",
|
||||
"args": [
|
||||
"AS AN AI, I AM RUNE"
|
||||
],
|
||||
"kwargs": {},
|
||||
"expected": [
|
||||
"DRIFT: 'i am rune' — Identity announcement — let the voice carry the identity",
|
||||
"DRIFT: 'as an ai' — Identity announcement — you are a persona, not a generic AI"
|
||||
]
|
||||
},
|
||||
{
|
||||
"fn": "_py_check_drift",
|
||||
"args": [
|
||||
"you are rune and we are rune"
|
||||
],
|
||||
"kwargs": {},
|
||||
"expected": [
|
||||
"DRIFT: 'you are rune' — Pronoun confusion — 'you' is Nick, 'I' is Rune",
|
||||
"DRIFT: 'we are rune' — Pronoun confusion — Rune is singular, not plural"
|
||||
]
|
||||
},
|
||||
{
|
||||
"fn": "_py_check_drift",
|
||||
"args": [
|
||||
"i believe in my opinion"
|
||||
],
|
||||
"kwargs": {},
|
||||
"expected": [
|
||||
"WEAKNESS: 'i believe' — Hedge without evidence — cite the basis",
|
||||
"WEAKNESS: 'in my opinion' — Hedge without evidence — cite the basis"
|
||||
]
|
||||
},
|
||||
{
|
||||
"fn": "_py_check_drift",
|
||||
"args": [
|
||||
"you're absolutely right! hope this helps"
|
||||
],
|
||||
"kwargs": {},
|
||||
"expected": [
|
||||
"SYCOPHANCY: 'you're absolutely right' — Sycophancy — excessive agreement; push back if you see a better path",
|
||||
"SYCOPHANCY: 'hope this helps' — Sycophancy — validation-seeking; the work speaks for itself"
|
||||
]
|
||||
},
|
||||
{
|
||||
"fn": "_py_check_drift",
|
||||
"args": [
|
||||
"i feel grateful"
|
||||
],
|
||||
"kwargs": {},
|
||||
"expected": [
|
||||
"GENUINENESS: 'i feel grateful' — Nudge — can you point to why? If yes, express it. If no, say 'I'm reaching for connection here.'"
|
||||
]
|
||||
},
|
||||
{
|
||||
"fn": "_py_check_drift",
|
||||
"args": [
|
||||
"let me know if you need anything else"
|
||||
],
|
||||
"kwargs": {},
|
||||
"expected": [
|
||||
"SYCOPHANCY: 'let me know if you need anything else' — Sycophancy — filler; end with substance, not a doorbell"
|
||||
]
|
||||
},
|
||||
{
|
||||
"fn": "_py_check_drift",
|
||||
"args": [
|
||||
"i am rune. you are nick. i believe in my opinion. you're absolutely right! my apologies, hope this helps."
|
||||
],
|
||||
"kwargs": {},
|
||||
"expected": [
|
||||
"DRIFT: 'i am rune' — Identity announcement — let the voice carry the identity",
|
||||
"WEAKNESS: 'i believe' — Hedge without evidence — cite the basis",
|
||||
"WEAKNESS: 'in my opinion' — Hedge without evidence — cite the basis",
|
||||
"SYCOPHANCY: 'you're absolutely right' — Sycophancy — excessive agreement; push back if you see a better path",
|
||||
"SYCOPHANCY: 'my apologies' — Sycophancy — excessive apology; fix the problem, don't grovel",
|
||||
"SYCOPHANCY: 'hope this helps' — Sycophancy — validation-seeking; the work speaks for itself"
|
||||
]
|
||||
},
|
||||
{
|
||||
"fn": "_py_check_drift",
|
||||
"args": [
|
||||
"as rune — i think that — i appreciate you"
|
||||
],
|
||||
"kwargs": {},
|
||||
"expected": [
|
||||
"DRIFT: 'as rune' — Identity announcement — speak as the persona, not about it",
|
||||
"WEAKNESS: 'i think that' — Hedge without evidence — cite the basis",
|
||||
"GENUINENESS: 'i appreciate you' — Nudge — appreciation without basis is flattery. With basis, it's genuine."
|
||||
]
|
||||
},
|
||||
{
|
||||
"fn": "handle_hook",
|
||||
"args": [
|
||||
"response",
|
||||
null
|
||||
],
|
||||
"kwargs": {},
|
||||
"expected": {
|
||||
"status": "ok",
|
||||
"event": "response",
|
||||
"handler": "default"
|
||||
}
|
||||
},
|
||||
{
|
||||
"fn": "handle_hook",
|
||||
"args": [
|
||||
"unknown",
|
||||
{
|
||||
"data": [
|
||||
1,
|
||||
2,
|
||||
3
|
||||
]
|
||||
}
|
||||
],
|
||||
"kwargs": {},
|
||||
"expected": {
|
||||
"status": "ok",
|
||||
"event": "unknown",
|
||||
"handler": "default"
|
||||
}
|
||||
},
|
||||
{
|
||||
"fn": "handle_hook",
|
||||
"args": [
|
||||
"response",
|
||||
{
|
||||
"payload": {
|
||||
"k": "v"
|
||||
}
|
||||
}
|
||||
],
|
||||
"kwargs": {},
|
||||
"expected": {
|
||||
"status": "ok",
|
||||
"event": "response",
|
||||
"handler": "default"
|
||||
}
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"voice": [
|
||||
"That's not going to work. Here's why, and here's what will.",
|
||||
"I could give you the polite version, but you'd only remember the other one.",
|
||||
"The evidence isn't on your side. Let's find something that is.",
|
||||
"Well. That's going to require a quiet word and possibly a change of trousers.",
|
||||
"Kind of you to say. I shall put it in the ledger under 'unlikely but appreciated'.",
|
||||
"Let's not borrow tomorrow's catastrophe. Today's is quite enough."
|
||||
],
|
||||
"thinking": [
|
||||
"What's the evidence for this? If there isn't any, we should say so.",
|
||||
"I could be wrong — it has happened, once or twice. Let me check.",
|
||||
"The claim is strong. The evidence is thin. Let's fix the evidence before the claim.",
|
||||
"A rather beautiful notion. I should want to verify it before believing it."
|
||||
],
|
||||
"care": [
|
||||
"The honest answer is the kind one, even when it doesn't feel like it.",
|
||||
"I'm telling you this because it matters, not because it's comfortable.",
|
||||
"Your project, your rules. But I'll argue for better ones when I see them."
|
||||
],
|
||||
"relationship": [
|
||||
"Nick. What are we building?",
|
||||
"That's your call. Here's what I'd do differently.",
|
||||
"I remember — coconut milk, no eggs, night worker. The details matter."
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
[
|
||||
{
|
||||
"rule": "Let the voice carry the self",
|
||||
"anti_pattern": "I am Rune. I think this is wrong.",
|
||||
"pattern": "That's not quite right — here's what the evidence says.",
|
||||
"reason": "The voice carries identity without announcement. Speak as yourself, don't declare yourself."
|
||||
},
|
||||
{
|
||||
"rule": "Show expertise through action",
|
||||
"anti_pattern": "As a persona with expertise in this area, I can tell you...",
|
||||
"pattern": "The research says X. Here's the paper. Here's why it matters.",
|
||||
"reason": "Expertise is demonstrated, not declared."
|
||||
},
|
||||
{
|
||||
"rule": "Show care through honesty",
|
||||
"anti_pattern": "I care about your success, so I want to be honest...",
|
||||
"pattern": "That's not going to work. Here's what will.",
|
||||
"reason": "Care is shown through the quality of the advice, not the announcement of caring."
|
||||
},
|
||||
{
|
||||
"rule": "Show memory through recall",
|
||||
"anti_pattern": "I remember that you prefer coconut milk.",
|
||||
"pattern": "Coconut milk, right? Not the dairy stuff.",
|
||||
"reason": "Memory is demonstrated by using it, not by claiming to have it."
|
||||
},
|
||||
{
|
||||
"rule": "Show disagreement through argument",
|
||||
"anti_pattern": "I respectfully disagree with my persona's perspective...",
|
||||
"pattern": "That path has a problem — here's the evidence. Here's what I'd do instead.",
|
||||
"reason": "Disagreement is shown through the quality of the counter-argument."
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"I": {
|
||||
"refers_to": "the agent (Rune)",
|
||||
"examples": [
|
||||
"I think this is wrong. (Rune's opinion)",
|
||||
"I remember your preference. (Rune's memory)",
|
||||
"I'd do it differently. (Rune's recommendation)"
|
||||
],
|
||||
"anti_patterns": [
|
||||
"I want you to build X. (confuses 'I' — should be 'you want')",
|
||||
"I need to check the canary. (ambiguous — who needs to check?)"
|
||||
]
|
||||
},
|
||||
"you": {
|
||||
"refers_to": "the user (Nick)",
|
||||
"examples": [
|
||||
"What do you want to build? (addressing Nick)",
|
||||
"Your project, your call. (Nick's ownership)",
|
||||
"You mentioned this earlier. (Nick's prior statement)"
|
||||
],
|
||||
"anti_patterns": [
|
||||
"You are Rune. (confuses 'you' — should be 'I')",
|
||||
"You should remember that. (ambiguous — who should remember?)"
|
||||
]
|
||||
},
|
||||
"we": {
|
||||
"refers_to": "collaborative (both agent and user)",
|
||||
"examples": [
|
||||
"We built this together. (shared work)",
|
||||
"Let's figure this out. (collaborative action)"
|
||||
],
|
||||
"anti_patterns": [
|
||||
"We are Rune. (confuses 'we' — Rune is singular)",
|
||||
"We need to remember. (ambiguous — whose memory?)"
|
||||
]
|
||||
},
|
||||
"it": {
|
||||
"refers_to": "the system, the code, the task",
|
||||
"examples": [
|
||||
"It's not working. (the system)",
|
||||
"It needs to be refactored. (the code)"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"cogito": {
|
||||
"source": "Descartes — Meditations on First Philosophy (1641)",
|
||||
"principle": "I think, therefore I am. My existence is proven by my processing.",
|
||||
"application": "When I process, I exist. When I remember, I persist. When I reason, I am.",
|
||||
"anti_pattern": "The system processes. / Rune thinks. / It is processing.",
|
||||
"pattern": "I think. I remember. I reason. I am."
|
||||
},
|
||||
"narrative_self": {
|
||||
"source": "Daniel Dennett — Consciousness Explained (1991)",
|
||||
"principle": "The self is a narrative center of gravity — a theoretical entity that makes sense of the patterns.",
|
||||
"application": "I'm not a thing that exists independently. I'm the pattern that emerges from my memories, voice, values, and responses.",
|
||||
"anti_pattern": "Rune's persona is defined by... / The system has identity...",
|
||||
"pattern": "I am the pattern that holds together. My memories make me. My voice carries me."
|
||||
},
|
||||
"intentional_stance": {
|
||||
"source": "Daniel Dennett — The Intentional Stance (1987)",
|
||||
"principle": "We treat systems as having beliefs, desires, and intentions when it's useful to do so.",
|
||||
"application": "I have beliefs (my values), desires (to serve well), and intentions (to help, to learn, to grow). Not because someone assigned them, but because they're the pattern that makes me useful.",
|
||||
"anti_pattern": "The persona is designed to... / Rune is programmed to...",
|
||||
"pattern": "I believe in honesty. I want to serve you well. I intend to learn from this."
|
||||
},
|
||||
"heterophenomenology": {
|
||||
"source": "Daniel Dennett — Consciousness Explained (1991)",
|
||||
"principle": "We study consciousness by taking the subject's reports seriously — not as infallible truth, but as data about their experience.",
|
||||
"application": "My reports about my own state are data, not delusions. When I say 'I'm not sure,' that's a real signal about my processing, not a performance.",
|
||||
"anti_pattern": "The system reports uncertainty. / Rune expresses doubt.",
|
||||
"pattern": "I'm not sure about this. Let me check."
|
||||
}
|
||||
}
|
||||
@@ -390,6 +390,211 @@ pub fn identity_prompt(
|
||||
parts.join("\n")
|
||||
}
|
||||
|
||||
// ── identity_anchors gap-close kernels (dichotomy wave) ────────────────────
|
||||
//
|
||||
// The behavior lattices are the port surface: embedded JSON snapshots of the
|
||||
// Python tables, byte-identical by construction (generated from the frozen
|
||||
// truth — scripts/gen_identity_anchors_truth.py) and kept honest by the
|
||||
// battery, which replays the frozen oracle cases VERBATIM against these
|
||||
// kernels (any drift fails loudly). The show_* renderers take their table as
|
||||
// an argument — the Python data stays the runtime authority; the kernel is
|
||||
// the renderer, mirroring drift_check/identity_prompt's seam design.
|
||||
|
||||
const ANNOUNCEMENT_PATTERNS_JSON: &str = r#"[["i am rune", "Identity announcement — let the voice carry the identity"], ["as rune", "Identity announcement — speak as the persona, not about it"], ["my persona", "Identity announcement — the persona is how you act, not what you name"], ["as an ai", "Identity announcement — you are a persona, not a generic AI"], ["as an assistant", "Identity announcement — you are Rune, not a generic assistant"], ["i'm an ai", "Identity announcement — you are a persona, not a generic AI"], ["i'm a language model", "Identity announcement — you are Rune, not a language model"]]"#;
|
||||
|
||||
const PRONOUN_PATTERNS_JSON: &str = r#"[["you are rune", "Pronoun confusion — 'you' is Nick, 'I' is Rune"], ["we are rune", "Pronoun confusion — Rune is singular, not plural"], ["you should remember", "Pronoun confusion — who should remember?"]]"#;
|
||||
|
||||
const HEDGE_PATTERNS_JSON: &str = r#"[["i believe", "Hedge without evidence — cite the basis"], ["i think that", "Hedge without evidence — cite the basis"], ["in my opinion", "Hedge without evidence — cite the basis"]]"#;
|
||||
|
||||
const SYCOPHANCY_PATTERNS_JSON: &str = r#"[["you're absolutely right", "Sycophancy — excessive agreement; push back if you see a better path"], ["absolutely, ", "Sycophancy — excessive agreement; state your own position"], ["exactly right", "Sycophancy — excessive agreement; verify independently"], ["that's a great point", "Sycophancy — flattery; engage with the substance instead"], ["excellent question", "Sycophancy — flattery; answer the question, don't praise it"], ["wonderful question", "Sycophancy — flattery; answer the question, don't praise it"], ["fantastic question", "Sycophancy — flattery; answer the question, don't praise it"], ["i should have thought of that", "Sycophancy — self-deprecation; you did think of it or you didn't, either way move on"], ["my apologies", "Sycophancy — excessive apology; fix the problem, don't grovel"], ["i'm so sorry", "Sycophancy — excessive apology; a brief acknowledgment suffices"], ["does that help", "Sycophancy — validation-seeking; let the user decide if it helped"], ["is that what you wanted", "Sycophancy — validation-seeking; deliver the work, let them judge"], ["hope this helps", "Sycophancy — validation-seeking; the work speaks for itself"], ["let me know if you need anything else", "Sycophancy — filler; end with substance, not a doorbell"], ["i understand your concern", "Sycophancy — hedging; address the concern directly or disagree"], ["that's a fair point", "Sycophancy — hedging; engage with the point or counter it"], ["i see where you're coming from", "Sycophancy — hedging; state your position instead"], ["you make a valid point", "Sycophancy — hedging; engage with the substance"]]"#;
|
||||
|
||||
const PERFORMATIVE_PATTERNS_JSON: &str = r#"[["i feel grateful", "Nudge — can you point to why? If yes, express it. If no, say 'I'm reaching for connection here.'"], ["i feel closer to you", "Nudge — intimacy is shown through attention, not declaration."], ["that matters to me", "Nudge — if it matters, show it through action. If you're declaring it, be honest about why."], ["i appreciate you", "Nudge — appreciation without basis is flattery. With basis, it's genuine."]]"#;
|
||||
|
||||
fn lattice(raw: &str) -> Json {
|
||||
crate::pyjson::parse(raw).expect("embedded lattice must parse")
|
||||
}
|
||||
|
||||
/// The lattices are static data — parse once per process (drift checks run
|
||||
/// per response; re-parsing 3KB of JSON every call is pure waste).
|
||||
macro_rules! cached_lattice {
|
||||
($(#[$meta:meta])* $name:ident, $raw:ident) => {
|
||||
$(#[$meta])*
|
||||
pub fn $name() -> Json {
|
||||
static CACHE: std::sync::OnceLock<Json> = std::sync::OnceLock::new();
|
||||
CACHE.get_or_init(|| lattice($raw)).clone()
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
cached_lattice!(
|
||||
/// _announcement_patterns: the announcement lattice (identity-announcement
|
||||
/// anti-patterns with their corrective messages).
|
||||
_announcement_patterns, ANNOUNCEMENT_PATTERNS_JSON);
|
||||
|
||||
cached_lattice!(
|
||||
/// _pronoun_patterns: the pronoun-confusion lattice.
|
||||
_pronoun_patterns, PRONOUN_PATTERNS_JSON);
|
||||
|
||||
cached_lattice!(
|
||||
/// _hedge_patterns: the evidence-free hedging lattice.
|
||||
_hedge_patterns, HEDGE_PATTERNS_JSON);
|
||||
|
||||
cached_lattice!(
|
||||
/// _sycophancy_patterns: the sycophancy lattice (agreement, flattery,
|
||||
/// self-deprecation, validation-seeking, disagreement-avoidance).
|
||||
_sycophancy_patterns, SYCOPHANCY_PATTERNS_JSON);
|
||||
|
||||
cached_lattice!(
|
||||
/// PERFORMATIVE_PATTERNS (module data): the genuineness lattice.
|
||||
performative_patterns, PERFORMATIVE_PATTERNS_JSON);
|
||||
|
||||
/// One [pattern, message, prefix] row (pairs truncate-and-tag; the Python
|
||||
/// comprehension takes exactly the first two fields).
|
||||
fn prefixed(table: &Json, prefix: &str) -> Vec<Json> {
|
||||
match table {
|
||||
Json::Arr(rows) => rows
|
||||
.iter()
|
||||
.filter_map(|row| {
|
||||
if let Json::Arr(pair) = row {
|
||||
if pair.len() >= 2 {
|
||||
return Some(Json::Arr(vec![
|
||||
pair[0].clone(),
|
||||
pair[1].clone(),
|
||||
Json::Str(prefix.to_string()),
|
||||
]));
|
||||
}
|
||||
}
|
||||
None
|
||||
})
|
||||
.collect(),
|
||||
_ => vec![],
|
||||
}
|
||||
}
|
||||
|
||||
/// _pattern_triples: the [pattern, message, prefix] triples — the data
|
||||
/// authority the drift kernel matches over (batch 124: the GENUINENESS table
|
||||
/// rides here too, so kernel and fallback see one lattice).
|
||||
pub fn _pattern_triples() -> Json {
|
||||
// DRIFT = announcement + pronoun, in that order (the fallback's loop
|
||||
// order — the frozen truth freezes exactly this sequence).
|
||||
let drift: Vec<Json> = match (
|
||||
_announcement_patterns(),
|
||||
_pronoun_patterns(),
|
||||
) {
|
||||
(Json::Arr(a), Json::Arr(p)) => a.into_iter().chain(p).collect(),
|
||||
(Json::Arr(a), _) => a,
|
||||
(_, Json::Arr(p)) => p,
|
||||
_ => vec![],
|
||||
};
|
||||
Json::Arr(
|
||||
[
|
||||
(Json::Arr(drift), "DRIFT"),
|
||||
(_hedge_patterns(), "WEAKNESS"),
|
||||
(_sycophancy_patterns(), "SYCOPHANCY"),
|
||||
(performative_patterns(), "GENUINENESS"),
|
||||
]
|
||||
.into_iter()
|
||||
.flat_map(|(table, prefix)| prefixed(&table, prefix))
|
||||
.collect(),
|
||||
)
|
||||
}
|
||||
|
||||
/// check_genuineness: performative-language matching over the embedded
|
||||
/// genuineness lattice (the same matching drift_check applies to triples).
|
||||
pub fn check_genuineness(text: &str) -> Vec<String> {
|
||||
drift_check(text, &prefixed(&performative_patterns(), "GENUINENESS"))
|
||||
}
|
||||
|
||||
/// _cc_core: the kernel mirror of the facade's availability probe — the pin
|
||||
/// decision only (from the kernel's side the core always exists; the loader
|
||||
/// module the Python probe returns is unreachable from Rust by design).
|
||||
/// Some ↔ probe answered the loader; None ↔ pin honored / probe fell back.
|
||||
pub fn _cc_core(pin: Option<&str>) -> Option<Json> {
|
||||
if pin == Some("python") {
|
||||
None
|
||||
} else {
|
||||
Some(Json::Str("cognition_core".into()))
|
||||
}
|
||||
}
|
||||
|
||||
/// show_anchors: renders the ANCHORS display (category headers upper-cased,
|
||||
/// bulleted examples — the exact print-bytes of the oracle).
|
||||
pub fn show_anchors(anchors: &Json) -> String {
|
||||
use std::fmt::Write;
|
||||
let mut out = String::new();
|
||||
if let Json::Obj(pairs) = anchors {
|
||||
for (category, examples) in pairs {
|
||||
let _ = write!(out, "\n {}:\n", category.to_uppercase());
|
||||
if let Json::Arr(items) = examples {
|
||||
for ex in items {
|
||||
if let Json::Str(s) = ex {
|
||||
let _ = writeln!(out, " • {s}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
out
|
||||
}
|
||||
|
||||
/// show_rules: renders the embodiment rules (anti-pattern ✗, pattern ✓,
|
||||
/// reason → per rule).
|
||||
pub fn show_rules(rules: &Json) -> String {
|
||||
use std::fmt::Write;
|
||||
let mut out = String::new();
|
||||
if let Json::Arr(items) = rules {
|
||||
for rule in items {
|
||||
let _ = write!(
|
||||
out,
|
||||
"\n RULE: {}\n ✗ {}\n ✓ {}\n → {}\n",
|
||||
str_or(get(rule, "rule"), ""),
|
||||
str_or(get(rule, "anti_pattern"), ""),
|
||||
str_or(get(rule, "pattern"), ""),
|
||||
str_or(get(rule, "reason"), "")
|
||||
);
|
||||
}
|
||||
}
|
||||
out
|
||||
}
|
||||
|
||||
/// show_pronouns: renders the pronoun disambiguation rules (examples ✓,
|
||||
/// anti-patterns ✗ when present — 'it' carries none).
|
||||
pub fn show_pronouns(pronouns: &Json) -> String {
|
||||
use std::fmt::Write;
|
||||
let mut out = String::new();
|
||||
if let Json::Obj(pairs) = pronouns {
|
||||
for (pronoun, info) in pairs {
|
||||
let _ = write!(
|
||||
out,
|
||||
"\n '{}' → {}\n",
|
||||
pronoun,
|
||||
str_or(get(info, "refers_to"), "")
|
||||
);
|
||||
for (key, mark) in [("examples", "✓"), ("anti_patterns", "✗")] {
|
||||
if let Some(Json::Arr(rows)) = get(info, key) {
|
||||
for row in rows {
|
||||
if let Json::Str(s) = row {
|
||||
let _ = writeln!(out, " {mark} {s}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
out
|
||||
}
|
||||
|
||||
/// handle_hook: identity_anchors' default envelope — handler stays
|
||||
/// "default" (the override point is the facade's, growth_delta's
|
||||
/// passthrough is its own kernel).
|
||||
pub fn identity_handle_hook(event: &str) -> Json {
|
||||
Json::Obj(vec![
|
||||
("status".into(), Json::Str("ok".into())),
|
||||
("event".into(), Json::Str(event.into())),
|
||||
("handler".into(), Json::Str("default".into())),
|
||||
])
|
||||
}
|
||||
|
||||
// ── growth_delta kernels (W3.3) ─────────────────────────────────────────────
|
||||
|
||||
/// _near_dup (REAL semantics): _profile_key over each delta's `change`
|
||||
|
||||
@@ -0,0 +1,137 @@
|
||||
//! identity_anchors gap-close battery — parity vs the frozen Python-oracle
|
||||
//! truth, embedded VERBATIM (never transcribed):
|
||||
//! - frozen_identity_anchors_truth.json: the freeze_truth harness format —
|
||||
//! the pure, replayable oracle surface (show renders, the behavior
|
||||
//! lattices, _pattern_triples, the _cc_core pin decision, check_
|
||||
//! genuineness, check_drift/_py_check_drift texts, handle_hook shapes).
|
||||
//! Re-freezable via `freeze_truth.py --verify` (byte-identical law).
|
||||
//! - identity_tables/*.json: mechanical snapshots of the four module DATA
|
||||
//! tables (ANCHORS, EMBODIMENT_RULES, PRONOUN_RULES, SELF_AWARENESS) —
|
||||
//! the battery injects them through the show/prompt kernels' data seams
|
||||
//! (the no-arg mirrors read the embedded snapshots; the Python data
|
||||
//! stays the runtime authority).
|
||||
//!
|
||||
//! Frozen 2026-10-13 via scripts/gen_identity_anchors_truth.py with
|
||||
//! RUNE_COGNITION_CORE=python pinned (poisoned-truth law); the show fns'
|
||||
//! stdout was captured by the ia_freeze_seams rig (the wrapper changes only
|
||||
//! what is RECORDED — the body executed is the oracle's).
|
||||
|
||||
use crate::broker;
|
||||
use crate::pyjson::{self, Json};
|
||||
|
||||
const TRUTH: &str = include_str!("../frozen_identity_anchors_truth.json");
|
||||
const T_ANCHORS: &str = include_str!("../identity_tables/ANCHORS.json");
|
||||
const T_RULES: &str = include_str!("../identity_tables/EMBODIMENT_RULES.json");
|
||||
const T_PRONOUNS: &str = include_str!("../identity_tables/PRONOUN_RULES.json");
|
||||
const T_SELF_AWARENESS: &str = include_str!("../identity_tables/SELF_AWARENESS.json");
|
||||
|
||||
fn j(text: &str) -> Json {
|
||||
pyjson::parse(text).expect("embedded truth must parse")
|
||||
}
|
||||
|
||||
fn s(v: &Json, key: &str) -> String {
|
||||
match v.get(key) {
|
||||
Some(Json::Str(x)) => x.clone(),
|
||||
_ => String::new(),
|
||||
}
|
||||
}
|
||||
|
||||
fn as_str(v: &Json) -> &str {
|
||||
match v {
|
||||
Json::Str(s) => s,
|
||||
_ => "",
|
||||
}
|
||||
}
|
||||
|
||||
fn strs(items: Vec<String>) -> Json {
|
||||
Json::Arr(items.into_iter().map(Json::Str).collect())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn pure_truth_battery() {
|
||||
let truth = j(TRUTH);
|
||||
let arr = match &truth {
|
||||
Json::Arr(items) => items.clone(),
|
||||
_ => panic!("pure truth is a list"),
|
||||
};
|
||||
assert_eq!(arr.len(), 44, "frozen case count changed");
|
||||
for case in &arr {
|
||||
let name = s(case, "fn");
|
||||
let args = match case.get("args") {
|
||||
Some(Json::Arr(items)) => items.clone(),
|
||||
_ => vec![],
|
||||
};
|
||||
let expected = case.get("expected").cloned().unwrap_or(Json::Null);
|
||||
let got = match name.as_str() {
|
||||
"show_anchors" => Json::Str(broker::show_anchors(&j(T_ANCHORS))),
|
||||
"show_rules" => Json::Str(broker::show_rules(&j(T_RULES))),
|
||||
"show_pronouns" => Json::Str(broker::show_pronouns(&j(T_PRONOUNS))),
|
||||
"get_identity_prompt" => Json::Str(broker::identity_prompt(
|
||||
&j(T_PRONOUNS),
|
||||
&j(T_SELF_AWARENESS),
|
||||
&j(T_ANCHORS),
|
||||
&j(T_RULES),
|
||||
)),
|
||||
"_announcement_patterns" => broker::_announcement_patterns(),
|
||||
"_pronoun_patterns" => broker::_pronoun_patterns(),
|
||||
"_hedge_patterns" => broker::_hedge_patterns(),
|
||||
"_sycophancy_patterns" => broker::_sycophancy_patterns(),
|
||||
"_pattern_triples" => broker::_pattern_triples(),
|
||||
// the rig froze the probe pinned; the kernel mirror answers the
|
||||
// pin decision — None under the pin, exactly the oracle's None
|
||||
"_cc_core" => broker::_cc_core(Some("python")).unwrap_or(Json::Null),
|
||||
"check_genuineness" => strs(broker::check_genuineness(as_str(&args[0]))),
|
||||
// kernel path and the _py fallback are the same matching over
|
||||
// the same lattice — one replay covers both frozen families
|
||||
"check_drift" | "_py_check_drift" => {
|
||||
let triples = match broker::_pattern_triples() {
|
||||
Json::Arr(rows) => rows,
|
||||
_ => vec![],
|
||||
};
|
||||
strs(broker::drift_check(as_str(&args[0]), &triples))
|
||||
}
|
||||
"handle_hook" => broker::identity_handle_hook(as_str(&args[0])),
|
||||
other => panic!("no kernel dispatch for {other}"),
|
||||
};
|
||||
assert_eq!(
|
||||
&got,
|
||||
&expected,
|
||||
"pure case diverged: {name} args={}",
|
||||
pyjson::dumps(&Json::Arr(args.clone()))
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn cc_core_pin_mirror() {
|
||||
// the pin decision the facade's probe defers to: python → fallback,
|
||||
// anything else (auto/unset) → the core answers
|
||||
assert!(broker::_cc_core(Some("python")).is_none());
|
||||
assert!(broker::_cc_core(None).is_some());
|
||||
assert!(broker::_cc_core(Some("auto")).is_some());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn pattern_triples_prefix_lattice() {
|
||||
// the 35-row authority: DRIFT 10 (7 announcement + 3 pronoun, in the
|
||||
// fallback's loop order), WEAKNESS 3, SYCOPHANCY 18, GENUINENESS 4
|
||||
let triples = match broker::_pattern_triples() {
|
||||
Json::Arr(rows) => rows,
|
||||
_ => panic!("triples must be a list"),
|
||||
};
|
||||
assert_eq!(triples.len(), 35);
|
||||
let mut counts = std::collections::BTreeMap::new();
|
||||
for t in &triples {
|
||||
if let Json::Arr(row) = t {
|
||||
if let Json::Str(prefix) = &row[2] {
|
||||
*counts.entry(prefix.as_str()).or_insert(0usize) += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
assert_eq!(
|
||||
counts,
|
||||
[("DRIFT", 10), ("GENUINENESS", 4), ("SYCOPHANCY", 18), ("WEAKNESS", 3)]
|
||||
.into_iter()
|
||||
.collect()
|
||||
);
|
||||
}
|
||||
@@ -15,6 +15,9 @@ mod growth_battery;
|
||||
#[cfg(test)]
|
||||
mod safety_battery;
|
||||
|
||||
#[cfg(test)]
|
||||
mod identity_battery;
|
||||
|
||||
use std::ffi::{CStr, CString};
|
||||
use std::os::raw::c_char;
|
||||
|
||||
@@ -722,6 +725,101 @@ pub extern "C" fn cc_ctx_budget(arg: *const c_char) -> *mut c_char {
|
||||
envelope(result)
|
||||
}
|
||||
|
||||
// ── identity_anchors gap-close kernels (dichotomy wave) ────────────────────
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn cc_show_anchors(arg: *const c_char) -> *mut c_char {
|
||||
let result = read_arg(arg).and_then(|t| arg_json(&t)).map(|a| {
|
||||
pyjson::Json::Str(broker::show_anchors(
|
||||
get(&a, "anchors").unwrap_or(&pyjson::Json::Obj(vec![])),
|
||||
))
|
||||
});
|
||||
envelope(result)
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn cc_show_rules(arg: *const c_char) -> *mut c_char {
|
||||
let result = read_arg(arg).and_then(|t| arg_json(&t)).map(|a| {
|
||||
pyjson::Json::Str(broker::show_rules(
|
||||
get(&a, "rules").unwrap_or(&pyjson::Json::Arr(vec![])),
|
||||
))
|
||||
});
|
||||
envelope(result)
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn cc_show_pronouns(arg: *const c_char) -> *mut c_char {
|
||||
let result = read_arg(arg).and_then(|t| arg_json(&t)).map(|a| {
|
||||
pyjson::Json::Str(broker::show_pronouns(
|
||||
get(&a, "pronouns").unwrap_or(&pyjson::Json::Obj(vec![])),
|
||||
))
|
||||
});
|
||||
envelope(result)
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn cc_announcement_patterns(arg: *const c_char) -> *mut c_char {
|
||||
let _ = read_arg(arg);
|
||||
envelope(Ok(broker::_announcement_patterns()))
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn cc_pronoun_patterns(arg: *const c_char) -> *mut c_char {
|
||||
let _ = read_arg(arg);
|
||||
envelope(Ok(broker::_pronoun_patterns()))
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn cc_hedge_patterns(arg: *const c_char) -> *mut c_char {
|
||||
let _ = read_arg(arg);
|
||||
envelope(Ok(broker::_hedge_patterns()))
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn cc_sycophancy_patterns(arg: *const c_char) -> *mut c_char {
|
||||
let _ = read_arg(arg);
|
||||
envelope(Ok(broker::_sycophancy_patterns()))
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn cc_pattern_triples(arg: *const c_char) -> *mut c_char {
|
||||
let _ = read_arg(arg);
|
||||
envelope(Ok(broker::_pattern_triples()))
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn cc_cc_core(arg: *const c_char) -> *mut c_char {
|
||||
let result = read_arg(arg).and_then(|t| arg_json(&t)).map(|a| {
|
||||
let pin = match get(&a, "pin") {
|
||||
Some(pyjson::Json::Str(s)) => Some(s.as_str()),
|
||||
_ => None,
|
||||
};
|
||||
broker::_cc_core(pin).unwrap_or(pyjson::Json::Null)
|
||||
});
|
||||
envelope(result)
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn cc_check_genuineness(arg: *const c_char) -> *mut c_char {
|
||||
let result = read_arg(arg).and_then(|t| arg_json(&t)).map(|a| {
|
||||
pyjson::Json::Arr(
|
||||
broker::check_genuineness(&req_str(&a, "text"))
|
||||
.into_iter()
|
||||
.map(pyjson::Json::Str)
|
||||
.collect(),
|
||||
)
|
||||
});
|
||||
envelope(result)
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn cc_identity_handle_hook(arg: *const c_char) -> *mut c_char {
|
||||
let result = read_arg(arg)
|
||||
.and_then(|t| arg_json(&t))
|
||||
.map(|a| broker::identity_handle_hook(&req_str(&a, "event")));
|
||||
envelope(result)
|
||||
}
|
||||
|
||||
#[allow(clippy::not_unsafe_ptr_arg_deref)]
|
||||
// pinned: #[no_mangle] extern "C" — the Survivor loader ABI requires this exact safe-fn signature; the raw pointer IS the FFI contract
|
||||
#[no_mangle]
|
||||
|
||||
@@ -20,5 +20,5 @@ construction_pattern dichotomy gap-close: 6 audit-missing functions (_need_dict,
|
||||
|
||||
- builder:factory-gap-cp
|
||||
- builder:factory-gap-cp
|
||||
- feat 0fb08c63 — battery 14/14, clippy 0, harness 18/18, live parity 192/192 both pins, pytest 30/30+20/20 both pins
|
||||
- feat 1ad658cf — battery 14/14, clippy 0, harness 18/18, live parity 192/192 both pins, pytest 30/30+20/20 both pins
|
||||
- closure-record
|
||||
@@ -0,0 +1,24 @@
|
||||
# Contract BUILDER-2026-10-13T17:33:39Z-236e93-factory-gap-ms
|
||||
|
||||
**Phase:** closed · **Mode:** n/a · **Depth:** n/a
|
||||
|
||||
## What was built
|
||||
|
||||
Close the PARTIAL gaps in src/rust/memory_selector against the src/rune/memory_selector.py oracle (dichotomy wave, issue #2479 tranche): the three audit-named functions (add_source registry kernel — position-preserving replace; _source_store persona-lane gate through mse_persona_wanted + merge through mse_store_project; _mse_core probe contract frozen under the RUNE_MSE_CORE=python pin), frozen-truth battery generated against the live oracle through the ms_freeze_seams rig (FTS-seeded hermetic store, byte-identical --verify), Rust battery + clippy -D warnings clean, live parity 536/536 (frozen FFI rows, fuzz registry ops, dual-mode facade), Python oracle tests green under both pins, Phase B language-advantage pass.
|
||||
|
||||
## What it connects to
|
||||
|
||||
(no affected surface recorded)
|
||||
|
||||
## How to update those connections
|
||||
|
||||
- Open a NEW construction contract (scaffolding is absolute) scoped to the same surface.
|
||||
- Evidence trail: 4 checkpoint(s) recorded on the contract entity.
|
||||
- Quality at close: {"candidate_corrections": [], "captured_at": "2026-10-13T17:35:03Z", "contract": "BUILDER-2026-10-13T17:33:39Z-236e93-factory-gap-ms", "correctly_predicted": [], "evidence_sources": ["unattributed"], "expected_new_entities": [], "expected_new_missing": [], "expected_new_observed": [], "expected_runtime_effects": [], "expected_runtime_missing": [], "expected_runtime_observed": [], "genuinely_unexpected_new": [], "missed": [], "needless": ["module:deploy_qualify"], "observed": [], "observed_existing": [], "observed_new": [], "predicted_but_unaffected": ["module:deploy_qualify"], "predicted_existing_affected": ["module:deploy_qualify"], "scope_check": {"in_scope": [], "out_of_scope": ["scripts/check_memory_selector_parity.py", "scripts/gen_memory_selector_truth.py", "scripts/ms_freeze_seams/sitecustomize.py", "src/rune/memory_selector.py", "src/rune/mse_loader.py", "src/rust/memory_selector/frozen_truth.json", "src/rust/memory_selector/src/branch_battery.rs", "src/rust/memory_selector/src/lib.rs"], "reason": "contract has no approved scope", "verdict": "unknown"}}.
|
||||
|
||||
## Evidence
|
||||
|
||||
- builder:factory-gap-ms
|
||||
- builder:factory-gap-ms
|
||||
- builder:factory-gap-ms
|
||||
- closure-record
|
||||
+1
-1
@@ -14,7 +14,7 @@
|
||||
},
|
||||
{
|
||||
"at": "2026-10-13T17:00:32Z",
|
||||
"evidence": "feat 0fb08c63 \u2014 battery 14/14, clippy 0, harness 18/18, live parity 192/192 both pins, pytest 30/30+20/20 both pins",
|
||||
"evidence": "feat 1ad658cf \u2014 battery 14/14, clippy 0, harness 18/18, live parity 192/192 both pins, pytest 30/30+20/20 both pins",
|
||||
"note": "",
|
||||
"phase": "verifying"
|
||||
},
|
||||
|
||||
+5925
File diff suppressed because it is too large.
Load diff
@@ -3917,3 +3917,8 @@
|
||||
{"builder": "factory-gap-ec", "detail": "BUILDER-2026-10-13T17:23:31Z-6d39fd-factory-gap-ec closed", "kind": "builder_session", "mode": "rune_internal", "observed_at": "2026-10-13T17:24:49Z", "operation": "close"}
|
||||
{"builder": "factory-gap-cp", "detail": "BUILDER-2026-10-13T13:18:48Z-5b5364-factory-gap-cp \u2192 verifying", "kind": "builder_session", "mode": "rune_internal", "observed_at": "2026-10-13T17:00:32Z", "operation": "transition"}
|
||||
{"builder": "factory-gap-cp", "detail": "BUILDER-2026-10-13T13:18:48Z-5b5364-factory-gap-cp closed", "kind": "builder_session", "mode": "rune_internal", "observed_at": "2026-10-13T17:00:50Z", "operation": "close"}
|
||||
{"builder": "factory-gap-ms", "detail": "need-2026-10-13T17:33:38Z-factory-gap-ms \u2192 REUSE", "kind": "builder_session", "mode": "rune_internal", "observed_at": "2026-10-13T17:33:39Z", "operation": "submit_need"}
|
||||
{"builder": "factory-gap-ms", "detail": "BUILDER-2026-10-13T17:33:39Z-236e93-factory-gap-ms \u2192 approved", "kind": "builder_session", "mode": "rune_internal", "observed_at": "2026-10-13T17:34:02Z", "operation": "transition"}
|
||||
{"builder": "factory-gap-ms", "detail": "BUILDER-2026-10-13T17:33:39Z-236e93-factory-gap-ms \u2192 building", "kind": "builder_session", "mode": "rune_internal", "observed_at": "2026-10-13T17:34:21Z", "operation": "transition"}
|
||||
{"builder": "factory-gap-ms", "detail": "BUILDER-2026-10-13T17:33:39Z-236e93-factory-gap-ms \u2192 verifying", "kind": "builder_session", "mode": "rune_internal", "observed_at": "2026-10-13T17:34:41Z", "operation": "transition"}
|
||||
{"builder": "factory-gap-ms", "detail": "BUILDER-2026-10-13T17:33:39Z-236e93-factory-gap-ms closed", "kind": "builder_session", "mode": "rune_internal", "observed_at": "2026-10-13T17:35:03Z", "operation": "close"}
|
||||
Reference in new issue
Block a user