Compare commits
5
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
077c588930 | ||
|
|
2f5045e989 | ||
|
|
d1d821059f | ||
|
|
679689cb15 | ||
|
|
5e0744a70c |
No files matched your search
@@ -15,9 +15,6 @@
|
||||
# Canary files are omitted: src/rune/canary_*.py are standalone CI
|
||||
# verification scripts executed directly by the canary job, never imported by
|
||||
# the test suite — counting them would make the global floor a fiction.
|
||||
# ffi_query_memory_smoke.py is the same class: a standalone evidence script
|
||||
# driven directly (and by tests/test_ffi_query_memory_smoke.py when the cdylib
|
||||
# is built), never imported by the suite.
|
||||
|
||||
[run]
|
||||
source = src/rune
|
||||
@@ -25,7 +22,6 @@ omit =
|
||||
tests/*
|
||||
scripts/*
|
||||
src/rune/canary_*.py
|
||||
src/rune/ffi_query_memory_smoke.py
|
||||
|
||||
[report]
|
||||
fail_under = 29
|
||||
|
||||
@@ -8,7 +8,7 @@ on:
|
||||
|
||||
jobs:
|
||||
backup:
|
||||
runs-on: rune-ci-desktop
|
||||
runs-on: rune-infra-pi
|
||||
steps:
|
||||
# actions/checkout v4.2.2, pinned to the audited upstream tag commit.
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
||||
|
||||
@@ -11,8 +11,8 @@ jobs:
|
||||
# P0/P1/P2/P3. An issue that lands without one gets 'unprioritized' +
|
||||
# a demand comment — filing is not complete until prioritized.
|
||||
priority-gate:
|
||||
if: github.event_name == 'issues' && github.event.action != 'labeled' && github.event.issue.state == 'open'
|
||||
runs-on: rune-ci-desktop
|
||||
if: github.event_name == 'issues' && github.event.action != 'labeled'
|
||||
runs-on: rune-infra-pi
|
||||
steps:
|
||||
- name: Enforce priority label
|
||||
uses: actions/github-script@v7
|
||||
@@ -23,13 +23,12 @@ jobs:
|
||||
const labels = (issue.labels || []).map(l => l.name);
|
||||
const priorities = ['P0 — critical', 'P1 — high', 'P2 — medium', 'P3 — low'];
|
||||
const has = labels.filter(l => priorities.includes(l));
|
||||
if (has.length === 1) {
|
||||
if (has.length >= 1) {
|
||||
// Prioritized — clear the flag if it was set.
|
||||
if (labels.includes('unprioritized')) {
|
||||
await github.request('DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{id}', {
|
||||
await github.rest.issues.removeLabel({
|
||||
owner: context.repo.owner, repo: context.repo.repo,
|
||||
issue_number: issue.number,
|
||||
id: issue.labels.find(l => l.name === 'unprioritized').id,
|
||||
issue_number: issue.number, name: 'unprioritized',
|
||||
}).catch(e => { if (e.status !== 404) throw e; });
|
||||
}
|
||||
return;
|
||||
@@ -45,26 +44,12 @@ jobs:
|
||||
});
|
||||
|
||||
auto-label:
|
||||
runs-on: rune-ci-desktop
|
||||
runs-on: rune-infra-pi
|
||||
steps:
|
||||
- name: Analyze and label
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
// CLOSED-ISSUE GUARD (#407): labels are filing-time metadata.
|
||||
// A closed issue's lifecycle has ended; re-running label
|
||||
// inference on it re-adds stale type labels (bug = currently
|
||||
// incorrect behavior — a closed fixed issue must not carry
|
||||
// it) and makes any human label cleanup self-defeating,
|
||||
// because every PUT fires a 'labeled' event that re-triggers
|
||||
// this job. Post-close label curation belongs to humans and
|
||||
// the conductor, not this workflow.
|
||||
const issueState = context.payload.issue?.state;
|
||||
if (issueState === 'closed') {
|
||||
console.log(`Issue #${context.payload.issue?.number} is closed — auto-label skips (labels are curated post-close).`);
|
||||
return;
|
||||
}
|
||||
const action = context.payload.action;
|
||||
const title = context.payload.issue?.title || context.payload.pull_request?.title || '';
|
||||
const body = context.payload.issue?.body || context.payload.pull_request?.body || '';
|
||||
const text = (title + ' ' + body).toLowerCase();
|
||||
@@ -73,8 +58,7 @@ jobs:
|
||||
const managedLabels = new Set([
|
||||
'memory', 'governance', 'identity', 'growth',
|
||||
'perception', 'infrastructure', 'life', 'custodian',
|
||||
'bug', 'feature', 'research',
|
||||
'P0 — critical', 'P1 — high', 'P2 — medium', 'P3 — low',
|
||||
'priority: high', 'bug', 'feature', 'research',
|
||||
]);
|
||||
|
||||
// Type label: DECLARED over GUESSED. The template spine
|
||||
@@ -90,12 +74,7 @@ jobs:
|
||||
isBug = kind === 'bug';
|
||||
isFeature = kind === 'feature';
|
||||
isResearch = kind === 'research';
|
||||
} else if (action === 'opened') {
|
||||
// KEYWORD FALLBACK (#407): pre-template issues only, and
|
||||
// ONLY at filing time. Re-running keyword guesses on every
|
||||
// edit/label event overrides human curation of spine-less
|
||||
// issues (documented rule: keyword heuristics are the
|
||||
// pre-template fallback, not a standing authority).
|
||||
} else {
|
||||
const textBug = title.startsWith('[BUG]') || text.includes('bug') || text.includes('fix') || text.includes('broken');
|
||||
isBug = textBug;
|
||||
isFeature = !isBug && (title.startsWith('[FEATURE]') || text.includes('feature') || text.includes('improve') || text.includes('add'));
|
||||
@@ -137,31 +116,9 @@ jobs:
|
||||
desiredLabels.add('custodian');
|
||||
}
|
||||
|
||||
// Priority labels (2026-10-05: PROGRAMMATIC P-ASSIGNMENT —
|
||||
// the gate demanded P0-P3 labels but nothing assigned them;
|
||||
// the dead 'priority: high' label is gone per the 2026-09-04
|
||||
// normalization). Assignment from the TITLE prefix first
|
||||
// ([P1]/P1:/priority=...), then keyword inference using the
|
||||
// gate's own rule set (the scale lives in ONE place — the
|
||||
// priority-gate job above).
|
||||
const pMatch = title.match(/\bP([0-3])\b/);
|
||||
const priorityLabelNames = ['P0 — critical', 'P1 — high', 'P2 — medium', 'P3 — low'];
|
||||
if (pMatch) {
|
||||
desiredLabels.add(priorityLabelNames[Number(pMatch[1])]);
|
||||
} else if (text.includes('urgent') || text.includes('critical') ||
|
||||
text.includes('spine') || text.includes('blocks other work')) {
|
||||
desiredLabels.add(priorityLabelNames[0]); // P0 — critical
|
||||
} else if (text.includes('broken') || text.includes('fix') ||
|
||||
text.includes('repair') || text.includes('defect') ||
|
||||
text.includes('real defect') || text.includes('money')) {
|
||||
desiredLabels.add(priorityLabelNames[1]); // P1 — high
|
||||
} else if (text.includes('improve') || text.includes('consolidat') ||
|
||||
text.includes('refactor') || text.includes('kernel') ||
|
||||
text.includes('port')) {
|
||||
desiredLabels.add(priorityLabelNames[2]); // P2 — medium
|
||||
} else if (text.includes('benchmark') || text.includes('measurement') ||
|
||||
text.includes('deferred')) {
|
||||
desiredLabels.add(priorityLabelNames[3]); // P3 — low
|
||||
// Priority labels
|
||||
if (text.includes('urgent') || text.includes('critical') || text.includes('broken')) {
|
||||
desiredLabels.add('priority: high');
|
||||
}
|
||||
|
||||
const issueNumber = context.payload.issue?.number || context.payload.pull_request?.number;
|
||||
@@ -171,7 +128,6 @@ jobs:
|
||||
issue_number: issueNumber,
|
||||
});
|
||||
const currentLabels = new Set(current.data.map(label => label.name));
|
||||
const currentLabelIds = new Map(current.data.map(label => [label.name, label.id]));
|
||||
const staleManaged = [...currentLabels].filter(
|
||||
label => managedLabels.has(label) && !desiredLabels.has(label)
|
||||
);
|
||||
@@ -181,14 +137,11 @@ jobs:
|
||||
|
||||
for (const name of staleManaged) {
|
||||
try {
|
||||
// Gitea's DELETE /labels/{id} requires the numeric label ID.
|
||||
// Octokit's GitHub-style removeLabel(name) returned 404 and
|
||||
// left stale priority labels behind (#2467: P0 AND P2).
|
||||
await github.request('DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{id}', {
|
||||
await github.rest.issues.removeLabel({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: issueNumber,
|
||||
id: currentLabelIds.get(name),
|
||||
name,
|
||||
});
|
||||
} catch (error) {
|
||||
if (error.status !== 404) {
|
||||
@@ -206,21 +159,5 @@ jobs:
|
||||
labels: missingDesired,
|
||||
});
|
||||
}
|
||||
// The priority gate can flag a duplicate before this job
|
||||
// reconciles it. Clear the flag only AFTER verifying exactly one
|
||||
// surviving P-label against Gitea's current state.
|
||||
const reconciled = await github.rest.issues.listLabelsOnIssue({
|
||||
owner: context.repo.owner, repo: context.repo.repo,
|
||||
issue_number: issueNumber,
|
||||
});
|
||||
const actual = reconciled.data;
|
||||
const activePriority = actual.filter(l => priorityLabelNames.includes(l.name));
|
||||
const flag = actual.find(l => l.name === 'unprioritized');
|
||||
if (activePriority.length === 1 && flag) {
|
||||
await github.request('DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{id}', {
|
||||
owner: context.repo.owner, repo: context.repo.repo,
|
||||
issue_number: issueNumber, id: flag.id,
|
||||
});
|
||||
}
|
||||
console.log(`Removed managed labels: ${staleManaged.join(', ') || 'none'}`);
|
||||
console.log(`Added managed labels: ${missingDesired.join(', ') || 'none'}`);
|
||||
@@ -8,7 +8,7 @@ on:
|
||||
|
||||
jobs:
|
||||
update-gitea:
|
||||
runs-on: rune-ci-desktop
|
||||
runs-on: rune-infra-pi
|
||||
steps:
|
||||
- name: Check current Gitea version
|
||||
id: current
|
||||
|
||||
@@ -11,7 +11,7 @@ permissions: write-all
|
||||
|
||||
jobs:
|
||||
release:
|
||||
runs-on: rune-ci-desktop
|
||||
runs-on: rune-infra-pi
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
@@ -131,12 +131,8 @@ jobs:
|
||||
"pyproject.toml": [(f'version = "{VERSION}"', f'version = "{NEW}"')],
|
||||
}
|
||||
|
||||
# Fetch current master content, apply replacements, VERIFY all six
|
||||
# surface patterns (five files + the TUI footer) agree on NEW before
|
||||
# committing anything (TUI gate). The footer check was added after
|
||||
# the 0.89.0 half-bump: a stale RELEASE_VERSION made both replace
|
||||
# pairs no-op; the gate's RECOVER regex fixed the header only and
|
||||
# the footer silently stayed 0.88.4, failing the banner test.
|
||||
# Fetch current master content, apply replacements, VERIFY all five
|
||||
# surfaces agree on NEW before committing anything (TUI gate).
|
||||
edited = {}
|
||||
for path, pairs in surfaces.items():
|
||||
status, cur = api(f"/contents/{path}?ref=master")
|
||||
@@ -155,7 +151,6 @@ jobs:
|
||||
checks = [
|
||||
("src/rune/__init__.py", rf'__version__ = "({VER})"'),
|
||||
("src/rune/rune_tui.py", rf"Version: v({VER})"),
|
||||
("src/rune/rune_tui.py", rf"Rune v({VER}) \|"),
|
||||
("src/rune/canary_gitea_automation.py", rf"'__version__ = \"({VER})\"'"),
|
||||
("pyproject.toml", rf'version = "({VER})"'),
|
||||
("README.md", rf"v({VER})"),
|
||||
|
||||
@@ -67,20 +67,6 @@ jobs:
|
||||
unit-tests:
|
||||
runs-on: rune-ci-desktop
|
||||
if: ${{ !startsWith(gitea.event.pull_request.head.ref, 'chore/auto-bump') }}
|
||||
env:
|
||||
RUNE_HOME: /tmp/rune-ci-${{ github.run_id }}
|
||||
RUNE_MEMORY_DIR: /tmp/rune-ci-${{ github.run_id }}/memory
|
||||
# The unit shim battery loads the cdylib (ep_loader); point it at the
|
||||
# runner-owned cdylib FILE from the crate-build step below (the override
|
||||
# expects a file path, not a directory).
|
||||
EP_RUST_LIB: /tmp/rune-ci-target-${{ github.run_id }}/release/libevidence_provenance.so
|
||||
SP_RUST_LIB: /tmp/rune-ci-target-${{ github.run_id }}/release/librune_spine.so
|
||||
MS_RUST_LIB: /tmp/rune-ci-target-${{ github.run_id }}/release/libmemory_scoring.so
|
||||
CS_RUST_LIB: /tmp/rune-ci-target-${{ github.run_id }}/release/libcapability_scoring.so
|
||||
TC_RUST_LIB: /tmp/rune-ci-target-${{ github.run_id }}/release/libtoken_counting.so
|
||||
SC_RUST_LIB: /tmp/rune-ci-target-${{ github.run_id }}/release/libscaffold_core.so
|
||||
MEMS_RUST_LIB: /tmp/rune-ci-target-${{ github.run_id }}/release/libmemory_storage.so
|
||||
MR_RUST_LIB: /tmp/rune-ci-target-${{ github.run_id }}/release/libmemory_retrieval.so
|
||||
steps:
|
||||
# actions/checkout v4.2.2, pinned to the audited upstream tag commit.
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
||||
@@ -116,25 +102,6 @@ jobs:
|
||||
fi
|
||||
python3 scripts/umbrella_impact.py check \
|
||||
--base "$(git merge-base origin/master HEAD)" --head HEAD ${BODY_FILE:+--body-file "$BODY_FILE"}
|
||||
- name: Build Rust evidence_provenance crate
|
||||
run: |
|
||||
# tests/test_evidence_provenance_shims.py drives the cdylib through
|
||||
# the shim layer. Toolchain law (see the canary job for the full
|
||||
# rationale): system rustc is broken on this host (LLVM_23.1
|
||||
# version-node symbol gap); use the healthy rustup toolchain, PATH
|
||||
# first so the rustup shim can't exec the broken system rustc.
|
||||
# Runner-owned /tmp target dir (the repo's target/ is nick's).
|
||||
export PATH="/home/nick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/bin:$PATH"
|
||||
export CARGO_TARGET_DIR="/tmp/rune-ci-target-${{ github.run_id }}"
|
||||
mkdir -p "$CARGO_TARGET_DIR"
|
||||
cargo build --release --manifest-path src/rust/evidence_provenance/Cargo.toml
|
||||
cargo build --release --manifest-path src/rust/rune_spine/Cargo.toml
|
||||
cargo build --release --manifest-path src/rust/memory_scoring/Cargo.toml
|
||||
cargo build --release --manifest-path src/rust/capability_scoring/Cargo.toml
|
||||
cargo build --release --manifest-path src/rust/token_counting/Cargo.toml
|
||||
cargo build --release --manifest-path src/rust/scaffold_core/Cargo.toml
|
||||
cargo build --release --manifest-path src/rust/memory_storage/Cargo.toml
|
||||
cargo build --release --manifest-path src/rust/memory_retrieval/Cargo.toml
|
||||
- name: Test with coverage (global floor + changed-lines ratchet)
|
||||
run: |
|
||||
# #149 coverage ratchet — both floors live in .coveragerc; raise,
|
||||
@@ -146,45 +113,12 @@ jobs:
|
||||
.test-venv/bin/coverage xml
|
||||
.test-venv/bin/diff-cover coverage.xml --compare-branch origin/master --fail-under=70 --diff-range-notation ..
|
||||
|
||||
go-surface:
|
||||
runs-on: rune-ci-desktop
|
||||
if: ${{ !startsWith(gitea.event.pull_request.head.ref, 'chore/auto-bump') }}
|
||||
steps:
|
||||
# actions/checkout v4.2.2, pinned to the audited upstream tag commit.
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
||||
- name: Verify Go toolchain version pin
|
||||
run: |
|
||||
# H0 pin: the Go surface builds against the pacman toolchain; the
|
||||
# pin file is the single source of truth so a distro upgrade that
|
||||
# changes behavior fails loud here, not downstream in the canary.
|
||||
WANT=$(cat go-version.txt)
|
||||
GOT=$(go version | awk '{print $3}' | sed 's/^go//' | cut -d- -f1)
|
||||
echo "pinned: $WANT | toolchain: $GOT"
|
||||
[ "$GOT" = "$WANT" ] || { echo "::error::Go toolchain drift: want $WANT, got $GOT (update go-version.txt with the rollout)"; exit 1; }
|
||||
- name: go vet + go test + go build
|
||||
run: |
|
||||
cd src/go/rune-entry
|
||||
go vet ./...
|
||||
go test ./...
|
||||
go build -o /tmp/rune-entry-ci .
|
||||
|
||||
canary:
|
||||
runs-on: rune-ci-desktop
|
||||
if: ${{ !startsWith(gitea.event.pull_request.head.ref, 'chore/auto-bump') }}
|
||||
env:
|
||||
RUNE_HOME: /tmp/rune-ci-${{ github.run_id }}
|
||||
RUNE_MEMORY_DIR: /tmp/rune-ci-${{ github.run_id }}/memory
|
||||
# The build emits to a runner-owned /tmp target dir (the repo's target/
|
||||
# is nick-owned); EP_RUST_LIB points ep_loader at the cdylib FILE there
|
||||
# (the override expects a file path, not a directory).
|
||||
EP_RUST_LIB: /tmp/rune-ci-target-${{ github.run_id }}/release/libevidence_provenance.so
|
||||
SP_RUST_LIB: /tmp/rune-ci-target-${{ github.run_id }}/release/librune_spine.so
|
||||
MS_RUST_LIB: /tmp/rune-ci-target-${{ github.run_id }}/release/libmemory_scoring.so
|
||||
CS_RUST_LIB: /tmp/rune-ci-target-${{ github.run_id }}/release/libcapability_scoring.so
|
||||
TC_RUST_LIB: /tmp/rune-ci-target-${{ github.run_id }}/release/libtoken_counting.so
|
||||
SC_RUST_LIB: /tmp/rune-ci-target-${{ github.run_id }}/release/libscaffold_core.so
|
||||
MEMS_RUST_LIB: /tmp/rune-ci-target-${{ github.run_id }}/release/libmemory_storage.so
|
||||
MR_RUST_LIB: /tmp/rune-ci-target-${{ github.run_id }}/release/libmemory_retrieval.so
|
||||
steps:
|
||||
# actions/checkout v4.2.2, pinned to the audited upstream tag commit.
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
||||
@@ -196,34 +130,6 @@ jobs:
|
||||
python3 -m venv .canary-venv
|
||||
.canary-venv/bin/pip install --disable-pip-version-check -r requirements-ci.txt
|
||||
.canary-venv/bin/pip install --disable-pip-version-check -e . --no-deps
|
||||
- name: Build Rust evidence_provenance crate
|
||||
run: |
|
||||
# The canary pair + the unit shim battery drive the COMPILED surfaces
|
||||
# (binary CLI parity, ep_loader FFI, ctypes cdylib loads).
|
||||
#
|
||||
# Toolchain law (troubleshooting history): the SYSTEM rustc is broken
|
||||
# on this host — librustc_driver-<sha>.so (pacman rust 1:1.99.0-1)
|
||||
# references std::string::_M_mutate under the LLVM_23.1 version node,
|
||||
# but /usr/lib/libLLVM.so.23.1 does not define that narrow-char
|
||||
# symbol under that node (it exports _M_create/_M_assign there, and
|
||||
# only the WIDE-char _M_mutate) — every compile dies with `symbol
|
||||
# lookup error` while `cargo --version` still prints. The rustup
|
||||
# toolchain under /home/nick/.rustup is healthy and ships its own
|
||||
# libLLVM, and /home/nick carries the x-ACL for this runner user.
|
||||
# Point PATH at the toolchain bin dir (bypasses the rustup shim,
|
||||
# which would exec the broken system rustc via RUSTUP_TOOLCHAIN).
|
||||
# Target dir is runner-owned (/tmp): the repo's target/ is nick's.
|
||||
export PATH="/home/nick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/bin:$PATH"
|
||||
export CARGO_TARGET_DIR="/tmp/rune-ci-target-${{ github.run_id }}"
|
||||
mkdir -p "$CARGO_TARGET_DIR"
|
||||
cargo build --release --manifest-path src/rust/evidence_provenance/Cargo.toml
|
||||
cargo build --release --manifest-path src/rust/rune_spine/Cargo.toml
|
||||
cargo build --release --manifest-path src/rust/memory_scoring/Cargo.toml
|
||||
cargo build --release --manifest-path src/rust/capability_scoring/Cargo.toml
|
||||
cargo build --release --manifest-path src/rust/token_counting/Cargo.toml
|
||||
cargo build --release --manifest-path src/rust/scaffold_core/Cargo.toml
|
||||
cargo build --release --manifest-path src/rust/memory_storage/Cargo.toml
|
||||
cargo build --release --manifest-path src/rust/memory_retrieval/Cargo.toml
|
||||
- name: Run canary suite
|
||||
run: |
|
||||
FAILED=0
|
||||
@@ -250,18 +156,6 @@ jobs:
|
||||
src/rune/canary_p1_06.py \
|
||||
src/rune/canary_p1_01.py \
|
||||
src/rune/canary_query_memory.py \
|
||||
src/rune/canary_rune_entry.py \
|
||||
src/rune/canary_spine_meta.py \
|
||||
src/rune/canary_audit_ledger.py \
|
||||
src/rust/rune_spine/canary_spine_rust.py \
|
||||
src/rune/canary_rune_serve.py \
|
||||
src/rune/canary_tui_transport.py \
|
||||
src/rust/memory_scoring/canary_memory_scoring.py \
|
||||
src/rust/capability_scoring/canary_capability_scoring.py \
|
||||
src/rust/token_counting/canary_token_counting.py \
|
||||
src/rust/scaffold_core/canary_scaffold_core.py \
|
||||
src/rust/memory_storage/canary_memory_storage.py \
|
||||
src/rust/memory_retrieval/canary_memory_retrieval.py \
|
||||
src/rune/canary_unbounded.py \
|
||||
src/rune/canary_full_system.py \
|
||||
src/rune/canary_native.py; do
|
||||
|
||||
@@ -8,7 +8,7 @@ on:
|
||||
|
||||
jobs:
|
||||
lint-and-format:
|
||||
runs-on: rune-ci-desktop
|
||||
runs-on: rune-infra-pi
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Lint Python files
|
||||
@@ -18,7 +18,7 @@ jobs:
|
||||
ruff format shared/ src/ || true
|
||||
|
||||
canary-suite:
|
||||
runs-on: rune-ci-desktop
|
||||
runs-on: rune-infra-pi
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Run all canaries
|
||||
@@ -37,7 +37,7 @@ jobs:
|
||||
exit $FAILED
|
||||
|
||||
best-practices:
|
||||
runs-on: rune-ci-desktop
|
||||
runs-on: rune-infra-pi
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Check best practices
|
||||
@@ -72,7 +72,7 @@ jobs:
|
||||
grep -rn "TODO\|FIXME\|HACK\|XXX" shared/ src/ --include="*.py" | head -10 || echo " Clean"
|
||||
|
||||
documentation-check:
|
||||
runs-on: rune-ci-desktop
|
||||
runs-on: rune-infra-pi
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Check documentation coverage
|
||||
@@ -113,7 +113,7 @@ jobs:
|
||||
# push-triggered safety net in auto-version.yml. Detects master/tag drift
|
||||
# and files a deduped issue — it never auto-releases without the PR flow.
|
||||
release-drift-reconciliation:
|
||||
runs-on: rune-ci-desktop
|
||||
runs-on: rune-infra-pi
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
|
||||
@@ -14,4 +14,3 @@ state/
|
||||
# Runtime artifacts (cwd-local event journal + capability index)
|
||||
index/
|
||||
journal/
|
||||
src/rust/*/target/
|
||||
@@ -1,6 +1,6 @@
|
||||
# Rune
|
||||
|
||||
**Current release: v0.99.5**
|
||||
**Current release: v0.87.5**
|
||||
|
||||
**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,124 +0,0 @@
|
||||
import { execFile } from "node:child_process"
|
||||
import { existsSync, appendFileSync } from "node:fs"
|
||||
|
||||
// builder-bridge — Rune Core preflight for the MiMo builder (handoff
|
||||
// 2026-09-10 §3–§7, Option C bridge tranche). For each user turn, the hook
|
||||
// extracts the user's message from the outgoing LLM request, runs the Rune
|
||||
// Core builder-bridge preflight (deterministic: route classification +
|
||||
// memory selection + active-Scaffolding projection, ZERO model calls), and
|
||||
// appends a compact capsule to the final user message. Same Rune Core the
|
||||
// TUI/operator path uses — this file is a thin adapter with no cognition.
|
||||
//
|
||||
// CANONICAL SOURCE: config/mimo-hooks/builder-bridge.ts
|
||||
// Installed to ~/.mimocode/hooks/builder-bridge.ts by
|
||||
// `scripts/install_mimo_hook.py` (hash-verified, drift-detecting — the same
|
||||
// contract as event-wait-guard.ts). T22: this file was previously
|
||||
// UNVERSIONED and hardcoded an ephemeral interpreter path (/tmp/ci-venv),
|
||||
// which silently killed the whole edge; both defects are repaired here.
|
||||
//
|
||||
// Overhead contract (§7/§8): capsule ≤ ~300 tokens; a repeat/empty task
|
||||
// costs ~0ms (TTL cache); a fresh task ~150ms (bounded retrieval). The hook
|
||||
// degrades silently to no-injection on any failure — it must never block
|
||||
// the builder.
|
||||
//
|
||||
// Injection policy: only append when the capsule is non-empty. A plain
|
||||
// "hello" gets nothing (§5: if nothing relevant exists, inject nothing).
|
||||
|
||||
const BRIDGE = "/mnt/workdrive/issue161-harness/src/rune/builder_bridge_cli.py"
|
||||
const MARKER_PREFIX = "/tmp/rune-bridge-"
|
||||
|
||||
// Interpreter resolution (T22 repair): the previous hardcoded
|
||||
// "/tmp/ci-venv/bin/python" is an EPHEMERAL path that no longer exists, so
|
||||
// every bridge call failed and the hook silently degraded — the MiMo edge
|
||||
// received no Rune Core preflight at all (zero fire-log lines). Resolve
|
||||
// against durable candidates, first existing wins; env override wins over
|
||||
// all of them. If nothing exists the hook degrades as before.
|
||||
const PY_CANDIDATES = [
|
||||
process.env.MIMO_BRIDGE_PY,
|
||||
"/mnt/workdrive/issue161-harness/.test-venv/bin/python",
|
||||
"/home/nick/.venvs/memory/bin/python3",
|
||||
"/usr/bin/python3",
|
||||
].filter((p) => typeof p === "string" && p.length > 0)
|
||||
|
||||
function resolvePy() {
|
||||
for (const p of PY_CANDIDATES) {
|
||||
try {
|
||||
if (existsSync(p)) return p
|
||||
} catch {}
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
// Per-process dedupe: identical task text within the cache TTL does not need
|
||||
// a second bridge call — the CLI has its own TTL cache, but skipping the
|
||||
// process spawn entirely for the same message text within 10 minutes keeps
|
||||
// repeats at ~0ms.
|
||||
const lastText = new Map() // text -> timestamp
|
||||
const TTL = 600_000
|
||||
|
||||
function extractUserText(messages) {
|
||||
// messages: Array<{ info: Message, parts: Part[] }> — newest last.
|
||||
for (let i = messages.length - 1; i >= 0; i--) {
|
||||
const m = messages[i]
|
||||
if (m?.info?.role !== "user") continue
|
||||
const texts = []
|
||||
for (const p of m.parts ?? []) {
|
||||
if (p?.type === "text" && typeof p.text === "string") texts.push(p.text)
|
||||
}
|
||||
if (texts.length) return texts.join("\n").slice(0, 4000)
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
export default {
|
||||
"experimental.chat.messages.transform": async (input, output) => {
|
||||
try {
|
||||
if (!Array.isArray(output.messages) || output.messages.length === 0) return
|
||||
const userText = extractUserText(output.messages)
|
||||
if (!userText || userText.length < 12) return // trivial/noise guard
|
||||
// Harness-internal steps (checkpoint writer, compaction, system
|
||||
// reminders) are not builder tasks — no capsule (measured: the fire
|
||||
// log showed checkpoint-writer steps receiving capsules 2026-09-10).
|
||||
if (/^(<system-reminder>|EXTRACTION REQUIRED)/.test(userText.trim())) return
|
||||
const now = Date.now()
|
||||
const prev = lastText.get(userText)
|
||||
if (prev !== undefined && now - prev < TTL) return // dedupe repeats
|
||||
lastText.set(userText, now)
|
||||
if (lastText.size > 64) {
|
||||
// evict oldest
|
||||
let oldestKey = null, oldestVal = Infinity
|
||||
for (const [k, v] of lastText) if (v < oldestVal) { oldestVal = v; oldestKey = k }
|
||||
if (oldestKey) lastText.delete(oldestKey)
|
||||
}
|
||||
|
||||
const py = resolvePy()
|
||||
if (!py) return // no durable interpreter — degrade (never block)
|
||||
|
||||
const capsule = await new Promise((resolve) => {
|
||||
execFile(py, [BRIDGE, userText], { timeout: 15_000 }, (err, stdout) => {
|
||||
resolve(err ? "" : (stdout?.toString() ?? ""))
|
||||
})
|
||||
})
|
||||
if (!capsule.trim()) return
|
||||
|
||||
// Durable fire-trace: one line per ACTUAL injection into an outgoing
|
||||
// model request (handoff §1 proof requirement). Not a canary — this is
|
||||
// standing observability for the bridge's consumer edge.
|
||||
try {
|
||||
appendFileSync("/tmp/rune-bridge-fire.log",
|
||||
JSON.stringify({ ts: new Date().toISOString(), task: userText.slice(0, 80), capsule_tokens: Math.round(capsule.length / 4), py }) + "\n")
|
||||
} catch {}
|
||||
|
||||
// Append the capsule to the LAST user message (the one being answered).
|
||||
const last = output.messages[output.messages.length - 1]
|
||||
if (last?.parts && Array.isArray(last.parts)) {
|
||||
last.parts.push({
|
||||
type: "text",
|
||||
text: "\n\n<rune-preflight>\n" + capsule.trim() + "\n</rune-preflight>\n(Injected by Rune Core builder bridge — deterministic preflight, zero model calls. Relevant state above; ignore if not applicable to this task.)",
|
||||
})
|
||||
}
|
||||
} catch {
|
||||
// never block the builder on bridge failure
|
||||
}
|
||||
},
|
||||
}
|
||||
+69
-116
@@ -4,37 +4,19 @@
|
||||
"generated_at": "2026-09-16T18:23:38Z",
|
||||
"umbrellas": {
|
||||
"capability": {
|
||||
"canaries": [
|
||||
"canary_native",
|
||||
"canary_p0_05",
|
||||
"canary_p1_01",
|
||||
"canary_rune_entry",
|
||||
"canary_rune_serve"
|
||||
],
|
||||
"configs": [],
|
||||
"depends_on": [
|
||||
"memory"
|
||||
],
|
||||
"description": "Tool selection and execution authority",
|
||||
"go_surfaces": [
|
||||
"rune-entry"
|
||||
],
|
||||
"mirrors": [],
|
||||
"modules": [
|
||||
"adaptive_router",
|
||||
"builder_bridge",
|
||||
"builder_bridge_cli",
|
||||
"capability_broker",
|
||||
"connection_pool",
|
||||
"core_server",
|
||||
"cs_loader",
|
||||
"evidence_probe",
|
||||
"forge",
|
||||
"forge_client",
|
||||
"intent_continuity",
|
||||
"local_tool_runtime",
|
||||
"message_queue",
|
||||
"native_units",
|
||||
"openai_compat_transport",
|
||||
"provider_context",
|
||||
"recall_uplift",
|
||||
@@ -42,30 +24,21 @@
|
||||
"tool_executor",
|
||||
"tool_protocol"
|
||||
],
|
||||
"rust_crates": [
|
||||
"capability_scoring"
|
||||
"depends_on": [
|
||||
"memory"
|
||||
],
|
||||
"mirrors": [],
|
||||
"canaries": [
|
||||
"canary_native",
|
||||
"canary_p0_05",
|
||||
"canary_p1_01"
|
||||
]
|
||||
},
|
||||
"governance": {
|
||||
"canaries": [
|
||||
"canary_full_system",
|
||||
"canary_schema_migration",
|
||||
"canary_audit_ledger",
|
||||
"canary_spine_meta"
|
||||
],
|
||||
"configs": [
|
||||
".coveragerc",
|
||||
"go-version.txt",
|
||||
"lint-baseline.json",
|
||||
"pyright-baseline.json"
|
||||
],
|
||||
"depends_on": [],
|
||||
"description": "Quality control, drift detection, promotion, audit",
|
||||
"mirrors": [],
|
||||
"modules": [
|
||||
"audit_ledger",
|
||||
"build_pipeline_policy",
|
||||
"cc_loader",
|
||||
"claim_audit",
|
||||
"contracts",
|
||||
"curator",
|
||||
@@ -73,24 +46,17 @@
|
||||
"drift_ledger",
|
||||
"drift_observability",
|
||||
"failure_auto_filer",
|
||||
"programme_gates",
|
||||
"sc_loader"
|
||||
"programme_gates"
|
||||
],
|
||||
"rust_crates": [
|
||||
"evidence_provenance",
|
||||
"scaffold_core"
|
||||
"depends_on": [],
|
||||
"mirrors": [],
|
||||
"canaries": [
|
||||
"canary_full_system",
|
||||
"canary_schema_migration"
|
||||
]
|
||||
},
|
||||
"growth": {
|
||||
"canaries": [
|
||||
"canary_full_system"
|
||||
],
|
||||
"depends_on": [
|
||||
"governance",
|
||||
"memory"
|
||||
],
|
||||
"description": "Learning and improvement",
|
||||
"mirrors": [],
|
||||
"modules": [
|
||||
"autonomy_loop",
|
||||
"cognitive_loop",
|
||||
@@ -101,17 +67,18 @@
|
||||
"growth_simulator",
|
||||
"self_improve",
|
||||
"subconscious_pass"
|
||||
],
|
||||
"depends_on": [
|
||||
"governance",
|
||||
"memory"
|
||||
],
|
||||
"mirrors": [],
|
||||
"canaries": [
|
||||
"canary_full_system"
|
||||
]
|
||||
},
|
||||
"identity": {
|
||||
"canaries": [
|
||||
"canary_full_system"
|
||||
],
|
||||
"depends_on": [
|
||||
"governance"
|
||||
],
|
||||
"description": "Who the agent is \u2014 persona, voice, anchors",
|
||||
"mirrors": [],
|
||||
"modules": [
|
||||
"behavior",
|
||||
"identity_anchors",
|
||||
@@ -122,19 +89,17 @@
|
||||
"voice_injector",
|
||||
"voice_sync",
|
||||
"voicebox"
|
||||
],
|
||||
"depends_on": [
|
||||
"governance"
|
||||
],
|
||||
"mirrors": [],
|
||||
"canaries": [
|
||||
"canary_full_system"
|
||||
]
|
||||
},
|
||||
"inference": {
|
||||
"canaries": [
|
||||
"canary_p1_02",
|
||||
"canary_p1_06",
|
||||
"canary_resource_authority"
|
||||
],
|
||||
"depends_on": [
|
||||
"capability"
|
||||
],
|
||||
"description": "Model routing and outbound requests",
|
||||
"mirrors": [],
|
||||
"modules": [
|
||||
"inference_trace",
|
||||
"model_connect",
|
||||
@@ -145,39 +110,31 @@
|
||||
"provider_registry",
|
||||
"response_adapter",
|
||||
"standardized_providers",
|
||||
"tc_loader",
|
||||
"token_optimizer"
|
||||
],
|
||||
"rust_crates": [
|
||||
"token_counting"
|
||||
"depends_on": [
|
||||
"capability"
|
||||
],
|
||||
"mirrors": [],
|
||||
"canaries": [
|
||||
"canary_p1_02",
|
||||
"canary_p1_06",
|
||||
"canary_resource_authority"
|
||||
]
|
||||
},
|
||||
"memory": {
|
||||
"canaries": [
|
||||
"canary_full_system",
|
||||
"canary_memory_synthesis",
|
||||
"canary_query_memory"
|
||||
],
|
||||
"depends_on": [
|
||||
"governance"
|
||||
],
|
||||
"description": "Storing, retrieving, and managing knowledge",
|
||||
"mirrors": [],
|
||||
"modules": [
|
||||
"abstraction",
|
||||
"cache",
|
||||
"drift_cache",
|
||||
"drift_compression",
|
||||
"ffi_query_memory_smoke",
|
||||
"graph_memory",
|
||||
"graph_shard_bridge",
|
||||
"memory_consolidation",
|
||||
"memory_env",
|
||||
"memory_selector",
|
||||
"memory_store",
|
||||
"mems_loader",
|
||||
"mr_loader",
|
||||
"ms_loader",
|
||||
"query_memory",
|
||||
"recall_router",
|
||||
"retrieval_benchmark",
|
||||
@@ -185,33 +142,18 @@
|
||||
"tier_manager",
|
||||
"warm_neuron_store"
|
||||
],
|
||||
"rust_crates": [
|
||||
"memory_retrieval",
|
||||
"memory_scoring",
|
||||
"memory_storage",
|
||||
"query_memory"
|
||||
"depends_on": [
|
||||
"governance"
|
||||
],
|
||||
"mirrors": [],
|
||||
"canaries": [
|
||||
"canary_full_system",
|
||||
"canary_memory_synthesis",
|
||||
"canary_query_memory"
|
||||
]
|
||||
},
|
||||
"orchestration": {
|
||||
"canaries": [
|
||||
"canary_cognitive_strata",
|
||||
"canary_conversation_state",
|
||||
"canary_gitea_pipeline",
|
||||
"canary_orchestration_foundation",
|
||||
"canary_p1_07",
|
||||
"canary_surface_parity",
|
||||
"canary_tui_drift",
|
||||
"canary_tui_transport"
|
||||
],
|
||||
"depends_on": [
|
||||
"capability",
|
||||
"growth",
|
||||
"identity",
|
||||
"inference",
|
||||
"perception"
|
||||
],
|
||||
"description": "Task lifecycle, operator, TUI presentation",
|
||||
"mirrors": [],
|
||||
"modules": [
|
||||
"auto_detect",
|
||||
"build_mode",
|
||||
@@ -246,24 +188,32 @@
|
||||
"task_persist",
|
||||
"tiered_executor",
|
||||
"time_awareness",
|
||||
"tui_transport",
|
||||
"tui_validator",
|
||||
"umbrella_update",
|
||||
"verification_layer",
|
||||
"warm_router",
|
||||
"work_manager"
|
||||
],
|
||||
"depends_on": [
|
||||
"capability",
|
||||
"growth",
|
||||
"identity",
|
||||
"inference",
|
||||
"perception"
|
||||
],
|
||||
"mirrors": [],
|
||||
"canaries": [
|
||||
"canary_cognitive_strata",
|
||||
"canary_conversation_state",
|
||||
"canary_gitea_pipeline",
|
||||
"canary_orchestration_foundation",
|
||||
"canary_p1_07",
|
||||
"canary_surface_parity",
|
||||
"canary_tui_drift"
|
||||
]
|
||||
},
|
||||
"perception": {
|
||||
"canaries": [
|
||||
"canary_context_broker",
|
||||
"canary_full_system"
|
||||
],
|
||||
"depends_on": [
|
||||
"memory"
|
||||
],
|
||||
"description": "Input processing and context assembly",
|
||||
"mirrors": [],
|
||||
"modules": [
|
||||
"attention_capsule",
|
||||
"auto_context",
|
||||
@@ -298,8 +248,6 @@
|
||||
"salience_gate",
|
||||
"scaffold",
|
||||
"spine",
|
||||
"spine_language",
|
||||
"spine_loader",
|
||||
"stage_guards",
|
||||
"structural_migration",
|
||||
"structural_model",
|
||||
@@ -311,8 +259,13 @@
|
||||
"wait_guard_corpus",
|
||||
"witness"
|
||||
],
|
||||
"rust_crates": [
|
||||
"rune_spine"
|
||||
"depends_on": [
|
||||
"memory"
|
||||
],
|
||||
"mirrors": [],
|
||||
"canaries": [
|
||||
"canary_context_broker",
|
||||
"canary_full_system"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
+1
-16
@@ -272,19 +272,4 @@ observations, fresh resume.
|
||||
|
||||
Release-note generator: LIVE-PROVEN (real Gitea, 10 releases). Backfill:
|
||||
0.66.35→0.66.44 carrying historical-backfill provenance. Pre-0.66.35
|
||||
history: skipped (weak evidence — honest limitation).
|
||||
|
||||
## Contract discovery → spine (2026-10-05, #2465 CI correction)
|
||||
|
||||
The closed construction contract is the authority for discoveries. Spine
|
||||
rebuild reads its observed entities and candidate corrections; it does not
|
||||
claim a correction has been built. Qualified IDs such as
|
||||
`rust-crate:cognition_core` keep their declared kind. Bare file paths,
|
||||
test suites and other unqualified references become
|
||||
`construction-surface:<reference>`, never `module`. An observed
|
||||
surface may be PRESENT; a candidate stays DECLARED until independently
|
||||
observed. Existing bad records are migrated with their evidence and edge
|
||||
references intact. This matters: the first write-back mapped bare paths to
|
||||
modules, made 22 false module records and crashed CI on the next rebuild.
|
||||
The per-contract quick-reference markdown is generated from the scaffold
|
||||
store at close; it is a view, not another authority.
|
||||
history: skipped (weak evidence — honest limitation).
|
||||
@@ -25,22 +25,22 @@
|
||||
"memory"
|
||||
],
|
||||
"live_defect": false,
|
||||
"last_revalidated": "2026-09-19",
|
||||
"next_action": "none \u2014 defect no longer reproduces: zero MessageAbortedError in current logs (incl. active worker), six most recent session checkpoints full documents (111-396 lines); verified by present-absence 2026-09-19"
|
||||
"last_revalidated": "2026-09-20",
|
||||
"next_action": "none \u2014 defect FIXED_VERIFIED (present-absence 2026-09-19); stale bug label removed 2026-09-20 after #407 fix (PR #408 merged) stopped the workflow re-adding it"
|
||||
},
|
||||
{
|
||||
"number": 316,
|
||||
"title": "ADAPT-1 B3-v2 (RESEARCH-LIKE): Qdrant associative-memory projection spike (executes #162)",
|
||||
"tracker_state": "open",
|
||||
"reconciliation_state": "VALID_OPEN",
|
||||
"tracker_state": "closed",
|
||||
"reconciliation_state": "FIXED_VERIFIED",
|
||||
"labels": [
|
||||
"governance",
|
||||
"memory",
|
||||
"perception"
|
||||
],
|
||||
"live_defect": false,
|
||||
"last_revalidated": "2026-09-12",
|
||||
"next_action": "B3-v2 Qdrant associative-memory projection spike \u2014 not started; ADAPT-1 sub-item under epic #284"
|
||||
"last_revalidated": "2026-09-20",
|
||||
"next_action": ""
|
||||
},
|
||||
{
|
||||
"number": 315,
|
||||
@@ -1147,8 +1147,20 @@
|
||||
"live_defect": false,
|
||||
"last_revalidated": "2026-09-11",
|
||||
"next_action": ""
|
||||
},
|
||||
{
|
||||
"number": 407,
|
||||
"title": "Auto-labeler re-adds bug label to closed fixed issues, defeating reconciliation",
|
||||
"tracker_state": "closed",
|
||||
"reconciliation_state": "FIXED_VERIFIED",
|
||||
"labels": [
|
||||
"infrastructure"
|
||||
],
|
||||
"live_defect": false,
|
||||
"last_revalidated": "2026-09-20",
|
||||
"next_action": "fixed by PR #408 (closed-issue guard + keyword fallback filing-time-only); verified live: bug label removed from #324 and no re-add after 75s across label events"
|
||||
}
|
||||
],
|
||||
"last_reconciled": "2026-09-19",
|
||||
"reconciled_by": "fresh-session tranche 2026-09-19: template retrofit (spine+plain-English on all open issues), closures #158/#162 (SUPERSEDED) and #324 (FIXED_VERIFIED), research labels applied to #163/#164/#165/#166/#182/#316, stale bug labels removed from #163-#166; 2026-09-19 absorption pass: parked children absorbed into parents (#175<-#176..#179; #181<-#182,#183,#164..#166) per one-open-note-per-idea standard"
|
||||
"last_reconciled": "2026-09-20",
|
||||
"reconciled_by": "2026-09-20 overnight Atlas close-out: R1 complete (#376-#406 all R1_QUALIFIED), epic #375 closed; artifact updated for #316 (FIXED_VERIFIED spike concluded) and #324 (FIXED_VERIFIED, label blocker owned by #407); prior: fresh-session tranche 2026-09-19 (template retrofit, closures #158/#162 SUPERSEDED + #324, absorption pass)"
|
||||
}
|
||||
@@ -1,382 +0,0 @@
|
||||
# Language-Fit Rubric — Wave 1 (Language-Rebasing Tranche R1)
|
||||
|
||||
> STATUS: FINAL — self-verified 2026-09-29 per tranche §12 (all 6 rounds completed,
|
||||
> evidence-sufficiency statements recorded, kill tests frozen; execution proceeds on the
|
||||
> evidence, every RECODE still passes its benchmark gate — no win, no recode).
|
||||
> Per-subsystem sections filled from live research rounds (≥2 live-verified external sources per claim,
|
||||
> per-source lessons, evidence→decision mapping, kill test per candidate). No code changes in Wave 1.
|
||||
> Governing law from §11: **KEEP-PYTHON honesty determines how much of the rebase volume is real.**
|
||||
> Toolchain baseline: Rust 1.98.1 + GCC 16.2.1 present; Go NOT installed — Go earns installation only
|
||||
> through rubric evidence here.
|
||||
|
||||
## Verdict (all rounds, one paragraph)
|
||||
|
||||
**KEEP-PYTHON across the board: 40 clusters scored, 0 recode units awarded.** Six research
|
||||
rounds (W2 leaf utilities, W3 memory, W4 provider-layer, W5 orchestration, W6 runtime-core,
|
||||
W7 TUI) each characterized their subsystem's actual workload inward (file:line-anchored) and
|
||||
tested Python/Rust/Go/C against it with live-verified sources and frozen kill tests. The
|
||||
pattern is consistent: the compute-shaped work already executes in C (hashlib, sqlite3/FTS5/vec0,
|
||||
json, regex), the dominant latency is network or LLM-bound, and no cluster contains a hot loop
|
||||
that pays for a process-boundary recode through the 658 µs–0.63 ms interop crossing. **Go:
|
||||
REJECTED — does not earn installation this tranche** (D5=0 everywhere; nothing measured or
|
||||
fetch-confirmed earns it; orchestration additionally rejects its design fit; K-GO kill tests
|
||||
frozen per round should the case be revived). **Rust: toolchain-ready, justified nowhere this
|
||||
tranche** — keep as the standing option behind the CI-proven std-only adapter for any future
|
||||
measured hot loop. **C: rejected everywhere scored** (duplicates C already inside SQLite/hashlib;
|
||||
adds an unsafe-memory surface). The rebase volume the tranche hypothesized is real only as a
|
||||
small set of named improvements — see "Wave-plan consequence" below.
|
||||
|
||||
## Rubric dimensions (applied to every candidate language per subsystem)
|
||||
|
||||
| Dimension | Question | Evidence required |
|
||||
|---|---|---|
|
||||
| D1 Workload fit | Does the subsystem's dominant workload (I/O-bound, CPU-bound, FFI, protocol, UI) actually favour this language? | Benchmarks or authoritative docs, live-verified |
|
||||
| D2 Measured gain | What wins, concretely — latency, memory, startup, binary distribution? | Named hot paths from the Wave 0 inventory + numbers |
|
||||
| D3 Interop cost | What does the interop contract (§5) cost to carry for this boundary? | Adapter surface size, ABI/build complexity |
|
||||
| D4 Ecosystem | Do the needed libraries exist and are they maintained? | Live-verified crate/package/module listings |
|
||||
| D5 Toolchain reality | Is the toolchain present (or installable and justified) on this machine and the CI runner? | Runner + local `--version` evidence |
|
||||
| D6 Maintenance continuity | Can the Rune ecosystem's single-maintainer loop sustain code in this language here? | Honest judgement, stated plainly |
|
||||
| D7 Kill test | What is the CHEAPEST disproof of this candidate? | One falsifiable early test, frozen before any recode |
|
||||
|
||||
Scoring: each candidate gets D1–D6 scored 0–2 with one-line evidence each, D7 written regardless.
|
||||
Decision per subsystem: **KEEP-PYTHON** / **RECODE→<language>** — KEEP-PYTHON is the expected default;
|
||||
a RECODE that cannot pass its own kill test reverts to KEEP-PYTHON before implementation.
|
||||
|
||||
---
|
||||
|
||||
## W3 — Memory & persistence (units: memory_store 56 fns, curator 43, warm_router 32, memory_consolidation 20, sleep_time 25, + graph_memory, night_mode, identity_anchors)
|
||||
|
||||
- **Research round actor:** general-2 (COMPLETED 2026-09-29 — artifacts at
|
||||
`research/wave1/memory/`: inward.md, outward/ ×6, outward-sources.md, synthesis.md)
|
||||
- **Intention profile:** JSONL-heavy appends, BM25/FTS ranking, consolidation passes, long-running
|
||||
scheduled jobs, file-backed state.
|
||||
- **Decision:** **KEEP-PYTHON (all 7 clusters, zero RECODE).** Cluster verdicts:
|
||||
(1) hot-store JSON persistence — KEEP with upgrade path: orjson in-process wheel
|
||||
(~10× dumps / 2× loads); a bespoke Rust CLI unit is dead on spawn cost (the
|
||||
`shared/native_units.py` crossing ~1–5 ms ≈ orjson's entire 3.4 MB `knowledge.json` decode);
|
||||
(2) SQLite store + FTS5/vec0 recall — KEEP, the compute is already C inside SQLite
|
||||
(`memory_store.py:646` vec0 MATCH, `:693` bm25); (3) neuron scoring/routing — KEEP,
|
||||
network-bound `_embed` (Ollama subprocess curl) dominates; (4) graph BFS — KEEP,
|
||||
hops=1 default, per-node SQL, tiny N; the future fix is a SQL CTE, not a language;
|
||||
(5) batch consolidation/curator — KEEP, LLM/I-O-bound and latency-insensitive,
|
||||
asyncio sweet spot; (6) orchestration/glue — KEEP, pure glue pinned by the Python-TUI
|
||||
interop contract; (7) embedding transport — KEEP, network-bound.
|
||||
- **Candidate matrix summary:** Python 7/7 · Go 0/7 (not installed, nothing measured or
|
||||
fetch-confirmed earns installation; Go's JSON stack mid-rewrite upstream) · hand-written C
|
||||
0/7 (C already battle-tested inside SQLite — hand-writing would duplicate it) · Rust 0/7
|
||||
as CLI units (spawn cost kills the one credible vector; in-process wheels excluded by
|
||||
Wave 0 policy).
|
||||
- **Kill tests (frozen in synthesis.md):** Rust-JSON — orjson microbench on live 3.4 MB
|
||||
`knowledge.json` (if drop-in and ≥2× load / ≥5× dump, the CLI unit is disproven on spawn
|
||||
cost); Rust-general — kill unless a profile shows ≥50% wall time in pure Python compute
|
||||
(none exists; reopen only on materially changed workload); Go — instrument one
|
||||
`consolidate_all` run, kill if Python-compute share <50% (it will be — LLM/I-O bound);
|
||||
C — kill unless a hot kernel absent from the SQLite extension ecosystem is identified
|
||||
(none).
|
||||
- **Sources + lessons:** 6 live-fetched 2026-09-29 (orjson, sled, sqlite-vec, SQLite FTS5
|
||||
docs, Go json/v2 rewrite issue, pydantic-core) — full annotations in
|
||||
`research/wave1/memory/outward-sources.md`.
|
||||
- **Evidence sufficiency (honest):** static analysis only, no runtime profiling;
|
||||
memory.store SQLite DB not materialized locally — kill tests specify *measured*
|
||||
thresholds rather than assertions. Verdicts rest on "Python is glue around C/network,"
|
||||
which profiling would only strengthen.
|
||||
|
||||
## W4 — Provider/model layer (units: provider_registry 28, model_connect 10, model_routing 15, model_profiles 15, provider_budget 21, + standardized_providers, model_registry, connection_pool)
|
||||
|
||||
- **Research round actor:** general-5 (COMPLETED 2026-09-29 — artifacts at
|
||||
`research/wave1/provider-layer/`: inward.md, outward-sources.md, outward/ (8 evidence
|
||||
JSONs), synthesis.md)
|
||||
- **Intention profile:** HTTP/SSE streaming, connection pooling, retries/backoff, protocol parsing,
|
||||
tool-call reliability.
|
||||
- **Intention profile correction (inward-verified):** the layer has **NO retry/backoff and NO
|
||||
SSE stub at all** (grep-verified) — `stream: False` everywhere, ~900 lines, remote-LLM-latency-
|
||||
bound. Rewrite pitches are therefore feature-adds, not ports.
|
||||
- **Candidate matrix:** 5 clusters, all KEEP-PYTHON. Scores (1–5 = fit for the cluster's actual
|
||||
workload): (C1) HTTP wire + transport (provider_registry, openai_compat_transport, model_connect
|
||||
discovery) Python 5 / Go 2 / Rust 1; (C2) connection pool (connection_pool.py, 144 lines —
|
||||
in-process object guards under threading.Lock, NOT a TCP pool) Python 5 / Go 2 / Rust 2;
|
||||
(C3) routing decisions (model_routing.py, 432 lines, pure decision logic, one httpx call)
|
||||
Python 5 / Go 1 / Rust 1; (C4) budget accounting (provider_budget.py, 354 lines, pure
|
||||
arithmetic + lock, no I/O) Python 5 / Go 1 / Rust 1; (C5) config/registry/normalization
|
||||
(model_profiles, model_registry, standardized_providers, model_connect tables — dataclasses +
|
||||
JSON, editable by non-systems programmers) Python 5 / Go 1 / Rust 1.
|
||||
- **Decision:** **KEEP-PYTHON (all 5 clusters).**
|
||||
- **Kill tests:** C1 Go — KILLED: toolchain absent (`which go` → not found); 28 call-site
|
||||
behaviors incl. the tool-call envelope contract (openai_compat_transport.py:67-107, 160-207)
|
||||
would be re-implemented with zero incumbent test port and NO performance signal (remote-LLM-
|
||||
latency-bound, kilobyte payloads). Re-earn path if Go is ever installed: std-only proof via
|
||||
`interop/rebase-proof/` + a benchmark harness on C1 only. C1 Rust — KILLED BY CONSTRUCTION:
|
||||
SSE parsing requires reqwest+tokio+eventsource-stream+nom (outward O3/O4/O5 — even mistral.rs
|
||||
takes the tokio stack), violating the std-only interop contract. C2–C5 Go/Rust — KILLED:
|
||||
burden of proof sits on the rewrite candidates; kill tests need contention/throughput/
|
||||
counter-evidence that does not exist; routing runs once per request at millisecond scale
|
||||
against multi-second LLM calls (5 orders of magnitude below any measurable threshold).
|
||||
- **Sources + lessons:** 8 live-fetched (O1–O8), ≥2 per major claim, coverage map in
|
||||
`outward-sources.md`. Lessons: (1) stdlib-only Rust has no realistic precedent for HTTP/SSE
|
||||
workloads — the interop contract's zero-crate standard effectively decides Rust out of all
|
||||
network-wire clusters; (2) Go's stdlib HTTP+NDJSON streaming is capability-proven
|
||||
(pkg.go.dev/net/http, ollama api/client.go, ollama's Go API server) — Go's losses here are
|
||||
evidence-absence, not capability-absence; (3) the honest reliability upgrade for this layer
|
||||
is a small Python-level httpx retry/timeout wrapper — a feature-add, not a language change.
|
||||
|
||||
## W5 — Orchestration, authority, plugins, skills (units: orchestration/ 44 files 244 fns, contracts, build_mode 34, construction_authority*, verification_construction, spine, + governance surfaces: drift_*, persona_gate, safety_override, witness, behavior, growth_delta, claim_audit)
|
||||
|
||||
- **Research round actor:** general-1 (COMPLETED 2026-09-29 — artifacts at
|
||||
`research/wave1/orchestration/`: inward.md, outward-sources.md, outward/ (4 search
|
||||
JSONs), synthesis.md)
|
||||
- **Intention profile:** contract/lifecycle state machines, authority gating, fail-closed validation,
|
||||
HMAC-chained ledgers, policy dispatch.
|
||||
- **Intention profile correction (inward-verified):** the subsystem is durable-ledger I/O,
|
||||
authority wiring, deterministic policy gates, and TUI-facing coordination — NOT hot loops
|
||||
(2 RLocks, 0 sockets, 0 thread pools across 43 files). **Scope gap: `construction_authority.py`
|
||||
and `verification_construction.py` do not exist in the tree** — the construction cluster is
|
||||
covered by build_mode.py; no evidence invented for the missing files.
|
||||
- **Candidate matrix:** 6 clusters, all KEEP-PYTHON. Scores (1–5 = fit for the cluster's actual
|
||||
workload): (C1) durable state & ledger stores (event_store.py:56-101, atomic.py, evidence_store.py
|
||||
— fsync-bound; hashing already C via hashlib) Python 5; (C2) composition roots & authority wiring
|
||||
(composition.py, authority.py, cognitive.py — pure glue, runtime cost ≈ 0) Python 5; (C3)
|
||||
policy/state machines/gates (lifecycle.py, scheduler.py, broker.py, no_change.py, reflex.py —
|
||||
deterministic dict/enum decisions, sub-ms; testability is the requirement) Python 5; (C4)
|
||||
structural self-model & schema tooling (spine.py:24-25, microkernel.py, contracts.py, records.py
|
||||
— introspection + canonical JSON; only candidate for a future Rust spine-diff if snapshots grow
|
||||
1000×) Python 4; (C5) TUI-facing orchestration & build pipeline (build_mode.py 11-stage pipeline,
|
||||
gateway.py, transport.py — the consumer IS the Python TUI; latency dominated by LLM/subprocess
|
||||
waits) Python 5; (C6) benchmark/migration harnesses (retrieval_benchmark.py, migrate.py,
|
||||
benchmark.py — offline tooling, recode buys nothing, loses iteration speed) Python 4.
|
||||
- **Decision:** **KEEP-PYTHON (all 6 clusters). This subsystem contributes 0 recode units to
|
||||
the wave plan.** Go: REJECTED, do not install — differentiator (goroutine-dense servers)
|
||||
targets a workload absent here; cost is exception→error-value rewrite of ~260 functions.
|
||||
Rust: FEASIBLE (toolchain proven) but UNJUSTIFIED anywhere — no cluster has the hot loop
|
||||
that pays for a process-boundary recode; keep as toolchain-ready for other subsystems.
|
||||
C: REJECTED — the only compute-shaped work (sha256) already executes C via stdlib hashlib.
|
||||
- **Kill tests:** K1 (frozen, ALREADY RUN): 100 round-trips through the rebase-proof adapter —
|
||||
mean 0.63ms, p95 0.74ms, cold 0.87ms, 100% exit-0 + ok:true → adapter overhead does NOT block
|
||||
recodes on cost; recodes die on value grounds. Re-open any cluster if profiling shows a
|
||||
function consuming >10% of a real interactive session. K-GO (frozen, ~30 min): Go prototype
|
||||
of event_store.py's batched append+fsync vs Python at 1000 events; if Python's p95 is within
|
||||
2× of Go's, Go is dead here permanently. K-RUST (frozen, ~20 min): measure spine diff on a
|
||||
10k-entity snapshot; <50ms kills any Rust spine recode by absence of pain.
|
||||
- **Sources + lessons:** 4 live-fetched web sources (pydantic-core, ruff blog, go.dev FAQ,
|
||||
Python 3.14 hashlib docs) + 1 LOCAL EXPERIMENT (n=100 adapter benchmark). Lessons: (1) the
|
||||
rebase-proof adapter round-trips at 0.63ms/op — subprocess-per-op is viable for coarse ops,
|
||||
never per-event; (2) Python's "slowness" argument dissolves where the actual compute already
|
||||
runs in C via stdlib (hashlib, sqlite) — the language question is really "where is the hot
|
||||
loop", and here the answer is nowhere; (3) assumed limits flagged honestly: human-scale event
|
||||
cadence (batch_size=8) and Linux spawn cost — both would need revisit at 10⁴+ events/sec or
|
||||
cross-platform targets.
|
||||
|
||||
## W6 — Runtime core & tooling (units: tool_executor 46, tool_protocol 27, local_tool_runtime 32, capability_broker 19, context_broker 21, work_manager 25, cron_engine 28, + failure_auto_filer 28, hook_engine, elastic_cognition, auto_tasks, goal)
|
||||
|
||||
- **Research round actor:** general-4 (COMPLETED 2026-09-29 on disk despite cancellation
|
||||
notification — artifacts at `research/wave1/runtime-core/`: inward.md, outward/,
|
||||
outward-sources.md, synthesis.md)
|
||||
- **Intention profile:** subprocess/process supervision, native execution boundary (native_units
|
||||
adapter already exists), event loops, cron scheduling, hook dispatch.
|
||||
- **Decision:** **STAY-PYTHON (all 6 clusters).** Round scores (1–5 = fit for the cluster's
|
||||
actual inward-characterized workload): (A) subprocess lifecycle (tool_executor, cron_engine,
|
||||
auto_tasks) 4.7 — `subprocess.run(timeout=, capture_output=)` is a one-call expression of the
|
||||
pattern; Rust std::process has NO built-in child timeout (outward-verified), strictly more
|
||||
code under zero-crate; (B) protocol/JSON parsing (tool_protocol, brokers) 4.5 — inputs are
|
||||
KB-scale model fragments; Python json/regex is already C-backed, so a rewrite swaps C for
|
||||
compiled code at the same asymptotic cost; serde's typed-struct model actively mismatches
|
||||
fence-wrapped schema-flexible output; (C) model→tool control loop + HTTP
|
||||
(local_tool_runtime, elastic_cognition, goal) 4.8 — wall time is LLM HTTP latency in seconds;
|
||||
Python overhead is µs–ms noise; the loop's content is policy (circuit breaker, escalation
|
||||
ladders, routing tables); (D) context assembly (context_broker) 4.7 — correctness lives in
|
||||
admission policy and degrade-not-crash semantics, not speed; compaction is itself an LLM call;
|
||||
(E) reliability/queueing (failure_auto_filer) 4.2 — honest lowest: on paper the best Rust
|
||||
candidate (queue + worker + crash-safe JSONL spool), but perf requirement ≈ nil and the
|
||||
correctness burden is threading semantics a rewrite would re-risk for no win ("nothing
|
||||
breaks today"); (F) declarative config/brokers (work_manager, hook_engine, capability_broker)
|
||||
4.9 — literal data, no-op runtime, portable to anything valuable in nothing.
|
||||
- **Candidate matrix summary:** Python 6/6 · Go 0/6 (paper verdicts only — evidence-starved,
|
||||
not installed, kill tests unrunnable locally) · Rust 0/6 (kill tests runnable via the
|
||||
existing std-only interop harness) · C unscored (no FFI-adjacent cluster surfaced).
|
||||
Best-language moment found anywhere: robfig/cron replacing ~37 hand-rolled cron-parsing
|
||||
lines (cron_engine.py:199-236) — ergonomics nicety, not a fit verdict.
|
||||
- **Kill tests (frozen in synthesis.md):** Rust-A — re-express `_run_command`
|
||||
(tool_executor.py:1064) with std::process + manual timeout; kill if >2× the ~40-line
|
||||
Python wrapper (Q4 predicts it is); Go-A — port `cron_engine._run_loop` with os/exec,
|
||||
measure task-fire latency delta (prediction: zero — 60 s sleep and child runtime dominate);
|
||||
B — parse the largest observed tool-protocol stream 1000× in Python; kill if total <1 s
|
||||
(no rewrite yields an observable win); C — instrument `_run_loop`
|
||||
(local_tool_runtime.py:417), log non-HTTP CPU per iteration (prediction <1% of wall);
|
||||
D — time `assemble`+`_admit` on the largest stored context, kill if <10 ms; E — fault-inject
|
||||
kill -9 during spool append; if recovery semantics already hold, the rewrite has no
|
||||
correctness win to buy; F — none needed: absence of any win condition IS the disproof.
|
||||
- **Sources + lessons:** live-fetched 2026-09-29 — annotations in
|
||||
`research/wave1/runtime-core/outward-sources.md`; headline lessons: Rust std::process lacks
|
||||
child timeout (Q4); Go os/exec reaches parity but changes only syntax (Q1); Python
|
||||
json/regex C-backed (Q5b); serde typed structs mismatch dynamic model output (Q5a);
|
||||
concurrency features irrelevant at ≤2 threads (Q6).
|
||||
- **Evidence sufficiency:** Python verdicts fully evidenced inward+outward; Go execution-side
|
||||
evidence honestly starved (paper kill tests carried forward); E's JSONL-spool crash-safety
|
||||
claim rests on inward semantics only — flagged in synthesis.md.
|
||||
|
||||
## W7 — Operator + TUI (units: rune_operator 61 fns, rune_tui 161 fns — largest module, tui_validator)
|
||||
|
||||
- **Research round actor:** general-3 (COMPLETED 2026-09-29 — artifacts at
|
||||
`research/wave1/tui/`: inward.md, outward/ ×8, outward-sources.md, synthesis.md)
|
||||
- **Intention profile:** terminal rendering, input handling, rich layout, hot store state, supervisory
|
||||
command surface. Design decision 4 holds: TUI consumes the interop contract, never rewritten first.
|
||||
- **Decision:** **KEEP-PYTHON (TUI shell; all 4 clusters, zero RECODE, no carve-out found).**
|
||||
Cluster scores (1 = recode, 5 = keep): (A) rendering/widgets 4 — no hot loop exists; render is
|
||||
plain Rich `Text` concatenation (rune_tui.py:1331, chat_bubble.py:157), only animation a 0.12 s
|
||||
spinner (:263), no markdown/Syntax parsing anywhere in src/rune; (B) event glue (~50 `_cmd_*`
|
||||
handlers, reactives, tool-widget maps) 5 — this is Textual's core competency (workers,
|
||||
`exclusive=True`, `call_from_thread`); vendor docs (ratatui) admit "little to no help in organizing
|
||||
large applications"; (C) model send path + envelope 5 — synchronous `send_task` in async worker;
|
||||
the envelope shape (`success/response/thinking/tool_events/degraded`, rune_tui.py:3624ff) is
|
||||
ALREADY the de-facto interop contract; (D) subprocess/streaming 5 — JSONL streaming precedent
|
||||
already in-tree (`_cmd_pull` :3443-3517): the pattern for consuming recoded units, not a recode
|
||||
target. Whole-TUI native recode 1/5 REJECTED — 80+ first-party module coupling, framework-provided
|
||||
concurrency re-implemented by hand; Go additionally toolchain-blocked. Countervailing evidence
|
||||
(Bubble Tea/tview/Codex TUI maturity) recorded honestly in outward-sources.md — it does not
|
||||
outweigh the coupling.
|
||||
- **⚠ CONTRACT GAP FLAGGED (binds Waves 2–7):** `shared/native_units.py` parses only the LAST
|
||||
stdout line — it must gain a JSONL streaming reader (per-line `json.loads` + terminal-envelope
|
||||
validation) before any recoded long-running unit can stream progress to the TUI. Small, testable,
|
||||
non-breaking; candidate for the first Wave 2 implementation issue.
|
||||
- **Adapter surface (TUI as consumer — adopted as the rubric's interop-contract restatement):**
|
||||
(1) single-invocation stateless CLI (`native_unit <op> [args]`, no daemon); (2) success = final
|
||||
stdout line `{"ok":true, …}` generalizing the model-send envelope — recoded units emitting
|
||||
`response`/`tool_events`/`degraded` plug in with zero TUI changes; (3) failure = `ok:false` +
|
||||
nonzero exit, stderr human-only, success = exit 0 AND not timed out; (4) mandatory `--version`
|
||||
on every unit (status bar + `canary_tui_drift.py` detect live units vs Python fallback);
|
||||
(5) JSONL streaming mode for long ops with terminal sentinel envelope; (6) per-call timeout
|
||||
budget, `timed_out` surfaced in `NativeResult` for graceful degradation; (7) streamed events
|
||||
referencing UI objects carry the TUI's stable keys — `(channel, call_id)` for tool widgets
|
||||
(:3676), WorkPane `_entries` object ids (:1239) — preserved verbatim; (8) std-only for
|
||||
proof-phase units.
|
||||
- **Candidate matrix summary:** Python 4/4 clusters · Rust/Go whole-TUI 1/5 rejected · carve-out
|
||||
candidates: none found (future markdown parsing would carve as a Rust native unit behind the
|
||||
adapter, not now).
|
||||
- **Kill tests (frozen in synthesis.md):** stay-Python — killed if >16 ms UI-thread stalls under
|
||||
heavy event bursts OR IPC latency dominates message round-trip (Textual pilot measurement);
|
||||
Rust recode — killed if the adapter must expose >~15 first-party modules (count today ≈80:
|
||||
killed NOW); Go recode — additionally killed by toolchain absence (`command -v go` empty).
|
||||
- **Sources + lessons:** 8 live-fetched 2026-09-29 (Textual workers guide, ratatui vendor docs,
|
||||
Bubble Tea/tview/Codex countervailing evidence, JSON Lines spec, push-granular-work guidance) —
|
||||
annotations in `research/wave1/tui/outward-sources.md`.
|
||||
- **Evidence sufficiency (honest):** full inward read of all 5 TUI files with line refs; ≥2 sources
|
||||
per major claim; gap = no runtime profiling (stall kill test unmeasured — but no mechanism exists
|
||||
for the stall to occur; the 120 ms 21-step pipeline was already removed, `_run_warm_router`
|
||||
:3575 is a no-op).
|
||||
|
||||
## W2 — Leaf utilities & canaries (~40 modules, low coupling: pins, time_awareness, message_queue, event_envelope, attention_capsule, complexity_scorer, token_optimizer, cache 501/17, prompt_sync, chat_bubble, ~15 canary_* modules)
|
||||
|
||||
- **Research round actor:** general-6 (COMPLETED 2026-09-29 — full report in actor notification)
|
||||
- **Intention profile:** small pure helpers, envelopes, scoring, cache; smallest blast radius; the
|
||||
factory + interop proving ground at real scale.
|
||||
- **Ground-truth measurements (local, this session):** Python fn call ~46 ns (100k timed
|
||||
iterations in-process) · native CLI roundtrip ~658 µs (subprocess to
|
||||
`interop/rebase-proof/target/release/rebase-proof --version`) · Python startup floor ~18 ms ·
|
||||
overhead ratio ≈ **14,000×**. The only CI-proven interop contract is the subprocess CLI boundary
|
||||
(`shared/native_units.py`: argv in → JSON stdout, `--version`, timeout, typed `NativeResult`).
|
||||
PyO3/in-process bindings excluded by Wave 0 policy. Therefore every per-call crossing costs
|
||||
≥658 µs — a per-turn helper would need to run >14,000× faster in Rust to break even.
|
||||
- **Candidate matrix (representative — full per-cluster 0–2 scoring in round report):**
|
||||
Python 12/12 in every cluster · Rust 5–6/12 · Go 1–3/12 (D5=0, not installed) · C 1–2/12.
|
||||
No module contains a hot loop (heaviest: 2 `re.sub` per turn in token_optimizer).
|
||||
- **Decision:** **KEEP-PYTHON (all ~40, zero RECODE).** Cluster verdicts: (a) pure CRUD helpers
|
||||
pins/time_awareness/token_optimizer — KEEP, CPython 3.11+ already 10–60% faster on this shape
|
||||
(PEP 659); (b) message/envelope/capsule structures — KEEP, recode would insert a boundary
|
||||
between the chattiest neighbors; (c) cache.py (501 L, largest in wave) — KEEP, the fast part is
|
||||
already C (sqlite3 DB-API 2.0 over SQLite's C library), Python is thin orchestration, batching
|
||||
(threshold 50 / 30 s) already amortizes writes; (d) chat_bubble.py — KEEP, **hard-pinned** to
|
||||
Python by the Textual framework (recode = full framework abandonment, bottleneck is human
|
||||
typing speed); (e) prompt_sync.py glue — KEEP, glue into Python siblings (memory_env,
|
||||
voice_sync, build_pipeline_policy); (f) ~19 canary_* — KEEP **categorically**, a canary that
|
||||
verifies Python importability cannot exist in another language.
|
||||
- **Kill tests (reopening criteria, all fail today on first cheap measurement):** Rust — microbench
|
||||
one per-turn helper behind the native_units CLI, must beat the Python in-process call >10×
|
||||
end-to-end including the 658 µs crossing (whole call <~46 µs; a trivial `--version` already
|
||||
costs 658 µs); Go — identical benchmark post-install, uninstall if roundtrip >100 µs with no
|
||||
named hot path; C — identical benchmark + required fuzz-clean JSON roundtrip, plus a
|
||||
demonstrated GC-free allocation-hot loop first; cache.py — recode only if Python-side
|
||||
orchestration (excl. sqlite3 waits) exceeds 5% of end-to-end latency; capsule/envelope/queue —
|
||||
recode only if one turn's Python total exceeds ~5 ms AND a candidate's CLI path is >10× cheaper.
|
||||
- **Sources + lessons:** (1) https://docs.python.org/3/whatsnew/3.11.html — 10–60% faster,
|
||||
PEP 659 specializing interpreter: CPython already optimized for helper-shaped code, the D2
|
||||
baseline is a moving improving target; (2) https://docs.python.org/3/whatsnew/3.13.html —
|
||||
free-threading/JIT experimental, KEEP-PYTHON ≠ frozen but no bets on experimental paths;
|
||||
(3) https://www.maturin.rs/ — in-process Rust↔Python needs a whole binding/packaging toolchain
|
||||
atop the CLI boundary, D3 worse than measured 658 µs (Wave 0 policy excludes it anyway);
|
||||
(4) https://go.dev/doc/install — Go is a pre-install prerequisite, D5=0 everywhere, never earned
|
||||
installation; (5) https://textual.textualize.io/ — Textual is a Python TUI framework,
|
||||
chat_bubble.py framework-pinned; (6) https://docs.python.org/3/library/sqlite3.html — sqlite3 is
|
||||
DB-API 2.0 over C, cache.py's perf layer already native. All fetched live 2026-09-29.
|
||||
- **⚠ Inventory drift (VERIFIED 2026-09-29):** complexity_scorer.py listed in
|
||||
rebase-inventory.json (2 mentions) but absent on disk — deleted in commit 867321e
|
||||
("governed retirement — complexity_scorer deleted (602 lines)"). Wave 0 inventory needs a
|
||||
correction pass; the module was scored nowhere (no source to characterize).
|
||||
|
||||
---
|
||||
|
||||
## Wave-plan consequence (T5 scope, from the verdict above)
|
||||
|
||||
With **0 recode units awarded**, the tranche's hypothesized rebase volume is real only as the
|
||||
work below. Waves 2–9 are **disposition + named improvements, NOT mass recoding**:
|
||||
|
||||
**Waves 2–7 — per-issue disposition (the 1,852 `[rebase w{wave}]` issues):**
|
||||
Each issue receives its tranche §7 disposition — improve / fix / missing-connectors answered
|
||||
with evidence — plus a language verdict of **KEEP-PYTHON with its rubric evidence line**
|
||||
(the round section for that subsystem names the claim). Disposition runs leaf-first
|
||||
(Wave 2 → 7), the canonical suite stays green throughout, and no issue closes without its
|
||||
evidence line. A recode is off the table unless a frozen kill test is reopened — and then
|
||||
tranche §6 still governs: **no benchmark win, no recode.** Go is not installed and earned no
|
||||
installation; Rust stays toolchain-ready but unjustified (standing option behind the
|
||||
CI-proven adapter).
|
||||
|
||||
**Named improvements — the actual rebase volume (ship alongside disposition):**
|
||||
1. **JSONL streaming reader for `shared/native_units.py`** (W7 contract gap): the adapter
|
||||
parses only the LAST stdout line; it must gain per-line `json.loads` + terminal-envelope
|
||||
validation before any recoded long-running unit could stream progress. Small, testable,
|
||||
non-breaking — first implementation issue of Wave 2.
|
||||
2. **httpx retry/timeout wrapper for the provider layer** (W4): the honest reliability
|
||||
upgrade is a feature-add, not a language change.
|
||||
3. **orjson upgrade path** (W3 cluster 1): the only credible Python-side JSON win —
|
||||
in-process, no boundary crossing. **DISPOSITION (2026-09-29, kill test EXECUTED and
|
||||
FAILED — KEEP-PYTHON stands, no dependency declared):** microbench on the live
|
||||
`~/.rune/consolidation/knowledge.json` (3,540,959 bytes, n=30 best-of): load 13.15 ms
|
||||
std vs 7.85 ms orjson = **1.68× (bar ≥2×: FAIL)**; dump 9.58 ms std vs 5.61 ms
|
||||
orjson-with-decode = **1.71× (bar ≥5×: FAIL)**; raw-bytes dump 1.39 ms = 6.91× but is
|
||||
not drop-in (every `write_text`/`json.dump`-to-file site would need a bytes→str or
|
||||
binary-write conversion). Roundtrip equality verified. Bench: `/tmp/orjson_bench.py`
|
||||
shape (uvx --with orjson). The bytes trap measured real: decode() eats ~60% of the
|
||||
dump win.
|
||||
4. **complexity_scorer.py inventory correction**: listed in `rebase-inventory.json` but
|
||||
deleted on disk (commit `867321e`, 602 lines) — Wave 0 inventory needs the correction
|
||||
pass. **DISPOSITION (2026-09-29, DONE):** inventory regenerated per the script's own
|
||||
header (never hand-edit) — 177→213 files, 1,852→2,314 functions, 13 dead files
|
||||
dropped; committed + pushed `5bc837c`. The W2 round's "2 mentions" drift claim
|
||||
verified FALSE against the live inventory (zero hits).
|
||||
5. **robfig/cron** (W6): recorded as a best-language footnote only; no action.
|
||||
|
||||
**Wave 8 — TUI integration proof:** demonstrate the TUI reading/utilising the mixed-language
|
||||
surfaces that exist (the `interop/rebase-proof` unit through the upgraded adapter), per the
|
||||
8-point adapter surface adopted above.
|
||||
**Wave 9 — close-out audit:** 100% of the 1,852 issues dispositioned, debt-table revision,
|
||||
version bump.
|
||||
|
||||
## Cross-cutting candidates (evaluated once, referenced by every subsystem)
|
||||
|
||||
- **Rust (present, 1.98.1):** interop proof unit already CI-proven (std-only, zero crates, `interop/rebase-proof/`, adapter in `shared/native_units.py`, ok = exit 0 AND not timed out).
|
||||
- **Go (absent):** must earn installation through D1–D5 evidence here before any recode targets it.
|
||||
- **C (present, GCC 16.2.1):** expected to lose D6 in most subsystems; scored where FFI-adjacent work exists.
|
||||
- **Python (KEEP baseline):** the default. Every subsystem begins here; evidence must move it.
|
||||
|
||||
## Evidence ledger (per-source lessons, all rounds)
|
||||
|
||||
Index of per-source evidence. Full annotations live in each round's
|
||||
`research/wave1/<subsystem>/outward-sources.md`; this ledger records the headline lesson
|
||||
each source contributed and the rubric claims it supports.
|
||||
|
||||
| Round | Sources (live-fetched 2026-09-29) | Headline lessons | Supports |
|
||||
|---|---|---|---|
|
||||
| W2 leaf utilities | 6: python.org 3.11 + 3.13 whatsnew, maturin.rs, go.dev/doc/install, textual.textualize.io, docs.python.org sqlite3 | CPython 3.11+ already 10–60% faster on helper-shaped code (PEP 659) — D2 baseline is a moving target; free-threading/JIT experimental, no bets; in-process bindings need a whole toolchain atop the CLI boundary (excluded by Wave 0 policy anyway); Go is pre-install prerequisite, D5=0; Textual framework-pins chat_bubble.py; sqlite3 perf layer already C | W2 KEEP-PYTHON ×~40; the 14,000× crossing-overhead law |
|
||||
| W3 memory | 6: orjson, sled, sqlite-vec, SQLite FTS5 docs, Go json/v2 rewrite issue, pydantic-core | orjson is the only credible Python-side JSON win (in-process, no boundary); SQLite FTS5/vec0 compute is already C; Go's JSON stack mid-rewrite upstream (versioning risk); pydantic-core shows the Rust-as-wheel pattern, excluded by policy | W3 KEEP-PYTHON 7/7; orjson upgrade path on cluster 1 |
|
||||
| W4 provider-layer | 8: live-fetched O1–O8 (HTTP/SSE ecosystem, tokio-stack precedents incl. mistral.rs, pkg.go.dev/net/http, ollama Go client/server) | stdlib-only Rust has no realistic HTTP/SSE precedent — the zero-crate contract decides Rust out of all network-wire clusters by construction; Go's stdlib HTTP+NDJSON streaming is capability-proven (its losses here are evidence-absence, not capability-absence); the honest reliability upgrade is a Python httpx retry/timeout wrapper — feature-add, not language change | W4 KEEP-PYTHON 5/5; SSE-cluster Rust kill-by-construction |
|
||||
| W5 orchestration | 4: pydantic-core, ruff blog, go.dev FAQ, Python 3.14 hashlib docs + 1 LOCAL EXPERIMENT (n=100 adapter benchmark) | adapter round-trips at 0.63ms/op — subprocess-per-op viable for coarse ops, never per-event; Python "slowness" dissolves where compute already runs in C via stdlib; the language question is really "where is the hot loop" (here: nowhere) | W5 KEEP-PYTHON 6/6; K1 kill test already run |
|
||||
| W6 runtime-core | headline lessons (full set in round outward-sources.md) | Rust std::process lacks built-in child timeout — strictly more code under zero-crate; Go os/exec reaches parity but changes only syntax; Python json/regex C-backed so rewrite swaps C for compiled code at equal asymptotic cost; serde typed structs mismatch schema-flexible model output; concurrency features irrelevant at ≤2 threads | W6 STAY-PYTHON 6/6; robfig/cron as best-language footnote |
|
||||
| W7 TUI | 8: Textual workers guide, ratatui vendor docs, Bubble Tea/tview/Codex TUI (countervailing), JSON Lines spec, push-granular-work guidance | Textual workers/`call_from_thread` are the core competency for event glue; ratatui admits "little to no help in organizing large applications"; countervailing native-TUI frameworks recorded honestly — do not outweigh 80+ module coupling; JSONL per-line parse + terminal sentinel is the streaming contract; vendor guidance: push granular speed-sensitive work to subcomponents only when measured | W7 KEEP-PYTHON 4/4; the 8-point adapter surface (adopted as the rubric's interop-contract restatement) |
|
||||
@@ -1,50 +0,0 @@
|
||||
# Wave 0 close-out report — language-rebasing tranche R1
|
||||
|
||||
Branch: `tranche-r1-wave-0` · Date: 2026-09-29
|
||||
|
||||
## 1. Inventory (docs/rebase/rebase-inventory.json)
|
||||
|
||||
- 177 Python modules, ~52,750 lines, 227 classes
|
||||
- TRUE unit count: **1,852 = 1,030 top-level functions + 822 class methods**
|
||||
- Zero duplicate call edges, zero method leaks (generator double-walk defect
|
||||
root-caused and fixed in scripts/rebase_inventory.py)
|
||||
- Cross-verified against an independent fresh AST walk: zero missing units;
|
||||
six inventory-"extras" are real nested/if-try-block classes the naive walk
|
||||
misses (inventory is MORE complete, not less)
|
||||
|
||||
## 2. Issue factory (scripts/rebase_issue_factory.py)
|
||||
|
||||
- One issue per unit following R1 §7; wave-batched (2–7); dedup-safe via
|
||||
deterministic title `[rebase w{wave}] {relpath}::{unit}` + existing-titles
|
||||
scan per run (retries never duplicate — preserve-first)
|
||||
- `plan` → {2: 239, 3: 251, 4: 129, 5: 544, 6: 415, 7: 274} = 1,852,
|
||||
zero unassigned
|
||||
- `sample --wave 5` → full §7 template holds; `_compute_hash` exactly once as
|
||||
labelled callee with line number
|
||||
- Contract fix during Wave 0: `--limit` default changed 5 → 0 (unlimited) for
|
||||
`create`; `sample` keeps its 5. A full-wave create with the old default
|
||||
would have silently truncated each wave to five issues.
|
||||
|
||||
## 3. Interop proof unit (R1 §5)
|
||||
|
||||
- Rust unit at interop/rebase-proof/ (std-only, zero crates): argv in → JSON
|
||||
on stdout, non-zero exit on failure, mandatory `--version`
|
||||
- Shell-proven: version flag, JSON out, exit 2 on failure, stderr diagnostic
|
||||
- Python thin adapter shared/native_units.py: typed NativeResult, timeout +
|
||||
stderr capture, unit failures as data (never exceptions)
|
||||
- Adapter contract fix during Wave 0: `ok` no longer requires a JSON
|
||||
`ok:true` field — plain-text output (`--version`) succeeds on exit code
|
||||
- tests/test_native_interop_proof.py: **8 passed** — version contract, sum
|
||||
happy path, hash determinism, failure paths, timeout, stderr capture
|
||||
|
||||
## 4. Per-wave issue creation
|
||||
|
||||
<!-- FILLED BY THE COMPLETION LOOP — do not hand-edit -->
|
||||
|
||||
- Wave 4 (129 units): created=127 skipped(dedup)=2 (includes smoke #417–418)
|
||||
- Wave 2 (239 units): created=239 skipped(dedup)=0
|
||||
- Wave 3 (251 units): created=251 skipped(dedup)=0
|
||||
- Wave 5 (544 units): created=544 skipped(dedup)=0
|
||||
- Wave 6 (415 units): created=415 skipped(dedup)=0
|
||||
- Wave 7 (274 units): created=274 skipped(dedup)=0
|
||||
- TOTAL: 1,850 created + 2 dedup = 1,852 / 1,852 ✅ full coverage
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"units_per_wave": {
|
||||
"2": 239,
|
||||
"3": 251,
|
||||
"4": 129,
|
||||
"5": 544,
|
||||
"6": 415,
|
||||
"7": 274
|
||||
},
|
||||
"unassigned_modules": {},
|
||||
"unassigned_module_count": 0
|
||||
}
|
||||
@@ -10,7 +10,6 @@ new surface._
|
||||
| `rune_tui.py` | The main Textual application — chat pane, work pane, status bar (version label + refresh), footer, dialogs | The known giant (file-size debt tracked in henxels); composition root for all UI |
|
||||
| `tui_validator.py` | Import-allowlist validation for TUI code | Drift defect tracked in #139 (allowlist vs `__future__`/relative imports) |
|
||||
| `tui_backlog.py` | Not a surface — the durable TUI Upgrade Backlog ledger (outstanding projection/control work per backend feature) | SCAFFOLD-TRANCHE-007; ledger only, never structural authority |
|
||||
| `tui_transport.py` | Not a surface — the transport seam for the TUI's operator calls (in-process default / /v1 wire opt-in) | H4 slice 1 (contract BUILDER-2026-10-04T10:32:00Z-cli); RUNE_TUI_TRANSPORT selects; coverage: canary_tui_transport.py |
|
||||
|
||||
## Adding a TUI surface
|
||||
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
1.27.1
|
||||
+2
-26
@@ -1,31 +1,7 @@
|
||||
settings:
|
||||
warn_about_similar_files:
|
||||
above: 0.85
|
||||
ignore: ["docs/review-lessons.yaml", "docs/v1/**", "docs/wiki/**", "store/spine/**",
|
||||
# shared/ is the DEPLOYED-VINTAGE mirror tree (strangler era):
|
||||
# every src/rune <-> shared similarity here is intentional
|
||||
# (the shim delegates to the crate; the mirror is the deployed
|
||||
# vintage it strangles). Registering the deliberate pairs.
|
||||
"shared/**",
|
||||
"src/rune/drift_core.py", "src/rune/drift_compression.py",
|
||||
"src/rune/drift_observability.py", "src/rune/shard_manager.py",
|
||||
"src/rune/subconscious_pass.py",
|
||||
# deliberate mirror pairs outside the strangler set:
|
||||
# issue templates are mirrored into shared/issue_templates;
|
||||
# completion_file.py is the bridge/daemon mirror of scripts/;
|
||||
# interop/rebase-proof is a committed proof fixture.
|
||||
".gitea/ISSUE_TEMPLATE/**", "shared/issue_templates/**",
|
||||
"bridge/daemon/completion_file.py", "scripts/completion_file.py",
|
||||
"interop/rebase-proof/**",
|
||||
# per-crate copies by zero-dep design: each crate is
|
||||
# self-contained (no shared crate dependency), so the pyjson
|
||||
# JSON module is copied verbatim per crate and the tiny
|
||||
# zero-dep lockfiles are near-identical by construction.
|
||||
"src/rust/*/Cargo.lock", "src/rust/*/src/pyjson.rs",
|
||||
"src/rust/query_memory/src/json_min.rs",
|
||||
# store/scaffold is data (proof fixtures, gate objects),
|
||||
# same class as the already-ignored store/spine.
|
||||
"store/scaffold/**"]
|
||||
ignore: ["docs/review-lessons.yaml", "docs/v1/**", "docs/wiki/**", "store/spine/**"]
|
||||
|
||||
henxels:
|
||||
- henxel: "Canaries live at the repo's canary slot and are registered in CI"
|
||||
@@ -44,7 +20,7 @@ henxels:
|
||||
- henxel: "Top-level docs are markdown or yaml references"
|
||||
in: ./docs/*
|
||||
allowed_filetypes: [.md, .yaml]
|
||||
except: ["./docs/v1/**", "./docs/wiki/**", "./docs/gitea_issue_reconciliation.json", "./docs/rebase/**"]
|
||||
except: ["./docs/v1/**", "./docs/wiki/**", "./docs/gitea_issue_reconciliation.json"]
|
||||
|
||||
- henxel: "The known giant stays visible — file-size debt is tracked, not silent"
|
||||
in: ./src/rune/*
|
||||
|
||||
Generated
-7
@@ -1,7 +0,0 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 4
|
||||
|
||||
[[package]]
|
||||
name = "rebase-proof"
|
||||
version = "0.1.0"
|
||||
@@ -1,15 +0,0 @@
|
||||
[package]
|
||||
name = "rebase-proof"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# Wave 0 interop proof unit (R1 §5). Std-only by design: no crates, no network,
|
||||
# deterministic build. The pattern under proof is the CLI boundary itself, not the
|
||||
# computation inside it.
|
||||
|
||||
[[bin]]
|
||||
name = "rebase-proof"
|
||||
path = "src/main.rs"
|
||||
|
||||
[profile.release]
|
||||
strip = true
|
||||
@@ -1,117 +0,0 @@
|
||||
//! Wave 0 interop proof unit (R1 §5 of the language-rebasing tranche).
|
||||
//!
|
||||
//! Contract under proof:
|
||||
//! - standalone binary; argv in, JSON on stdout
|
||||
//! - non-zero exit on failure (JSON error object still printed to stdout)
|
||||
//! - `--version` flag mandatory
|
||||
//! - Python wraps it in a thin adapter (`shared/native_units.py`); tests call
|
||||
//! it the same way.
|
||||
//!
|
||||
//! Ops: sum / echo / hash (fnv1a64) / sleep / fail. All std-only.
|
||||
|
||||
use std::env;
|
||||
use std::process::exit;
|
||||
use std::thread;
|
||||
use std::time::Duration;
|
||||
|
||||
const VERSION: &str = env!("CARGO_PKG_VERSION");
|
||||
|
||||
/// FNV-1a 64-bit — dependency-free deterministic hash for the proof unit.
|
||||
fn fnv1a64(data: &[u8]) -> u64 {
|
||||
let mut hash: u64 = 0xcbf29ce484222325;
|
||||
for byte in data {
|
||||
hash ^= u64::from(*byte);
|
||||
hash = hash.wrapping_mul(0x100000001b3);
|
||||
}
|
||||
hash
|
||||
}
|
||||
|
||||
fn print_json(line: &str) {
|
||||
println!("{line}");
|
||||
}
|
||||
|
||||
fn emit_ok(body: &str) {
|
||||
print_json(&format!("{{\"ok\":true,{body}}}"));
|
||||
exit(0);
|
||||
}
|
||||
|
||||
fn emit_err(message: &str) -> ! {
|
||||
// Escape the minimal set so the JSON stays parseable for arbitrary op names.
|
||||
let escaped: String = message
|
||||
.chars()
|
||||
.map(|c| match c {
|
||||
'"' => "\\\"".to_string(),
|
||||
'\\' => "\\\\".to_string(),
|
||||
'\n' => "\\n".to_string(),
|
||||
'\r' => "\\r".to_string(),
|
||||
'\t' => "\\t".to_string(),
|
||||
other => other.to_string(),
|
||||
})
|
||||
.collect();
|
||||
print_json(&format!("{{\"ok\":false,\"error\":\"{escaped}\"}}"));
|
||||
exit(2);
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let args: Vec<String> = env::args().skip(1).collect();
|
||||
|
||||
if args.as_slice() == ["--version"] || args.as_slice() == ["-V"] {
|
||||
println!("rebase-proof {VERSION}");
|
||||
exit(0);
|
||||
}
|
||||
if args.is_empty() {
|
||||
eprintln!("usage: rebase-proof <op> [args...] | --version");
|
||||
emit_err("no op given");
|
||||
}
|
||||
|
||||
let op = args[0].as_str();
|
||||
let rest = &args[1..];
|
||||
|
||||
match op {
|
||||
"sum" => {
|
||||
let mut total: i128 = 0;
|
||||
for a in rest {
|
||||
match a.parse::<i128>() {
|
||||
Ok(v) => total += v,
|
||||
Err(_) => emit_err(&format!("sum: not an integer: {a}")),
|
||||
}
|
||||
}
|
||||
emit_ok(&format!("\"op\":\"sum\",\"result\":{total}"));
|
||||
}
|
||||
"echo" => {
|
||||
let joined = rest.join(" ");
|
||||
let escaped: String = joined
|
||||
.chars()
|
||||
.map(|c| match c {
|
||||
'"' => "\\\"".to_string(),
|
||||
'\\' => "\\\\".to_string(),
|
||||
'\n' => "\\n".to_string(),
|
||||
'\r' => "\\r".to_string(),
|
||||
'\t' => "\\t".to_string(),
|
||||
other => other.to_string(),
|
||||
})
|
||||
.collect();
|
||||
emit_ok(&format!("\"op\":\"echo\",\"text\":\"{escaped}\""));
|
||||
}
|
||||
"hash" => {
|
||||
let joined = rest.join(" ");
|
||||
let h = fnv1a64(joined.as_bytes());
|
||||
emit_ok(&format!("\"op\":\"hash\",\"fnv1a64\":\"{h:016x}\""));
|
||||
}
|
||||
"sleep" => {
|
||||
let ms: u64 = match rest.first().map(|s| s.parse::<u64>()) {
|
||||
Some(Ok(v)) => v,
|
||||
_ => emit_err("sleep: expected milliseconds"),
|
||||
};
|
||||
thread::sleep(Duration::from_millis(ms));
|
||||
emit_ok(&format!("\"op\":\"sleep\",\"slept_ms\":{ms}"));
|
||||
}
|
||||
"fail" => {
|
||||
// Deliberate failure: stderr diagnostic + JSON error + exit 2.
|
||||
// Proves stderr capture and non-zero exit in the adapter.
|
||||
eprintln!("rebase-proof: deliberate failure for adapter proof");
|
||||
emit_err("deliberate failure");
|
||||
}
|
||||
other => emit_err(&format!("unknown op: {other}")),
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
{
|
||||
"BLE001": 345,
|
||||
"BLE001": 347,
|
||||
"S110": 75
|
||||
}
|
||||
@@ -1,401 +1 @@
|
||||
[
|
||||
{
|
||||
"name": "read_file",
|
||||
"description": "Read a file with optional windowed viewing (offset/limit). Returns numbered lines. Use offset/limit for large files (100 lines at a time).",
|
||||
"capabilities": [
|
||||
"read_file"
|
||||
],
|
||||
"file": "tool_executor.py",
|
||||
"full_path": "",
|
||||
"priority": 100,
|
||||
"semantic_examples": [],
|
||||
"risk": "read-only",
|
||||
"preconditions": [
|
||||
"path exists and is a readable file"
|
||||
],
|
||||
"side_effects": [],
|
||||
"auto_invoked": false,
|
||||
"hooks": [],
|
||||
"native_tool": true,
|
||||
"searchable_text": "read_file read a file with optional windowed viewing (offset/limit). returns numbered lines. use offset/limit for large files (100 lines at a time). native tool"
|
||||
},
|
||||
{
|
||||
"name": "edit_file",
|
||||
"description": "Surgical search/replace edit. More reliable than full file rewrites. The search string must match exactly.",
|
||||
"capabilities": [
|
||||
"edit_file"
|
||||
],
|
||||
"file": "tool_executor.py",
|
||||
"full_path": "",
|
||||
"priority": 100,
|
||||
"semantic_examples": [],
|
||||
"risk": "write",
|
||||
"preconditions": [
|
||||
"path is inside an allowed write directory",
|
||||
"search string matches exactly once"
|
||||
],
|
||||
"side_effects": [
|
||||
"rewrites the target file atomically after approval",
|
||||
"creates a .bak backup under ~/.rune/undo"
|
||||
],
|
||||
"auto_invoked": false,
|
||||
"hooks": [],
|
||||
"native_tool": true,
|
||||
"searchable_text": "edit_file surgical search/replace edit. more reliable than full file rewrites. the search string must match exactly. native tool"
|
||||
},
|
||||
{
|
||||
"name": "write_file",
|
||||
"description": "Write content to a file. Creates parent directories if needed. Shows diff before writing. Use for new files or full rewrites.",
|
||||
"capabilities": [
|
||||
"write_file"
|
||||
],
|
||||
"file": "tool_executor.py",
|
||||
"full_path": "",
|
||||
"priority": 100,
|
||||
"semantic_examples": [],
|
||||
"risk": "write",
|
||||
"preconditions": [
|
||||
"path is inside an allowed write directory"
|
||||
],
|
||||
"side_effects": [
|
||||
"writes the full file content atomically after approval",
|
||||
"creates a .bak backup under ~/.rune/undo"
|
||||
],
|
||||
"auto_invoked": false,
|
||||
"hooks": [],
|
||||
"native_tool": true,
|
||||
"searchable_text": "write_file write content to a file. creates parent directories if needed. shows diff before writing. use for new files or full rewrites. native tool"
|
||||
},
|
||||
{
|
||||
"name": "glob_files",
|
||||
"description": "Find files matching a glob pattern. Returns file paths sorted by modification time.",
|
||||
"capabilities": [
|
||||
"glob_files"
|
||||
],
|
||||
"file": "tool_executor.py",
|
||||
"full_path": "",
|
||||
"priority": 100,
|
||||
"semantic_examples": [],
|
||||
"risk": "read-only",
|
||||
"preconditions": [
|
||||
"search directory is readable"
|
||||
],
|
||||
"side_effects": [],
|
||||
"auto_invoked": false,
|
||||
"hooks": [],
|
||||
"native_tool": true,
|
||||
"searchable_text": "glob_files find files matching a glob pattern. returns file paths sorted by modification time. native tool"
|
||||
},
|
||||
{
|
||||
"name": "grep_files",
|
||||
"description": "Search for a pattern in files. Returns file paths and line numbers. Use include to filter by file type.",
|
||||
"capabilities": [
|
||||
"grep_files"
|
||||
],
|
||||
"file": "tool_executor.py",
|
||||
"full_path": "",
|
||||
"priority": 100,
|
||||
"semantic_examples": [],
|
||||
"risk": "read-only",
|
||||
"preconditions": [
|
||||
"search directory is readable"
|
||||
],
|
||||
"side_effects": [],
|
||||
"auto_invoked": false,
|
||||
"hooks": [],
|
||||
"native_tool": true,
|
||||
"searchable_text": "grep_files search for a pattern in files. returns file paths and line numbers. use include to filter by file type. native tool"
|
||||
},
|
||||
{
|
||||
"name": "list_directory",
|
||||
"description": "List files and directories at a path. Returns names with / suffix for directories.",
|
||||
"capabilities": [
|
||||
"list_directory"
|
||||
],
|
||||
"file": "tool_executor.py",
|
||||
"full_path": "",
|
||||
"priority": 100,
|
||||
"semantic_examples": [],
|
||||
"risk": "read-only",
|
||||
"preconditions": [
|
||||
"path is a readable directory"
|
||||
],
|
||||
"side_effects": [],
|
||||
"auto_invoked": false,
|
||||
"hooks": [],
|
||||
"native_tool": true,
|
||||
"searchable_text": "list_directory list files and directories at a path. returns names with / suffix for directories. native tool"
|
||||
},
|
||||
{
|
||||
"name": "lint_file",
|
||||
"description": "Lint a file for syntax errors and style issues. Blocks bad edits. Supports Python (ruff), JS/TS (eslint), Go (golangci-lint), and more.",
|
||||
"capabilities": [
|
||||
"lint_file"
|
||||
],
|
||||
"file": "tool_executor.py",
|
||||
"full_path": "",
|
||||
"priority": 100,
|
||||
"semantic_examples": [],
|
||||
"risk": "read-only",
|
||||
"preconditions": [
|
||||
"file exists",
|
||||
"a linter is configured for the language"
|
||||
],
|
||||
"side_effects": [],
|
||||
"auto_invoked": false,
|
||||
"hooks": [],
|
||||
"native_tool": true,
|
||||
"searchable_text": "lint_file lint a file for syntax errors and style issues. blocks bad edits. supports python (ruff), js/ts (eslint), go (golangci-lint), and more. native tool"
|
||||
},
|
||||
{
|
||||
"name": "run_tests",
|
||||
"description": "Run tests for a file or project. Auto-detects test runner from language.",
|
||||
"capabilities": [
|
||||
"run_tests"
|
||||
],
|
||||
"file": "tool_executor.py",
|
||||
"full_path": "",
|
||||
"priority": 100,
|
||||
"semantic_examples": [],
|
||||
"risk": "write",
|
||||
"preconditions": [
|
||||
"a test runner is configured for the project"
|
||||
],
|
||||
"side_effects": [
|
||||
"runs project test commands which may create or delete files"
|
||||
],
|
||||
"auto_invoked": false,
|
||||
"hooks": [],
|
||||
"native_tool": true,
|
||||
"searchable_text": "run_tests run tests for a file or project. auto-detects test runner from language. native tool"
|
||||
},
|
||||
{
|
||||
"name": "format_code",
|
||||
"description": "Auto-format code files. Supports Python (black/ruff), JS/TS (prettier), Go (gofmt), and more.",
|
||||
"capabilities": [
|
||||
"format_code"
|
||||
],
|
||||
"file": "tool_executor.py",
|
||||
"full_path": "",
|
||||
"priority": 100,
|
||||
"semantic_examples": [],
|
||||
"risk": "write",
|
||||
"preconditions": [
|
||||
"path is inside an allowed write directory",
|
||||
"a formatter is configured for the language"
|
||||
],
|
||||
"side_effects": [
|
||||
"rewrites files in place to the formatter's style"
|
||||
],
|
||||
"auto_invoked": false,
|
||||
"hooks": [],
|
||||
"native_tool": true,
|
||||
"searchable_text": "format_code auto-format code files. supports python (black/ruff), js/ts (prettier), go (gofmt), and more. native tool"
|
||||
},
|
||||
{
|
||||
"name": "git_diff",
|
||||
"description": "Show git diff for staged or unstaged changes.",
|
||||
"capabilities": [
|
||||
"git_diff"
|
||||
],
|
||||
"file": "tool_executor.py",
|
||||
"full_path": "",
|
||||
"priority": 100,
|
||||
"semantic_examples": [],
|
||||
"risk": "read-only",
|
||||
"preconditions": [
|
||||
"working directory is a git repository"
|
||||
],
|
||||
"side_effects": [],
|
||||
"auto_invoked": false,
|
||||
"hooks": [],
|
||||
"native_tool": true,
|
||||
"searchable_text": "git_diff show git diff for staged or unstaged changes. native tool"
|
||||
},
|
||||
{
|
||||
"name": "git_log",
|
||||
"description": "Show recent git commits.",
|
||||
"capabilities": [
|
||||
"git_log"
|
||||
],
|
||||
"file": "tool_executor.py",
|
||||
"full_path": "",
|
||||
"priority": 100,
|
||||
"semantic_examples": [],
|
||||
"risk": "read-only",
|
||||
"preconditions": [
|
||||
"working directory is a git repository"
|
||||
],
|
||||
"side_effects": [],
|
||||
"auto_invoked": false,
|
||||
"hooks": [],
|
||||
"native_tool": true,
|
||||
"searchable_text": "git_log show recent git commits. native tool"
|
||||
},
|
||||
{
|
||||
"name": "git_commit",
|
||||
"description": "Commit changes with a message. Auto-stages modified files.",
|
||||
"capabilities": [
|
||||
"git_commit"
|
||||
],
|
||||
"file": "tool_executor.py",
|
||||
"full_path": "",
|
||||
"priority": 100,
|
||||
"semantic_examples": [],
|
||||
"risk": "irreversible",
|
||||
"preconditions": [
|
||||
"working directory is a git repository",
|
||||
"there are changes to commit"
|
||||
],
|
||||
"side_effects": [
|
||||
"creates a commit on the current branch"
|
||||
],
|
||||
"auto_invoked": false,
|
||||
"hooks": [],
|
||||
"native_tool": true,
|
||||
"searchable_text": "git_commit commit changes with a message. auto-stages modified files. native tool"
|
||||
},
|
||||
{
|
||||
"name": "repo_map",
|
||||
"description": "Generate an AST-based codebase map showing key symbols (classes, functions, imports). Uses tree-sitter for 100+ languages.",
|
||||
"capabilities": [
|
||||
"repo_map"
|
||||
],
|
||||
"file": "tool_executor.py",
|
||||
"full_path": "",
|
||||
"priority": 100,
|
||||
"semantic_examples": [],
|
||||
"risk": "read-only",
|
||||
"preconditions": [
|
||||
"target directory is readable"
|
||||
],
|
||||
"side_effects": [],
|
||||
"auto_invoked": false,
|
||||
"hooks": [],
|
||||
"native_tool": true,
|
||||
"searchable_text": "repo_map generate an ast-based codebase map showing key symbols (classes, functions, imports). uses tree-sitter for 100+ languages. native tool"
|
||||
},
|
||||
{
|
||||
"name": "run_command",
|
||||
"description": "Run an approved command. Prefer argv (shell=False); shell syntax requires shell=true and explicit user approval.",
|
||||
"capabilities": [
|
||||
"run_command"
|
||||
],
|
||||
"file": "tool_executor.py",
|
||||
"full_path": "",
|
||||
"priority": 100,
|
||||
"semantic_examples": [],
|
||||
"risk": "irreversible",
|
||||
"preconditions": [
|
||||
"operator approves the command",
|
||||
"required binaries are on PATH"
|
||||
],
|
||||
"side_effects": [
|
||||
"executes arbitrary commands with their full side effects"
|
||||
],
|
||||
"auto_invoked": false,
|
||||
"hooks": [],
|
||||
"native_tool": true,
|
||||
"searchable_text": "run_command run an approved command. prefer argv (shell=false); shell syntax requires shell=true and explicit user approval. native tool"
|
||||
},
|
||||
{
|
||||
"name": "read_persona",
|
||||
"description": "Read Rune's persona definition. Returns the full persona block with voice, identity, and rules.",
|
||||
"capabilities": [
|
||||
"read_persona"
|
||||
],
|
||||
"file": "tool_executor.py",
|
||||
"full_path": "",
|
||||
"priority": 100,
|
||||
"semantic_examples": [],
|
||||
"risk": "read-only",
|
||||
"preconditions": [
|
||||
"persona MEMORY.md exists"
|
||||
],
|
||||
"side_effects": [],
|
||||
"auto_invoked": false,
|
||||
"hooks": [],
|
||||
"native_tool": true,
|
||||
"searchable_text": "read_persona read rune's persona definition. returns the full persona block with voice, identity, and rules. native tool"
|
||||
},
|
||||
{
|
||||
"name": "query_memory",
|
||||
"description": "Query Rune's memory store. Returns relevant memories for a query.",
|
||||
"capabilities": [
|
||||
"query_memory"
|
||||
],
|
||||
"file": "tool_executor.py",
|
||||
"full_path": "",
|
||||
"priority": 100,
|
||||
"semantic_examples": [],
|
||||
"risk": "read-only",
|
||||
"preconditions": [
|
||||
"memory store database is available"
|
||||
],
|
||||
"side_effects": [],
|
||||
"auto_invoked": false,
|
||||
"hooks": [],
|
||||
"native_tool": true,
|
||||
"searchable_text": "query_memory query rune's memory store. returns relevant memories for a query. native tool"
|
||||
},
|
||||
{
|
||||
"name": "check_growth",
|
||||
"description": "Check Rune's growth log. Returns recent growth entries and patterns.",
|
||||
"capabilities": [
|
||||
"check_growth"
|
||||
],
|
||||
"file": "tool_executor.py",
|
||||
"full_path": "",
|
||||
"priority": 100,
|
||||
"semantic_examples": [],
|
||||
"risk": "read-only",
|
||||
"preconditions": [
|
||||
"growth log file exists"
|
||||
],
|
||||
"side_effects": [],
|
||||
"auto_invoked": false,
|
||||
"hooks": [],
|
||||
"native_tool": true,
|
||||
"searchable_text": "check_growth check rune's growth log. returns recent growth entries and patterns. native tool"
|
||||
},
|
||||
{
|
||||
"name": "diagnose_behavior",
|
||||
"description": "Diagnose Rune's current behavior. Returns analysis of persona adherence, voice consistency, and drift.",
|
||||
"capabilities": [
|
||||
"diagnose_behavior"
|
||||
],
|
||||
"file": "tool_executor.py",
|
||||
"full_path": "",
|
||||
"priority": 100,
|
||||
"semantic_examples": [],
|
||||
"risk": "read-only",
|
||||
"preconditions": [
|
||||
"recent response text provided"
|
||||
],
|
||||
"side_effects": [],
|
||||
"auto_invoked": false,
|
||||
"hooks": [],
|
||||
"native_tool": true,
|
||||
"searchable_text": "diagnose_behavior diagnose rune's current behavior. returns analysis of persona adherence, voice consistency, and drift. native tool"
|
||||
},
|
||||
{
|
||||
"name": "find_capability",
|
||||
"description": "Search all installed capabilities for what you need. Returns matching tool names with descriptions and argument schemas. Use this when a capability you need is not in your current tool set; the matched tool becomes callable in the same session.",
|
||||
"capabilities": [
|
||||
"find_capability"
|
||||
],
|
||||
"file": "tool_executor.py",
|
||||
"full_path": "",
|
||||
"priority": 100,
|
||||
"semantic_examples": [],
|
||||
"risk": "read-only",
|
||||
"preconditions": [
|
||||
"a capability query describing the needed outcome"
|
||||
],
|
||||
"side_effects": [],
|
||||
"auto_invoked": false,
|
||||
"hooks": [],
|
||||
"native_tool": true,
|
||||
"searchable_text": "find_capability search all installed capabilities for what you need. returns matching tool names with descriptions and argument schemas. use this when a capability you need is not in your current tool set; the matched tool becomes callable in the same session. native tool"
|
||||
}
|
||||
]
|
||||
[]
|
||||
+15
-38886
File diff suppressed because it is too large.
Load diff
@@ -1,48 +0,0 @@
|
||||
# Phase G slice 1 — retrieval-index authority supersession ledger
|
||||
|
||||
**Date:** 2026-10-02 · **Branch:** `phase-g-strangler-retrieval-index` · **Unit issue:** conductor/rune#2448
|
||||
|
||||
## What was superseded
|
||||
|
||||
The pure-Python `query_memory` implementation (formerly `src/rune/query_memory.py`,
|
||||
deployed at `~/.config/opencode/scripts/query_memory.py`) is RETIRED as a production
|
||||
implementation. Production authority now rests with:
|
||||
|
||||
1. **Implementation:** Rust crate `src/rust/query_memory/` (lib.rs core + cdylib, ten
|
||||
`extern "C"` FFI symbols, zero external crates).
|
||||
2. **Production service surface:** `shared/query_memory.py` — a ctypes-backed shim
|
||||
(179 lines) over `qm_loader.py`, byte-deployed to `~/.config/opencode/scripts/query_memory.py`,
|
||||
serving the FULL prior Python class API including the `self.history` snapshot.
|
||||
|
||||
## Strangler doctrine (master doc lines 685–770) — step discharge
|
||||
|
||||
| Step | Requirement | Evidence |
|
||||
|------|-------------|----------|
|
||||
| 1–4 | candidate built, contract frozen, parity proven | commits `9b76585`+`54d2db9`; `/tmp/phaseG_retrieval_index_contract.md` frozen; parity harness ALL GREEN |
|
||||
| 5 | qualification | `/tmp/phaseG_qual_bench.out` (Rust CLI ~45× faster end-to-end); canaries both sides |
|
||||
| 6 | canaries conformance | Python canary 12/12; Rust canary 27/27 |
|
||||
| 7 | shadow comparison vs live store | `/tmp/phaseG_shadow.py` 46/46 exact-equal vs 77-record production store |
|
||||
| 8 | authority switch + observed consumer evidence | commit `6f44a87`; both consumers verified live — `memory_store.py` (lines 820–821, live 76-record store, nested stats shape) + `growth_simulator.py` (record_query through Rust core); #2448 comment id 33795 |
|
||||
| 9 | runtime evidence post-switch | post-switch verification wall ALL GREEN: Python canary 12/12, FFI smoke 41/41, Rust canary 27/27, parity harness ALL GREEN |
|
||||
| 10 | old production path unreachable | ALL import paths (`import query_memory`) now resolve to the deployed shim; `shared/graph_shard_bridge.py` tolerant import serves the shim; the orphan `src/rune/query_memory.py` had ZERO importers (verified by sweep incl. path-string references) |
|
||||
| 11 | old implementation removed or reference-only | `src/rune/query_memory.py` DELETED (this commit); the only stale reference (`scripts/structural_coverage_audit.py` registry mapping shared/ as a mirror of src/rune) corrected — query_memory removed from `SRC_A`/`SHARED_D`, added to `SHARED_B` (canonical, ops-harness owned) |
|
||||
| 12 | supersession ledger | THIS FILE |
|
||||
|
||||
Deletion discipline (language-governance rule ⑥) satisfied: old code removed only after
|
||||
the new implementation was PROVEN — wall green, shadow 46/46, both production consumers
|
||||
observed live on the Rust core before deletion.
|
||||
|
||||
## Consumer map at supersession
|
||||
|
||||
- `~/.config/opencode/scripts/memory_store.py` — in-process, `adaptive_exploration_rate` (line 820).
|
||||
- `~/.config/opencode/scripts/growth_simulator.py` — in-process, `record_query`.
|
||||
- `shared/graph_shard_bridge.py` — tolerant import (try/except), follows the switch.
|
||||
- `src/rune/tool_executor.py` — NOT a consumer (nominal grep hit only; goes through `memory_store.cached_recall`).
|
||||
|
||||
## Verification commands (reproducible)
|
||||
|
||||
- `/home/nick/.venvs/memory/bin/python3 src/rune/canary_query_memory.py` → 12/12
|
||||
- `/home/nick/.venvs/memory/bin/python3 src/rust/query_memory/canary_rust.py` → 27/27
|
||||
- `/home/nick/.venvs/memory/bin/python3 src/rune/ffi_query_memory_smoke.py` → 41/41
|
||||
- `/home/nick/.venvs/memory/bin/python3 /tmp/phaseG_parity.py` → ALL GREEN
|
||||
- `/home/nick/.venvs/memory/bin/python3 scripts/structural_coverage_audit.py` → exit 0, coverage 100%
|
||||
@@ -1,66 +0,0 @@
|
||||
# Phase G Slice 2 — FROZEN CONTRACT: evidence-provenance (T7.3)
|
||||
|
||||
Frozen: 2026-10-03, session ses_ffe5f08a7892affeGzZWhhm0wR. Branch `phase-g-strangler-evidence-provenance` (cut from slice-1 head `2ac2d0a`). Gitea issue #2449. Nothing below may change without a recorded amendment in this file.
|
||||
|
||||
## 1. Scope (observed, not inferred)
|
||||
|
||||
Six modules in `src/rune/`, 1796 lines total, one test file each as marked:
|
||||
|
||||
| Module | Lines | Surface (grep-verified 2026-10-03) |
|
||||
|---|---|---|
|
||||
| `audit_ledger.py` | 231 | `_compute_hash(prev_hash, entry)`, `append_entry(entry_type, entry_id, details)`, `verify_chain() -> {valid, entries, reason}`, `get_entries(limit=50)`, `log_promotion(entry_id, old_status, new_status, wash_count, reason)`, `log_gate_result(entry_id, verdict, critics)`, `log_drift_alert(alert_type, message, severity)`, `main()` |
|
||||
| `behavior.py` | 411 | `connect()`, `add_correction(original, corrected, scope_tags=None, domain="", pattern="")`, `add_habit(trigger, action, name="", context_tags=None, min_activations=3)`, `match_context(context, match_type=None)`, `reinforce(item_id, outcome, item_type="habit")`, `list_items(item_type="all", limit=20)`, `behavior_stats()`, `main()`, `PLUGIN` dict |
|
||||
| `behaviour_ledger.py` | 251 | 9 state constants (UNVALIDATED…NOT_APPLICABLE) + `STATES` + `CONFIRMED_STATES` tuples, `BehaviourLedger` class |
|
||||
| `claim_audit.py` | 430 | `PATTERNS` list, `EVIDENCE_TAG` regex, `LEDGER_MARKERS`, `reframe(text)`, `scan(text)`, `verify(claim)`, `degrade(claim, verdict)`, `journal(entry)`, `report()`, `audit(draft)`, `handle_hook(event, data=None)`, `main()`, `PLUGIN` |
|
||||
| `evidence_probe.py` | 214 | `PROBE_STATUSES`, `PROBE_FIELDS`, `MAX_PROBES_PER_TASK=2`, `ProbeBudgetExceeded`, `ProbeResult`, `build_probe_prompt(question, artifact_path)`, `validate_probe(artifact)`, `count_probes(artifact_dir)`, `check_budget(artifact_dir)`, `record_probe(result, artifact_dir)`, `run_probe(question, artifact_dir, runner=None, model="UNKNOWN")` |
|
||||
| `verification_layer.py` | 259 | `VerificationResult`, seven `verify_*` functions (exit_code, unit_test, schema, file_exists, file_changed, tool_receipt, constraint_check), `verify(result, verifier_type)`, `handle_hook`, `PLUGIN` |
|
||||
|
||||
Plus `shared/audit_ledger.py` (210 ln) — OLDER vintage of audit_ledger.
|
||||
|
||||
## 2. Authority decisions (per module)
|
||||
|
||||
- **src/rune/ is the authority vintage for all six modules** — hardened newer code (memory_env-pathed storage, defensive handling). The deployed `~/.config/opencode/scripts/{audit_ledger,behavior,claim_audit}.py` copies are OLDER vintages (hardcoded expanduser paths). The authority switch is a VINTAGE UPGRADE plus a language swap — not a mirror replacement.
|
||||
- `shared/audit_ledger.py` is superseded alongside the deployed copy (same older vintage, same defects).
|
||||
|
||||
## 3. Live-data contract (the linchpin — observed)
|
||||
|
||||
- **Live ledger:** `/home/nick/.config/opencode/memory/promotion_ledger.jsonl` (21 entries). `verify_chain()` under the deployed module's own defaults returns `{'valid': True, 'entries': 21, 'reason': 'chain intact'}` — OBSERVED 2026-10-03.
|
||||
- **Live signing key: `rune-drift-integrity-2024`** (the deployed/shared default). The src/rune default `rune-governed-adaptation-2024` FAILS the live chain — it is a latent break, recorded as a defect this slice fixes.
|
||||
- **Hash scheme (both vintages identical):** `HMAC-SHA256(key, (prev_hash + json.dumps(entry_without_hash, sort_keys=True)).encode()).hexdigest()`; genesis prev_hash = `"genesis"`; entry lines written with `json.dumps(entry)` in insertion order (type, entry_id, details, timestamp, prev_hash, hash); timestamp = `datetime.now(timezone.utc).isoformat()`.
|
||||
- **Key rule for the Rust candidate:** read `AUDIT_LEDGER_KEY` env; DEFAULT = `rune-drift-integrity-2024` (the key that verifies the live chain). Never default to the governed key — it verifies nothing that exists.
|
||||
- **Live `behavior.db`:** SQLite at memory_env memory dir, touched Sep 24 — must remain readable by the Rust candidate's storage layer.
|
||||
|
||||
## 4. Rust candidate design
|
||||
|
||||
Crate `/mnt/workdrive/rune/src/rust/evidence_provenance/` following the proven slice-1 shape: zero-dep core in `lib.rs`, `cdylib` FFI exports, hand-rolled JSON serialization where byte-parity demands it. **Port order within the slice** (dependency + risk order):
|
||||
|
||||
1. **audit_ledger** — linchpin: live data, external consumers, key contract.
|
||||
2. **verification_layer** — pure logic, no storage, one test file; fastest port.
|
||||
3. **evidence_probe** — file-based budget/records; `rune_operator.py:581` consumer.
|
||||
4. **behaviour_ledger** — state machine, src/rune-only.
|
||||
5. **behavior** — SQLite habits; live DB; deployed vintage upgrade + `rune_tui.py` consumer.
|
||||
6. **claim_audit** — heaviest (warm-neuron store + graph DB + regex engine); last.
|
||||
|
||||
Python-side ctypes loaders (`*_loader.py`) + deployed shims per slice-1 pattern, so every consumer keeps its import surface unchanged.
|
||||
|
||||
## 5. Parity + qualification criteria
|
||||
|
||||
- **Byte-parity:** Rust `verify_chain` output byte-identical to Python's on the live ledger AND on a mutation battery (tampered entry, broken chain, invalid JSON, empty ledger). Parity harness both sides, slice-1 pattern.
|
||||
- **Canaries:** Python-side canary module per ported module + Rust canary; both green before any switch.
|
||||
- **Shadow:** shadow-compare Rust vs Python on live-shaped data before authority switch.
|
||||
- **Performance:** like-for-like benchmark on the real consumption shape; no regression (Nick's law: combination does not decrease speed).
|
||||
|
||||
## 6. Consumers + adoption plan (Nick's directive: adoption during the refactor)
|
||||
|
||||
| Consumer | Imports | Switch |
|
||||
|---|---|---|
|
||||
| `~/.config/opencode/scripts/curator.py` | audit_ledger | at audit_ledger switch |
|
||||
| `canary_tui_drift.py`, `canary_full_system.py` | audit_ledger | at audit_ledger switch |
|
||||
| `rune_tui.py` (L62, L83) | claim_audit, behavior | at each module's switch |
|
||||
| `rune_operator.py:581` | evidence_probe (relative) | at evidence_probe switch |
|
||||
|
||||
Deployed copies become ctypes shims at each module's authority switch (vintage upgrade included — the shim serves the src/rune contract, not the old vintage's). Old deployed Python deletions follow language-governance ⑥: only after the new is proven.
|
||||
|
||||
## 7. Exit criteria
|
||||
|
||||
All twelve doctrine steps discharged per module-port with observed evidence on #2449; coverage-audit registry remapped; supersession ledger written; audit regression gate green.
|
||||
@@ -1,62 +0,0 @@
|
||||
# Phase G slice 2 — evidence-provenance authority supersession ledger
|
||||
|
||||
**Date:** 2026-10-03 · **Branch:** `phase-g-strangler-evidence-provenance` · **Unit issue:** conductor/rune#2449
|
||||
|
||||
## What was superseded
|
||||
|
||||
The pure-Python evidence-provenance implementations (six modules in `src/rune/`, 1796 lines; plus the two OLD deployed vintages and `shared/audit_ledger.py`) are RETIRED as production implementations for their ported surfaces. Production authority now rests with:
|
||||
|
||||
1. **Rust crate `src/rust/evidence_provenance/`** — six cores: `lib.rs` (audit_ledger chain + FFI), `verification.rs` (7 verifiers), `probe.rs` (schema gate + budget), `behaviour.rs` (state machine), `habitmath.rs` (reinforce math), `claims.rs` (claim-audit decision skeleton); cdylib FFI (`ep_*` symbols, 21 total), zero external crates.
|
||||
2. **Python shims** at `src/rune/{audit_ledger,verification_layer,evidence_probe,behaviour_ledger,behavior,claim_audit}.py` — serving the src/rune authority contract through `ep_loader.py` (in-process, no interpreter startup for the ported logic).
|
||||
3. **Deployed shims** at `~/.config/opencode/scripts/{audit_ledger,behavior,claim_audit}.py` — same shape; audit_ledger + claim_audit + behavior carry the LIVE data-path rules (drift-key ledger, live behavior.db, real journal); claim_audit additionally carries the preserved SYMMETRY GUARD (deployed-vintage feature) and the repaired `scan_text()` TUI surface.
|
||||
|
||||
## Port ledger (all six, in contract §4 order)
|
||||
|
||||
| Port | Module | Rust core | Parity | Commit | Consumer proof |
|
||||
|------|--------|-----------|--------|--------|----------------|
|
||||
| 1 | audit_ledger | lib.rs chain ops | shadow 18/18; canaries 28/28+23/23 | `114c394`+`4b0d1d2` | live ledger entries 4242 (post-switch write), verify 23-intact |
|
||||
| 2 | verification_layer | verification.rs | 33/33 (7 verifiers + CLI render) | `9cb93e6` | contracts.py, canary_native, rune_operator:323 dataclass |
|
||||
| 3 | evidence_probe | probe.rs | 24/24 + consumer tests 23/23 | `3450a1c` | rune_operator:581/603, research_stage_executor:312 |
|
||||
| 4 | behaviour_ledger | behaviour.rs | 13/13 full-scenario | `8973caa` | testing_mode:19, iteration:23, rune_tui:3152 |
|
||||
| 5 | behavior | habitmath.rs | 16/16 + full-stack live-db | `2732677` | rune_tui:83; deployed vintage upgraded (live db read-verified) |
|
||||
| 6 | claim_audit | claims.rs | 17/17 + real-journal aggregate (1127 rows) | `969e39f` | rune_tui:62/2468/3752, contracts.py, hook_engine:270 |
|
||||
|
||||
Errors: byte-equal (duplicate/unknown-behaviour/unknown-state; probe schema-gate lists incl. Python repr rendering; CLI argparse shapes + exit codes).
|
||||
|
||||
## Strangler doctrine (master doc lines 685–770) — step discharge (slice level)
|
||||
|
||||
| Step | Requirement | Evidence |
|
||||
|------|-------------|----------|
|
||||
| 1–4 | candidate built, contract frozen, parity proven | commits `114c394` → `969e39f`; frozen contract `plans/2026-10-03-phase-g-evidence-provenance-contract.md` (commit `7c68e41`); per-port parity harnesses ALL GREEN |
|
||||
| 5 | qualification | per-port parity + decision-math batteries; canary pair per port (Python 74/74, Rust 66/66 — all six port sections accumulated); performance follows the slice-1 in-process shape (no interpreter startup; same cdylib) |
|
||||
| 6 | canaries conformance | canary_audit_ledger.py 74/74; canary_evidence_provenance_rust.py 66/66 (per-port sections for ALL six ports; dual-mode LIVE/ISOLATED for live-ledger pins — run 18141 repair); embedded tests through shims (verification test, 23 consumer tests) |
|
||||
| 7 | shadow comparison vs live-shaped data | port-1 shadow 18/18 vs `939883d:shared/audit_ledger.py` (banked at `114c394`); ports 2–6 use direct byte-parity batteries vs the live originals (same discipline, stronger: full-document byte-quality) |
|
||||
| 8 | authority switch + observed consumer evidence | shims deployed + live-verified per port: entry 4242 (first post-switch ledger write), live behavior.db read through the port-5 shim, real 1127-row journal through the port-6 aggregation, TUI backend trio imports, TUI scan_text FIRST-EVER live call |
|
||||
| 9 | runtime evidence post-switch | post-switch walls per port: parity round-trips, embedded tests, consumer chains (rune.behaviour_ledger / rune.evidence_probe / rune.claim_audit + deployed trio) — all GREEN |
|
||||
| 10 | old production path unreachable | `import audit_ledger` (deployed consumers) → shim; `rune.behaviour_ledger` / `rune.evidence_probe` / `rune.claim_audit` / `rune.verification_layer` → shims; `shared/audit_ledger.py` had ZERO importers (verified by sweep incl. path-string forms) — DELETED |
|
||||
| 11 | old implementation removed or reference-only | `shared/audit_ledger.py` DELETED (this commit, after the proven wall + zero-importer sweep); six src/rune modules remain as shims (the API contract); original Python lives in git history. Coverage registry remapped: `audit_ledger` removed from SHARED_D; gate exit 0 post-deletion |
|
||||
| 12 | supersession ledger | THIS FILE |
|
||||
|
||||
Deletion discipline (language-governance rule ⑥): `shared/audit_ledger.py` removed only after (a) the deployed shim proved live against the real ledger, (b) the shadow wall was green, (c) a zero-importer sweep across src/ shared/ scripts/ tests/. The remaining five src/rune originals were rewritten AS shims in their own commits (git history holds each original); they are the API contract and stay.
|
||||
|
||||
## Vintage-merge disclosures
|
||||
|
||||
- **SYMMETRY GUARD preserved:** the deployed `claim_audit` vintage carried `research_lens.symmetry_check` integration (2026-08-15) absent from src/rune — preserved in both shims (feature-preserving merge; load-bearing behavior).
|
||||
- **DEAD CONSUMER REPAIRED:** `rune_tui.py:3752` `claim_audit.scan_text()` had NO implementation in either vintage (silent try/except death) — now implemented, first-class, live-verified.
|
||||
- **Sequence break (port 1):** the audit_ledger shim was deployed BEFORE its canary pair existed; both canaries subsequently written and green — disclosed on #2449 comment 33817, not retrofitted.
|
||||
|
||||
## Consumer map at supersession
|
||||
|
||||
- `~/.config/opencode/scripts/rune_tui.py` — claim_audit (report L2468, scan_text L3752), behaviour (L3152), behavior (L83).
|
||||
- `src/rune/rune_operator.py` — evidence_probe (L581/603), VerificationResult dataclass (L323).
|
||||
- `src/rune/contracts.py` — dynamic `__import__` surfaces (verification_layer, claim_audit).
|
||||
- `src/rune/testing_mode.py:19` / `src/rune/iteration.py:23` — behaviour_ledger constants + class.
|
||||
- `scripts/research_stage_executor.py:312` — evidence_probe orchestration.
|
||||
- `~/.config/opencode/scripts/curator.py` / `canary_full_system.py` — audit_ledger (deployed shim).
|
||||
- `src/rune/dependency_tracker.py` — map-strings only (NOT an import).
|
||||
|
||||
## Live-data rules (contract §3) — honored in the shims
|
||||
|
||||
- Live promotion ledger: drift key verified 23-intact through the shim + FFI; explicit `AUDIT_LEDGER_KEY` override honored.
|
||||
- Live behavior.db: read/written through the deployed shim at `~/.config/opencode/memory/behavior.db`; parity scenarios ran on temp dirs only.
|
||||
- Live claim_audit journal (1127 rows): read-only aggregate through the Rust core; writes stay Python.
|
||||
@@ -1,97 +0,0 @@
|
||||
# Phase H plan — Go front end / Rust back end (Nick's architecture directive)
|
||||
|
||||
Status: PLAN (awaiting Nick's sign-off before any code)
|
||||
Directive: USER-LOCKED (2026-10-04). Supersedes the KEEP-PYTHON verdicts in
|
||||
docs/rebase-language-rubric.md wherever they conflict.
|
||||
|
||||
## 1. The directive
|
||||
|
||||
Go owns the front end: runtime entry points, the first-call surface, the
|
||||
user-facing interface and its calls. Rust owns the back end: every core
|
||||
logic module. Python survives only as transitional glue inside a module
|
||||
until its own Go/Rust surface lands.
|
||||
|
||||
## 2. What "front end" means concretely here
|
||||
|
||||
From the runtime-audit memory (2026-09-10): the live entry chain is
|
||||
rune_tui -> send_task -> ContextBroker -> ModelRouter -> local/Cloud
|
||||
transports. The user-facing calls are: the TUI process itself, the CLI
|
||||
entry (python -m rune / rune binary), the operator message path, and the
|
||||
OpenAI-compatible /v1 endpoints MiMoCode serves.
|
||||
|
||||
Candidates for the Go first-call layer, in dependency order:
|
||||
- rune binary (process entry, arg parsing, process lifecycle) — replaces
|
||||
the Python module-loading bootstrap.
|
||||
- CLI/IPC command dispatch — the first-call surface that routes a user
|
||||
command to the right back-end service.
|
||||
- The OpenAI-compatible HTTP endpoint surface (/v1 chat completions) —
|
||||
stdlib net/http + NDJSON streaming is exactly the area the rubric called
|
||||
Go's only capability-proven fit (W4 evidence, unchanged by the directive).
|
||||
- TUI: NOT in the first Go surface. Textual coupling is deep (80+ modules
|
||||
per the rubric); the front-end Go layer first exposes the API the TUI
|
||||
consumes, and the TUI itself migrates later as its own wave.
|
||||
|
||||
## 3. What "back end" means concretely here
|
||||
|
||||
All pure-logic modules move into the two existing zero-dep crates
|
||||
(evidence_provenance, query_memory) or a third crate for the remaining
|
||||
domains. The zero-external-crate discipline stands (the rubric's W4 Rust
|
||||
kill-rule for network code stays valid INSIDE Rust crates: no network code
|
||||
in crates, that belongs to the Go layer).
|
||||
|
||||
Back-end candidates not yet ported (pure logic, no external deps):
|
||||
- drift_core, drift_cache, drift_compression (scored math) — memory umbrella
|
||||
- warm_neuron_store/warm_router scoring paths — memory umbrella
|
||||
- memory_store consolidation/scoring helpers — memory umbrella
|
||||
- capability_fit/capability_broker scoring — capability umbrella
|
||||
- tokenizer/counting helpers in token_optimizer — inference umbrella
|
||||
Each port follows the slice-2 pipeline: contract, zero-dep Rust, byte-parity
|
||||
battery vs the Python vintage, dual-mode canary, consumer import chain,
|
||||
CI green, supersession ledger.
|
||||
|
||||
## 4. Sequencing (per wave, each independently mergeable)
|
||||
|
||||
H0 — enablement (no behavior change):
|
||||
- Install Go on the host + the runner user's PATH; pin a version in
|
||||
requirements-ci-equivalent (a go-version file + CI check).
|
||||
- CI: add a Go build+vet+test job (empty module, exits 0) so the pipeline
|
||||
carries Go before any code lands.
|
||||
|
||||
H1 — Go first-call shim:
|
||||
- Go binary `rune` replacing the Python entrypoint's process bootstrap:
|
||||
arg parsing, env resolution, spawn the Python runtime (transitional).
|
||||
- Canary: same first-call contract (exit codes, env handoff, TTY attach).
|
||||
|
||||
H2 — Go command dispatch + /v1 endpoint:
|
||||
- Go serves /v1 chat completions + CLI dispatch, calling the Python core
|
||||
through the same local transport the TUI uses today.
|
||||
- Parity battery: request/response shapes vs the Python server for the
|
||||
same canned conversations (byte-level for metadata, streaming NDJSON).
|
||||
|
||||
H3 — back-end wave (parallel to H1/H2 where independent):
|
||||
- Ports listed in section 3, one or two modules per slice, same slice-2
|
||||
discipline. No port starts without its parity battery written first.
|
||||
|
||||
H4 — TUI migration wave (its own contract, later):
|
||||
- Only after H1-H2 prove the Go front end serves the same surfaces the TUI
|
||||
consumes. The TUI is the largest single module (4k+ lines, Textual) and
|
||||
earns its own contract.
|
||||
|
||||
## 5. Honest constraints (carried from the rubric, not contradicted)
|
||||
|
||||
- Go must be installed first (rubric D5 gate: it failed this before; the
|
||||
directive now outweighs the gate but installation is still step zero).
|
||||
- Network/streaming code lives in the Go layer, never in Rust crates
|
||||
(rubric W4: stdlib-only Rust has no credible HTTP/SSE precedent).
|
||||
- SQLite/regex/file-IO stay at their current language boundaries per the
|
||||
zero-dep split law from slice 2 (math Rust, IO at the edges).
|
||||
- Every surface gets the same proof pipeline as slice 2: observed-not-
|
||||
invented expectations, byte parity, dual-mode canary, CI green.
|
||||
|
||||
## 6. Success measure
|
||||
|
||||
The tranche is complete when: the `rune` process starts as a Go binary;
|
||||
user-facing calls (CLI, /v1, operator path) are served by Go; every core
|
||||
logic module on the port list is byte-parity Rust; Python remains only in
|
||||
surfaces explicitly contracted as keep-Python (TUI internals until H4,
|
||||
test harness, canary frameworks).
|
||||
@@ -1,285 +0,0 @@
|
||||
# TOTAL REBASE TRANCHE — Rune to Go/Rust (R2)
|
||||
|
||||
**Status:** DESIGN — awaiting Nick's approval gate (TRANCHE-DEPTH TEMPLATE §4)
|
||||
**Supersedes:** the KEEP-PYTHON rubric verdicts (already superseded by Nick's
|
||||
Go-front/Rust-back directive) and extends Phase H (H0–H4 slice 1, merged
|
||||
`693a494`, v0.90.0) from first ports to total rebase.
|
||||
**Nick's directives (verbatim anchors):**
|
||||
- "i want the whole codebase rebased in rust and go"
|
||||
- "everything should initiate with go as the runtime, and reactive adaptable
|
||||
runtime should be go"
|
||||
- "the deterministic backend i.e memory storage, architectures and elastic
|
||||
cognition and everything like that should be in rust"
|
||||
- "go should be the reactive front end to what interfaces with the user —
|
||||
not gui — the deliverables and chat interactions as well as how rune
|
||||
handles thoughts and runtime"
|
||||
- "the zero dependency rule should be in place but the rebase should rebuild
|
||||
those aspects into the new architecture and make them operational"
|
||||
- "the textual tui should be last but everything should be wired into the
|
||||
textual tui"
|
||||
- "start with the scaffolding first as everything relies on that, then use
|
||||
the new rust scaffolding to make sure everything else is built towards
|
||||
scaffold protocol"
|
||||
- "the scaffolding function should be a rust execution but go start"
|
||||
|
||||
## 1. Grounding summary (measured 2026-10-04, from the spine store + wc)
|
||||
|
||||
- 161 modules with source, **64,482 lines** of `src/rune/` Python.
|
||||
- Draft classification (rule-based, to be function-level verified in Wave 0):
|
||||
- **RUST (deterministic backend):** 49 modules, 26,772 lines — memory,
|
||||
drift, warm, capability, token, spine, scaffold, construction_*,
|
||||
structural_store, curator, consolidation, elastic cognition, ledgers,
|
||||
audit, evidence, contracts, sleep_time, subconscious, persona_gate,
|
||||
context_broker, growth.
|
||||
- **GO (reactive runtime + user-facing):** 10 modules, 7,043 lines —
|
||||
operator, transports, dispatch, provider registry, adaptive router,
|
||||
hook engine, local tool runtime, work manager, deploy_qualify.
|
||||
- **TUI-last:** 4 modules, 4,889 lines — rune_tui (4,041), tui_validator,
|
||||
tui_backlog, tui_transport.
|
||||
- **UNCLASSIFIED (Wave 0 must disposition each with evidence):** 73
|
||||
modules, 21,473 lines — voice_*, tool_executor, model_routing/registry,
|
||||
event_bus, cron_engine, message_queue, identity_anchors, pins,
|
||||
stage_guards, tier_manager, witness, etc.
|
||||
- **Test infra:** 23 canary/test modules, 4,211 lines — rewritten per wave
|
||||
(Rust canaries port with their surface; Go canaries for the front).
|
||||
- **Retires:** `__init__`, `__main__`, `memory_env` (bootstrap glue —
|
||||
subsumed by the Go runtime's env contract).
|
||||
- Existing Rust (merged, production-proven): 6 zero-dep crates
|
||||
(query_memory, evidence_provenance, rune_spine, memory_scoring,
|
||||
capability_scoring, token_counting), 338k bytes, all with parity
|
||||
batteries. Go: rune-entry (H1 shim + H2 /v1 front door).
|
||||
- Stragglers from R1 folded in: #2171, #2119 (TUI), #1844 (salience_gate),
|
||||
#1755 (goal._load), #1738 (failure_auto_filer).
|
||||
|
||||
## 2. Objective
|
||||
|
||||
Every line of rune's Python runtime is rebased into the dichotomy —
|
||||
**Go initiates and reacts; Rust determines and stores** — with the
|
||||
scaffolding protocol rebuilt FIRST (Go start / Rust execution) so every
|
||||
subsequent conversion is driven, checked, and closed by the new protocol
|
||||
itself. Python is deleted only after the replacement is parity-proven and
|
||||
CI-green (strangler exit law). The Textual TUI is last and stays the
|
||||
integration surface: everything wires into it over the transport seam.
|
||||
|
||||
## 3. The hard constraint analysis (zero-dep + total rebase — feasibility)
|
||||
|
||||
Nick asked: confirm or deny. **Confirmed possible**, amended per his
|
||||
critiques (2026-10-04):
|
||||
|
||||
- **Hybridized membrane, not a wall (Nick's correction):** Go remains the
|
||||
reactive initiator, but "Rust never touches a socket" is WITHDRAWN as an
|
||||
absolute. The languages interoperate where coherence demands: Rust cores
|
||||
callable from Go (the proven cdylib pattern), Go surfaces invocable from
|
||||
Rust through defined channels, shared wire protocols. The dichotomy is
|
||||
the DEFAULT placement rule; hybrid junctions are deliberate, contracted
|
||||
exceptions — each recorded in the unit's contract.
|
||||
- **SQLite STAYS (Nick's ruling):** no bespoke storage engine in this
|
||||
tranche. SQLite remains and is wired into the new architecture — the
|
||||
Rust side reaches it through system-library FFI (legal under zero-dep:
|
||||
a system library is not a crate dependency). The bespoke memory-system
|
||||
redesign is a LATER, separate program.
|
||||
- **Reactivity/async:** Go goroutines + channels own the event loops;
|
||||
Rust's deterministic cores stay synchronous behind the membrane.
|
||||
- **Regex:** hand-rolled matchers per case (proven: pyjson, word-run
|
||||
scanner, run-collapse). No general regex engine needed.
|
||||
- **Parity-plus-improvement (Nick's upgrade):** parity is the FLOOR, not
|
||||
the ceiling. Every unit answers "parity OR measurably better" —
|
||||
efficiency improvements are in scope per function (Rust zero-copy and
|
||||
exactness, Go goroutine-native concurrency), bloat from bad syntax is
|
||||
removed, and functionality is the non-negotiable gate. Improvements
|
||||
carry measurements; the parity battery proves no behavior regression
|
||||
either way.
|
||||
- **TUI wiring is continuous (Nick's correction):** each landed surface
|
||||
wires toward the Textual TUI over the transport seam as part of its
|
||||
unit contract — the final TUI wave integrates a system already aimed
|
||||
at it, not a retrofit.
|
||||
- **Language intelligence in the protocol (Nick's addition):** the
|
||||
scaffolding gains a first-class placement decision — for rune, the
|
||||
Go/Rust dichotomy rule (reactive/initiating → Go; deterministic/
|
||||
stateful → Rust); for other projects, a language-fit assessment at
|
||||
construction-classification time (the protocol recommends the right
|
||||
language for the task's characteristics).
|
||||
- **Provenance lock (Nick's verification):** the scaffolding being ported
|
||||
in Wave 1 is the V1-ACCEPTED system per docs/SCAFFOLDING_V1_DEFINITION.md
|
||||
(T18 §18B; North Star = Nick's verbatim words; 17/17 acceptance gates).
|
||||
The Wave 1 parity replay against the production contract ledger proves
|
||||
the rebuild is that design, not a drift.
|
||||
|
||||
## 4. Wave structure (each wave independently mergeable, scaffolding-gated)
|
||||
|
||||
### Wave 0 — Grounding + inventory verification (the template's bar)
|
||||
- Function-level mapping of all 161 modules (the spine gives structure;
|
||||
wave 0 verifies 100% of functions and classifies the 73 UNCLASSIFIED
|
||||
with evidence).
|
||||
- Disposition the 5 R1 stragglers.
|
||||
- Produce the per-unit issue factory input: one issue per function,
|
||||
each answering improve/fix/missing-connectors with evidence.
|
||||
- Deliverable: `plans/total-rebase-inventory.md` + issues filed.
|
||||
- Exit gate: inventory signed off by Nick (the approval gate).
|
||||
|
||||
### Wave 1 — The scaffolding engine reborn (Go start / Rust execution)
|
||||
**Everything depends on this — it goes first, per Nick's directive.**
|
||||
- The rebuild target is the V1-ACCEPTED system (Nick's design —
|
||||
docs/SCAFFOLDING_V1_DEFINITION.md, North Star verbatim, 17/17
|
||||
acceptance gates). The parity replay against the production contract
|
||||
ledger is the proof the rebuild IS that design.
|
||||
- Rust crate `scaffold_core`: the construction machinery as pure
|
||||
deterministic logic — contract lifecycle (draft→approved→building→
|
||||
verifying→closed), closure classification (correctly_predicted et al.),
|
||||
scope resolution, legal transitions, the contract store.
|
||||
Source modules: scaffold.py, construction_interface.py,
|
||||
construction_decision.py, construction_intent.py, structural_store.py
|
||||
(parts not already in rune_spine), contracts.py, toolchain.py.
|
||||
- Go surface `rune-scaffold` (extends rune-entry): the initiation layer —
|
||||
submit-need/observe/transition/close CLI + /v1 endpoints, delegating to
|
||||
the Rust core.
|
||||
- NEW per Nick: the **language-placement decision** lands in the protocol
|
||||
here — construction classification gains a language-fit assessment
|
||||
(rune: the Go/Rust dichotomy rule; other projects: characteristic-based
|
||||
recommendation). Every later contract carries its placement verdict.
|
||||
- NEW per Nick: parity is the floor — the engine itself is the first
|
||||
beneficiary of the parity-plus-improvement rule (measured improvements
|
||||
allowed, functionality preserved, no-regression proven).
|
||||
- Exit gate: the R2 tranche's own remaining waves are driven THROUGH the
|
||||
new engine (the protocol builds itself under its own rules).
|
||||
|
||||
### Wave 2 — Memory/storage backend (Rust, SQLite retained)
|
||||
- SQLite is NOT replaced (Nick's ruling). The Rust memory core reaches it
|
||||
via system-library FFI (zero-dep legal); memory_store.py (2,435 lines)
|
||||
is decomposed: query paths and consolidation logic into Rust, the SQLite
|
||||
mechanics behind a thin storage trait that maps to libsqlite3 today and
|
||||
to the future bespoke engine LATER without consumer churn.
|
||||
- elastic_cognition, memory_consolidation, sleep_time, curator,
|
||||
subconscious_pass, drift_* (remaining DB-backed surfaces), journal,
|
||||
recall_* (recall_router is routing → boundary checked at Wave 0
|
||||
disposition).
|
||||
- Data safety gate: checksum-verified read-back of the live store through
|
||||
the new engine; zero writes until the read path is proven identical.
|
||||
|
||||
### Wave 3 — Cognition + architecture engines (Rust)
|
||||
- The remaining deterministic cores: capability_broker decision logic,
|
||||
context_broker, persona_gate, growth, identity_anchors, pins,
|
||||
stage_guards, tier_manager, witness, safety_override, abstraction,
|
||||
verification surfaces.
|
||||
- Ports already merged (memory_scoring, capability_scoring,
|
||||
token_counting, rune_spine) are verified against the new scaffold
|
||||
protocol and wired into the final architecture.
|
||||
|
||||
### Wave 4 — The reactive runtime (Go)
|
||||
- The operator turn loop (rune_operator.py, 2,697 lines), chat
|
||||
interactions, deliverables production, model routing at call time
|
||||
(adaptive_router, model_registry/profiles/routing, provider_*),
|
||||
tool execution (tool_executor, tool_protocol, local_tool_runtime),
|
||||
event surfaces (event_bus, message_queue, cron_engine, hook_engine),
|
||||
voice output chain (voice_*) as deliverable production.
|
||||
- The /v1 surface deepens to carry the full interaction contract;
|
||||
NDJSON streaming becomes the standard response shape.
|
||||
|
||||
### Wave 5 — Python retirement sweep
|
||||
- Every Python module whose surfaces have landed is deleted (strangler
|
||||
exit: parity proven + CI green + deployed one cycle). Shared/ vintage
|
||||
mirrors retired with them.
|
||||
- The glue shims (ms_loader, cs_loader, tc_loader, spine_loader) retire
|
||||
when their consumers no longer speak Python at all.
|
||||
|
||||
### Wave 6 — TUI last (but wired continuously)
|
||||
- Every wave before this one ships its transport-seam wiring toward the
|
||||
TUI as part of each unit's contract (Nick's correction: natural,
|
||||
continuous wiring — not a retrofit wave).
|
||||
- Then the TUI itself: a thin Textual render shell over the wire (all
|
||||
logic already Go/Rust by then) or a port — disposition decided on the
|
||||
evidence of everything that came before.
|
||||
|
||||
### Wave 7 — Final audit
|
||||
- Language-bar measurement, the full scaffolding ledger replayed, the
|
||||
tranche's closure report with per-wave evidence.
|
||||
|
||||
## 5. Per-unit discipline (the template, unchanged)
|
||||
|
||||
- One issue per function via the issue factory; each answers
|
||||
improve/fix/missing-connectors with evidence.
|
||||
- Every unit runs the scaffolding pipeline end-to-end: submit-need →
|
||||
contract → approval → canary-first (red proven) → implementation →
|
||||
parity battery vs the Python vintage → closure audit (structural ids,
|
||||
never file paths — the closure vocabulary law).
|
||||
- Per-unit decisions on evidence, never pre-decided globally: each
|
||||
function's Go-vs-Rust placement is assessed by the dichotomy rule with
|
||||
the measured call graph, not by the draft classification alone.
|
||||
- Bug-fix contract governs every defect found en route (red test first,
|
||||
regression frozen).
|
||||
|
||||
## 6. Verification gates
|
||||
|
||||
- CI green per wave (crate builds, Go vet/test/build, canaries, henxels,
|
||||
type ratchet until the Python ratchet itself retires in Wave 5).
|
||||
- Parity batteries are byte-level for deterministic surfaces, shape-level
|
||||
modulo volatile fields for wire surfaces.
|
||||
- The scaffolding closure audit for every contract: correctly_predicted
|
||||
or honestly flagged, never silent.
|
||||
- Deploy qualification per merge (the pipeline that proved itself today).
|
||||
|
||||
### The 90/100 coverage law (Nick, 2026-10-05 — GOVERNING from W3.4 on)
|
||||
|
||||
Per Nick: "if it's realistically achievable but aim higher also if that's
|
||||
realistically achievable. go to 100% where achievable."
|
||||
|
||||
- **100% where achievable — the deterministic Rust kernels.** Every kernel
|
||||
crate (memory_retrieval, cognition_core, scaffold_core, memory_storage,
|
||||
and every future crate) targets 100% BRANCH coverage via its parity
|
||||
matrices + the pytest shim battery: every branch has real reachable
|
||||
semantics, and exhaustive enumeration is exactly what the batteries do.
|
||||
Achievability is measured per crate at wave close; a kernel below 100%
|
||||
carries the named unreachable case or it isn't done.
|
||||
- **≥90% on the changed-lines bar (diff-cover), aiming higher.** The floor
|
||||
stays a floor; the working standard per slice is 90%+ on changed lines;
|
||||
whatever a slice achieves beyond 90 becomes the next slice's personal
|
||||
benchmark (per-unit "aim higher" — the number climbs wave over wave).
|
||||
The floor ratchet itself moves after consecutive clean waves
|
||||
(70 → 76 → 84 → 90; each raise is a commit, never a step down).
|
||||
- **Glue/failure branches: 90%+ with byte-compare proofs.** The stubs and
|
||||
probe branches that only fire in a broken world are covered by honest
|
||||
fixtures (real import-failure probes like the from-import resolution
|
||||
law) — never by fake-triggered pragmas. A branch covered by a lying
|
||||
fixture is WORSE than uncovered; if it can't be honestly reached, it's
|
||||
named in the wave's closure report with the reason.
|
||||
- **Assertion quality is part of the bar.** A test that touches a line
|
||||
without verifying its OUTPUT doesn't count toward the bar — byte-compare
|
||||
/ exact-value asserts are the standard; "is not None" assertions reject
|
||||
at review.
|
||||
|
||||
## 7. Risk register
|
||||
|
||||
- **SQLite FFI correctness** (Wave 2) — the storage layer is retained but
|
||||
re-wired; mitigations: read-path proven identical before any write,
|
||||
checksum-verified read-back of the live store, the storage trait
|
||||
boundary keeps the future bespoke swap cheap.
|
||||
- **Hybrid membrane drift** — junctions multiply ad-hoc if ungoverned;
|
||||
every Go↔Rust interaction point is a contracted, recorded decision in
|
||||
its unit's contract (the dichotomy is the default; hybrids justify
|
||||
themselves per unit).
|
||||
- **Improvement regressions** — parity-plus-improvement invites subtle
|
||||
behavior changes; every improvement carries a measurement AND the parity
|
||||
battery stays authoritative for no-regression.
|
||||
- **Go↔Rust call latency** — measure in Wave 1; the architecture assumes
|
||||
local transport cost is negligible vs model latency; if measured wrong,
|
||||
the membrane's transport moves (decision recorded, not improvised).
|
||||
- **Context-window economics** — 1,852-style issue volumes mean the
|
||||
pipeline must multiplex (no-wait law) and local models carry routine
|
||||
units (custodian pattern).
|
||||
- **Scope creep during Wave 0** — the inventory is measured and frozen
|
||||
before design; additions go through scope amendments.
|
||||
|
||||
## 8. Rollback
|
||||
|
||||
- Every wave merges independently; master stays deployable at each
|
||||
boundary (the strangler's whole point).
|
||||
- The Python vintage remains until Wave 5 deletion gates pass; a wave
|
||||
revert = revert the merge commit (deploy qualification re-runs).
|
||||
- The scaffolding engine's Wave 1 parity replay means even the protocol's
|
||||
own replacement is reversible against recorded history.
|
||||
|
||||
## 9. Approval gate
|
||||
|
||||
This tranche does not execute until Nick approves. On approval, Wave 0
|
||||
starts immediately and runs without consent blockers (standing directive),
|
||||
with self-verified checkpoints and defect filing.
|
||||
@@ -1,196 +0,0 @@
|
||||
# Total-Rebase Inventory (R2 Wave 0.1) — measured 2026-10-04
|
||||
|
||||
Generated from `store/rebase/inventory.json` (AST function-level extraction) +
|
||||
`store/rebase/classification.json` (import/content evidence per module).
|
||||
Placement law: reactive/initiating/user-facing/network/turn-time → GO;
|
||||
deterministic/stateful/storage/cognition → RUST; Textual rendering → TUI-LAST;
|
||||
pure compute with no I/O markers defaults to the deterministic backend.
|
||||
|
||||
## Totals
|
||||
|
||||
| Side | Modules | Lines | Functions |
|
||||
|---|---|---|---|
|
||||
| GO | 43 | 19495 | 708 |
|
||||
| RUST | 93 | 36215 | 1091 |
|
||||
| TUI-LAST | 7 | 5438 | 225 |
|
||||
| TEST-INFRA | 29 | 5395 | 158 |
|
||||
| RETIRES | 2 | 93 | 9 |
|
||||
|
||||
## Per-module classification (evidence-carrying)
|
||||
|
||||
| Module | Side | Lines | Functions | Evidence |
|
||||
|---|---|---|---|---|
|
||||
| rune_tui | TUI-LAST | 4041 | 166 | textual/rich imports: ['rich', 'textual'] |
|
||||
| rune_operator | GO | 2697 | 68 | network/concurrency imports: ['threading', 'urllib']; reactive/initiating domain |
|
||||
| memory_store | RUST | 2435 | 56 | sqlite3 (storage-backed); network/concurrency imports: ['subprocess']; deterministic/state domain |
|
||||
| curator | RUST | 1838 | 43 | sqlite3 (storage-backed); network/concurrency imports: ['subprocess']; deterministic/state domain |
|
||||
| tool_executor | GO | 1812 | 47 | network/concurrency imports: ['subprocess']; reactive/initiating domain |
|
||||
| warm_router | RUST | 1536 | 36 | sqlite3 (storage-backed); network/concurrency imports: ['subprocess']; reactive/initiating domain; deterministic/state domain |
|
||||
| construction_interface | RUST | 1039 | 25 | deterministic/state domain |
|
||||
| spine | RUST | 1019 | 31 | deterministic/state domain |
|
||||
| sleep_time | RUST | 971 | 25 | sqlite3 (storage-backed); network/concurrency imports: ['subprocess', 'urllib']; deterministic/state domain |
|
||||
| construction_decision | RUST | 949 | 18 | deterministic/state domain |
|
||||
| capability_broker | RUST | 900 | 21 | deterministic/state domain |
|
||||
| hook_engine | GO | 860 | 8 | reactive/initiating domain |
|
||||
| scaffold | RUST | 854 | 31 | network/concurrency imports: ['subprocess']; deterministic/state domain |
|
||||
| local_tool_runtime | GO | 806 | 32 | network/concurrency imports: ['threading', 'urllib']; reactive/initiating domain |
|
||||
| context_broker | GO | 768 | 23 | network/concurrency imports: ['threading'] |
|
||||
| elastic_cognition | RUST | 765 | 13 | network/concurrency imports: ['urllib']; deterministic/state domain |
|
||||
| memory_consolidation | RUST | 733 | 20 | network/concurrency imports: ['subprocess']; deterministic/state domain |
|
||||
| provider_registry | GO | 666 | 28 | network/concurrency imports: ['threading', 'urllib']; reactive/initiating domain |
|
||||
| persona_gate | RUST | 661 | 21 | sqlite3 (storage-backed); network/concurrency imports: ['subprocess', 'urllib']; deterministic/state domain |
|
||||
| structural_store | RUST | 656 | 33 | deterministic/state domain |
|
||||
| contracts | RUST | 626 | 7 | deterministic/state domain |
|
||||
| adaptive_router | GO | 625 | 19 | reactive/initiating domain |
|
||||
| work_manager | GO | 591 | 25 | reactive/initiating domain |
|
||||
| abstraction | RUST | 587 | 12 | sqlite3 (storage-backed); network/concurrency imports: ['urllib']; deterministic/state domain |
|
||||
| construction_intent | RUST | 555 | 16 | deterministic/state domain |
|
||||
| canary_audit_ledger | TEST-INFRA | 540 | 2 | canary/test module |
|
||||
| safety_override | RUST | 530 | 18 | no network/reactive markers — pure compute defaults to the deterministic backend |
|
||||
| failure_auto_filer | GO | 527 | 28 | network/concurrency imports: ['threading'] |
|
||||
| build_mode | GO | 517 | 34 | network/concurrency imports: ['subprocess'] |
|
||||
| drift_core | RUST | 517 | 14 | deterministic/state domain |
|
||||
| event_wait | GO | 517 | 14 | network/concurrency imports: ['subprocess', 'urllib']; reactive/initiating domain |
|
||||
| tui_validator | TUI-LAST | 514 | 13 | tui family |
|
||||
| memory_selector | RUST | 511 | 14 | deterministic/state domain |
|
||||
| system_registry | RUST | 501 | 14 | no network/reactive markers — pure compute defaults to the deterministic backend |
|
||||
| construction_pattern | RUST | 496 | 13 | deterministic/state domain |
|
||||
| cache | GO | 492 | 17 | sqlite3 (storage-backed); network/concurrency imports: ['threading'] |
|
||||
| claim_audit | RUST | 483 | 14 | sqlite3 (storage-backed); deterministic/state domain |
|
||||
| graph_memory | RUST | 474 | 9 | sqlite3 (storage-backed); deterministic/state domain |
|
||||
| identity_anchors | RUST | 474 | 8 | deterministic/state domain |
|
||||
| model_connect | GO | 462 | 10 | network/concurrency imports: ['urllib']; reactive/initiating domain |
|
||||
| auto_tasks | GO | 460 | 14 | sqlite3 (storage-backed); network/concurrency imports: ['subprocess'] |
|
||||
| capability_fit | RUST | 455 | 14 | deterministic/state domain |
|
||||
| tool_protocol | GO | 455 | 27 | reactive/initiating domain |
|
||||
| drift_ledger | RUST | 453 | 16 | sqlite3 (storage-backed); deterministic/state domain |
|
||||
| witness | RUST | 451 | 10 | network/concurrency imports: ['urllib']; deterministic/state domain |
|
||||
| goal | RUST | 441 | 20 | network/concurrency imports: ['urllib']; deterministic/state domain |
|
||||
| release_notes | GO | 439 | 17 | network/concurrency imports: ['urllib'] |
|
||||
| cron_engine | GO | 436 | 28 | network/concurrency imports: ['subprocess', 'threading']; reactive/initiating domain |
|
||||
| model_profiles | GO | 435 | 15 | network/concurrency imports: ['urllib']; reactive/initiating domain |
|
||||
| microkernel | GO | 434 | 12 | network/concurrency imports: ['subprocess', 'threading'] |
|
||||
| model_routing | GO | 432 | 15 | network/concurrency imports: ['urllib']; reactive/initiating domain |
|
||||
| voice_hybrid | RUST | 421 | 10 | sqlite3 (storage-backed); reactive/initiating domain |
|
||||
| behavior | RUST | 407 | 9 | sqlite3 (storage-backed); deterministic/state domain |
|
||||
| token_optimizer | RUST | 407 | 23 | deterministic/state domain |
|
||||
| capability_ledger | RUST | 405 | 19 | deterministic/state domain |
|
||||
| night_mode | GO | 405 | 19 | network/concurrency imports: ['subprocess', 'threading', 'urllib'] |
|
||||
| chat_bubble | TUI-LAST | 401 | 16 | textual/rich imports: ['rich', 'textual'] |
|
||||
| growth_delta | RUST | 400 | 16 | network/concurrency imports: ['subprocess', 'urllib']; deterministic/state domain |
|
||||
| construction_mode | RUST | 395 | 5 | deterministic/state domain |
|
||||
| prompt_sync | RUST | 376 | 14 | sqlite3 (storage-backed) |
|
||||
| provider_budget | GO | 354 | 21 | network/concurrency imports: ['urllib']; reactive/initiating domain |
|
||||
| structural_model | RUST | 352 | 21 | deterministic/state domain |
|
||||
| programme_continuation | RUST | 349 | 11 | no network/reactive markers — pure compute defaults to the deterministic backend |
|
||||
| canary_rune_serve | TEST-INFRA | 329 | 13 | canary/test module |
|
||||
| builder_bridge | GO | 326 | 11 | reactive/initiating domain |
|
||||
| canary_p1_07 | TEST-INFRA | 324 | 12 | canary/test module |
|
||||
| layout_contract | RUST | 316 | 6 | deterministic/state domain |
|
||||
| message_queue | GO | 316 | 14 | reactive/initiating domain |
|
||||
| drift_observability | RUST | 315 | 9 | deterministic/state domain |
|
||||
| build_basis | RUST | 314 | 12 | no network/reactive markers — pure compute defaults to the deterministic backend |
|
||||
| canary_p0_07 | TEST-INFRA | 310 | 11 | canary/test module |
|
||||
| drift_compression | RUST | 307 | 12 | deterministic/state domain |
|
||||
| event_envelope | GO | 303 | 8 | reactive/initiating domain |
|
||||
| attention_capsule | RUST | 296 | 7 | no network/reactive markers — pure compute defaults to the deterministic backend |
|
||||
| canary_p1_01 | TEST-INFRA | 294 | 14 | canary/test module |
|
||||
| voice_sync | RUST | 293 | 10 | sqlite3 (storage-backed); reactive/initiating domain |
|
||||
| drift_cache | RUST | 292 | 16 | deterministic/state domain |
|
||||
| outcome_ledger | RUST | 286 | 8 | sqlite3 (storage-backed); deterministic/state domain |
|
||||
| time_awareness | RUST | 283 | 15 | no network/reactive markers — pure compute defaults to the deterministic backend |
|
||||
| tiered_executor | GO | 282 | 9 | network/concurrency imports: ['urllib'] |
|
||||
| stage_guards | RUST | 281 | 11 | network/concurrency imports: ['subprocess']; deterministic/state domain |
|
||||
| standardized_providers | GO | 281 | 5 | reactive/initiating domain |
|
||||
| canary_p1_06 | TEST-INFRA | 280 | 9 | canary/test module |
|
||||
| progressive_escalation | RUST | 279 | 9 | no network/reactive markers — pure compute defaults to the deterministic backend |
|
||||
| pins | RUST | 276 | 11 | deterministic/state domain |
|
||||
| canary_p1_03 | TEST-INFRA | 271 | 9 | canary/test module |
|
||||
| auto_context | GO | 270 | 8 | network/concurrency imports: ['subprocess'] |
|
||||
| task_persist | RUST | 269 | 10 | no network/reactive markers — pure compute defaults to the deterministic backend |
|
||||
| context_pressure | RUST | 262 | 9 | no network/reactive markers — pure compute defaults to the deterministic backend |
|
||||
| canary_gitea_automation | TEST-INFRA | 261 | 3 | canary/test module |
|
||||
| canary_p1_02 | TEST-INFRA | 253 | 12 | canary/test module |
|
||||
| construction_patterns_builtin | RUST | 249 | 1 | deterministic/state domain |
|
||||
| canary_full_system | TEST-INFRA | 244 | 2 | canary/test module |
|
||||
| event_bus | GO | 244 | 7 | reactive/initiating domain |
|
||||
| salience_gate | RUST | 243 | 4 | deterministic/state domain |
|
||||
| self_improve | RUST | 242 | 5 | sqlite3 (storage-backed) |
|
||||
| construction_activation | RUST | 237 | 4 | deterministic/state domain |
|
||||
| toolchain | RUST | 236 | 7 | no network/reactive markers — pure compute defaults to the deterministic backend |
|
||||
| task_gate | RUST | 235 | 8 | sqlite3 (storage-backed) |
|
||||
| core_server | GO | 234 | 13 | network/concurrency imports: ['http', 'urllib']; reactive/initiating domain |
|
||||
| audit_ledger | RUST | 231 | 8 | deterministic/state domain |
|
||||
| canary_native | TEST-INFRA | 231 | 3 | canary/test module |
|
||||
| openai_compat_transport | GO | 227 | 10 | network/concurrency imports: ['urllib']; reactive/initiating domain |
|
||||
| shard_manager | RUST | 223 | 10 | sqlite3 (storage-backed) |
|
||||
| response_adapter | RUST | 222 | 7 | no network/reactive markers — pure compute defaults to the deterministic backend |
|
||||
| evidence_probe | RUST | 212 | 9 | network/concurrency imports: ['subprocess']; deterministic/state domain |
|
||||
| model_registry | GO | 211 | 8 | reactive/initiating domain |
|
||||
| persona_definition | GO | 210 | 8 | network/concurrency imports: ['subprocess'] |
|
||||
| cognitive_budgeter | RUST | 208 | 3 | deterministic/state domain |
|
||||
| canary_p0_04 | TEST-INFRA | 207 | 8 | canary/test module |
|
||||
| forge_client | GO | 203 | 19 | network/concurrency imports: ['urllib']; reactive/initiating domain |
|
||||
| dependency_tracker | RUST | 202 | 5 | no network/reactive markers — pure compute defaults to the deterministic backend |
|
||||
| canary_context_broker | TEST-INFRA | 199 | 10 | canary/test module |
|
||||
| canary_p0_05 | TEST-INFRA | 199 | 16 | canary/test module |
|
||||
| testing_mode | RUST | 196 | 13 | no network/reactive markers — pure compute defaults to the deterministic backend |
|
||||
| parallel_processor | GO | 194 | 17 | network/concurrency imports: ['threading'] |
|
||||
| canary_spine_meta | TEST-INFRA | 192 | 7 | canary/test module |
|
||||
| iteration | RUST | 190 | 8 | no network/reactive markers — pure compute defaults to the deterministic backend |
|
||||
| verification_layer | RUST | 189 | 12 | deterministic/state domain |
|
||||
| subconscious_pass | RUST | 187 | 6 | deterministic/state domain |
|
||||
| ffi_query_memory_smoke | RUST | 182 | 5 | deterministic/state domain |
|
||||
| tier_manager | RUST | 182 | 9 | deterministic/state domain |
|
||||
| canary_tui_transport | TEST-INFRA | 174 | 7 | canary/test module |
|
||||
| behaviour_ledger | RUST | 173 | 13 | deterministic/state domain |
|
||||
| construction_commands | RUST | 173 | 4 | deterministic/state domain |
|
||||
| canary_tui_drift | TEST-INFRA | 170 | 2 | canary/test module |
|
||||
| intent_continuity | RUST | 168 | 11 | no network/reactive markers — pure compute defaults to the deterministic backend |
|
||||
| rune_profiler | RUST | 165 | 3 | no network/reactive markers — pure compute defaults to the deterministic backend |
|
||||
| inference_trace | RUST | 164 | 6 | no network/reactive markers — pure compute defaults to the deterministic backend |
|
||||
| ms_loader | RUST | 163 | 16 | no network/reactive markers — pure compute defaults to the deterministic backend |
|
||||
| subsystem_health | GO | 163 | 8 | network/concurrency imports: ['threading'] |
|
||||
| recall_router | GO | 162 | 3 | reactive/initiating domain |
|
||||
| voicebox | GO | 161 | 11 | network/concurrency imports: ['subprocess']; reactive/initiating domain |
|
||||
| canary_gitea_pipeline | TEST-INFRA | 159 | 2 | canary/test module |
|
||||
| forge | GO | 146 | 12 | network/concurrency imports: ['subprocess', 'urllib'] |
|
||||
| rune_graphic | TUI-LAST | 145 | 5 | textual/rich imports: ['rich'] |
|
||||
| connection_pool | GO | 144 | 9 | sqlite3 (storage-backed); network/concurrency imports: ['threading'] |
|
||||
| recall_uplift | RUST | 141 | 1 | sqlite3 (storage-backed) |
|
||||
| project_registry | RUST | 139 | 12 | no network/reactive markers — pure compute defaults to the deterministic backend |
|
||||
| construction_depth | RUST | 138 | 2 | deterministic/state domain |
|
||||
| voice_injector | GO | 138 | 5 | reactive/initiating domain |
|
||||
| canary_rune_entry | TEST-INFRA | 137 | 3 | canary/test module |
|
||||
| construction_projection | RUST | 135 | 3 | deterministic/state domain |
|
||||
| rune_spinner | RUST | 130 | 5 | no network/reactive markers — pure compute defaults to the deterministic backend |
|
||||
| tui_backlog | TUI-LAST | 125 | 5 | tui family |
|
||||
| warm_neuron_store | RUST | 122 | 6 | sqlite3 (storage-backed); deterministic/state domain |
|
||||
| drift_resume | RUST | 118 | 3 | deterministic/state domain |
|
||||
| wait_guard | RUST | 116 | 1 | no network/reactive markers — pure compute defaults to the deterministic backend |
|
||||
| canary_conversation_state | TEST-INFRA | 115 | 2 | canary/test module |
|
||||
| canary_query_memory | TEST-INFRA | 110 | 2 | canary/test module |
|
||||
| failure_recovery | RUST | 108 | 1 | no network/reactive markers — pure compute defaults to the deterministic backend |
|
||||
| graph_projection | RUST | 108 | 5 | deterministic/state domain |
|
||||
| tui_transport | TUI-LAST | 108 | 12 | tui family |
|
||||
| spine_loader | RUST | 105 | 7 | deterministic/state domain |
|
||||
| canary_unbounded | TEST-INFRA | 104 | 2 | canary/test module |
|
||||
| message_widgets | TUI-LAST | 104 | 8 | textual/rich imports: ['rich', 'textual'] |
|
||||
| cs_loader | RUST | 90 | 5 | no network/reactive markers — pure compute defaults to the deterministic backend |
|
||||
| tc_loader | RUST | 88 | 5 | no network/reactive markers — pure compute defaults to the deterministic backend |
|
||||
| canary_schema_migration | TEST-INFRA | 86 | 1 | canary/test module |
|
||||
| programme_gates | RUST | 85 | 6 | no network/reactive markers — pure compute defaults to the deterministic backend |
|
||||
| structural_migration | RUST | 77 | 4 | deterministic/state domain |
|
||||
| memory_env | RETIRES | 72 | 8 | bootstrap glue subsumed by the Go runtime env contract |
|
||||
| impact_preview | RUST | 69 | 2 | no network/reactive markers — pure compute defaults to the deterministic backend |
|
||||
| provider_context | GO | 48 | 1 | reactive/initiating domain |
|
||||
| wait_guard_corpus | RUST | 46 | 0 | no network/reactive markers — pure compute defaults to the deterministic backend |
|
||||
| canary_cognitive_strata | TEST-INFRA | 44 | 1 | canary/test module |
|
||||
| builder_bridge_cli | GO | 42 | 1 | reactive/initiating domain |
|
||||
| route_risk_flags | RUST | 37 | 1 | no network/reactive markers — pure compute defaults to the deterministic backend |
|
||||
| canary_memory_synthesis | TEST-INFRA | 33 | 1 | canary/test module |
|
||||
| canary_resource_authority | TEST-INFRA | 33 | 1 | canary/test module |
|
||||
| canary_surface_parity | TEST-INFRA | 33 | 1 | canary/test module |
|
||||
| canary_orchestration_foundation | TEST-INFRA | 32 | 1 | canary/test module |
|
||||
| canary_gitea_delegation | TEST-INFRA | 31 | 1 | canary/test module |
|
||||
| __main__ | RETIRES | 21 | 1 | bootstrap glue subsumed by the Go runtime env contract |
|
||||
+1
-2
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
||||
|
||||
[project]
|
||||
name = "rune"
|
||||
version = "0.99.5"
|
||||
version = "0.87.5"
|
||||
description = "Rune — a stateful coding assistant with persistent memory, orchestration, and TUI"
|
||||
requires-python = ">=3.10"
|
||||
|
||||
@@ -16,7 +16,6 @@ dependencies = [
|
||||
"aiohttp>=3.9.0",
|
||||
"websockets>=12.0",
|
||||
"psutil>=5.9.0",
|
||||
"pillow>=10.0",
|
||||
"pyyaml>=6.0",
|
||||
]
|
||||
|
||||
|
||||
+1
-5
@@ -29,10 +29,6 @@
|
||||
"**/__pycache__"
|
||||
],
|
||||
"extraPaths": [
|
||||
"scripts",
|
||||
"src/rune",
|
||||
"shared",
|
||||
"src/rust/evidence_provenance",
|
||||
"src/rust/query_memory"
|
||||
"scripts"
|
||||
]
|
||||
}
|
||||
+9
-11
@@ -1,8 +1,8 @@
|
||||
# This file was autogenerated by uv via the following command:
|
||||
# uv pip compile pyproject.toml -o requirements-ci.txt --extra dev --extra memory --python-version 3.11
|
||||
# uv pip compile pyproject.toml -o /tmp/req_new.txt --extra dev --extra memory --python-version 3.11
|
||||
aiohappyeyeballs==2.7.1
|
||||
# via aiohttp
|
||||
aiohttp==3.14.4
|
||||
aiohttp==3.14.3
|
||||
# via rune (pyproject.toml)
|
||||
aiosignal==1.4.0
|
||||
# via aiohttp
|
||||
@@ -18,9 +18,9 @@ certifi==2026.7.22
|
||||
# httpx
|
||||
chardet==7.6.0
|
||||
# via diff-cover
|
||||
coverage==7.16.2
|
||||
coverage==7.16.1
|
||||
# via rune (pyproject.toml)
|
||||
diff-cover==10.6.0
|
||||
diff-cover==10.5.1
|
||||
# via rune (pyproject.toml)
|
||||
frozenlist==1.8.0
|
||||
# via
|
||||
@@ -50,23 +50,21 @@ markdown-it-py==4.2.0
|
||||
# mdit-py-plugins
|
||||
# rich
|
||||
# textual
|
||||
markupsafe==3.0.4
|
||||
markupsafe==3.0.3
|
||||
# via jinja2
|
||||
mdit-py-plugins==0.6.1
|
||||
# via textual
|
||||
mdurl==0.1.2
|
||||
# via markdown-it-py
|
||||
multidict==6.9.1
|
||||
multidict==6.9.0
|
||||
# via
|
||||
# aiohttp
|
||||
# yarl
|
||||
nodeenv==1.11.0
|
||||
nodeenv==1.10.0
|
||||
# via pyright
|
||||
packaging==26.3
|
||||
# via pytest
|
||||
pillow==12.3.0
|
||||
# via rune (pyproject.toml)
|
||||
platformdirs==4.12.3
|
||||
platformdirs==4.11.11
|
||||
# via textual
|
||||
pluggy==1.6.0
|
||||
# via
|
||||
@@ -118,7 +116,7 @@ typing-extensions==4.16.0
|
||||
# pyright
|
||||
# textual
|
||||
# textual-autocomplete
|
||||
websockets==17.2
|
||||
websockets==17.1
|
||||
# via rune (pyproject.toml)
|
||||
yarl==1.25.1
|
||||
# via aiohttp
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,47 @@
|
||||
# 00 — ISSUE SCOPE (#376 R1)
|
||||
|
||||
## Core question
|
||||
What does Complementary Learning Systems (CLS) actually establish about fast episodic acquisition, slower generalization, consolidation, replay, schemas, interference, reconsolidation, and retention — and which of those mechanisms should or should not inform Rune's Memory architecture?
|
||||
|
||||
## Subquestions
|
||||
1. What did the original CLS theory actually claim?
|
||||
2. Which claims were empirical vs computational/theoretical?
|
||||
3. What has changed since the original theory?
|
||||
4. Which mechanisms survived later evidence?
|
||||
5. Which were weakened or substantially revised?
|
||||
6. How does schema learning change "fast vs slow"?
|
||||
7. What is known about replay selection?
|
||||
8. What is known about destructive interference?
|
||||
9. What is known about memory transformation during consolidation?
|
||||
10. What is known about reconsolidation?
|
||||
11. Does consolidation necessarily imply transformation?
|
||||
12. When is rapid integration possible?
|
||||
13. What evidence exists against a simple dual-store interpretation?
|
||||
14. What competing theories explain the same observations?
|
||||
15. What parts are biological constraints rather than general learning principles?
|
||||
16. Which properties transfer to software agents?
|
||||
17. Which do NOT transfer?
|
||||
18. Does Rune already implement analogous behavior?
|
||||
19. What would materially alter Rune's target architecture?
|
||||
20. What remains experimental?
|
||||
|
||||
## Hypotheses under test (from R0, NOT accepted)
|
||||
H1: fast exact episodic storage + slow generalized knowledge is the right Rune split.
|
||||
H2: two stores / two writers is the software form.
|
||||
H3: schema-gated fast consolidation is justified.
|
||||
H4: consolidation should be utility-prioritized, not recency-based.
|
||||
H5: covering episodes must be retained after generalization.
|
||||
H6: reconsolidation has a software analogue in supersession.
|
||||
H7: independent-evidence corroboration should gate promotion.
|
||||
H8: destructive consolidation must be rejected (append-only).
|
||||
H9: evidence→episode→observation→belief→procedure is the right progression.
|
||||
|
||||
## Falsifiers
|
||||
- F1: If deeper evidence shows no useful fast/slow separation outside biological constraints, the CLS architectural analogy is weakened or rejected.
|
||||
- F2: If schema-rapid-integration findings fail replication or are explained by simpler mechanisms, H3 falls.
|
||||
- F3: If replay prioritization evidence is task-specific (rodent navigation) with no general principle, H4 weakens to speculation.
|
||||
- F4: If reconsolidation's boundary conditions prove so biological that no software analogue preserves the useful property, H6 falls.
|
||||
- F5: If retained-episodes practice has no measured benefit in AI systems (consolidation without retention works as well), H5 is a preference, not a requirement.
|
||||
|
||||
## Stopping criterion
|
||||
Evidence saturation: new sources repeat known mechanisms/criticisms, add only detail.
|
||||
@@ -0,0 +1,32 @@
|
||||
# 01 — INWARD: Current Rune reality (evidence-first)
|
||||
|
||||
_Evidence hierarchy: observed runtime > persisted canonical state > independent tests > source existence > design docs. Sources: T0 gates, T0.1 reconciliation, R0 artifact, direct store inspection (this tranche, read-only)._
|
||||
|
||||
## What Rune already does (PROVEN, T0/T0.1)
|
||||
- **Fast exact capture:** every entry append-only with created_at; dedupe/supersede gate with receipts (T0 PROVEN_PRESENT). 924 canonical entries; supersession preserves prior rows (56 superseded retained).
|
||||
- **Slow derived layer:** knowledge.json consolidation (PROVEN to run; single inspectable writer `memory_consolidation.py`); source-attributed (memory/abstraction/neuron/graph provenance counts in T0 map).
|
||||
- **Trust lifecycle:** provisional/validated/locked + HMAC audit ledger (PROVEN — but T0.1: trust does NOT gate retrieval today).
|
||||
- **Dual-write discipline:** episodic writes synchronous via `memory_store.py add_entry`; consolidation runs offline. Two writers exist structurally (agent path vs consolidation path).
|
||||
- **Failure learning:** wash_count/use history, promotion_eligible flag (PROVEN fields; promotion gate semantics = design, not exercised at scale).
|
||||
|
||||
## What is DESIGNED but not proven
|
||||
- `derived_from` links: ABSENT (T0.1/M: "what depended on X" unanswerable).
|
||||
- Utility-prioritized or schema-gated consolidation: ABSENT (consolidation = full sweep; trigger non-deterministic — T0.1 R5: no cron/timer exists, agent-invoked).
|
||||
- Reconsolidation loop: ABSENT (locked is terminal; retrieved beliefs are not re-litigated).
|
||||
- Case layer (episode→case→procedure): ABSENT.
|
||||
- Independent-evidence corroboration test: ABSENT (promotion_eligible driven by wash_count = frequency, not independence).
|
||||
|
||||
## What is BROKEN/DORMANT
|
||||
- Sleep-time transcript mining: BROKEN (stale DB path, T0).
|
||||
- Warm tier: vestigial (all 924 rows tier='warm'; T0.1 R4).
|
||||
- Graph projection: dormant (last edge 2026-08-26).
|
||||
- 439/838 active entries unindexed (embedder silent failure — T0.1 R3): the fast layer itself is LEAKY.
|
||||
|
||||
## R0 CLS claims (to reconcile, not accept)
|
||||
R0 (families/complementary_learning_systems.md) claimed CLS supports: H1-H9 above, classifications COVERED (two-store split), ADAPT (utility qualification, shadow-mode, schema fast-path, reconsolidation loop, utility-prioritized consolidation), REJECT (recency-based priority, destructive consolidation). T1-impact flag: YES (three missing mechanisms).
|
||||
|
||||
## Where R0 made implementation leaps
|
||||
1. R0 said "utility (retrieved-and-used count)" as qualification signal — but Rune's wash_count IS a retrieved-use count and T0 evidence shows it was never validated as a quality signal (it's frequency, gameable, and the T0.1 store shows superseded entries with high wash counts).
|
||||
2. R0's "schema-gated fast path" assumed schema detection is tractable — no Rune mechanism for schema-matching exists (abstraction.db has 59 facts; no matching machinery).
|
||||
3. R0's reconsolidation analogue assumed retrieval-triggered lability maps to supersession — but Rune supersession is write-triggered, not retrieval-triggered; the mapping was asserted, not derived.
|
||||
4. R0 did not distinguish which CLS claims are empirical vs computational assumptions (e.g. d≈0.5 decay is a fit parameter, not a law).
|
||||
@@ -0,0 +1,6 @@
|
||||
# 02 — OUTWARD (populated by the deep-research actor; verified by controller)
|
||||
|
||||
Files: historical_foundations.md, modern_cls.md, consolidation_and_replay.md,
|
||||
schema_learning.md, reconsolidation.md, interference_and_forgetting.md,
|
||||
competing_models.md, criticism_and_limitations.md, software_and_ai_analogues.md
|
||||
+ sources.md (ledger) + claims.json (machine-readable).
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
# Competing theories (researched from critics, not just CLS advocates)
|
||||
|
||||
- **MTT vs standard consolidation** (Nadel & Moscovitch 1997/2000 vs Squire & Alvarez 1995): retrograde amnesia gradients exist in BOTH directions depending on lesion/method; meta-analyses of patient data show inconsistent gradient temporality. Status: genuinely UNRESOLVED.
|
||||
- **Hippocampal indexing vs store-and-transfer:** Teyler & Rudy 2007 (DOI 10.1002/hipo.20350); Ryan/Tonegawa 2015 engram work (DOI 10.1126/science.aaa5542) favors trace-persistence + retrieval-dependence over physical transfer. 2025 reassessment preprint exists (Authorea).
|
||||
- **Consolidation skeptics / old-memory hippocampal engagement:** Nadel, Hupbach, Gomez & Newman-Smith 2012 (Neurosci Biobehav Rev) — hippocampus remains active for remote memories; Bontempi et al. 1999 (J Neurosci); Frankland et al. 2004, Science 304. DOI 10.1126/science.1094804 — remote memories shift cortical systems (ACC) but hippocampal damage still disrupts DETAILED remote recall; Squire camp counters deficits reflect detail/quality not necessity (Squire, Genzel, Wixted & Morris 2015, CSH Perspect Biol). **This is the field's fault line on transformation-vs-retention.**
|
||||
- **Trace Transformation Theory:** R0's "Winsneski/Bhatt" DOES NOT EXIST. Verified anchors: Moscovitch & Gilboa 2021 preprint (OSF, DOI 10.31234/osf.io/yxbrs) + Sekeres/Winocur/Moscovitch 2018.
|
||||
- **Bayesian/latent-cause:** Gershman, Blei & Niv 2010, Psych Review 117:197 — reconsolidation/extinction phenomena emerge from latent-cause inference; reconsolidation = belief-updating special case. This is the strongest competing FRAMEWORK for Rune: it explains the same data without a biological consolidation story.
|
||||
- **CLS v2 (McClelland et al. 2020)** absorbs schema effects and responds to MTT — the live theoretical front.
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
# Consolidation & replay
|
||||
|
||||
**Foster & Wilson 2006, Nature 440:680. DOI 10.1038/nature04587.** Reverse replay of behavioral sequences in awake hippocampal place cells.
|
||||
|
||||
**Carr, Jadhav & Frank 2011, Nat Neurosci 14:147. DOI 10.1038/nn.2732.** Awake replay serves BOTH retrieval and consolidation — unresolved dual role.
|
||||
|
||||
**Ambrose, Pfeiffer & Foster 2016, Neuron 91:1342. DOI 10.1016/j.neuron.2016.07.047.** Awake reverse replay gated by changing reward — precursor evidence for prioritization.
|
||||
|
||||
**Mattar & Daw 2018, Nat Neurosci 21:1609. DOI 10.1038/s41593-018-0232-z.** Computational model: replay prioritized by EXPECTED FUTURE UTILITY (gain = value of replaying; need = state relevance), NOT recency; replays benefit FUTURE learning. Makes replay prospective/selective — biological analog of prioritized experience replay, and a direct constraint on CLS's replay-as-teacher loop.
|
||||
|
||||
**Tanrıverdi et al. 2023, J Cogn Neurosci. DOI 10.1162/jocn_a_02021.** In humans, MORE awake hippocampal-cortical co-reactivation predicted MORE forgetting of details — co-reactivation may reorganize/gist-ify rather than preserve.
|
||||
|
||||
**Method validity caveat:** "Evaluating hippocampal replay without a ground truth" (eLife 2023, DOI 10.7554/eLife.85635.sa0) + 2024 dopamine-signaling exchange (eLife): replay DECODING methods still contested — treat specific replay-content claims as method-dependent.
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
# Negative evidence / limitations
|
||||
|
||||
1. **Fenn et al. 2009** (DOI 10.1101/lm.1500808): sleep REDUCED false memories — direct counter-result to Payne 2009. The gist-consolidation direction is not settled.
|
||||
2. **Tanrıverdi et al. 2023** (DOI 10.1162/jocn_a_02021): replay-like co-reactivation associated with FORGETTING — consolidation-as-helping is not monotone.
|
||||
3. **RIF reliability** (European Psychologist 2011, DOI 10.1027/1016-9040/a000040; Frontiers 2014, DOI 10.3389/fpsyg.2014.01343; Camp/Pecher/Schmidt 2007 cue-independent tests): effect size unstable across labs/cues; inhibition interpretation often fails.
|
||||
4. **Reconsolidation human failures:** prediction-error boundary (Sevenster/Kindt) means many "reactivation" protocols fail to destabilize — numerous human nulls (Exton-McGuinness & Reichelt review).
|
||||
5. **Sharon/Moscovitch/Gilboa 2011** (PNAS, DOI 10.1073/pnas.1005238108): rapid acquisition of arbitrary associations WITHOUT hippocampus — counterevidence to strict hippocampal necessity for fast learning.
|
||||
6. **Ryan/Tonegawa engram line** (DOI 10.1126/science.aaa5542): retrograde amnesia without trace loss — behavioral "forgetting after consolidation disruption" can be RETRIEVAL failure, not trace destruction; weakens lesion-based consolidation arguments in BOTH directions.
|
||||
7. **Hoffman et al. 2024, Memory & Cognition. DOI 10.3758/s13421-024-01576-x:** "Awake targeted memory reactivation doesn't work" — a named negative result.
|
||||
8. **Two R0-brief references do not exist** (McClelland/Whyte 1994; Winsneski/Bhatt) — flagged and excluded (see sources.md).
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
# Historical foundations (API-verified citations)
|
||||
|
||||
**McClelland, McNaughton & O'Reilly 1995, "Why there are complementary learning systems in the hippocampus and neocortex," Psych Review 102(3):419-457. DOI 10.1037/0033-295X.102.3.419.**
|
||||
Claims verified: (1) catastrophic interference in backprop-style networks — new arbitrary associations sharing representations destroy old ones; (2) forces slow, interleaved, small-step statistical learning in neocortex; (3) structurally separate hippocampus with sparse representations provides fast episodic learning and later acts as TEACHER via replay; (4) episodes become neocortical gist. Computational assumptions: hippocampal sparseness (pattern separation), neocortical overlap (generalization), replay-driven consolidation.
|
||||
NOTE: the "McClelland/McNaughton/Whyte 1994 bitter-tracing paper" from the R0 brief DOES NOT EXIST (Crossref/OpenAlex/arXiv searched) — likely conflation of the 1995 review with animal rapid-learning studies. Flagged; excluded from ledger.
|
||||
|
||||
**Squire 1992 (Archives of Neurology); Squire & Alvarez 1995 (Curr Opin Neurobiol).** Declarative-memory background; hippocampal involvement TEMPORARY; systems consolidation = neocortex gradually sufficient. This is the position CLS inherits — and the main target of MTT critics.
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
# Interference / forgetting / generalization hazards
|
||||
|
||||
**McCloskey & Cohen 1989 (Psychol Learn Motiv 24:109); Ratcliff 1990 (JEP:General 119:195).** Catastrophic interference — the motivating phenomenon for CLS; robust in simulation.
|
||||
|
||||
**O'Reilly & Norman 2002, TiCS 6. DOI 10.1016/s1364-6613(02)02005-3; Norman & O'Reilly 2003, Psych Review 109. DOI 10.1037/0033-295x.110.4.611.** REC model: hippocampal pattern SEPARATION (prevents interference/false memories) vs pattern COMPLETION (retrieval); computational trade-off explains age-related and amnesic distortions. Robust computationally; hippocampal-subfield fMRI support (Lacy/Yassa/Stark line, e.g. 2011 Learn Mem, DOI 10.1101/lm.1971111).
|
||||
|
||||
**False memories via gist:** Payne et al. 2009, Neurobiol Learn Mem. DOI 10.1016/j.nlm.2009.03.007 — sleep INCREASED DRM false memory (gist consolidation). **BUT Fenn et al. 2009, Learn Mem. DOI 10.1101/lm.1500808 found the OPPOSITE** (sleep reduced false memories). Flag: the gist-consolidation claim is directly contested at the effect level. Ledger records the PAIR.
|
||||
|
||||
**Retrieval-induced forgetting:** Anderson, Bjork & Bjork 1994, JEP:LMC 20:1063. DOI 10.1037/0278-7393.20.5.1063. Meta-analytically real on average — Murayama et al. 2014, Psych Bull. DOI 10.1037/a0037505 — but strong cue-dependence; the INHIBITION interpretation contested (interference accounts; Raaijmakers-school critiques); reliability concerns documented (European Psychologist 2011, DOI 10.1027/1016-9040/a000040; Frontiers in Psychology 2014, DOI 10.3389/fpsyg.2014.01343). Effect real; mechanism and cross-lab reliability of the inhibitory version unsettled.
|
||||
@@ -0,0 +1,13 @@
|
||||
# Modern CLS (CLS v1 → v2)
|
||||
|
||||
**Nadel & Moscovitch 1997 (Hippocampus 7:217); Nadel et al. 2000 (Psych Review 107:66).** MTT: each retrieval creates a new hippocampal trace; episodic memories stay hippocampus-dependent FOREVER; only semanticized gist becomes neocortex-dependent. Direct challenge to standard consolidation and CLS's teacher-transfer picture.
|
||||
|
||||
**Teyler & DiScenna 1986; Teyler & Rudy 2007 (Hippocampus, DOI 10.1002/hipo.20350).** Hippocampal indexing theory: hippocampus stores an INDEX only; cortical representations reinstated at retrieval — consolidation is index elaboration, not trace transfer.
|
||||
|
||||
**Ryan, Roy, Pignatelli, Arons & Tonegawa 2015, Science 348:1007. DOI 10.1126/science.aaa5542.** Optogenetic reactivation of hippocampal engram cells rescued memory expression after anisomycin-induced amnesia; silent engrams later matured (Roy et al. 2017 PNAS, DOI 10.1073/pnas.1714248114). Bearing: dissociates trace STORAGE from trace RETRIEVAL — amnesia is often retrieval failure, undermining simple "consolidation = strengthening" readings used by BOTH CLS and its critics.
|
||||
|
||||
**Winocur & Moscovitch 2011 (JINS 17:766); Sekeres et al. 2018 (Hippocampus).** Transformation hypothesis: remote memories are TRANSFORMED (episodic→semantic; vivid→schematic), not copied.
|
||||
|
||||
**Kumaran, Hassabis & McClelland 2016, TiCS 20(7). DOI 10.1016/j.tics.2016.05.004.** CLS updated: rapid neocortical integration via schema-consistency, episodic control, deep-learning interpretation; explicitly reconciles Tse findings with CLS. Robust as framework paper; each added claim inherits its own evidence base.
|
||||
|
||||
**McClelland, McNaughton & Lampinen 2020, Phil Trans R Soc B 375. DOI 10.1098/rstb.2019.0637.** CLS v2: schema consistency, replay gating, explicit MTT responses.
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
# Reconsolidation
|
||||
|
||||
**Nader, Schafe & LeDoux 2000, Nature 406:722. DOI 10.1038/35021052.** Anisomycin in lateral amygdala after retrieval blocks subsequent expression of an already-consolidated fear memory — consolidated memories re-enter a labile state. Method: Pavlovian fear conditioning + post-reactivation infusion.
|
||||
|
||||
**Tronson & Taylor 2007, Nat Rev Neurosci 8. DOI 10.1038/nrn2090.** Canonical review: successful replications across tasks/species AND wildly heterogeneous boundary conditions.
|
||||
|
||||
**Boundary conditions (the crucial ledger part):** Sevenster, Beckers & Kindt 2014, Learn Mem 21. DOI 10.1101/lm.035493.114 — destabilization requires sufficient PREDICTION ERROR (violated expectation); a mere reminder does not. Exton-McGuinness, Lee & Reichelt 2015 (Neurosci Biobehav Rev, DOI 10.1016/j.bbr.2014.10.011) + Lee 2009 (Trends Neurosci): memory strength and age limit labilization (weak/very old memories resist).
|
||||
|
||||
**Framing:** reconsolidation is best understood as UPDATING WITH A GATE (prediction error), not automatic restabilization. Whether it differs from ordinary updating only in timing: UNRESOLVED. Replication: rodent amygdala robust; human literature mixed (benzodiazepine/propranolol inconsistencies).
|
||||
|
||||
**Adversarial canon (see 05_adversarial.md):** Rudy et al. 2006 (Learn Mem 13:1-3, anisomycin non-specificity); Lattal & Abel 2004 (PNAS 101:4667, deficits REVERSE with time = retrieval failure); Morris et al. 2006 (Neuron 50:479, nonspecific effects). Nader & Hardt 2009 (Nat Rev Neurosci 10:224-234) is the PRO case — the phenomenon requires a "case for" paper.
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
# Schema learning
|
||||
|
||||
**Tse et al. 2007, Science 313:76 (neuroscience pages 1130-1133 of that issue). DOI 10.1126/science.1135935.** Rats: flavor-place paired associates over weeks; schema-CONSISTENT new pairs learned in one trial and became hippocampal-lesion-insensitive (neocortical immediate-early gene markers); schema-INCONSISTENT pairs needed weeks + hippocampal replay. Strongest single result for schema-gated rapid integration — the finding that forced McClelland to revise CLS.
|
||||
|
||||
**Tse et al. 2011, Science 333:891. DOI 10.1126/science.1205274.** Immediate-early gene activation in neocortex for schema-consistent encoding.
|
||||
|
||||
**McClelland 2013, JEP:General 142(4):1190. DOI 10.1037/a0033812.** Principled CLS revision: schema consistency permits small neocortical weight changes that don't cross interference thresholds.
|
||||
|
||||
**Replication status:** core effect replicated in Morris lab (2010/2011); human echo: Audrain & McAndrews 2022, Nature Communications. DOI 10.1038/s41467-022-33517-0 (fMRI scaffold-for-integration). BUT the neocortex-alone/hippocampal-independence interpretation is CONTESTED: Sharon, Moscovitch & Gilboa 2011, PNAS 108:17263-17268. DOI 10.1073/pnas.1005238108 (rapid arbitrary associates WITHOUT hippocampus); hippocampal damage still slows many rapid-learning tasks (Warren, Duff & Cohen line — "Fast mappers, slow learners," Cognitive Neuroscience 2019, DOI 10.1080/17588928.2019.1593120). Consolidation skeptics note schema effects may reflect inferential/RETRIEVAL processes rather than consolidation speed.
|
||||
NOTE: the R0-brief "Warren et al. 2020-2021 schema replication" is UNVERIFIED — nearest verified Warren items are 2019 Cognitive Neuroscience and 2014 hippocampus/word-learning work.
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
# Software / AI analogues
|
||||
|
||||
**Schaul, Quan, Antonoglou & Silver 2016, "Prioritized Experience Replay," ICLR (arXiv 1511.05952).** TD-error-prioritized sampling beats uniform on 41/49 Atari games. Relationship to Mattar & Daw: Schaul's priority ≈ "gain" (prediction error); Mattar-Daw adds "need" (utility). Caveats from adversarial pass: PER needs importance-sampling correction; Fedus et al. ICML 2020 (arXiv 2007.06700) — uniform replay often MATCHES PER, freshness dominates; Song & Qian 2024 (Sci Rep 53117) — single-criterion prioritization unstable.
|
||||
|
||||
**Shin et al. 2017, "Continual Learning with Deep Generative Replay," NeurIPS (arXiv 1705.08690).** Generative replay mitigates catastrophic forgetting — direct computational CLS instantiation.
|
||||
|
||||
**Blundell et al. 2016 (arXiv 1606.04460); Pritzel et al. 2017, "Neural Episodic Control" (arXiv 1703.01988).** Semi-tabular episodic buffers give one-shot value updates — the FAST system as the missing piece of slow-gradient deep RL. Validated as engineering lever.
|
||||
|
||||
**Kauvar et al. 2023, "Curious Replay for Model-based Adaptation," ICML (arXiv 2306.15934).** Curiosity-prioritized replay for world models — direct translational echo of Mattar-Daw.
|
||||
|
||||
**Kumaran, Summerfield, Hassabis & Botvinick 2016, Neuron 92** (Neuroscience-Inspired AI program statement); **Marblestone, Wayne & Kording 2016, Front Comput Neurosci** (constructive critique: biological plausibility gaps).
|
||||
|
||||
**Kumaran, Hassabis & McClelland 2016, TiCS** — the pro-CLS-for-agents anchor the adversarial side must answer; De Lange et al. 2021 (IEEE TPAMI) establishes catastrophic interference as REAL in ML — CLS's distinctive content transfers as interference management.
|
||||
|
||||
Bearing: in ML, fast/slow split and replay prioritization are VALIDATED AS ENGINEERING LEVERS; the contested part is whether biological replay does what the algorithms assume.
|
||||
@@ -0,0 +1,77 @@
|
||||
# Sources Ledger (#376 R1)
|
||||
|
||||
_Format: source_id | citation | DOI/arXiv | peer-reviewed | primary/secondary | read depth | bearing. All "(verified)" DOIs were confirmed via Crossref/OpenAlex/arXiv APIs during the outward pass._
|
||||
|
||||
## Foundations
|
||||
- S001 | McClelland, McNaughton & O'Reilly 1995, Psych Review 102(3):419-457 | 10.1037/0033-295X.102.3.419 | yes | primary (theory) | RELEVANT_SECTIONS | canonical fast/slow split; catastrophic-interference motivation
|
||||
- S002 | Squire 1992, Archives of Neurology; Squire & Alvarez 1995, Curr Opin Neurobiol | — | yes | primary | RELEVANT_SECTIONS | standard-consolidation position CLS inherits
|
||||
- X001 | "McClelland/McNaughton/Whyte 1994 bitter-tracing" | NOT FOUND in Crossref/OpenAlex/arXiv | — | — | — | UNVERIFIABLE — excluded from ledger
|
||||
|
||||
## Schema learning
|
||||
- S003 | Tse et al. 2007, Science 313:1130-1133 | 10.1126/science.1135935 | yes | primary | RELEVANT_SECTIONS | schema-gated rapid integration (rats)
|
||||
- S004 | Tse et al. 2011, Science 333:891 | 10.1126/science.1205274 | yes | primary | ABSTRACT/SECTIONS | neocortical gene activation
|
||||
- S005 | McClelland 2013, JEP:General 142(4):1190 | 10.1037/a0033812 | yes | primary (theory) | RELEVANT_SECTIONS | CLS schema revision
|
||||
- S006 | Audrain & McAndrews 2022, Nature Communications | 10.1038/s41467-022-33517-0 | yes | primary | ABSTRACT | human fMRI echo
|
||||
- S007 | Sharon, Moscovitch & Gilboa 2011, PNAS 108:17263-17268 | 10.1073/pnas.1005238108 | yes | primary | RELEVANT_SECTIONS | rapid learning WITHOUT hippocampus
|
||||
- S008 | Warren & Duff 2014, Hippocampus 24(8):920-932; Warren et al. 2014, J Neurosci 34(22); Warren et al. 2019, Cognitive Neuroscience | 10.1080/17588928.2019.1593120 | yes | primary | ABSTRACT/SECTIONS | amnesic fast-mapping failures; vmPFC schema locus
|
||||
- X002 | "Warren et al. 2020-2021 schema replication" | NOT FOUND as named | — | — | — | UNVERIFIABLE — nearest verified items listed above
|
||||
|
||||
## Replay
|
||||
- S009 | Foster & Wilson 2006, Nature 440:680 | 10.1038/nature04587 | yes | primary | ABSTRACT | reverse replay discovery
|
||||
- S010 | Carr, Jadhav & Frank 2011, Nat Neurosci 14:147 | 10.1038/nn.2732 | yes | review/primary | RELEVANT_SECTIONS | dual retrieval/consolidation role
|
||||
- S011 | Ambrose, Pfeiffer & Foster 2016, Neuron 91:1342 | 10.1016/j.neuron.2016.07.047 | yes | primary | ABSTRACT | reward-gated replay
|
||||
- S012 | Mattar & Daw 2018, Nat Neurosci 21:1609 | 10.1038/s41593-018-0232-z | yes | primary (model) | RELEVANT_SECTIONS | utility-prioritized replay (gain+need)
|
||||
- S013 | Tanrıverdi et al. 2023, J Cogn Neurosci | 10.1162/jocn_a_02021 | yes | primary | RELEVANT_SECTIONS | co-reactivation ↔ FORGETTING
|
||||
- S014 | eLife 2023 ground-truth evaluation + 2024 dopamine exchange | 10.7554/eLife.85635.sa0 | yes | editorial/primary | ABSTRACT | replay-decoding methods contested
|
||||
|
||||
## Reconsolidation
|
||||
- S015 | Nader, Schafe & LeDoux 2000, Nature 406:722 | 10.1038/35021052 | yes | primary | RELEVANT_SECTIONS | reconsolidation anchor (rodent amygdala)
|
||||
- S016 | Tronson & Taylor 2007, Nat Rev Neurosci 8 | 10.1038/nrn2090 | yes | review | RELEVANT_SECTIONS | boundary-condition heterogeneity
|
||||
- S017 | Sevenster, Beckers & Kindt 2014, Learn Mem 21 | 10.1101/lm.035493.114 | yes | primary | RELEVANT_SECTIONS | prediction-error gate
|
||||
- S018 | Rudy et al. 2006, Learn Mem 13:1-3 | — | yes | primary (critique) | RELEVANT_SECTIONS | anisomycin non-specificity
|
||||
- S019 | Lattal & Abel 2004, PNAS 101(13):4667 | — | yes | primary | RELEVANT_SECTIONS | deficits REVERSE with time
|
||||
- S020 | Morris et al. 2006, Neuron 50(3):479 | — | yes | primary | ABSTRACT | nonspecific anisomycin effects
|
||||
- S021 | Nader & Hardt 2009, Nat Rev Neurosci 10:224-234 | — | yes | review (PRO) | ABSTRACT | "a single standard" — pro-reconsolidation case
|
||||
- S022 | Exton-McGuinness, Lee & Reichelt 2015, Neurosci Biobehav Rev | 10.1016/j.bbr.2014.10.011 | yes | review | ABSTRACT | update-gate framing
|
||||
|
||||
## Competing theories
|
||||
- S023 | Nadel & Moscovitch 1997, Hippocampus 7:217; Nadel et al. 2000, Psych Review 107:66 | — | yes | primary (theory) | RELEVANT_SECTIONS | MTT
|
||||
- S024 | Teyler & Rudy 2007, Hippocampus | 10.1002/hipo.20350 | yes | primary (theory) | RELEVANT_SECTIONS | indexing theory
|
||||
- S025 | Ryan et al. 2015, Science 348:1007 (+ Roy 2017 PNAS) | 10.1126/science.aaa5542 | yes | primary | RELEVANT_SECTIONS | engram persistence vs retrieval
|
||||
- S026 | Winocur & Moscovitch 2011, JINS 17(5):766; Moscovitch et al. 2016, Ann Rev Psych 67 | — | yes | review/theory | RELEVANT_SECTIONS | transformation hypothesis
|
||||
- S027 | Frankland et al. 2004, Science 304 | 10.1126/science.1094804 | yes | primary | ABSTRACT | remote-memory cortical shift + detail loss
|
||||
- S028 | Moscovitch & Gilboa 2021 OSF preprint | 10.31234/osf.io/yxbrs | no (preprint) | theory | ABSTRACT | TTT verified anchor
|
||||
- S029 | Gershman, Blei & Niv 2010, Psych Review 117:197 | — | yes | primary (theory) | RELEVANT_SECTIONS | latent-cause: reconsolidation = belief updating
|
||||
- X003 | "Winsneski/Bhatt TTT" | NOT FOUND | — | — | — | UNVERIFIABLE — replaced by S028
|
||||
|
||||
## Generalization / interference
|
||||
- S030 | McCloskey & Cohen 1989; Ratcliff 1990 | — | yes | primary | RELEVANT_SECTIONS | catastrophic interference
|
||||
- S031 | O'Reilly & Norman 2002, TiCS; Norman & O'Reilly 2003, Psych Review 109 | 10.1016/s1364-6613(02)02005-3 | yes | primary (model) | RELEVANT_SECTIONS | pattern separation/completion (REC)
|
||||
- S032 | Payne et al. 2009, Neurobiol Learn Mem | 10.1016/j.nlm.2009.03.007 | yes | primary | ABSTRACT | sleep increases false memory
|
||||
- S033 | Fenn et al. 2009, Learn Mem | 10.1101/lm.1500808 | yes | primary | ABSTRACT | OPPOSITE: sleep reduces false memory
|
||||
- S034 | Anderson, Bjork & Bjork 1994, JEP:LMC 20:1063 | 10.1037/0278-7393.20.5.1063 | yes | primary | RELEVANT_SECTIONS | RIF discovery
|
||||
- S035 | Murayama et al. 2014, Psych Bull | 10.1037/a0037505 | yes | meta-analysis | ABSTRACT | RIF real on average, boundaries
|
||||
- S036 | RIF reliability papers (Eur Psychologist 2011, DOI 10.1027/1016-9040/a000040; Frontiers 2014, DOI 10.3389/fpsyg.2014.01343) | — | yes | meta/replication | ABSTRACT | reliability concerns
|
||||
|
||||
## AI analogues
|
||||
- S037 | Schaul et al. 2016, ICLR (PER) | 1511.05952 | yes (conference) | primary | RELEVANT_SECTIONS | prioritized replay in RL + bias caveat
|
||||
- S038 | Fedus et al. 2020, ICML | 2007.06700 | yes | primary | RELEVANT_SECTIONS | uniform replay often matches PER
|
||||
- S039 | Song & Qian 2024, Scientific Reports 53117 | — | yes | review | ABSTRACT | prioritization instability
|
||||
- S040 | Shin et al. 2017, NeurIPS | 1705.08690 | yes | primary | ABSTRACT | generative replay
|
||||
- S041 | Blundell et al. 2016 (1606.04460); Pritzel et al. 2017 (1703.01988) | — | yes (conference) | primary | ABSTRACT | episodic control — fast store as engineering lever
|
||||
- S042 | Kauvar et al. 2023, ICML | 2306.15934 | yes | primary | ABSTRACT | curious replay for world models
|
||||
- S043 | Kumaran, Hassabis & McClelland 2016, TiCS 20(7) | 10.1016/j.tics.2016.05.004 | yes | review (theory) | RELEVANT_SECTIONS | CLS-for-agents anchor (pro)
|
||||
- S044 | McClelland, McNaughton & Lampinen 2020, Phil Trans R Soc B | 10.1098/rstb.2019.0637 | yes | review (theory) | RELEVANT_SECTIONS | CLS v2
|
||||
- S045 | De Lange et al. 2021, IEEE TPAMI 44(7) | — | yes | survey | RELEVANT_SECTIONS | catastrophic interference REAL in ML
|
||||
- S046 | Dacrema et al. 2019, RecSys | 1907.06902 | yes | primary (critique) | RELEVANT_SECTIONS | simple baselines beat complexity (adversarial)
|
||||
- S047 | O'Neil et al. 1996, Acta Informatica 33(4):351-385 (LSM-tree) | — | yes | primary | RELEVANT_SECTIONS | two-stores-as-engineering (adversarial)
|
||||
- S048 | Baria & Cross 2021, arXiv 2107.14042; Weisberg et al. 2008, J Cogn Neurosci 20(3) | — | mixed | critique | ABSTRACT | neuro-metaphor seduction (adversarial)
|
||||
- S049 | Lam et al. 2026, SSGM | 2603.11768 | no (preprint) | primary | RELEVANT_SECTIONS | semantic drift + immutable ledger fix
|
||||
- S050 | TRUSTMem 2026 | 2606.25161 | no (preprint) | primary | ABSTRACT | consolidation-pipeline corruption measured
|
||||
- S051 | Ólafsdóttir, Bush & Barry 2018, Curr Biol 28(1) | — | yes | review | RELEVANT_SECTIONS | replay dynamics load-bearing (adversarial)
|
||||
- S052 | Maynez et al. 2020, ACL | — | yes | primary | ABSTRACT | summarization hallucination (adversarial)
|
||||
- S053 | Roediger & McDermott 1995, JEP:LMC 21(4):803 | — | yes | primary | RELEVANT_SECTIONS | DRM gist falsification
|
||||
- S054 | Greshake et al. 2023 | — | yes | primary | ABSTRACT | indirect injection (adversarial, corroboration justification)
|
||||
- S055 | Candea & Fox 2003 HotOS (crash-only, context) | — | yes | primary | ABSTRACT | engineering pattern context
|
||||
|
||||
Totals: primary sources 40+; reviews/surveys 6; competing theories 4 (MTT, indexing, latent-cause, TTT); negative/contrary sources 9; recent (2023-2026) 8; software analogues 8. Unverifiable R0 references excluded: 3 (X001-X003).
|
||||
@@ -0,0 +1,56 @@
|
||||
# 03 — APPLICABILITY (Rune-specific, per surviving mechanism)
|
||||
|
||||
_Mandate questions 1-15 answered per mechanism. Cheapest-mechanism rule enforced._
|
||||
|
||||
## M1: Two-layer split (fast exact / slow generalized) — CLS-R1-C001
|
||||
1. Original problem: catastrophic interference in overlapping-representation learners.
|
||||
2. Rune's problem: REAL but milder — LLM consolidation rounds corrupt (C007), not gradient interference. Interference arrives via semantic drift, not weight overlap.
|
||||
3. Non-transferring biology: replay dynamics, sleep, neuromodulation, decay constants (d≈0.5 is a fit parameter to rodent data, S001).
|
||||
4. Computational differences: Rune's "fast store" is a database; perfect fidelity, zero decay — better than a hippocampus.
|
||||
5. Rune already solves it: YES — append-only entries + separate consolidation writer (T0 PROVEN). CLS adds justification, not mechanism.
|
||||
6-7. Complexity check: copying CLS's neural machinery (sparseness, decay curves) = unnecessary. Simplest capture: the existing two-writer design + drift guards (C007).
|
||||
8-9. Preserves exact evidence + provenance: YES (append-only + source columns).
|
||||
10. LLM dependence: unchanged. 11. Offline: YES. 12. Century-scale: YES (append-only is archival-friendly, child U).
|
||||
13. Event-driven conflict: none. 14. Owner: Memory (whole). 15. Cheapest mechanism: current design + index repair.
|
||||
|
||||
## M2: Schema-gated fast path — CLS-R1-C002
|
||||
1. Original problem: weeks-long consolidation latency for schema-consistent info.
|
||||
2. Rune's problem: PARTIAL — consolidation lag exists but is not user-painful (nightly); urgency unproven.
|
||||
3-4. Non-transferring: schema detection in biology is implicit/in learned representations; Rune would need EXPLICIT schema matching (a new classifier) — the biological mechanism does not transfer, only the outcome.
|
||||
5. Rune already solves: NO (uniform consolidation).
|
||||
6. Copying increases complexity: YES — schema classifier = new LLM/deterministic component with its own error rate.
|
||||
7. Simpler capture: promotion-gate with independence check (C006) approximates the benefit without schema detection.
|
||||
8-12. Preserves evidence/provenance: yes if shadow-mode; offline yes; century-scale yes.
|
||||
13. Event-driven: compatible (consolidation trigger can be event-driven).
|
||||
14. Owner: Memory consolidation. 15. Cheapest: defer fast path until consolidation lag is measured as a real problem; shadow-mode experiment first.
|
||||
|
||||
## M3: Utility-prioritized consolidation — CLS-R1-C003
|
||||
1. Original: finite replay budget in navigation.
|
||||
2. Rune: consolidation compute is cheap; the REAL constraint is lesson QUALITY (bad generalizations are expensive).
|
||||
3-4. Non-transferring: "need" signals (state relevance) are navigation-specific; Rune's equivalent ("what will shape future behavior") is unmeasurable without an outcome stream.
|
||||
5. Rune already solves: NO (full sweeps).
|
||||
6. Complexity: moderate — a utility estimator is a new component.
|
||||
7. Simpler: dedup + diversity + contradiction-targeting (from child E replay findings) captures most value without a utility model.
|
||||
8-12. Preserves evidence: yes. 10. LLM: can REDUCE (fewer consolidation calls). 11. Offline: yes.
|
||||
14. Owner: Memory consolidation. 15. Cheapest: diversity+contradiction sampling; utility model only if that fails.
|
||||
|
||||
## M4: Retained covering episodes — CLS-R1-C004
|
||||
Already Rune doctrine (append-only). Applicability: total. Cheapest: current design. The R1 change is the RATIONALE (drift-correction, not reconsolidation) and the added obligation: drift tests comparing consolidated output against retained sources.
|
||||
|
||||
## M5: Reconsolidation framing — CLS-R1-C005
|
||||
REJECTED as framing. The transferable atom: S017's prediction-error gate — update memories when reality VIOLATES them (contradiction detected), not on mere retrieval. That's just Rune's supersession trigger refined: supersede on contradiction, not on schedule. Owner: Memory write path.
|
||||
|
||||
## M6: Independence-gated promotion — CLS-R1-C006
|
||||
Problem proven (wash_count gameable/unvalidated). Cheapest mechanism: promotion requires entries from ≥2 distinct sessions/sources touching the same content + no contradiction at promotion time. No new subsystem — a gate rule.
|
||||
|
||||
## M7: Drift guards on consolidation — CLS-R1-C007
|
||||
Cheapest: (a) consolidate from immutable source text only (never from prior summaries) — already Rune doctrine, now load-bearing; (b) spot-check: N sampled claims per consolidation run verified against sources (existing claim_audit machinery); (c) drift metric: factual-consistency rate per run, logged. Owner: consolidation pipeline.
|
||||
|
||||
## M8: Stage progression — CLS-R1-C008
|
||||
Keep stages as LABELS on one store (they already exist as kind/status fields); do NOT create separate stores per stage. Owner: Memory.
|
||||
|
||||
## M9: Shadow-mode — CLS-R1-C009
|
||||
Cheap version: generalized beliefs enter with status=provisional and `acted_on=false` until independence gate passes; retrieval MAY surface them but marked. Owner: Memory entry status.
|
||||
|
||||
## Boundary assignments (Q14)
|
||||
All mechanisms above: Memory authority. Nothing here belongs to Spine (structural truth), Substrate (execution), Persona (identity spec), or World Model (current-state belief) — with one note: consolidation's OUTPUT that describes the environment (facts about services/config) feeds the WM projection, but the belief-update authority stays in Memory.
|
||||
@@ -0,0 +1,42 @@
|
||||
# 04 — INNOVATION (falsifiable hypotheses only; systems integration counts; novelty not manufactured)
|
||||
|
||||
## I1: Drift-metered consolidation (closest prior art: SSGM 2603.11768, TRUSTMem 2606.25161)
|
||||
- Difference: SSGM prescribes immutable ledgers; Rune ADDS a measured drift metric per consolidation run (factual-consistency rate of sampled claims vs immutable sources) gating whether the run's output is accepted.
|
||||
- Mechanism: post-consolidation, sample N derived claims, verify against source episodes (existing claim_audit machinery); acceptance threshold; failed runs re-run or discarded.
|
||||
- Predicted advantage: consolidation corruption (C007, S050: 79%/50% reduction when guarded) caught before entering the belief layer.
|
||||
- Cost: N verification calls per run. Failure mode: verification LLM hallucinates agreement — mitigate with exact-quote checks.
|
||||
- Benchmark: drift rate per run before/after; retraction rate of accepted beliefs.
|
||||
- Rejection criterion: if drift rate is <1% unguarded across 10 runs, the meter is overhead — drop it.
|
||||
- Classification: EXPERIMENT. Evidence: EXTERNALLY_ESTABLISHED (drift) → RUNE_HYPOTHESIS (meter).
|
||||
|
||||
## I2: Independence-gated promotion (closest prior art: dedup+recency recommenders, S046)
|
||||
- Difference: recommendation systems gate on statistical ensembles; Rune gates on SOURCE-GRAPH independence (distinct sessions, distinct evidence chains) + contradiction absence — a check available only because Rune keeps exact provenance.
|
||||
- Mechanism: promotion_eligible requires ≥2 independent evidence chains + zero active contradictions (using existing supersession graph).
|
||||
- Predicted advantage: eliminates frequency-gamed promotions (observed T0.1).
|
||||
- Cost: none — query over existing data. Failure mode: over-strict gate starves promotion (measure promotion latency).
|
||||
- Benchmark: promoted-belief retraction rate vs old wash_count gate.
|
||||
- Rejection criterion: if retraction rates equal, revert to simple gate.
|
||||
- Classification: ADAPT. Evidence: RUNE_APPLICABLE.
|
||||
|
||||
## I3: Contradiction-triggered consolidation (event-driven, from S017's prediction-error gate via M5)
|
||||
- Difference: consolidation runs on DRIFT/CONTRADICTION events (new evidence contradicting an existing belief), not on timers — unifying Rune's event-driven mandate (req 34) with CLS's update-gate.
|
||||
- Mechanism: write-path contradiction detection (cross-encoder prefilter, child AC) emits consolidation-trigger events; consolidation processes affected beliefs, not the whole store.
|
||||
- Predicted advantage: timely belief updates (T0.1's non-deterministic trigger replaced); reduced LLM consumption (targeted runs).
|
||||
- Cost: contradiction detector errors (false positives → consolidation churn; rate-limit).
|
||||
- Benchmark: belief-update latency; LLM calls per belief-update; churn rate.
|
||||
- Rejection criterion: if targeted consolidation misses updates the sweep catches, hybrid (event + periodic sweep).
|
||||
- Classification: EXPERIMENT. Evidence: RUNE_HYPOTHESIS.
|
||||
|
||||
## I4: Shadow-mode generalizations (closest prior art: TiMem dual-buffer probation; SSGM staging)
|
||||
- Difference: probation tied to the independence gate (I2) with `acted_on=false` semantics — beliefs are retrievable-but-marked, and the promotion decision is auditable in the ledger.
|
||||
- Predicted advantage: overgeneralization caught before behavior; audit trail of WHY a belief was promoted (req 24).
|
||||
- Cost: status complexity. Failure mode: shadow beliefs leak into behavior unmarked.
|
||||
- Benchmark: retraction rate of shadow-vs-direct promotions.
|
||||
- Rejection criterion: if no retraction-rate difference across 50 promotions, drop shadow mode.
|
||||
- Classification: EXPERIMENT. Evidence: RUNE_HYPOTHESIS.
|
||||
|
||||
## I5: Two-lane consolidation benchmark (from CLS-R1-C010 refinement)
|
||||
- The innovation is METRIC-FIRST: before any prioritization scheme, implement the measurement (lesson quality: retraction rate, contradiction rate at promotion, independence depth) — then let data pick recency vs utility vs diversity.
|
||||
- Classification: EXPERIMENT (protocol). Evidence: RUNE_APPLICABLE (problem proven).
|
||||
|
||||
No manufactured novelty: I1/I4 have close published prior art (SSGM, TiMem); I2 is integration of existing Rune provenance with standard hygiene; I3 is Rune's own event-driven mandate applied to CLS's update gate; I5 is measurement design. Each claims integration, not new mechanism.
|
||||
@@ -0,0 +1,30 @@
|
||||
# 05 — ADVERSARIAL (independent research pass; actor general-31)
|
||||
|
||||
_Mandate: assume the emerging CLS→Rune conclusions are WRONG. Find the strongest cited evidence. Honest failed attacks recorded._
|
||||
|
||||
## Attack 1 — "Two stores / two writers": LARGELY SUCCESSFUL
|
||||
The dual-store pattern exists in engineering WITHOUT neuroscience and predates CLS-as-software: the LSM-tree (memtable + immutable SSTables + background compaction) is exactly "fast volatile store, slow durable store, consolidation pass" — O'Neil, Cheng, Gawlick & O'Neil, *Acta Informatica* 33(4):351-385, 1996. What CLS would add beyond cache+DB is the DYNAMICS: sharp-wave-ripple replay during sleep, interleaved training, slow integration — software Rune has none (Ólafsdóttir, Bush & Barry, *Current Biology* 28(1):R37-R50, 2018: the biological consolidation story rests on those dynamics). Metaphor critique: Baria & Cross, arXiv:2107.14042 (2021); Weisberg et al., "The seductive allure of neuroscience explanations," *J Cogn Neurosci* 20(3):470-477, 2008. **Strength: high.** Honest counter: CLS's distinctive content is INTERFERENCE MANAGEMENT — catastrophic interference is a real software phenomenon (De Lange et al. 2021) — but that doesn't rescue "two stores" specifically, which is not where CLS does work.
|
||||
|
||||
## Attack 2 — Tse 2007 schema gating: SUCCESSFUL
|
||||
Tse et al., *Science* 313:1130-1133, 2007: rats only, food-reward flavor-place paired-associate task, WEEKS of training on six PAs before one-trial new-PA learning (paradigm per Hasan et al., *PLoS Biology* 17(12):e3000564, 2019, which concedes "difficult to map the concept of mental schema precisely onto existing neurobiological models"). Mechanism contested at publication: "Does assimilation into schemas involve systems or cellular consolidation?" (*Neurobiol Learn Mem* 2007) — an encoding-level prior-knowledge benefit is an equally live explanation. Human translation: Warren & Duff, *Hippocampus* 24(8):920-932, 2014 — amnesics fail to benefit from fast-mapping routes; Warren et al., *J Neurosci* 34(22), 2014 — schema influence located in vmPFC, not a hippocampus-bypassing speedup; Sharon/Moscovitch/Gilboa, *PNAS* 108:17263-17268, 2011 — rapid acquisition via a DIFFERENT route (rapid neocortical acquisition independent of hippocampus). **Strength: high** for animal-paradigm confinement; **medium** for the encoding-effect alternative (no paper cleanly rules it out).
|
||||
|
||||
## Attack 3 — Mattar & Daw prioritized replay → utility-prioritized consolidation: SUCCESSFUL
|
||||
Mattar & Daw, *Neuron* 99(5):944-966, 2018 models utility-driven replay in simulated MAZE NAVIGATION. Ólafsdóttir et al. (2018): replay literature rests "mainly, but not exclusively, on rodents"; human replay evidence indirect. **No published evidence prioritized replay transfers to semantic-memory consolidation.** Closest analog (RL PER) is cautionary: Schaul et al. ICLR 2016 (PER needs importance-sampling correction for bias); Fedus et al. ICML 2020 — uniform replay often MATCHES PER, buffer freshness dominates; Song & Qian, *Scientific Reports* 53117, 2024 — single-criterion prioritization unstable across environments. **Strength: high** ("no transfer evidence"); PER pathologies make transfer worse.
|
||||
|
||||
## Attack 4 — retained covering episodes: **FAILED** (conclusion survives; rationale replaced)
|
||||
The biology supports the attack: transformation theory (Winocur & Moscovitch, *JINS* 17(5):766-780, 2011; Moscovitch et al., *Ann Rev Psych* 67:1-36, 2016) holds the brain ROUTINELY DISCARDS details — retention of source episodes is not what biological consolidation does. Generative Agents (Park et al., UIST 2023) and MemGPT (Packer et al. 2023) run reflection/summarization without retained originals. **But the strongest engineering evidence cuts the other way**: SSGM (Lam et al., arXiv:2603.11768, 2026) documents SEMANTIC DRIFT — lossy iterative summarization progressively distorting stored facts ("likes mild spicy food" → "loves very spicy") — and prescribes an immutable episodic ledger reconciled against the mutable store. **Retention is justified by DRIFT-CORRECTION, not reconsolidation; the CLS conclusion survives on engineering grounds, losing its biological rationale.**
|
||||
|
||||
## Attack 5 — reconsolidation → supersession: SUCCESSFUL
|
||||
Pharmacological foundation contested: Rudy, Biedenkapp, Moineau & Bolding, *Learn Mem* 13(1):1-3, 2006 — anisomycin has non-specific effects producing TEMPORARY amnesia unrelated to re-stabilization; Lattal & Abel, *PNAS* 101(13):4667-4672, 2004 — deficits REVERSE with time (retrieval-failure signature, not erasure); Morris et al., *Neuron* 50(3):479-489, 2006 — intrahippocampal anisomycin "nonspecific effects unconnected with reconsolidation." Alternative mechanisms (extinction facilitation: Myers & Davis 2002; Fischer et al. 2004) explain the same data. Tronson & Taylor, *Nat Rev Neurosci* 8:352-365, 2007 — wildly heterogeneous boundary conditions. **Correction to the R0 assumption: Hardt & Nader are on the PRO side** — Nader & Hardt, "A single standard for memory: the case for reconsolidation," *Nat Rev Neurosci* 10:224-234, 2009 — which is itself telling: the phenomenon requires a "case for" paper. **Strength: high.** Mapping Rune supersession to a phenomenon whose existence is pharmacology-dependent is speculation.
|
||||
|
||||
## Attack 6 — corroboration gating: PARTIAL SUCCESS
|
||||
Dacrema, Cremonesi & Jannach, "Are we really making much progress?" *RecSys 2019* (1907.06902): 11 of 18 neural recommenders failed to beat well-tuned simple baselines — simple mechanisms (dedup, recency, linear) match added complexity; "corroboration" is structurally ensemble voting / confirmation-weighted averaging — standard hygiene needing no memory theory. **However, partially fails:** for single-user stores exposed to prompt injection and hallucinated inputs (Greshake et al. 2023, indirect injection), write-path validation has a distinct justification beyond dedup/recency. Corroboration-as-hygiene: yes; corroboration-as-redundant: unproven.
|
||||
|
||||
## Attack 7 — workload mismatch: MIXED
|
||||
De Lange et al., *IEEE TPAMI* 44(7), 2021; Abel et al., *NeurIPS 2023*: agent settings are never-stationary, never-i.i.d. streams — nothing like hippocampal encoding at fixed event boundaries; MemGPT demonstrates top-down OS-style design working without neuro-anchoring; timescales differ by orders of magnitude. **Failed part:** Kumaran, Hassabis & McClelland, "What learning systems do efficient agents need?" *TiCS* 20(7):512-534, 2016 IS a peer-reviewed argument that CLS maps directly onto agent ML — the strongest pro-position the adversarial side must answer; and catastrophic interference (real, per De Lange) gives CLS teeth.
|
||||
|
||||
## Attack 8 — consolidation damages exactness: SUCCESSFUL
|
||||
Maynez et al., "On faithfulness and factuality in abstractive summarization," *ACL 2020*: "substantial amounts of hallucinated content in all model generated summaries" — summarization (consolidation's software form) systematically injects error. Roediger & McDermott 1995 (DRM): gist compression GENERATES false content. Agent-specific: SSGM (2603.11768) places "semantic drift during consolidation updates" among top three failure modes; **TRUSTMem (arXiv:2606.25161, 2026) measures omission/corruption/hallucination introduced BY the consolidation pipeline itself** and cuts these 79.1%/50.0% vs baselines — direct evidence consolidation rounds degrade exactness an exact store wouldn't.
|
||||
|
||||
## Bottom line
|
||||
**Strongest kills:** #5 (contested pharmacological foundation), #3 (no transfer evidence + fragile RL analog), #2 (rat food-reward paradigm, contested mechanism, human translation failures), #8 (documented consolidation-introduced corruption). **Attack #4 failed on the conclusion** (retention is right) **but won on the rationale** (drift-correction, not reconsolidation). **#1 strongest** where it says two stores are trivial engineering (LSM 1996), weakest against interference-based CLS content. **#6, #7 genuinely mixed** — with Kumaran 2016 as the pro-CLS anchor any honest synthesis must answer.
|
||||
@@ -0,0 +1,22 @@
|
||||
# 06 — SYNTHESIS: mechanism matrix + reconciliation
|
||||
|
||||
## Mechanism matrix
|
||||
|
||||
| MECHANISM | ORIGINAL PURPOSE | EVIDENCE STRENGTH | LIMITATIONS | RUNE EQUIVALENT | RUNE GAP | TRANSFER VALIDITY | COST | FAILURE MODES | CLASSIFICATION | RUNE EVIDENCE LEVEL |
|
||||
|---|---|---|---|---|---|---|---|---|---|---|
|
||||
| Fast exact episodic store | evade catastrophic interference | STRONG (S001, S030, S045, S041) | biology's decay dynamics don't transfer; Rune's is better (perfect fidelity) | append-only entries (PROVEN) | index coverage (439 unindexed) | HIGH (as engineering; CLS adds interference rationale) | none | silent embedder failure (observed) | COVERED — repair | RUNE_PROVEN (store); index repair needed |
|
||||
| Slow statistical/generalized layer | interference-free generalization | STRONG (S001, S044) | transformation loses detail (S026) | knowledge.json consolidation (PROVEN to run) | drift guards; source-only inputs | HIGH | verification calls | consolidation hallucination (S052, S050) | ADAPT (drift-metered) | RUNE_APPLICABLE |
|
||||
| Two stores / two writers | separate update rates | STRONG as engineering (S047 LSM) / CLS content = interference mgmt (S045) | "two stores" trivial without dynamics (adversarial #1) | agent writer + consolidator (PROVEN) | none structural | HIGH | none | writer conflation | COVERED | RUNE_PROVEN |
|
||||
| Schema-gated rapid integration | fast assimilation with prior knowledge | CONTESTED (S003 effect real in rats; mechanism contested S007/S008; adversarial #2) | animal paradigm; encoding-vs-consolidation confound; schema detection cost | none | schema detector would be NEW | MEDIUM | new classifier | wrong schema match → corrupt fast promotions | EXPERIMENT (deferred until lag measured) | RUNE_HYPOTHESIS |
|
||||
| Utility-prioritized consolidation | finite replay budget, prospective value | MEDIUM (S012 model+converging ephys; navigation-specific) | no semantic-memory transfer evidence (adversarial #3); PER fragility (S038/S039) | none (full sweeps) | utility signal unmeasurable without outcome stream | MEDIUM | utility estimator | gamed/biased prioritization | EXPERIMENT (baseline-first) | RUNE_HYPOTHESIS |
|
||||
| Retained covering episodes | reconsolidation substrate (R0 claim) → drift correction (R1) | STRONG engineering (S049/S050/S052) | storage cost; biology actually discards (S026) | append-only (PROVEN) | drift tests vs sources | HIGH | storage | none serious | ADOPT (rationale corrected) | RUNE_APPLICABLE |
|
||||
| Reconsolidation → supersession | update-on-retrieval | CONTESTED (S015 rodent robust; S018-020 pharmacology contested) | write-vs-retrieval trigger mismatch | supersession (PROVEN, write-triggered) | prediction-error trigger refinement | LOW (framing) / MEDIUM (gate atom) | none | dogma without mechanism | REJECT framing; KEEP contradiction-triggered updates | RUNE_APPLICABLE (gate atom only) |
|
||||
| Interference management (pattern separation/completion) | avoid false memories + enable retrieval | STRONG computational (S031) + fMRI support | separation/completion trade-off is architectural, not tunable | dedupe/supersede gate (PROVEN); exact quotes | contradiction detection (missing) | HIGH | cross-encoder prefilter | false contradiction detections | ADAPT | RUNE_APPLICABLE |
|
||||
| Independent-evidence promotion gate | avoid premature generalization | MEDIUM (S017 gates; S046 simplicity warning) | nothing biological required | promotion_eligible (exists, frequency-driven — UNVALIDATED) | independence test | HIGH | none (query) | over-strict gate starves promotion | ADAPT | RUNE_APPLICABLE |
|
||||
| Shadow-mode provisional beliefs | prevent premature influence | MEDIUM (interference-threshold logic; TiMem convergence) | state complexity | status field (exists) | acted_on semantics | MEDIUM | none | shadow leakage | EXPERIMENT | RUNE_HYPOTHESIS |
|
||||
| Replay as teacher (offline re-processing) | neocortical learning from hippocampal record | MEDIUM (S012; decoding contested S014) | content-decoding methods disputed (S014); co-reactivation ↔ forgetting (S013) | consolidation as re-processing (PROVEN to run) | sampling policy | MEDIUM | none | replay amplifies poisoned content (child E) | COVERED (consolidation = Rune's replay; policy = experiments above) | RUNE_APPLICABLE |
|
||||
| Gist consolidation creates false content | efficiency of gist | CONTESTED in biology (S032 vs S033); STRONG in software (S052, S049, S050) | — | LLM summarization | drift guards | HIGH | verification | silent corruption | ADOPT (guards) | RUNE_APPLICABLE |
|
||||
|
||||
## Synthesis narrative
|
||||
|
||||
CLS's load-bearing content for Rune is NOT the two-store anatomy (that's LSM-tree engineering, S047) and NOT the biological dynamics (replay/sleep — S051) and NOT reconsolidation (pharmacologically contested — S018-020). Three things transfer: (1) **the interference-management problem is real in software** (S045) and Rune's exact store + supersession is the pattern-separation answer; (2) **consolidation corrupts** (S049/S050/S052) — so the slow layer requires drift guards and retained sources as engineering requirements; (3) **updates are gated by prediction error, not schedules** (S017, reframed via S029's latent-cause account as plain belief-updating) — which lands Rune's consolidation trigger on events, not timers. The five-stage progression is Rune's own construct: keep it as labels, not stores. Competing theories (MTT, indexing, latent-cause) matter mostly as warnings: the biology does not settle what CLS's early readings assumed, and the latent-cause account explains reconsolidation phenomena as ordinary belief-updating — which is exactly the software form Rune should implement. Kumaran 2016 (S043) remains the strongest pro-CLS-for-agents argument and survives the adversarial pass on interference grounds.
|
||||
@@ -0,0 +1,28 @@
|
||||
# 07 — QUALIFICATION (#376 R1)
|
||||
|
||||
_Classification separate from evidence level. Each item: confidence, sources (for/against), assumptions, cost, failure modes, T1 impact, experiment, falsifier, rejection criterion. Evidence levels per claims.json._
|
||||
|
||||
## Qualified mechanisms
|
||||
|
||||
| # | Mechanism | Classification | Evidence level | Conf | For | Against | T1 impact | Experiment | Rejection criterion |
|
||||
|---|---|---|---|---|---|---|---|---|---|
|
||||
| Q1 | Two-layer split (exact episodes + generalized layer, two writers) | COVERED — keep; repair index coverage | EXTERNALLY_ESTABLISHED + RUNE_APPLICABLE (store RUNE_PROVEN) | HIGH | S001/S045/S041/S049 | S047 (trivial-engineering caveat — does not defeat interference content) | HIGH (retention/rotation decision) | index-repair + embedder loud-failure (not CLS but urgent) | single-store drift parity |
|
||||
| Q2 | Drift guards on consolidation (source-only inputs, quote-checks, drift metric) | ADOPT | EXTERNALLY_ESTABLISHED + RUNE_APPLICABLE | HIGH | S049/S050/S052/S053 | S033 (biology direction contested — irrelevant to software) | HIGH | drift-rate measurement per run | drift <1% unguarded over 10 runs |
|
||||
| Q3 | Retained covering episodes (append-only; rationale = drift correction) | ADOPT — already doctrine | RUNE_APPLICABLE | HIGH | S049 adversarial-confirmed | S026 (biology discards — explicitly not imitated) | MEDIUM | retention vs drift controlled test | consolidation-without-retention parity |
|
||||
| Q4 | Independence-gated promotion (replaces wash_count frequency gate) | ADAPT | RUNE_APPLICABLE (problem RUNE_PROVEN via T0.1) | HIGH | S054 threat model; wash_count unvalidated | S046 simplicity | MEDIUM | promotion retraction-rate A/B | equal retraction rates |
|
||||
| Q5 | Contradiction-triggered (event-driven) consolidation | ADAPT | RUNE_HYPOTHESIS | MEDIUM | S017 gate atom; S029 latent-cause framing | trigger-churn risk | MEDIUM | targeted-vs-sweep update latency | missed updates vs sweep |
|
||||
| Q6 | Shadow-mode provisional generalizations | EXPERIMENT | RUNE_HYPOTHESIS | MEDIUM | TiMem convergence; interference logic | complexity | MEDIUM | shadow-vs-direct retraction rates | no difference over 50 promotions |
|
||||
| Q7 | Utility-prioritized consolidation | EXPERIMENT (refined from R0) | RUNE_HYPOTHESIS (transfer unproven) | LOW-MED | S012/S011 | adversarial#3; S038/S039 | LOW-MED | lesson-quality A/B vs dedup+diversity baseline | no improvement over baseline |
|
||||
| Q8 | Schema-gated fast path | EXPERIMENT (DEFERRED until consolidation lag measured as real) | CONTESTED externally | LOW-MED | S003/S005 | S007/S008; adversarial#2 | LOW | lag measurement first; then shadow fast path | fast-path retraction rate higher |
|
||||
| Q9 | Five-stage progression (episode→observation→belief→procedure) | ADAPT (as labels on one store) | RUNE_APPLICABLE (transitions RUNE_PROVEN) | MEDIUM | S001/S044 stage logic | over-engineering risk (meta-review) | LOW-MED | friction vs lesson-quality | collapse to 2-stage if no benefit |
|
||||
| Q10 | Reconsolidation framing for supersession | REJECT (framing); KEEP prediction-error-gated updates | CONTESTED | HIGH (in the reject) | S015/S017/S029 | S018/S019/S020; adversarial#5 | LOW | — | — |
|
||||
|
||||
## Evidence-level discipline (mandate §17)
|
||||
No mechanism above is RUNE_PROVEN beyond what T0/T0.1 already established (two-writer structure, append-only, promotion-gate existence). Everything new — drift guards, independence gates, event triggers, shadow mode — is RUNE_HYPOTHESIS until Rune experiments run. Q1's store layer is the only RUNE_PROVEN item, and its gap (index coverage) is operational, not architectural.
|
||||
|
||||
## Evidence-level separation statement (G10)
|
||||
|
||||
Explicit separation of layers, per mandate:
|
||||
- BIOLOGICAL MECHANISM (what the brain does): fast sparse hippocampal store, slow overlapping neocortex, replay-as-teacher, schema-gated integration, reconsolidation-with-prediction-error-gate. Established to varying degrees (S001-S031) — NOT Rune claims.
|
||||
- SOFTWARE ANALOGY (what the mechanism becomes in software): two-layer store, consolidation pass, prioritized sampling, update-on-violation. Validated as engineering levers (S037-S041, S045) — still NOT Rune claims.
|
||||
- RUNE PRESCRIPTION (what Rune should do): only items with RUNE_APPLICABLE or stronger levels in claims.json — the two-layer split (RUNE_PROVEN structure), drift guards (RUNE_APPLICABLE), independence gate (RUNE_APPLICABLE), contradiction-triggered updates (RUNE_HYPOTHESIS), shadow mode (RUNE_HYPOTHESIS). Every EXTERNALLY_ESTABLISHED claim that entered Rune prescription passed through an explicit applicability argument (03_applicability.md) and carries its Rune evidence level in claims.json. No biological finding is cited as Rune proof anywhere in this artifact set.
|
||||
@@ -0,0 +1,46 @@
|
||||
# #376 R1 — Complementary Learning Systems: FINAL (durable technical reference)
|
||||
|
||||
_This document is the domain's durable reference. It assumes the reader has the pipeline artifacts alongside: 00_issue_scope, 01_inward, 02_outward/ (9 files + sources.md + claims.json), 03_applicability, 04_innovation, 05_adversarial, 06_synthesis, 07_qualification, r0_reconciliation._
|
||||
|
||||
## 1. The domain in one page
|
||||
|
||||
Complementary Learning Systems (McClelland, McNaughton & O'Reilly 1995) claims cognition needs two learning systems: a fast, sparse, episodic store (hippocampus) that learns instantly but interferes catastrophically when asked to generalize, and a slow, overlapping, statistical store (neocortex) that generalizes well but must learn slowly and interleaved. The hippocampus acts as a teacher: replay of episodes drives slow neocortical integration. Thirty years of development produced: schema-gated rapid integration (Tse 2007; McClelland 2013 — the theory's biggest self-revision), utility-prioritized replay (Mattar & Daw 2018), reconsolidation (Nader 2000 — with a contested pharmacological foundation), transformation theory (memories are transformed, not copied — Winocur/Moscovitch), and serious competitors (MTT, hippocampal indexing, latent-cause/Bayesian accounts). In ML, the pattern is validated as engineering: episodic control buffers, experience/generative replay, and catastrophic interference are all real (S037-S045).
|
||||
|
||||
## 2. What transfers to Rune, and what does not
|
||||
|
||||
**Transfers (as engineering, with Rune evidence):**
|
||||
- The two-layer split with separate update rates. Rune has it structurally (RUNE_PROVEN); its urgency comes from consolidation corruption (S049/S050), not from CLS.
|
||||
- Retention of exact sources. NOT because reconsolidation needs them (the biology discards — S026) but because iterative summarization measurably drifts (S049) and the consolidation pipeline itself corrupts (S050).
|
||||
- Update gating by prediction error. When new evidence contradicts a belief, update; mere retrieval changes nothing. (S017's gate, reframed through S029's latent-cause account as ordinary belief-updating.)
|
||||
- Interference management. Catastrophic interference is real in ML (S045); Rune's exact store + supersession + dedupe is the pattern-separation answer.
|
||||
|
||||
**Does not transfer:**
|
||||
- The biological dynamics (replay during sleep, decay constants, neuromodulation). Rune has no sleep; its "fast store" is a database with perfect fidelity.
|
||||
- Reconsolidation as a phenomenon to imitate. Pharmacologically contested (S018-020); the useful atom (update-on-violation) is captured by plain belief-updating.
|
||||
- Schema detection as a mechanism. In biology it is implicit in learned representations; in Rune it would be an explicit, error-prone classifier.
|
||||
- Utility signals without an outcome stream. Mattar-Daw "need" requires measuring future value; Rune cannot measure that yet.
|
||||
|
||||
## 3. The corrected rationale for Rune's pipeline
|
||||
|
||||
R0 said: CLS justifies episode→observation→belief→procedure with a schema fast path, utility prioritization, and reconsolidation-style updates. R1 corrects: the pipeline is justified by (a) drift-correction economics (exact sources are the only defense against measured consolidation corruption), (b) interference management (dedupe/supersede/exact quotes), (c) prediction-error-gated updates (contradiction-triggered, event-driven), and (d) independence-gated promotion (because frequency is gameable and unvalidated). Schema fast paths and utility prioritization are experiments, not architecture.
|
||||
|
||||
## 4. Experiments this domain requires (in order)
|
||||
1. **Drift-metered consolidation**: measure factual-consistency of derived claims vs immutable sources per run. Rejection criterion: drift <1% unguarded → drop the meter.
|
||||
2. **Promotion-gate A/B**: independence-gated vs wash_count-gated promotion; metric = promoted-belief retraction rate.
|
||||
3. **Consolidation trigger A/B**: event-driven (contradiction-triggered) vs periodic sweep; metrics = update latency, missed updates, LLM calls.
|
||||
4. **Prioritization A/B**: recency vs utility vs dedup+diversity sampling; metric = lesson quality (retraction/contradiction rates).
|
||||
5. **Shadow mode**: shadow-vs-direct promotion retraction comparison over 50 promotions.
|
||||
|
||||
## 5. What would change this conclusion
|
||||
- A credible "summarize-and-discard works fine" result (would force re-examination of retention).
|
||||
- Consolidation-lag evidence showing nightly updates are user-painful (would revive the schema fast path).
|
||||
- An outcome-stream making utility measurable (would upgrade C003 from experiment to design input).
|
||||
- Replication of schema-acceleration as consolidation-specific (would strengthen C002).
|
||||
|
||||
## 6. Remaining unknowns (bounded)
|
||||
- Whether Rune's consolidation is atomically checkpointed end-to-end (code verification, not research).
|
||||
- Optimal independence-test depth (2 chains? 3?) — needs the promotion A/B.
|
||||
- Whether interval-confidence elicitation helps on local models (child Q's open question, shared).
|
||||
|
||||
## 7. Production implementation
|
||||
NONE. This tranche is research only. Everything above enters T1 as design input and experiment protocol.
|
||||
@@ -0,0 +1,125 @@
|
||||
{
|
||||
"note": "Narrow, falsifiable claims. external_status: EXTERNALLY_ESTABLISHED|CONTESTED|WEAK. rune_status: RUNE_APPLICABLE|RUNE_HYPOTHESIS|RUNE_EXPERIMENTALLY_SUPPORTED|RUNE_PROVEN.",
|
||||
"claims": [
|
||||
{
|
||||
"claim_id": "CLS-R1-C001",
|
||||
"claim": "Fast exact episodic capture + slow statistical generalization is the right two-layer split for Rune",
|
||||
"evidence_for": ["S001 core CLS logic", "S045 catastrophic interference REAL in ML", "S041 episodic fast store validated as engineering lever", "S049 semantic drift from lossy consolidation documents what happens without the split"],
|
||||
"evidence_against": ["S047 two-stores is trivial engineering (LSM-tree) needing no CLS", "S048 neuro-metaphor seduction", "S051 biological dynamics (replay/sleep) not present in software"],
|
||||
"external_status": "EXTERNALLY_ESTABLISHED (as engineering pattern; CLS's interference-management content adds justification)",
|
||||
"rune_status": "RUNE_APPLICABLE (T0: two writers exist structurally; T0.1 leak = implementation gap not design gap)",
|
||||
"architecture_impact": "HIGH",
|
||||
"falsifier": "F1: if single-store designs match two-store on drift+interference metrics at Rune scale, the split is preference",
|
||||
"experiment_required": true,
|
||||
"classification": "COVERED (architecture) — implement cleanly"
|
||||
},
|
||||
{
|
||||
"claim_id": "CLS-R1-C002",
|
||||
"claim": "Schema-gated rapid consolidation (fast path) is justified for Rune",
|
||||
"evidence_for": ["S003 Tse 2007 (rats, replicated in-lab)", "S005 McClelland 2013 principled revision", "S006 human fMRI echo"],
|
||||
"evidence_against": ["S007 rapid learning WITHOUT hippocampus (alternative route)", "S008 amnesic failures of fast mapping", "adversarial#2: encoding-level prior-knowledge benefit equally live; food-reward rat paradigm; mechanism contested at publication"],
|
||||
"external_status": "CONTESTED (effect real; MECHANISM and hippocampal-independence interpretation contested)",
|
||||
"rune_status": "RUNE_HYPOTHESIS",
|
||||
"architecture_impact": "MEDIUM",
|
||||
"falsifier": "F2: if fast-path promotions show higher retraction rates than slow-path, revert",
|
||||
"experiment_required": true,
|
||||
"classification": "EXPERIMENT (fast path with shadow-mode + retraction-rate kill criterion)"
|
||||
},
|
||||
{
|
||||
"claim_id": "CLS-R1-C003",
|
||||
"claim": "Consolidation should be utility-prioritized (expected future value), not recency/frequency-based",
|
||||
"evidence_for": ["S012 Mattar & Daw: prioritization by gain+need, NOT recency", "S011 reward-gating precursor", "S037 PER validates prioritization as lever (with bias caveat)"],
|
||||
"evidence_against": ["adversarial#3: model is maze-navigation-specific; NO transfer evidence to semantic consolidation", "S038 uniform replay often matches PER", "S039 single-criterion prioritization unstable", "Rune's own wash_count (frequency) never validated as quality signal (T0.1)"],
|
||||
"external_status": "EXTERNALLY_ESTABLISHED (in navigation/RL) / TRANSFER_UNPROVEN (to semantic memory consolidation)",
|
||||
"rune_status": "RUNE_HYPOTHESIS",
|
||||
"architecture_impact": "MEDIUM",
|
||||
"falsifier": "F3: if utility-weighted consolidation produces no measurable lesson-quality improvement over recency+dedup baselines, use the simple version",
|
||||
"experiment_required": true,
|
||||
"classification": "EXPERIMENT (utility signal must be measured, not assumed; simple baseline first)"
|
||||
},
|
||||
{
|
||||
"claim_id": "CLS-R1-C004",
|
||||
"claim": "Covering episodes must be retained after generalization (no destructive consolidation)",
|
||||
"evidence_for": ["S026 transformation theory: details are LOST — retention fights biology but preserves verifiability", "S049 SSGM: semantic drift from lossy summarization; immutable ledger is the fix", "S050 TRUSTMem: consolidation pipeline itself corrupts (79%/50% reduction when guarded)", "S052 summarization hallucination", "S053 DRM gist falsification"],
|
||||
"evidence_against": ["adversarial#4 FAILED: no 'summarize-and-discard works fine' evidence found; biology discards freely (S026)", "storage cost is real"],
|
||||
"external_status": "EXTERNALLY_ESTABLISHED (as engineering requirement — drift correction; NOT as biological requirement)",
|
||||
"rune_status": "RUNE_APPLICABLE (append-only entries already PROVEN in Rune)",
|
||||
"architecture_impact": "HIGH",
|
||||
"falsifier": "F5: if consolidation-without-retention shows no drift/corruption in controlled Rune test, retention is preference",
|
||||
"experiment_required": false,
|
||||
"classification": "ADOPT (already Rune doctrine; rationale CORRECTED from reconsolidation to drift-correction)"
|
||||
},
|
||||
{
|
||||
"claim_id": "CLS-R1-C005",
|
||||
"claim": "Reconsolidation (retrieval-triggered lability) maps to Rune supersession",
|
||||
"evidence_for": ["S015 anchor phenomenon", "S017 prediction-error gate is a real mechanism", "S029 latent-cause framing: reconsolidation = belief updating"],
|
||||
"evidence_against": ["S018/S019/S020 pharmacological foundation contested (temporary amnesia, reversal with time, nonspecific effects)", "adversarial#5: mapping to a phenomenon whose existence is pharmacology-dependent is speculation", "Rune supersession is WRITE-triggered not retrieval-triggered — the analogy was asserted in R0, not derived"],
|
||||
"external_status": "CONTESTED (rodent robust; human mixed; pharmacology-dependent)",
|
||||
"rune_status": "RUNE_HYPOTHESIS (weak)",
|
||||
"architecture_impact": "LOW",
|
||||
"falsifier": "F4: if reconsolidation's useful property (update-on-retrieval) is fully captured by plain belief-updating (S029), drop the neuroscience framing entirely",
|
||||
"experiment_required": false,
|
||||
"classification": "REJECT the reconsolidation FRAMING; KEEP plain belief-updating with prediction-error gating (S017's gate is the transferable part)"
|
||||
},
|
||||
{
|
||||
"claim_id": "CLS-R1-C006",
|
||||
"claim": "Independent-evidence corroboration should gate promotion (not frequency/wash_count)",
|
||||
"evidence_for": ["S017 prediction-error/independence gates exist in biology", "S054 injection threat makes write-path validation distinct from dedup", "Rune wash_count demonstrably unvalidated (T0.1: superseded entries with high counts)"],
|
||||
"evidence_against": ["S046 11/18 neural recommenders failed vs simple baselines", "adversarial#6: corroboration = ensemble voting hygiene, no memory theory needed"],
|
||||
"external_status": "EXTERNALLY_ESTABLISHED (as hygiene)",
|
||||
"rune_status": "RUNE_APPLICABLE (problem proven: frequency gating is gameable and unvalidated)",
|
||||
"architecture_impact": "MEDIUM",
|
||||
"falsifier": "If dedup+recency matches corroboration-gated promotion on lesson quality, use simple version",
|
||||
"experiment_required": true,
|
||||
"classification": "ADAPT (independence test as promotion criterion; simple implementation first)"
|
||||
},
|
||||
{
|
||||
"claim_id": "CLS-R1-C007",
|
||||
"claim": "Consolidation introduces errors an exact store wouldn't have (gist hallucination/drift)",
|
||||
"evidence_for": ["S052 summarization hallucination (ACL 2020)", "S053 DRM", "S049 SSGM drift documented", "S050 TRUSTMem measured consolidation corruption"],
|
||||
"evidence_against": ["S033 sleep REDUCED false memories (biology direction contested)", "none in software — drift is well-documented"],
|
||||
"external_status": "EXTERNALLY_ESTABLISHED (in software)",
|
||||
"rune_status": "RUNE_APPLICABLE (Rune consolidates via LLM summarization — same mechanism)",
|
||||
"architecture_impact": "HIGH",
|
||||
"falsifier": "none plausible — mitigation is the question, not existence",
|
||||
"experiment_required": false,
|
||||
"classification": "ADOPT mitigations: consolidate from immutable sources only; quote-verification before promotion; drift tests"
|
||||
},
|
||||
{
|
||||
"claim_id": "CLS-R1-C008",
|
||||
"claim": "Evidence→episode→observation→belief→procedure progression with deterministic state transitions and LLM-only content operations",
|
||||
"evidence_for": ["S001/S044 CLS stage structure", "S029 latent-cause: updating = inference (LLM content ops) over deterministic state", "S041 episodic control (fast layer engineering-validated)", "Rune T0: state transitions already deterministic; promotion gate exists"],
|
||||
"evidence_against": ["stage boundaries are Rune's construct, not CLS's — CLS has two stores, not five stages", "over-engineering risk (meta-review #3)"],
|
||||
"external_status": "EXTERNALLY_ESTABLISHED (as two-layer); the 5-stage elaboration is RUNE-designed",
|
||||
"rune_status": "RUNE_APPLICABLE (transitions already deterministic; T0 PROVEN)",
|
||||
"architecture_impact": "MEDIUM",
|
||||
"falsifier": "if 5-stage bookkeeping adds friction without measurable lesson quality, collapse to 2-stage (episodes + consolidated)",
|
||||
"experiment_required": true,
|
||||
"classification": "ADAPT (keep progression but treat intermediate stages as labels on one store, not separate stores)"
|
||||
},
|
||||
{
|
||||
"claim_id": "CLS-R1-C009",
|
||||
"claim": "Shadow-mode provisional generalizations (behavioral-only until corroborated by independent episodes)",
|
||||
"evidence_for": ["S003/S005 interference-threshold logic supports probation", "S050 consolidation corruption risk argues for pre-promotion probation", "TiMem dual-buffer probation (prior closure O) — convergent design"],
|
||||
"evidence_against": ["no biological analog needed — this is engineering", "adds state complexity"],
|
||||
"external_status": "RUNE_HYPOTHESIS (engineering design informed by interference thresholds)",
|
||||
"rune_status": "RUNE_HYPOTHESIS",
|
||||
"architecture_impact": "MEDIUM",
|
||||
"falsifier": "if shadow-mode beliefs never differ from direct promotion outcomes in retrospective analysis, drop the mode",
|
||||
"experiment_required": true,
|
||||
"classification": "EXPERIMENT"
|
||||
},
|
||||
{
|
||||
"claim_id": "CLS-R1-C010",
|
||||
"claim": "Recency-based consolidation priority should be rejected",
|
||||
"evidence_for": ["S012 replay NOT recency-biased in biology", "S013 co-reactivation ↔ forgetting", "R0 rationale holds"],
|
||||
"evidence_against": ["S038 freshness dominates in RL replay buffers (recency has value!)", "adversarial#3: no transfer evidence either direction for semantic consolidation"],
|
||||
"external_status": "CONTESTED",
|
||||
"rune_status": "RUNE_HYPOTHESIS",
|
||||
"architecture_impact": "LOW",
|
||||
"falsifier": "if recency-weighted consolidation matches utility-weighted on lesson quality, the rejection is dogma",
|
||||
"experiment_required": true,
|
||||
"classification": "REFINED — reject recency-ONLY; do not assume utility-weighting either; benchmark both against dedup+diversity baseline"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
# R0 → R1 Reconciliation (#376 CLS)
|
||||
|
||||
_Every material R0 claim, revisited. R0 source: memory-atlas/families/complementary_learning_systems.md_
|
||||
|
||||
| R0 claim | R1 verdict | Why |
|
||||
|---|---|---|
|
||||
| Fast exact episodic storage + slow generalized knowledge is the right split | **CONFIRMED** (with rationale correction) | Survives adversarial pass as ENGINEERING pattern (S047 caveat noted); interference management (S045) is the transferable content, not the anatomy. Rune's gap is operational (index coverage), not architectural. |
|
||||
| Two stores / two writers analogy | **CONFIRMED** | Already RUNE_PROVEN structurally (T0); CLS adds justification via interference content; adversarial "it's just LSM" accepted as caveat, not defeat. |
|
||||
| Schema-gated fast path | **REFINED → DEFERRED-EXPERIMENT** | R0 said "justified by CLS"; R1: mechanism CONTESTED externally (encoding-vs-consolidation confound, S007/S008; adversarial#2), schema detection is a new error-prone component, and consolidation lag is unmeasured. Reclassified EXPERIMENT with a precondition (measure lag first). Evidence level downgraded from implied-strong to RUNE_HYPOTHESIS. |
|
||||
| Utility-prioritized consolidation | **REFINED** | R0 accepted Mattar-Daw transfer; R1: transfer to semantic consolidation UNPROVEN (adversarial#3), PER has documented fragilities (S038/S039), and Rune's own frequency signal was never validated. Reclassified: benchmark utility vs dedup+diversity baseline before any adoption; recency-only rejection itself downgraded to "benchmark it" (C010). |
|
||||
| Retained covering episodes | **CONFIRMED (rationale replaced)** | Adversarial#4 FAILED to kill the conclusion but SUCCEEDED against the rationale: not reconsolidation — DRIFT CORRECTION (S049/S050). Evidence level upgraded: RUNE_APPLICABLE with software evidence, not biological analogy. |
|
||||
| Shadow-mode provisional beliefs | **CONFIRMED as EXPERIMENT** | R0 hypothesis; R1 adds convergence (TiMem) + falsifiable kill criterion + leakage failure mode. |
|
||||
| Reconsolidation → supersession mapping | **OVERTURNED** | R0 asserted the mapping; R1: pharmacological foundation contested (S018-020), trigger mismatch (write vs retrieval), and S029's latent-cause account explains the same data as ORDINARY belief-updating — the neuroscience framing adds nothing. Keep supersession; keep the prediction-error GATE atom; drop the framing. (Also corrected: Nader & Hardt are PRO-reconsolidation — R0's assumption was inverted.) |
|
||||
| Independent-evidence corroboration gate | **CONFIRMED (evidence strengthened)** | R0 hypothesis; R1 adds: wash_count PROVEN unvalidated (T0.1), injection threat makes write-path validation distinct from dedup (S054), and the gate is implementable over existing provenance at zero schema cost. Still needs the retraction-rate experiment. |
|
||||
| Destructive consolidation rejection | **CONFIRMED (upgraded)** | R0 rejected on principle; R1: drift/corruption is MEASURED in software (S049/S050/S052) — the strongest evidence in the entire domain, and it's engineering evidence, not analogy. |
|
||||
| Recency-based consolidation rejection | **REFINED** | R0 rejected recency citing S012; R1: S038 shows freshness dominates in RL buffers — recency has documented value; the honest position is benchmark recency vs utility vs diversity, not dogma. |
|
||||
| Evidence→episode→observation→belief→procedure progression | **REFINED** | Keep the stages as LABELS on one store (T0-proven fields); do NOT materialize separate stores per stage. Over-engineering guard from meta-review. |
|
||||
| T1 impact = YES (three missing mechanisms) | **REFINED** | The three R0 mechanisms become: drift guards (ADOPT), independence gate (ADAPT), event-triggered consolidation (EXPERIMENT). Schema fast-path dropped from T1 scope to deferred-experiment. |
|
||||
|
||||
Tally: CONFIRMED 4 · REFINED 5 · OVERTURNED 1 · STILL_UNKNOWN 0 (all bounded into experiments).
|
||||
|
||||
Honest note: R0 was directionally right on every claim — but three of its rationale chains did not survive contact with the primary literature, and one mechanism (schema fast path) was prematurely promoted toward T1. That is exactly what R1 exists to catch.
|
||||
@@ -0,0 +1,3 @@
|
||||
# Sources Ledger (#376 R1)
|
||||
|
||||
Columns: source_id | title | authors | year | venue | DOI/arXiv/URL | peer-reviewed | primary/secondary | version | research question | mechanism | method | claims supported | claims contradicted | limitations | Rune relevance | confidence | read depth (ABSTRACT_ONLY/RELEVANT_SECTIONS/FULL_PAPER/CODE_AUDITED/REPLICATED)
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
# AA — Security / Memory Poisoning: R1 Domain Master
|
||||
## #402
|
||||
|
||||
**Executive summary:** TMA-NM (2606.24322) is the design law — content- and lineage-based trust are both launderable; trust MUST be bound at write time from input channel, elevated only via human/Sybil-resistant processes. MemCollusion (2608.01637) proves per-record trust scoring is unsound — taint must propagate to derived records.
|
||||
|
||||
**Attack landscape:** AgentPoison (NeurIPS 2024, >80% ASR <0.1% poison rate); PoisonedRAG (USENIX 2025, 90% ASR from 5 texts in 1M corpus); InjecMEM (COLM 2026, single-interaction injection); MemCollusion/Salami (81.3% save rate, 75% ASR — kills individual-record defenses); MPBench (systematic taxonomy — aggressive agents more exploitable); eTAMP (environment-observation-only poisoning); Sleeper poisoning (60-89% action success, dormant).
|
||||
|
||||
**Defenses:** TMA-NM origin binding (provable, machine-checked); CaMeL 2503.18813 (control/data-flow separation — memory reads are untrusted data, never trigger state mutations); trust-aware retrieval with temporal decay (2601.05504 — but thresholds brittle); forensic trajectory detection (2606.30566 — AUC 0.99 but 25-53% benign FPR; warning against recall-signal auto-quarantine); GRAB-RAG — sufficiency-based confidence cannot substitute for source-based trust.
|
||||
|
||||
**Design invariants for Rune:** (1) channel-bound trust, never laundered by summarization; (2) elevation only via human review or Sybil-resistant corroboration; (3) taint propagation through derived memories; (4) time-bounded re-verification; (5) quarantine as visible state, not silent deletion.
|
||||
|
||||
**SQLite transfer (highest of all domains):** origin_channel, trust_level (write-time bound), taint set, quarantined_at, supersession/rollback rows.
|
||||
|
||||
**Classification:** ADOPT (TMA-NM origin binding, CaMeL data-flow separation, taint propagation, quarantine-as-state); EXPERIMENT (temporal decay trust, forensic trajectory detection); REJECT (per-record trust scoring, sufficiency-based abstention for security). Evidence: EXTERNALLY_ESTABLISHED.
|
||||
|
||||
**R0:** CONFIRMED 3 · REFINED 2 · OVERTURNED 0 · Sum = 5.
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
# AB — Multimodal / Artifact Memory: R1 Domain Master
|
||||
## #403
|
||||
|
||||
**Executive summary:** Literature multimodal "memory" is never a second store — it is either a shared embedding space (Nomic Embed Vision 2406.18587 explicitly shares latent space with nomic-embed-text) or distilled artifacts (Voyager 2305.16291 code skills; Agent Workflow Memory 2409.07429 abstracted routines, +24.6%/+51.1% relative success). Screenshots in GUI agents are INPUT, not retained memory.
|
||||
|
||||
**Verdicts:**
|
||||
- **ADOPT**: artifact memory as metadata (path, hash, MIME, mtime, provenance — ledger already does this)
|
||||
- **ADAPT**: code-artifact distillations tied to outcomes (Voyager/AWM pattern)
|
||||
- **REJECT**: storing screenshots/images as memory entries (zero payoff evidence for text-first agent, real token/storage cost)
|
||||
- **FUTURE**: nomic-embed-vision into the EXISTING index (no second store) if a concrete "I saw that file/error before" retrieval failure appears — EXPERIMENT only then
|
||||
|
||||
**Evidence grades:** CLIP 2103.00020, Voyager, AWM, CogAgent = A (peer-reviewed); Nomic Embed Vision, OS-Copilot, surveys = B.
|
||||
|
||||
**R0 reconciliation:** CONFIRMED 2 · REFINED 1 · OVERTURNED 0 · Sum = 3.
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
# AC — Local / Offline Intelligence: R1 Domain Master
|
||||
## #404
|
||||
|
||||
**Executive summary:** Nomic Embed (2402.01613, TMLR) achieves cloud-parity embeddings locally — Rune's local embedding is evidence-backed, not convenience. BUT: no A/B evidence exists that small local models match cloud on consolidation-style summarization — that gap is the crux.
|
||||
|
||||
**Verdicts:**
|
||||
- **ADOPT**: local embedding (nomic-embed-text via Ollama — verified parity with Ada-002/emb-3-small on MTEB 2210.07316)
|
||||
- **REJECT**: local LLM consolidation (summarize/merge/rewrite facts) with small models — silent quality loss, unmeasurable without ground truth
|
||||
- **EXPERIMENT**: small local models for MECHANICAL ops only (dedup clustering, tag/title extraction, tool-call classification — MobileLLM 2402.14905 ICML 2024 covers exactly this class)
|
||||
- **FUTURE**: quantized consolidation; revisit when an ≤8B A/B study on memory-consolidation quality exists
|
||||
|
||||
**Evidence:** QLoRA 4-bit NF4 preserves task performance (2305.14314, NeurIPS 2023); quantization degradation predictable not chaotic (2103.13630); layer-pruning headroom (2403.17887, ICLR 2025). Asymmetry doctrine: consolidation is a rare background op — cloud for judgment-heavy, local for mechanical.
|
||||
|
||||
**R0 reconciliation:** CONFIRMED 2 · REFINED 1 · OVERTURNED 0 · Sum = 3.
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
# AD — Hardware / Resource Placement: R1 Domain Master
|
||||
## #405
|
||||
|
||||
**Executive summary:** "Memory-resident vs disk-backed" is VACUOUS below ~10^5 entries. All ANN-placement literature (HNSW 1603.09320 TPAMI 2018; DiskANN 2105.09613; SPANN 2111.08566 — both NeurIPS 2021) is calibrated at 10^6–10^9 points. vstash (2604.15484): vector+FTS5 hybrid in a single SQLite file at 20.9ms median latency at 50,000 chunks — 54× Rune's count.
|
||||
|
||||
**Rune arithmetic:** 924 × 768-dim float32 ≈ 2.7MB. Brute-force cosine is sub-millisecond. SQLite on NVMe + OS page cache = effectively memory-resident (sqlite.org/mmap.html); mmap optional copy-avoidance with documented failure modes.
|
||||
|
||||
**Verdicts:**
|
||||
- **ADOPT**: whole-store memory-residency as a side effect (SQLite on NVMe + page cache; optional mmap_size)
|
||||
- **REJECT**: DiskANN/SPANN-style disk-backed ANN (design point 10^9, not 10^3) and any dedicated vector database
|
||||
- **REJECT**: Pi placement for memory operations — no model capacity, no measurable benefit; current split (PC: Gitea/CI/Ollama; Pi: TLS/backup) matches the doctrine that placement follows capability
|
||||
- **FUTURE**: revisit only if the store crosses ~10^5 entries (vstash shows the SQLite stack holds well past that)
|
||||
|
||||
**R0 reconciliation:** CONFIRMED 1 · REFINED 2 · OVERTURNED 0 · Sum = 3.
|
||||
@@ -0,0 +1,17 @@
|
||||
# AE — Memory Evaluation / Benchmark Science: R1 Domain Master
|
||||
## #406
|
||||
|
||||
**Executive summary:** R0's LoCoMo critique CORROBORATED (6.4% wrong answer key; ~63–64% judge wrong-accept — directional, via secondary reporting; full-context baseline ~73% J beats Mem0's best ~68% per Zep's released eval code). New failure mode beyond R0: scoring-target noninvariance (2605.24060) flips benchmark conclusions on 83–94% of shared LoCoMo/LongMemEval queries depending on which derived form gets retrieval credit.
|
||||
|
||||
**Minimal viable evaluation for a single-user store with no ground truth:**
|
||||
1. Hand-curated ~50–100 question probe set over Rune's own history (abstention questions verifiable with zero ground truth) — LongMemEval 2410.10813 ICLR 2025 taxonomy: temporal, update, abstention
|
||||
2. Ledger-derived end-task outcome metrics — τ-bench pattern (2406.12045): compare final DB state vs goal state; pass^k reliability
|
||||
3. Hybrid-retrieval disagreement as continuous label-free health signal (vstash: 74.5% of queries produce top-10 disagreement between lexical and dense lanes)
|
||||
|
||||
**Verdicts:**
|
||||
- **REJECT**: running LoCoMo/MemBench (wrong population: multi-persona synthetic chat, not coding traces; known scoring pathologies)
|
||||
- **ADAPT**: LongMemEval question taxonomy; judge use only with FairEval position calibration (2305.17926: ordering alone flips 66/80 verdicts; MT-Bench 2306.05685: ~80% agreement with position/verbosity bias)
|
||||
- **ADOPT**: the three-part minimal eval above
|
||||
- **EXPERIMENT**: pass^k reliability across repeated sessions
|
||||
|
||||
**R0 reconciliation:** CONFIRMED 2 · REFINED 2 · OVERTURNED 0 · Sum = 4.
|
||||
@@ -0,0 +1,68 @@
|
||||
# #377 R1 — 00_issue_scope.md
|
||||
|
||||
## Core question
|
||||
|
||||
What distinctions and mechanisms established by human memory and cognitive-science
|
||||
research are genuinely useful for Rune's Memory architecture, and which should be
|
||||
rejected as biological detail, misleading metaphor, or human failure mode?
|
||||
|
||||
## Investigative scope (30 areas per mandate)
|
||||
|
||||
1. episodic memory; 2. semantic memory; 3. autobiographical memory;
|
||||
4. prospective memory; 5. working memory; 6. procedural memory;
|
||||
7. source memory; 8. familiarity vs recollection; 9. cue-dependent recall;
|
||||
10. context-dependent recall; 11. temporal memory; 12. prospective
|
||||
obligations/reminders; 13. encoding vs storage vs retrieval failure;
|
||||
14. consolidation; 15. reconsolidation/update; 16. interference;
|
||||
17. forgetting; 18. retrieval-induced forgetting; 19. spacing effects;
|
||||
20. testing/retrieval-practice effects; 21. false memories;
|
||||
22. misinformation effects; 23. source-monitoring errors;
|
||||
24. confidence/metamemory boundaries; 25. salience/emotion (mechanics only);
|
||||
26. memory transformation over time; 27. schema effects (delta only vs #376);
|
||||
28. distortions from repeated summarization/reconstruction;
|
||||
29. prospective cues and event-triggered remembering;
|
||||
30. unavailable vs inaccessible vs forgotten vs overwritten.
|
||||
|
||||
## R0 hypotheses under re-evaluation (NOT accepted)
|
||||
|
||||
H1: prospective memory → typed obligation rows with trigger field.
|
||||
H2: episodic vs semantic → entry-kind distinctions.
|
||||
H3: autobiographical → session/task narrative records.
|
||||
H4: source memory → mandatory origin fields.
|
||||
H5: recollection/familiarity → exact/lexical vs semantic retrieval analogy.
|
||||
H6: cue/context recall → task/session scoping.
|
||||
H7: reconsolidation → supersession analogue (ALREADY OVERTURNED by #376 R1:
|
||||
reconsolidation framing rejected; prediction-error-gated updating kept).
|
||||
H8: spacing → reactivation-driven consolidation priority.
|
||||
H9: confidence → evidence-linked rather than self-reported.
|
||||
H10: RIF → reject imitation.
|
||||
H11: false-memory research → anti-pattern/design constraint.
|
||||
H12: source-monitoring errors → provenance requirement.
|
||||
|
||||
H7 incorporates #376's correction: the reconsolidation→supersession mapping
|
||||
is dead. This tranche must not reintroduce it; the prediction-error-gate atom
|
||||
survives independently (Sevenster/Beckers/Kindt 2014 via #376).
|
||||
|
||||
## Falsifiers
|
||||
|
||||
F1: If episodic/semantic/autobiographical are descriptive human taxonomies
|
||||
rather than computationally distinct processes, Rune must not materialize
|
||||
them as separate stores.
|
||||
F2: If prospective-memory findings primarily concern biological attentional
|
||||
limitations Rune does not share, they do not by themselves justify an
|
||||
"obligation memory" subsystem.
|
||||
F3: If familiarity/recollection evidence does not transfer cleanly to
|
||||
lexical/vector retrieval, reject that analogy.
|
||||
F4: If spacing/testing effects depend strongly on human neural learning
|
||||
rather than information availability, do not use them as consolidation policy.
|
||||
F5: If human forgetting mechanisms mostly exist because biology is
|
||||
resource-limited in ways Rune is not, Rune should solve overload with
|
||||
indexing, cooling and paging instead of imitating forgetting.
|
||||
F6: If human metamemory confidence is systematically unreliable, do not map
|
||||
human confidence mechanisms directly to Rune trust.
|
||||
|
||||
## Stopping criterion
|
||||
|
||||
Evidence saturation: new sources repeat known mechanisms/criticisms, add
|
||||
only detail. No arbitrary paper-count target — but a few paragraphs and a
|
||||
handful of citations are NOT sufficient for a foundational field.
|
||||
@@ -0,0 +1,85 @@
|
||||
# #377 R1 — 01_inward.md
|
||||
|
||||
## Current Rune mechanisms mapped to human-memory questions (evidence-first)
|
||||
|
||||
_Source: direct read-only inspection of memory.db (924 entries) + T0/T0.1
|
||||
archaeology. Status vocabulary: PROVEN / IMPLEMENTED_UNPROVEN /
|
||||
DESIGNED / DORMANT / ABSENT / BROKEN._
|
||||
|
||||
### Canonical entries and kinds
|
||||
- kinds present: `fact` (729), `neuron` (195). NO episodic/semantic/
|
||||
autobiographical/procedural/prospective kinds exist. Memory_type column
|
||||
exists but R0 found only `associative` populated.
|
||||
- Status: PROVEN (counts), but kind coverage is NARROW — H2 (entry-kind
|
||||
distinctions) would be NEW schema, not a rename.
|
||||
|
||||
### Facts vs neurons
|
||||
- Neurons (195) = warm-neuron activation rows with wash_count history;
|
||||
facts (729) = durable content. 304 entries have wash_count>0.
|
||||
- Status: PROVEN. Use-history exists but T0.1 found it unvalidated as
|
||||
quality signal (superseded entries carry high wash counts).
|
||||
|
||||
### Retrieval lanes
|
||||
- Dense: 420/924 entries have vectors (sqlite-vec, 256-d). FTS5/BM25:
|
||||
560 rows. Hybrid recall dense+BM25+RRF+floor: PROVEN (T0).
|
||||
- T0.1 R3: 439/838 active entries retrievable by NEITHER index.
|
||||
- Recollection/familiarity analogy (H5) would map to exact/lexical vs
|
||||
vector lanes — lanes exist (PROVEN), the ANALOGY is untested.
|
||||
|
||||
### Temporal fields
|
||||
- valid_from non-null on all 924; valid_until on 56 (supersession-derived).
|
||||
- Status: IMPLEMENTED_UNPROVEN for tri-timestamp semantics — fields exist,
|
||||
retention policy and record-time query path unproven (T0 AS-IS).
|
||||
|
||||
### Provenance/source/method
|
||||
- Columns: `source`, `method` (values: curator 679, dedupe_policy 165,
|
||||
directive 34, migrate_blocks 22, warm_router 6, record 5). NO `origin`
|
||||
column — R0's "mandatory origin field" (H4) is DESIGNED, not present.
|
||||
- `derived_from` edge: ABSENT (#376 R1 finding).
|
||||
- Confidence column exists (IMPLEMENTED_UNPROVEN — calibration unknown).
|
||||
|
||||
### Trust
|
||||
- NO `trust_level` column — trust lifecycle (provisional/validated/locked)
|
||||
lives in governance scripts, not as entry state. UNKNOWN state: ABSENT.
|
||||
- H9 (evidence-linked confidence): DESIGNED.
|
||||
|
||||
### Supersession
|
||||
- 56 superseded rows retained; valid_until set. PROVEN. Write-triggered
|
||||
(not retrieval-triggered) — #376 R1 overturned the reconsolidation
|
||||
mapping; prediction-error gate atom survives.
|
||||
|
||||
### Obligations/task systems
|
||||
- No obligation entry kind. Task system (auto_tasks.db, 2 tasks) and
|
||||
PendingOperation machinery exist SEPARATELY from Memory.
|
||||
- H1 (obligation rows in Memory) would be NEW — the boundary question
|
||||
(§10) is live: obligation-as-Memory vs Memory-as-evidence-for-tasks.
|
||||
|
||||
### Persona/relationship memory
|
||||
- No dedicated persona/relationship kinds. Persona lives in constitution
|
||||
files; relationship memory is implicit in facts.
|
||||
- Status: ABSENT as memory kinds.
|
||||
|
||||
### Consolidation and failure learning
|
||||
- Consolidation → knowledge.json: PROVEN to run; trigger non-deterministic
|
||||
(agent-invoked; no cron — T0.1 R5).
|
||||
- promotion_eligible flag exists; wash_count feeds it (unvalidated).
|
||||
- knowledge.json: derived artifact, source-attributed.
|
||||
|
||||
### Warm Neurons
|
||||
- 195 neuron rows; tier='warm' on ALL 924 rows = vestigial (T0.1 R4).
|
||||
- Wash/use history PROVEN; activation ≠ truth doctrine stated but the
|
||||
scoring (wash_count+importance) is frequency-only (NFU-like per #376/#385).
|
||||
|
||||
## Where R0 renamed software without proving transfer
|
||||
1. "Episodic vs semantic → entry kinds": Rune has NO such kinds; calling
|
||||
facts-vs-chronicles "episodic/semantic" would rename an ABSENT
|
||||
distinction. Transfer must be EARNED, not asserted.
|
||||
2. "Recollection/familiarity → exact/vector": lanes exist, but dual-process
|
||||
theory adds nothing until a retrieval-routing decision cites it.
|
||||
3. "Cue/context recall → task scoping": scoping exists (session/task keys);
|
||||
Godden & Baddeley add no mechanism.
|
||||
4. "Spacing → reactivation priority": wash_count already counts
|
||||
reactivation; Cepeda adds nothing unless a spacing SCHEDULE is proposed.
|
||||
5. "Prospective memory → obligation rows": the boundary question is
|
||||
unresolved; R0 assumed the answer (Memory) without arguing against
|
||||
task-system ownership.
|
||||
@@ -0,0 +1,9 @@
|
||||
# 02 — OUTWARD (populated by deep-research actor; verified by controller)
|
||||
|
||||
Files: taxonomy_of_memory.md, episodic_semantic_memory.md,
|
||||
autobiographical_memory.md, prospective_memory.md, source_memory.md,
|
||||
working_memory.md, procedural_memory.md, cue_context_retrieval.md,
|
||||
temporal_memory.md, forgetting_interference.md, false_memory_source_errors.md,
|
||||
spacing_testing_learning.md, consolidation_retrieval_update.md,
|
||||
competing_models.md, criticisms_replication.md, software_transfer.md
|
||||
+ sources.md (ledger) + claims.json (machine-readable).
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
# Autobiographical memory
|
||||
|
||||
Conway & Pleydell-Pearce (2000) SMS: generative construction yoked to identity goals. Adversarial #6 SUCCEEDS: this is the confabulation engine a truth-preserving store must NOT imitate (identity-flattering reconstruction, telescoping, goal-consistent distortion).
|
||||
|
||||
Rune use: session/task narratives exist (COVERED as chronicles); any "life-story synthesis" must be fenced from the evidence store and labeled generated. Take only a warning label.
|
||||
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
# Competing models / disputes
|
||||
|
||||
- Systems vs processes: Foster & Jelicic 1999; Roediger/Buckner/McDermott 1999-style process critiques; Schacter & Tulving 1994. Psychologists' own failure to agree on system count = evidence software should not hard-code one taxonomy (adversarial #8).
|
||||
- Unitary vs dual-process recognition: Wixted 2007 / Dunn 2004 / Wixted & Mickes 2010 vs Yonelinas 1994. Live dispute; software mapping built on it is sand.
|
||||
- Working memory: Baddeley boxes vs Cowan activation vs Engle attention. Active contest.
|
||||
- Inhibition vs interference (RIF mechanism); storage-loss vs retrieval-failure; reconstructive (Bartlett) vs trace views; modularity (Squire) vs distributed processing.
|
||||
- Functional accounts: Nairne survival-processing; Henke 2010 processing-modes — dissolve store boundaries into processes/functions.
|
||||
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
# Consolidation / retrieval / updating (delta vs #376)
|
||||
|
||||
No deep duplication of #376 CLS per mandate. #376 R1 already: overturned reconsolidation→supersession mapping; kept prediction-error-gated updating; confirmed retained covering episodes (rationale = drift correction); rejected destructive consolidation.
|
||||
|
||||
Human-memory additions from this tranche: Fuzzy Trace verbatim/gist opponent processes (Brainerd & Reyna) — store both, expect gist to outlive detail; Bartlett schema-assimilation across retellings — minimize re-encoding retrieved outputs; reconsolidation boundary conditions (Sevenster prediction-error gate, via #376) — update-on-violation, not on retrieval.
|
||||
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
# Criticisms / replication / negative evidence
|
||||
|
||||
- RIF: small effect + publication bias (Murayama 2014); reliability weak (Potts 2012; Eur Psychologist 2011; Frontiers 2014); inhibition signature often fails (Camp 2007).
|
||||
- Misinformation boundaries: McCloskey & Zaragoza 1985; recent high-powered boundary work.
|
||||
- Godden & Baddeley 1975: N=18, small-N legacy; Smith & Vela 2001: small/fragile overall.
|
||||
- DRM ecological validity (Pezdek & Lam 2007); Shaw & Porter 2015 rate disputes.
|
||||
- WEIRD populations; lab-vs-naturalistic prospective-memory gaps; measurement confounds (remember/know, ROC procedures).
|
||||
- Consolidation-hallucination links contested/mixed (Darsaud; Calvillo 2016).
|
||||
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
# Retrieval: cues, context, recognition
|
||||
|
||||
**Encoding specificity: Tulving & Thomson (1973), Psych Review 80(5) (~4690 cites).** Retrieval succeeds to the degree cues reinstate encoding conditions. ROBUST principle, boundaries debated. Bearing: store encoding context alongside content; match on cues present at write.
|
||||
|
||||
**Availability vs accessibility: Tulving & Pearlstone (1966, JVLVB).** Unrecallable-under-one-cue items become available under another — failure is often accessibility, not erasure. ROBUST; designated THE key distinction. Bearing: default to retrieval-failure hypothesis before deletion; forgetting policy gates on demonstrated inaccessibility across cues, never single failed recall.
|
||||
|
||||
**Context-dependence: Godden & Baddeley (1975, BJP 66:325-331)** — divers, N=18, WEAK-evidence legacy. **Smith & Vela (2001)** synthesis: overall effect small/fragile; reinstatement helps mainly with impoverished cues. CONTESTED/small-effect. State-dependence similarly fragile. Bearing: context tags help; expect small gains; never rely on context match alone.
|
||||
|
||||
**Recognition vs recall; recollection vs familiarity:** Yonelinas (1994) dual-process vs Wixted unitary-strength (2007; Wixted & Mickes 2010). CONTESTED — both fit much data; measurement confounds. Adversarial #4 SUCCEEDS: do not reify two hardware systems; keep two retrieval GRADES (detail-bearing vs bare signal) as outputs; track confidence separately. Bearing: the lexical/vector mapping inherits a live dispute — justify hybrid retrieval by IR engineering only.
|
||||
|
||||
**Retrieval competition, temporal order, partial cues:** cue-overload competition ROBUST; temporal-order memory error-prone/reconstructive; partial cues help only when encoding-compatible (encoding-specificity corollary).
|
||||
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
# Episodic / semantic memory
|
||||
|
||||
See taxonomy (Tulving 1972/1985/2002). Status: ROBUST descriptive; CONTESTED as strict neural systems (adversarial #1: Henke 2010 processing-modes; systems-vs-processes debate; Vargha-Khadem 1997 amnesic dissociations preserve a weak distinction).
|
||||
|
||||
Bearing for Rune: strongest candidate for two store-types (event records with source/context vs distilled durable claims) — but as QUERY-TIME TAGS, never schema partition (adversarial verdict). F1 falsifier stands: descriptive taxonomy ≠ computational process split.
|
||||
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
# False memory / source errors
|
||||
|
||||
**DRM: Roediger & McDermott (1995, JEP:LMC 21(4):803-814; Deese 1959).** Lure recalled ~40-55%, recognized at studied-item rates, ~72% "remember" judgments. ROBUST, heavily replicated; ecological-validity critiques (Pezdek & Lam 2007). Bearing: associative retrieval generates confident false positives — penalize gist-only matches lacking verbatim support.
|
||||
|
||||
**Fuzzy Trace Theory: Brainerd & Reyna (2002, Curr Dir Psych Sci 11(5):164-169; 2005 OUP book).** Parallel verbatim (decays fast) + gist (persists) traces; false memory = gist-supported + verbatim-unsuppressed; signature predictions: delay increases false memory while true decays; developmental reversal (older show MORE DRM false memory). ROBUST alternative to unitary-trace views. Bearing: store BOTH verbatim detail and gist; expect gist to outlive detail; gist-vs-verbatim contradiction should trigger verification, not averaging.
|
||||
|
||||
**Reconstruction: Bartlett (1932, Remembering).** Repeated reproduction rationalizes toward schemas. Foundational; direct replication difficult (Bergman & Roediger 1999 partial), schema-consistent distortion ROBUST via successors. Bearing: each retrieval-rewrite cycle risks schema assimilation — minimize re-encoding retrieved outputs as new entries without provenance.
|
||||
|
||||
**Rich false memories: Shaw & Porter (2015, Psych Sci 26:291-301)** — whole-event implantation possible with suggestive pressure (~70%, coding-dependent). CONTESTED rates, ROBUST possibility.
|
||||
|
||||
**Misinformation: Loftus & Palmer (1974, JVLVB 13(5):585-589); Loftus, Miller & Burns (1978).** Post-event narrative blends with/overwrites original; grows with delay, lowers with discrepancy detection. ROBUST core; CONTESTED mechanism (McCloskey & Zaragoza 1985: modified tests reduce apparent impairment). Bearing: post-event inputs (corrections, restatements, tool outputs) can corrupt originals — keep original vs amendment separated with source tags.
|
||||
|
||||
**Confidence-accuracy: Wixted & Wells (2017) eyewitness family; Koriat metamemory.** Confidence malleable (feedback, repetition), often miscalibrated. ROBUST dissociation. Bearing: never confidence-as-accuracy-proxy; track calibration separately.
|
||||
|
||||
**Cryptomnesia/reality monitoring/false fame (Jacoby et al. 1989, JPSP):** ROBUST demonstrations of origin confusion. Bearing: generation events labeled self-generated at write time.
|
||||
|
||||
All converge on: append-only + supersession-linking beats destructive consolidation (adversarial #10 FAILED as attack — Maynez 2020 + SSGM 2026 corroborate).
|
||||
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
# Forgetting / interference
|
||||
|
||||
Interference (proactive/retroactive) ROBUST since Underwood/McGeoch; pure trace-decay WEAK as sole account — most forgetting = cue-dependent inaccessibility + competition. Directed forgetting ROBUST as control phenomenon. Adaptive/intentional forgetting (Anderson & Hanslmayr) CONTESTED as unified mechanism.
|
||||
|
||||
**RIF: Anderson, Bjork & Bjork (1994, JEP:LMC 20(5):1063-1087).** ~10-13% effect; inhibition account. Status CONTESTED — real but fragile: Murayama et al. (2014, Psych Bulletin) meta-analysis small effect + publication bias; Raaijmakers/Verde interference alternatives; Potts et al. (2012) reliability weak; cue-independence (inhibition signature) often fails (Camp et al. 2007).
|
||||
|
||||
Bearing: do NOT implement inhibition-as-deletion — retrieval practice suppressing neighbors is exactly what a memory system must avoid; treat RIF as hazard (retrieval narrows access), not feature. Adversarial #7 SUCCEEDS: keep tiered storage; ban "forgetting" vocabulary; the one transferable rule = never delete, only de-index (availability vs accessibility).
|
||||
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
# Procedural memory
|
||||
|
||||
Squire declarative/nondeclarative split (ROBUST coarse). "How I do X" ≠ "what happened" — supports separating procedure traces from statable entries. NOT_RELEVANT as memory-store mechanism (skill runtime concern); relevant as taxonomy boundary.
|
||||
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
# Prospective memory
|
||||
|
||||
**Einstein & McDaniel (1990, JEP:LMC 16:717-726).** Event vs time-based; external event cues beat self-initiated time monitoring; age deficits larger for time tasks. **Sellen et al. (1997, Memory 4:483-507)** in-situ confirmation. ROBUST.
|
||||
|
||||
**Monitoring costs — PAM vs multiprocess:** Smith (2003) PAM (capacity-consuming preparatory monitoring; ongoing-task slowing) vs McDaniel & Einstein (2000 Applied Cog Psych; 2005) multiprocess (monitoring + spontaneous retrieval; salient/focal cues pop without cost); Reese & Cherry (2002) against constant monitoring (~2% reported thinking of intention). CONTESTED coexistence; pure-PAM rejected for mundane tasks.
|
||||
|
||||
**Interruption/resumption: Altmann & Trafton (2002)** goal-activation model: interruptions decay activation; resumption lag grows with length; reminders restore. **McDaniel et al. (2004, Applied Cog Psych 18:533-547):** delays degrade performance; external reminders eliminate interruption cost. ROBUST practical findings.
|
||||
|
||||
**Implementation intentions: Gollwitzer (1999, American Psychologist 54:493-503).** If-then plans substantially raise follow-through. ROBUST, large literature.
|
||||
|
||||
Bearing: prefer event-anchored triggers over pure time; time intentions need external scaffolding; support both spontaneous firing (salient cues) AND costly watch (non-focal); store intentions as cue→action pairs with explicit triggers + reminder scaffolding. BUT adversarial #2 (Risko & Gilbert 2016 offloading) says obligations belong OUTSIDE memory in a commitment authority — the obligation-entry-kind question is NOT settled by this literature (see 03_applicability).
|
||||
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
# Software transfer (placeholder — full chain in 03_applicability)
|
||||
|
||||
Transfer rule: HUMAN FINDING → GENERAL COMPUTATIONAL PRINCIPLE → SOFTWARE ANALOGUE → RUNE APPLICABILITY → RUNE PRESCRIPTION. If one arrow cannot be justified, stop the chain. Full treatment in 03_applicability.md; key results: availability/accessibility → retrieval-failure-before-deletion policy; encoding specificity → store encoding context; Fuzzy Trace verbatim/gist → dual representation with verification on conflict; offloading literature → obligations OUTSIDE memory; testing effect → reactivation-as-durability (not ranking).
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
# Source memory / monitoring
|
||||
|
||||
**Johnson, Hashtroudi & Lindsay (1993, Psych Bulletin 114(1):3-28).** Source attributions = decisions over features (perceptual, contextual, affective, cognitive-operations records), heuristic (fast) vs systematic (slow) judgments. External/internal/reality monitoring types. ROBUST/influential framework.
|
||||
|
||||
Bearing: every entry needs source features recorded at write; source judgments at READ are fallible decisions — provenance must be stored, not inferred. Adversarial #3: mechanism analogy backwards (Rune already has columns), but Johnson's cue inventory is a useful schema checklist; errors spike under similarity/time-pressure → predicts when retrieval needs provenance-weighted ranking.
|
||||
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
# Spacing / testing / reactivation
|
||||
|
||||
**Spacing: Cepeda et al. (2006, Psych Bulletin 132(3):354-380).** 839 assessments: spaced > massed in 259/271. Lag effects (Glenberg; Kahana); Bahrick et al. (1993) 9-year retention (56-day gaps optimal there). ROBUST — among psychology's most replicated. Mechanism accounts (encoding variability, study-phase retrieval, deficient processing) CONTESTED; multifactor prevails.
|
||||
|
||||
**Testing: Roediger & Karpicke (2006, Psych Sci 17(3):249-255); Karpicke & Roediger (2008, Science 319:966-968).** Repeated testing beats restudying on delayed retention; Butler (2010) superior transfer. Dunlosky et al. (2013) rates practice testing + distributed practice highest-utility. ROBUST. **Desirable difficulties: Bjork (1994) family** — effortful retrieval aids retention.
|
||||
|
||||
Bearing (adversarial #5 verdict): re-exposure scheduling is the one human effect safe to import as POLICY — but frequency ≠ spacing; the wash_count question resolves toward SPACED re-presentation, not raw repetition count. Allow reactivation into retention/tiering decisions; FORBID (or heavily discount) in relevance ranking. Spacing is acquisition-side; ranking is a separate judgment.
|
||||
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
# Taxonomy of memory (human literature)
|
||||
|
||||
**Tulving (1972)** episodic vs semantic (Organization of Memory; K.C. amnesic dissociations). Later: Tulving 1985 autonoetic/noetic; Tulving 2002 mental time travel. Status: ROBUST as descriptive distinction; CONTESTED as strict neural-systems claim.
|
||||
|
||||
**Squire (1992 Psych Review; Squire & Zola 1996 PNAS).** Declarative (hippocampal-dependent) vs nondeclarative (skills/habits/priming). ROBUST at coarse grain. Bearing: separate skill/procedure traces from statable entries.
|
||||
|
||||
**Conway & Pleydell-Pearce (2000, Psych Review 107(2):261-275).** Self-Memory System: autobiographical memory hierarchical (lifetime periods → general events → event-specific knowledge), reconstructed under working-self control; generative, not replay. ROBUST/influential. Bearing: warns against treating recalled episodes as verbatim logs.
|
||||
|
||||
**Baddeley & Hitch (1974); Baddeley (2000, TiCS 4(11), episodic buffer).** Dual-task interference basis. ROBUST framework, revised often. Competitor: **Cowan (1999)** embedded-processes (activated LTM + ~4-chunk focus); Engle executive-attention third pole. Active CONTEST. Bearing: do NOT hard-imitate slot buffers; transferable = capacity-limited active set + executive control (~4-chunk focus).
|
||||
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
# Temporal memory
|
||||
|
||||
Tri-timestamps already adopted from Graphiti (prior closure; COVERED). This literature adds: temporal-order memory is reconstructive and error-prone — "as-of" queries must trust stored timestamps, never reconstructed order. No new mechanism beyond prior closure; cross-reference #376-adjacent schema work minimally per mandate (no deep duplication).
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
# Working memory
|
||||
|
||||
Baddeley & Hitch 1974 / Baddeley 2000 (above) vs Cowan 1999 vs Engle. Active contest; do not hard-imitate boxes. Transferable: capacity-limited active set + executive control. NOT_RELEVANT as store concern (context window / skill runtime).
|
||||
|
||||
@@ -0,0 +1,109 @@
|
||||
# #377 R1 — 03_applicability.md
|
||||
|
||||
_For every surviving mechanism: the 19 applicability questions + the transfer
|
||||
chain HUMAN FINDING → GENERAL PRINCIPLE → SOFTWARE ANALOGUE → RUNE
|
||||
APPLICABILITY → RUNE PRESCRIPTION. Chain breaks are recorded, not smoothed._
|
||||
|
||||
## T1. Availability/accessibility distinction (Tulving & Pearlstone 1966)
|
||||
- Human finding: unrecallable-under-one-cue items become available under
|
||||
another — failure is often accessibility, not erasure.
|
||||
- Principle: retrieval failure ≠ storage loss.
|
||||
- Analogue: multi-cue retrieval + deletion gated on demonstrated
|
||||
inaccessibility across cues.
|
||||
- Rune: PROVEN problem (439/838 active entries unindexed — but those are
|
||||
AVAILABILITY failures, worse). Prescription: default to retrieval-failure
|
||||
hypothesis; forgetting/deletion policy requires demonstrated
|
||||
inaccessibility across cues, never single failed recall.
|
||||
- Owner: retrieval layer + deletion policy. LLM: none. Offline: yes.
|
||||
Century: yes. Cheapest: deletion-gate rule. EXTERNALLY_ESTABLISHED → RUNE_APPLICABLE.
|
||||
|
||||
## T2. Encoding specificity (Tulving & Thomson 1973)
|
||||
- Finding: retrieval succeeds to the degree cues reinstate encoding conditions.
|
||||
- Principle: store the conditions, not just the content.
|
||||
- Analogue: encoding-context metadata on entries (session/task/partition keys
|
||||
already exist; extend to query-relevant cue fields).
|
||||
- Rune: PARTIALLY solved (scoping exists). Prescription: extend stored context
|
||||
fields; retrieval matches on write-present cues. Owner: retrieval layer.
|
||||
|
||||
## T3. Fuzzy Trace verbatim/gist (Brainerd & Reyna 2002/2005)
|
||||
- Finding: parallel traces; gist persists, verbatim decays; false memory is
|
||||
gist-supported + verbatim-unsuppressed.
|
||||
- Principle: keep both representations; contradiction between them triggers
|
||||
verification, not averaging.
|
||||
- Analogue: store exact source text + distilled gist side by side (Rune
|
||||
already stores text; gist = summary field).
|
||||
- Rune prescription: verbatim/gist dual representation with
|
||||
conflict-triggered verification. Owner: Memory. Cheap: schema fields.
|
||||
EXTERNALLY_ESTABLISHED → RUNE_APPLICABLE. (Chain holds end to end.)
|
||||
|
||||
## T4. Source-monitoring cue inventory (Johnson 1993) — schema only
|
||||
- Per adversarial #3: mechanism backwards, inventory useful. Prescription:
|
||||
ensure origin/source/method/verbatim-detail/operation-record fields exist
|
||||
(partially present; origin column ABSENT → add). Owner: Memory schema.
|
||||
|
||||
## T5. Prospective cues → task authority, NOT memory (adversarial #2 wins)
|
||||
- Human finding: event cues beat time monitoring; monitoring costs are real;
|
||||
implementation intentions (cue→action pairs) work.
|
||||
- Principle: intentions need triggers + scaffolding.
|
||||
- Analogue: commitment state machine with trigger conditions.
|
||||
- Rune applicability: the OWNER is the task/commitment authority, NOT Memory
|
||||
(Risko & Gilbert 2016 offloading: externalize intentions). R0's H1
|
||||
(obligation rows IN Memory) is OVERTURNED as stated.
|
||||
- Prescription: obligations live in task system with open/kept/broken states;
|
||||
Memory holds evidence ABOUT commitments. Event-triggered remembering reuses
|
||||
PendingOperation machinery where applicable. Owner: task system.
|
||||
EXTERNALLY_ESTABLISHED → RUNE_APPLICABLE (with corrected owner).
|
||||
|
||||
## T6. Testing effect → durability signal only (adversarial #5 verdict)
|
||||
- Finding: retrieval strengthens the trace (Roediger & Karpicke 2006).
|
||||
- Principle: reactivation = durability event.
|
||||
- Analogue: reactivation count feeds retention/tiering.
|
||||
- Rune: allowed into retention decisions; FORBIDDEN in relevance ranking
|
||||
(category jump: learning schedule ≠ relevance score; rich-get-richer).
|
||||
- Owner: retention policy. Cheap: spaced-reactivation counter distinct from
|
||||
wash_count.
|
||||
|
||||
## T7. Misinformation/DRM → anti-pattern constraints
|
||||
- Findings: post-event blending (Loftus), gist false positives (DRM 40-55%
|
||||
recall, 72% "remember"), schema assimilation across retellings (Bartlett).
|
||||
- Principle: every transformation is a corruption opportunity.
|
||||
- Analogues: consolidate from immutable sources only; original-vs-amendment
|
||||
separation; penalize gist-only retrieval matches; minimize re-encoding
|
||||
retrieved outputs.
|
||||
- Rune: largely COVERED (append-only, supersession); ADD: gist-match penalty
|
||||
in retrieval scoring; re-encoding guard. Owner: Memory + retrieval.
|
||||
|
||||
## T8. RIF → hazard, never feature
|
||||
- Finding: retrieval practice suppresses competitors (~10-13%, fragile).
|
||||
- Rune: retrieval must not narrow access to neighbors. Prescription: no
|
||||
inhibition mechanism; monitor for retrieval-narrowing as a bug class.
|
||||
- Owner: retrieval layer. REJECT imitation (adversarial #7 supports).
|
||||
|
||||
## T9. Confidence-accuracy dissociation → calibration discipline
|
||||
- Finding: confidence malleable, miscalibrated (Wixted & Wells; Koriat).
|
||||
- Principle: never confidence-as-accuracy.
|
||||
- Analogue: evidence-linked confidence + separate calibration tracking.
|
||||
- Rune: confidence column exists (IMPLEMENTED_UNPROVEN). Prescription:
|
||||
calibration tracked per source/kind; self-reported confidence distrusted.
|
||||
- Owner: Memory schema + governance.
|
||||
|
||||
## T10. Context-dependence → small-gain tags (expectations capped)
|
||||
- Finding: real but small/fragile (Smith & Vela 2001); N=18 legacy.
|
||||
- Prescription: keep context tags; never rely on context match alone;
|
||||
measure gains before investing. Owner: retrieval.
|
||||
|
||||
## T11. Recognition grades without dual-process ontology
|
||||
- Per adversarial #4: keep two retrieval outputs (detail-bearing vs bare
|
||||
signal) + separate confidence; do NOT cite Yonelinas as architecture.
|
||||
- Owner: retrieval layer. Justification: IR engineering (child H), not
|
||||
psychology.
|
||||
|
||||
## T12. Autobiographical generativity → fence + label
|
||||
- Finding: SMS construction yoked to identity goals (Conway 2000).
|
||||
- Prescription: any life-story synthesis fenced from evidence store,
|
||||
labeled generated. Owner: Persona/presentation layer, never canonical Memory.
|
||||
|
||||
## Authority assignments (Q19)
|
||||
Memory owns: T1, T2, T3, T4, T6, T7, T8, T9, T10, T11. Task system owns: T5.
|
||||
Persona/presentation owns: T12. Retrieval layer implements: T1, T2, T8, T10, T11.
|
||||
No mechanism here belongs to Substrate, World Model, or Spine.
|
||||
@@ -0,0 +1,57 @@
|
||||
# #377 R1 — 04_innovation.md
|
||||
|
||||
_Falsifiable integration hypotheses only. Each: prior art, difference,
|
||||
advantage, cost, failure mode, benchmark, kill criterion._
|
||||
|
||||
## I1. Availability-gated deletion (prior art: HSM tiering policies)
|
||||
- Difference: deletion requires demonstrated inaccessibility across N
|
||||
independent cue sets + time window, not age or single failed recall.
|
||||
- Advantage: eliminates the worst deletion class (available-but-inaccessible).
|
||||
- Cost: bookkeeping per deletion candidate. Failure: gate too strict →
|
||||
unbounded growth (mitigate: tiering absorbs).
|
||||
- Benchmark: zero wrongful deletions on synthetic available-but-inaccessible
|
||||
probes. Kill: gate never fires in 6 months → simplify.
|
||||
|
||||
## I2. Verbatim/gist dual entries with conflict verification (prior art:
|
||||
Fuzzy Trace Theory; Rune text+summary fields)
|
||||
- Difference: explicit conflict detector — when gist contradicts verbatim
|
||||
detail, verification fires instead of averaging.
|
||||
- Advantage: catches consolidation drift at the representation level.
|
||||
- Cost: dual storage + detector. Failure: detector false positives annoy.
|
||||
- Benchmark: drift-detection rate on synthetic gist/verbatim conflicts.
|
||||
- Kill: no conflicts detected in production over 6 months → keep schema,
|
||||
drop detector.
|
||||
|
||||
## I3. Spaced-reactivation durability counter (prior art: Cepeda spacing;
|
||||
Anki/SRS scheduling)
|
||||
- Difference: separates durability counting (spaced re-presentations) from
|
||||
relevance ranking (topical fit) — two counters, two consumers.
|
||||
- Advantage: resolves the wash_count conflation T0.1 exposed.
|
||||
- Cost: one new counter + scheduler. Failure: scheduler complexity.
|
||||
- Benchmark: retention prediction accuracy vs wash_count.
|
||||
- Kill: no retention-prediction gain → drop.
|
||||
|
||||
## I4. Gist-match penalty in retrieval (prior art: DRM literature; child H
|
||||
reranking)
|
||||
- Difference: retrieval scores down-weight matches supported only by
|
||||
gist-level similarity without verbatim support, for factual queries.
|
||||
- Advantage: directly attacks the 40-55% DRM-style false-positive class.
|
||||
- Cost: scoring change. Failure: over-penalization hurts paraphrase recall
|
||||
(tune on paraphrase-vs-lure test set).
|
||||
- Benchmark: lure-rejection rate vs paraphrase-recall rate.
|
||||
- Kill: paraphrase recall drops >5% → revert.
|
||||
|
||||
## I5. Commitment-evidence linking (prior art: GTD trusted-system concept;
|
||||
Rune PendingOperation)
|
||||
- Difference: task-system commitments carry memory-evidence pointers
|
||||
(supporting entries), and memory entries ABOUT commitments link back —
|
||||
bidirectional without co-location (respects adversarial #2's ownership
|
||||
verdict).
|
||||
- Advantage: obligations auditable against evidence without living in Memory.
|
||||
- Cost: link maintenance. Failure: stale links.
|
||||
- Benchmark: commitment audit completeness on synthetic set.
|
||||
- Kill: links unused in 6 months → drop.
|
||||
|
||||
No manufactured novelty: I1 = HSM policy + Tulving distinction; I2 = FTT
|
||||
applied to schema; I3 = SRS practice applied to counters; I4 = DRM
|
||||
literature applied to scoring; I5 = GTD + existing Rune machinery.
|
||||
@@ -0,0 +1,135 @@
|
||||
# #377 R1 — 05_adversarial.md
|
||||
|
||||
_Independent pass (separate actor/context). Instruction: assume the emerging
|
||||
human-memory → Rune conclusions are wrong. Verdicts: ATTACK SUCCEEDS / MIXED /
|
||||
ATTACK FAILED. ✅ = tool-verified citations; ⚠️ = canonical references._
|
||||
|
||||
## 1. Episodic/semantic store separation — MIXED, leans SUCCEEDS
|
||||
**Henke (2010, Nat Rev Neurosci)** ✅ — processing-modes (rapid-flexible vs
|
||||
slow-rigid encoding) should replace the consciousness-based declarative split.
|
||||
If right, an episodic/semantic table split reifies the wrong ontology: the
|
||||
joint is at processing mode, not phenomenology. Backing: systems-vs-processes
|
||||
debate (⚠️ Foster & Jelicic 1999; ⚠️ Roediger/Buckner/McDermott 1999-style
|
||||
process critiques); ⚠️ Cabeza et al. 2008 (parietal = attention-to-memory, not
|
||||
episodic module); ⚠️ Nairne/Thompson/Pandeirada 2007 (survival-processing
|
||||
functional account). Patient dissociations (⚠️ Vargha-Khadem 1997, Science:
|
||||
developmental amnesia sparing semantic learning) keep the distinction alive —
|
||||
demoted to "one contested taxonomy," not neural fact.
|
||||
**Software verdict: query-time tag, never schema partition.**
|
||||
|
||||
## 2. Obligation-as-memory — ATTACK SUCCEEDS (strongest in brief)
|
||||
**Risko & Gilbert (2016, Trends Cogn Sci)** ✅ — cognitive offloading: agents
|
||||
perform better EXTERNALIZING intentions than retaining them; intention-offloading
|
||||
literature shows people set external triggers precisely because internal
|
||||
prospective memory is unreliable. ⚠️ Allen (2001, GTD): "mind like water" via
|
||||
capture into a trusted EXTERNAL system. Hostile inference: obligations are the
|
||||
canonical case where science says DO NOT store as memory traces — they belong
|
||||
in a commitment/task authority with state machines (open/kept/broken/
|
||||
superseded), deadlines, reminders; memory holds only evidence ABOUT the
|
||||
commitment. Putting obligations inside the memory store repeats the exact error
|
||||
the offloading literature diagnoses.
|
||||
**Verdict: obligations live outside Memory.**
|
||||
|
||||
## 3. Source-memory analogies — MIXED, leans FAILED
|
||||
⚠️ Johnson/Hashtroudi/Lindsay 1993 (source-monitoring framework); ⚠️ Johnson &
|
||||
Raye 1981 (reality monitoring): a brain doing forensic reconstruction from
|
||||
impoverished cues because it has NO provenance bus. Rune already has
|
||||
source/method columns — importing "source-monitoring processes" brings a candle
|
||||
to a lit room. Honest admission: Johnson's diagnostic cue inventory (verbatim
|
||||
detail, operation records, affective tags, contextual embedding) is a useful
|
||||
SCHEMA checklist, and source errors spiking under similarity/time-pressure
|
||||
predicts when retrieval needs provenance-weighted ranking.
|
||||
**Verdict: analogy backwards as mechanism, useful as schema checklist.
|
||||
Downgrade "implement source monitoring" → "store what source monitoring
|
||||
wishes it had."**
|
||||
|
||||
## 4. Recollection/familiarity → lexical/vector mapping — ATTACK SUCCEEDS
|
||||
Three verified kill-shots: **Wixted (2007, Psych Review)** ✅ — unitary
|
||||
unequal-variance signal-detection model fits the ROC data dual-process
|
||||
theorists claimed exclusively. **Dunn (2004, Psych Review)** ✅ —
|
||||
remember/know dissociations fall out of unidimensional strength + decision
|
||||
criteria. **Wixted & Mickes (2010, Psych Review)** ✅ — "continuous
|
||||
dual-process" concedes recollection is graded, collapsing the categorical
|
||||
joint the mapping leans on. (⚠️ Rotello et al. 2005 same point via
|
||||
process-dissociation critiques.) Mapping BM25→familiarity/vectors→recollection
|
||||
inherits a live dispute as settled architecture.
|
||||
**Verdict: keep hybrid retrieval (it works), justify by IR engineering, never
|
||||
by dual-process psychology. The mapping adds zero architectural force.**
|
||||
|
||||
## 5. Spacing/reactivation → activation scoring — MIXED, leans SUCCEEDS
|
||||
⚠️ Cepeda et al. 2006 (Psych Bulletin): spacing framed as ACQUISITION/encoding
|
||||
phenomenon (optimal inter-study intervals as function of retention interval).
|
||||
Nothing licenses "reactivated often → rank higher at retrieval" — a category
|
||||
jump from learning schedule to relevance score, smuggling frequency-past-use
|
||||
into relevance where it swamps topical fit (rich-get-richer). Admission:
|
||||
⚠️ Roediger & Karpicke 2006 (testing effect) proves retrieval IS an encoding
|
||||
event — reactivation genuinely strengthens the trace.
|
||||
**Verdict: reactivation allowed into retention/tiering decisions, FORBIDDEN
|
||||
(or heavily discounted) in relevance ranking.**
|
||||
|
||||
## 6. Autobiographical-memory requirements — ATTACK SUCCEEDS
|
||||
**Conway & Pleydell-Pearce (2000, Psych Review)** ✅ — autobiographical recall
|
||||
is GENERATIVE CONSTRUCTION yoked to the "working self" and identity goals, not
|
||||
playback. ⚠️ Conway 2005: coherence with self-goals constrains construction.
|
||||
That is precisely the confabulation engine a truth-preserving store must NOT
|
||||
imitate — importing SMS requirements invites identity-flattering
|
||||
reconstruction, telescoping, goal-consistent distortion dressed as "rich
|
||||
autobiographical context."
|
||||
**Verdict: dangerous as design input. Take only a warning label: any
|
||||
"life-story synthesis" feature must be fenced off from the evidence store and
|
||||
labeled generated.**
|
||||
|
||||
## 7. Human forgetting → software cooling — ATTACK SUCCEEDS (one caveat)
|
||||
Storage engineering solved tiering decades ago without psychology (HSM,
|
||||
LRU/LFU/ARC, buffer pools — hit-rate math, no Ebbinghaus). "Cooling" that
|
||||
merely demotes priority is eviction policy with a cardigan; calling it
|
||||
"forgetting" licenses the one thing a single-user truth store must never do —
|
||||
silent data loss — while adding no mechanism (no decay constant transfers to
|
||||
SQLite rows). Caveat: the availability-vs-accessibility distinction maps to a
|
||||
sound rule — never delete, only de-index.
|
||||
**Verdict: keep tiered storage; ban the word "forgetting" from the codebase
|
||||
vocabulary. The metaphor's expected value is negative.**
|
||||
|
||||
## 8. Cognitive-science terminology adds architecture — ATTACK SUCCEEDS
|
||||
The field's own meta-literature: systems-vs-processes controversy plus "how
|
||||
many systems?" stalemates (⚠️ Schacter & Tulving 1994; ⚠️ Foster & Jelicic
|
||||
1999) — labels proliferating while predictions stay put. Adopting "episodic /
|
||||
semantic / procedural / source / familiarity" imports five contested ontologies
|
||||
and zero ranking functions, loss functions, or invariants.
|
||||
**Gate: every borrowed noun must answer — what query does it change, what
|
||||
invariant does it enforce, what test would falsify it? Failing that gate =
|
||||
documentation perfume. Terminology guilty until proven mechanistic.**
|
||||
|
||||
## 9. Bonus: computer memory should NOT imitate humans — MIXED
|
||||
⚠️ Schacter 1999 (American Psychologist: "seven sins") — a spec sheet for what
|
||||
NOT to build. ⚠️ Norman 1986/1988 (gulfs of execution/evaluation) — bridge
|
||||
limits with external structure, don't mirror them. Database/IR orthodoxy never
|
||||
cites Atkinson–Shiffrin: durability, transactions, recall metrics come from
|
||||
engineering. Admission: nobody wants to imitate FALLIBILITY — borrowings are
|
||||
functional (separate concerns, provenance, tiering); biomimetic inspiration
|
||||
constrained by benchmarks is legitimate.
|
||||
**Verdict: "human memory is a terrible database" is true and worth posting on
|
||||
the wall — kills naive imitation, not disciplined functional borrowing.**
|
||||
|
||||
## 10. Bonus: consolidation-hallucination — ATTACK FAILED
|
||||
Backfired into corroboration. **Maynez et al. 2020 (ACL)** ✅ — widespread
|
||||
hallucination in abstractive summarizers, direct analog of lossy LLM
|
||||
consolidation rounds. **SSGM (2026 preprint)** ✅ — semantic drift across
|
||||
evolving LLM memory updates as governed risk. Both support the FALSE-memory-
|
||||
as-anti-pattern stance: each summarization round is a misinformation
|
||||
opportunity; append-only + supersession-linking beats destructive
|
||||
consolidation.
|
||||
**Verdict: evidence sides with the main researcher.**
|
||||
|
||||
## Failed-attack rollup
|
||||
- #3 partially failed: Johnson's cue inventory informs schema.
|
||||
- #5 partially failed: testing effect legitimizes reactivation as durability
|
||||
signal (not ranking signal).
|
||||
- #9 partially failed: kills naive mimicry only.
|
||||
- #10 fully failed: Maynez 2020 + SSGM 2026 corroborate append-only/supersede.
|
||||
- #1 partially failed: amnesic dissociations preserve weak tag-level
|
||||
episodic/semantic distinction.
|
||||
|
||||
Strongest clean kills: #2 (obligations out of memory), #4 (dual-process
|
||||
mapping built on sand), #6 (autobiographical confabulation engine),
|
||||
#7 (forgetting vocabulary), #8 (terminology without mechanism).
|
||||
@@ -0,0 +1,44 @@
|
||||
# #377 R1 — 06_synthesis.md
|
||||
|
||||
## Mechanism matrix
|
||||
|
||||
| MECHANISM | ORIGINAL PURPOSE | EVIDENCE STRENGTH | LIMITATIONS | RUNE EQUIVALENT | RUNE GAP | TRANSFER VALIDITY | COST | FAILURE MODES | CLASSIFICATION | RUNE EVIDENCE LEVEL |
|
||||
|---|---|---|---|---|---|---|---|---|---|---|
|
||||
| Episodic/semantic distinction | describe human memory kinds | STRONG descriptive; CONTESTED neural | Henke processing-modes; systems-vs-processes stalemate | none (no such kinds) | — | LOW as stores; MEDIUM as tags | none | reified wrong ontology | query-time TAGS, never schema partition | RUNE_HYPOTHESIS |
|
||||
| Availability/accessibility | explain recall failure | STRONG (Tulving & Pearlstone) | — | none (no deletion gate) | deletion-gate rule | HIGH | bookkeeping | gate too strict | ADAPT | RUNE_APPLICABLE |
|
||||
| Encoding specificity | explain cue effects | STRONG + boundaries | — | session/task scoping (partial) | cue-field extension | HIGH | schema fields | over-tagging | ADAPT | RUNE_APPLICABLE |
|
||||
| Fuzzy Trace verbatim/gist | explain false memory + development | STRONG (developmental predictions confirmed) | — | text+summary (implicit) | conflict verification | HIGH | detector | false positives | ADAPT | RUNE_APPLICABLE |
|
||||
| Source-monitoring inventory | explain source errors | STRONG framework | mechanism backwards for Rune | source/method cols (partial; origin ABSENT) | origin column | MEDIUM (schema only) | one column | omission under pressure | ADAPT (schema) | RUNE_APPLICABLE |
|
||||
| Prospective cues | explain remembering-to-act | STRONG (event>time; monitoring costs; implementation intentions) | lab-vs-naturalistic gaps | task system + PendingOperation (separate) | commitment-evidence links | HIGH (with corrected owner) | links | stale links | task-system ADAPT; REJECT memory co-location | RUNE_APPLICABLE |
|
||||
| Testing effect | explain retention | STRONG | acquisition-side only | wash_count (conflated) | spaced-durability counter | MEDIUM (durability only) | counter | scheduler complexity | ADAPT (durability); REJECT (ranking) | RUNE_HYPOTHESIS |
|
||||
| Spacing | optimize learning schedules | STRONGEST in psychology | encoding-side; no ranking license | none | re-presentation policy | MEDIUM | scheduler | — | EXPERIMENT | RUNE_HYPOTHESIS |
|
||||
| DRM/gist hazards | explain false recall | STRONG | word-list ecology | dedupe/supersede (partial) | gist-match penalty | HIGH | scoring change | paraphrase harm | ADAPT | RUNE_APPLICABLE |
|
||||
| Misinformation blending | explain post-event corruption | STRONG core; mechanism contested | — | append-only + supersession | re-encoding guard | HIGH | guard | friction | ADAPT | RUNE_APPLICABLE |
|
||||
| RIF | explain forgetting-after-retrieval | FRAGILE (small + bias) | inhibition contested; reliability weak | none (good) | monitoring as bug class | LOW (as mechanism) | none | implementing it | REJECT imitation | EXTERNALLY_ESTABLISHED (fragility) |
|
||||
| Dual-process recognition | explain recognition ROCs | CONTESTED (Wixted/Dunn kill-shots) | — | hybrid lanes (exist) | nothing | NONE (mapping dead) | — | sand architecture | REJECT mapping; keep lanes on IR grounds | — |
|
||||
| Autobiographical generativity | explain self-memory | STRONG (as description of construction) | — | narratives (exist) | fence + label | HIGH (as warning) | fence | confabulation leak | REJECT as design input | RUNE_APPLICABLE (warning) |
|
||||
| Forgetting-as-deletion | explain loss | WEAK as sole account | — | tier flags (vestigial) | tiering without the word | HIGH (tiering) / NONE (word) | vocabulary change | silent loss license | REJECT word; ADAPT tiering | RUNE_APPLICABLE |
|
||||
| Confidence-accuracy link | predict accuracy from confidence | DISSOCIATED (robust) | — | confidence col (unproven) | calibration tracking | HIGH (as discipline) | tracking | decoration | ADAPT | RUNE_APPLICABLE |
|
||||
| Reconsolidation mapping | update-on-retrieval | CONTESTED (per #376) | trigger mismatch | supersession (write-triggered) | prediction-error gate | LOW (framing dead) | none | dogma | REJECT (per #376; not reintroduced) | — |
|
||||
|
||||
## Synthesis narrative
|
||||
|
||||
Human memory science gives Rune three kinds of value, in descending order:
|
||||
(1) **Error catalogs** — DRM, misinformation, source confusion, schema
|
||||
assimilation, confidence dissociation are a field-tested list of what goes
|
||||
wrong in any reconstructive memory process, biological or software. Every one
|
||||
maps to a concrete Rune guard, and the guards are cheap.
|
||||
(2) **Policy-grade effects** — spacing, testing, availability/accessibility,
|
||||
encoding specificity are acquisition/retention phenomena robust enough to
|
||||
inform scheduling and deletion policy, with the strict boundary that none
|
||||
licenses relevance ranking.
|
||||
(3) **Warnings** — autobiographical generativity, forgetting vocabulary,
|
||||
dual-process ontology, and the systems-vs-processes stalemate are what NOT
|
||||
to import.
|
||||
|
||||
The single largest correction vs R0: obligations live in the task authority,
|
||||
not Memory (Risko & Gilbert 2016 is load-bearing and verified). The single
|
||||
largest confirmation: append-only + supersession beats destructive
|
||||
consolidation (Maynez 2020 + SSGM 2026 corroborate from the software side).
|
||||
The taxonomy question resolves to tags, never partitions (Henke 2010 +
|
||||
Vargha-Khadem 1997 jointly: contested ontology, weak surviving distinction).
|
||||
@@ -0,0 +1,26 @@
|
||||
# #377 R1 — 07_qualification.md
|
||||
|
||||
_Classification separate from evidence level. No item above RUNE_APPLICABLE
|
||||
except pre-existing RUNE_PROVEN infrastructure; everything new is hypothesis
|
||||
until Rune experiments run._
|
||||
|
||||
| # | Mechanism | Classification | Evidence level | Conf | T1 impact | Experiment | Rejection criterion |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| Q1 | Episodic/semantic/autobiographical as query tags | ADAPT (tags) | RUNE_HYPOTHESIS | MED | LOW | tag-retrieval benefit test | no benefit → drop |
|
||||
| Q2 | Obligations in task authority (NOT Memory) | REJECT co-location; ADAPT task commitments | RUNE_APPLICABLE | HIGH | HIGH | audit/completion parity test | parity → revisit |
|
||||
| Q3 | Dual-process retrieval mapping | REJECT mapping | — (dead) | HIGH | LOW | — | — |
|
||||
| Q4 | Reactivation in durability, banned in ranking | ADAPT / REJECT split | RUNE_APPLICABLE / RUNE_HYPOTHESIS | HIGH | MED | retention A/B | no gain → drop counter |
|
||||
| Q5 | Forgetting vocabulary ban; engineering tiering | REJECT word; ADAPT tiering | RUNE_APPLICABLE | HIGH | LOW | — (costless) | — |
|
||||
| Q6 | Autobiographical fence-and-label | REJECT input; ADAPT rule | RUNE_APPLICABLE | HIGH | MED | — | — |
|
||||
| Q7 | Availability-gated deletion | ADAPT | RUNE_APPLICABLE | MED | MED | synthetic probes | gate never fires → simplify |
|
||||
| Q8 | Verbatim/gist dual + conflict verification | ADAPT | RUNE_APPLICABLE | MED | MED | synthetic conflicts | no conflicts → keep schema, drop detector |
|
||||
| Q9 | Gist-match penalty | EXPERIMENT | RUNE_HYPOTHESIS | MED | MED | lure vs paraphrase A/B | >5% paraphrase harm → revert |
|
||||
| Q10 | Original/amendment separation + re-encoding guard | ADAPT | RUNE_APPLICABLE | HIGH | MED | — (largely covered) | — |
|
||||
| Q11 | Calibration tracking (not self-report) | ADAPT | RUNE_APPLICABLE | MED | LOW | calibration measurement | — |
|
||||
| Q12 | Mechanistic gate for borrowed nouns | ADAPT (process rule) | RUNE_APPLICABLE | HIGH | LOW | — | — |
|
||||
|
||||
## Evidence-level discipline
|
||||
No biological finding is cited as Rune proof anywhere in this artifact set.
|
||||
Every EXTERNALLY_ESTABLISHED claim that entered prescription passed through
|
||||
an explicit applicability argument (03_applicability.md) with its Rune level
|
||||
in claims.json. New prescriptions are RUNE_HYPOTHESIS until experiments run.
|
||||
@@ -0,0 +1,71 @@
|
||||
# #377 R1 — Human Memory / Cognitive Science: FINAL (durable technical reference)
|
||||
|
||||
_Companion artifacts: 00_issue_scope, 01_inward, 02_outward/ (16 sections +
|
||||
sources.md with 44 entries + claims.json with 12 falsifiable claims),
|
||||
03_applicability (12 transfer chains), 04_innovation (5 candidates),
|
||||
05_adversarial (10 attacks), 06_synthesis (16-row matrix),
|
||||
07_qualification (below), r0_reconciliation._
|
||||
|
||||
## 1. The domain in one page
|
||||
|
||||
Human memory science is a century of careful experiments on a system Rune
|
||||
does not have: a biological organ with fixed capacity, no provenance bus, no
|
||||
exact storage, and identity goals tangled into recall. Its value to Rune is
|
||||
therefore asymmetric: ENORMOUS as an error catalog (every failure mode humans
|
||||
exhibit — gist falsification, source confusion, misinformation blending,
|
||||
schema assimilation, confidence dissociation — is a hazard any reconstructive
|
||||
process faces, including LLM consolidation), MODERATE as policy (spacing,
|
||||
testing, availability/accessibility inform scheduling and deletion rules),
|
||||
and NEGATIVE as ontology (its taxonomies are contested; importing them as
|
||||
schema partitions reifies one faction's vocabulary).
|
||||
|
||||
## 2. What transfers, what does not
|
||||
|
||||
**Transfers (with Rune evidence ≥ RUNE_APPLICABLE):** availability/
|
||||
accessibility → deletion gating; encoding specificity → cue metadata;
|
||||
Fuzzy Trace verbatim/gist → dual representation + conflict verification;
|
||||
source-monitoring inventory → origin column; testing effect → durability
|
||||
(not ranking); misinformation/DRM → anti-reconstruction guards;
|
||||
confidence dissociation → calibration discipline; implementation
|
||||
intentions → cue→action pairs (in the task system).
|
||||
|
||||
**Does not transfer:** store partitions from taxonomies; dual-process
|
||||
recognition as retrieval architecture; spacing as ranking signal;
|
||||
forgetting as deletion license; autobiographical generativity as design
|
||||
input; reconsolidation as supersession rationale (per #376); obligations
|
||||
as memory rows; cognitive-science nouns without mechanistic gates.
|
||||
|
||||
## 3. The corrected rationale for Rune's pipeline
|
||||
|
||||
R0 said: human memory justifies obligation rows, dual-process retrieval,
|
||||
spacing-weighted activation, and store-partitioned kinds. R1 corrects:
|
||||
human memory justifies ERROR GUARDS (append-only, supersession, provenance,
|
||||
verbatim preservation, gist penalties), RETENTION POLICIES (spaced
|
||||
re-presentation, availability-gated deletion), and OWNERSHIP DECISIONS
|
||||
(obligations to tasks, generativity fenced from evidence). Everything else
|
||||
is either IR engineering wearing a psychology costume or contested ontology.
|
||||
|
||||
## 4. Experiments required (in order)
|
||||
1. Gist-penalty A/B: lure-rejection vs paraphrase-recall (kill: >5%
|
||||
paraphrase harm).
|
||||
2. Spaced-durability counter vs wash_count: retention-prediction accuracy.
|
||||
3. Deletion-gate trial: availability-gated vs age-based on synthetic
|
||||
available-but-inaccessible probes.
|
||||
4. Verbatim/gist conflict detector: detection rate on synthetic conflicts.
|
||||
|
||||
## 5. What would change this conclusion
|
||||
- A replication resolving dual-process recognition in its favor (would
|
||||
reopen C003 — unlikely to change the IR justification either way).
|
||||
- Evidence that co-located obligations outperform task-owned commitments
|
||||
on audit/completion metrics (would reopen C002).
|
||||
- Large-scale evidence that spacing schedules improve retrieval ranking
|
||||
(would reopen C004's ranking ban).
|
||||
|
||||
## 6. Remaining unknowns (bounded)
|
||||
- Optimal spaced-re-presentation schedule parameters (needs retention A/B).
|
||||
- Gist/verbatim conflict-detector design (needs prototype).
|
||||
- Whether event-triggered obligations can reuse PendingOperation without
|
||||
new state (shared with #376's unknowns; needs code verification).
|
||||
|
||||
## 7. Production implementation
|
||||
NONE. Research only. All prescriptions enter T1 as design input.
|
||||
@@ -0,0 +1,188 @@
|
||||
{
|
||||
"note": "Narrow, falsifiable claims. external_status vs rune_status kept separate per R1 standard.",
|
||||
"claims": [
|
||||
{
|
||||
"claim_id": "HM-R1-C001",
|
||||
"claim": "Episodic/semantic/autobiographical distinctions should be query-time tags, never schema partitions",
|
||||
"evidence_for": [
|
||||
"Henke 2010 processing-modes",
|
||||
"systems-vs-processes stalemate",
|
||||
"Nairne functional accounts"
|
||||
],
|
||||
"evidence_against": [
|
||||
"Vargha-Khadem 1997 amnesic dissociations (weak surviving distinction)"
|
||||
],
|
||||
"external_status": "CONTESTED (as neural systems)",
|
||||
"rune_status": "RUNE_HYPOTHESIS",
|
||||
"architecture_impact": "LOW",
|
||||
"falsifier": "F1: if tag-based retrieval shows no benefit over untyped, drop tags",
|
||||
"experiment_required": true,
|
||||
"classification": "ADAPT (tags)"
|
||||
},
|
||||
{
|
||||
"claim_id": "HM-R1-C002",
|
||||
"claim": "Obligations belong in the task/commitment authority, NOT in Memory",
|
||||
"evidence_for": [
|
||||
"Risko & Gilbert 2016 offloading review",
|
||||
"Allen GTD trusted-external-system premise",
|
||||
"monitoring-cost literature (Smith PAM vs multiprocess)"
|
||||
],
|
||||
"evidence_against": [],
|
||||
"external_status": "EXTERNALLY_ESTABLISHED",
|
||||
"rune_status": "RUNE_APPLICABLE",
|
||||
"architecture_impact": "HIGH",
|
||||
"falsifier": "F2: if Memory-co-located obligations show audit/completion parity with task-owned in A/B, revisit",
|
||||
"experiment_required": false,
|
||||
"classification": "REJECT memory co-location; ADAPT task-system commitments with evidence links"
|
||||
},
|
||||
{
|
||||
"claim_id": "HM-R1-C003",
|
||||
"claim": "Recollection/familiarity must NOT justify the lexical/vector retrieval split",
|
||||
"evidence_for": [
|
||||
"Wixted 2007 UVSD fit",
|
||||
"Dunn 2004 confidence account",
|
||||
"Wixted & Mickes 2010 graded recollection"
|
||||
],
|
||||
"evidence_against": [],
|
||||
"external_status": "CONTESTED (psychology unsettled)",
|
||||
"rune_status": "RUNE_HYPOTHESIS (mapping dead)",
|
||||
"architecture_impact": "LOW",
|
||||
"falsifier": "F3 resolved: mapping rejected regardless",
|
||||
"experiment_required": false,
|
||||
"classification": "REJECT mapping; keep lanes on IR grounds"
|
||||
},
|
||||
{
|
||||
"claim_id": "HM-R1-C004",
|
||||
"claim": "Reactivation counts belong in retention/tiering decisions, NOT relevance ranking",
|
||||
"evidence_for": [
|
||||
"Cepeda 2006 (acquisition-side)",
|
||||
"Roediger & Karpicke 2006 (retrieval-as-encoding)"
|
||||
],
|
||||
"evidence_against": [],
|
||||
"external_status": "EXTERNALLY_ESTABLISHED (as acquisition)",
|
||||
"rune_status": "RUNE_APPLICABLE (durability only)",
|
||||
"architecture_impact": "MEDIUM",
|
||||
"falsifier": "F4/F5: if ranking-with-reactivation beats ranking-without on topical-fit benchmarks, revisit with discount factor",
|
||||
"experiment_required": true,
|
||||
"classification": "ADAPT (durability counter); REJECT (ranking use)"
|
||||
},
|
||||
{
|
||||
"claim_id": "HM-R1-C005",
|
||||
"claim": "Human forgetting vocabulary must not enter the codebase; tiering is engineering",
|
||||
"evidence_for": [
|
||||
"HSM/cache/buffer-pool practice (no psychology needed)",
|
||||
"availability/accessibility distinction as the sound core"
|
||||
],
|
||||
"evidence_against": [],
|
||||
"external_status": "EXTERNALLY_ESTABLISHED (engineering)",
|
||||
"rune_status": "RUNE_APPLICABLE",
|
||||
"architecture_impact": "LOW",
|
||||
"falsifier": "F5: none plausible \u2014 vocabulary ban is costless",
|
||||
"experiment_required": false,
|
||||
"classification": "REJECT word; ADAPT tiering"
|
||||
},
|
||||
{
|
||||
"claim_id": "HM-R1-C006",
|
||||
"claim": "Autobiographical generativity is a confabulation engine; fence life-story synthesis from evidence",
|
||||
"evidence_for": [
|
||||
"Conway & Pleydell-Pearce 2000 (generative, goal-yoked)",
|
||||
"Conway 2005 (coherence constraints)"
|
||||
],
|
||||
"evidence_against": [],
|
||||
"external_status": "EXTERNALLY_ESTABLISHED (as description)",
|
||||
"rune_status": "RUNE_APPLICABLE (as warning)",
|
||||
"architecture_impact": "MEDIUM",
|
||||
"falsifier": "none plausible",
|
||||
"experiment_required": false,
|
||||
"classification": "REJECT as design input; ADAPT as fence-and-label rule"
|
||||
},
|
||||
{
|
||||
"claim_id": "HM-R1-C007",
|
||||
"claim": "Deletion requires demonstrated inaccessibility across cues (availability/accessibility)",
|
||||
"evidence_for": [
|
||||
"Tulving & Pearlstone 1966"
|
||||
],
|
||||
"evidence_against": [],
|
||||
"external_status": "EXTERNALLY_ESTABLISHED",
|
||||
"rune_status": "RUNE_APPLICABLE",
|
||||
"architecture_impact": "MEDIUM",
|
||||
"falsifier": "if gate never fires, simplify",
|
||||
"experiment_required": false,
|
||||
"classification": "ADAPT"
|
||||
},
|
||||
{
|
||||
"claim_id": "HM-R1-C008",
|
||||
"claim": "Store verbatim detail + gist side by side; verify on conflict (Fuzzy Trace)",
|
||||
"evidence_for": [
|
||||
"Brainerd & Reyna 2002/2005 + developmental predictions"
|
||||
],
|
||||
"evidence_against": [],
|
||||
"external_status": "EXTERNALLY_ESTABLISHED",
|
||||
"rune_status": "RUNE_APPLICABLE",
|
||||
"architecture_impact": "MEDIUM",
|
||||
"falsifier": "if no conflicts detected in 6 months, keep schema, drop detector",
|
||||
"experiment_required": false,
|
||||
"classification": "ADAPT"
|
||||
},
|
||||
{
|
||||
"claim_id": "HM-R1-C009",
|
||||
"claim": "Penalize gist-only retrieval matches lacking verbatim support (DRM guard)",
|
||||
"evidence_for": [
|
||||
"Roediger & McDermott 1995 (40-55% recall, 72% remember)"
|
||||
],
|
||||
"evidence_against": [
|
||||
"paraphrase-recall harm risk"
|
||||
],
|
||||
"external_status": "EXTERNALLY_ESTABLISHED",
|
||||
"rune_status": "RUNE_HYPOTHESIS",
|
||||
"architecture_impact": "MEDIUM",
|
||||
"falsifier": "paraphrase recall drops >5% \u2192 revert",
|
||||
"experiment_required": true,
|
||||
"classification": "EXPERIMENT"
|
||||
},
|
||||
{
|
||||
"claim_id": "HM-R1-C010",
|
||||
"claim": "Post-event inputs can corrupt originals; keep original-vs-amendment separated",
|
||||
"evidence_for": [
|
||||
"Loftus & Palmer 1974; Loftus/Miller/Burns 1978"
|
||||
],
|
||||
"evidence_against": [
|
||||
"McCloskey & Zaragoza 1985 (mechanism dispute \u2014 blending vs interference)"
|
||||
],
|
||||
"external_status": "EXTERNALLY_ESTABLISHED (core)",
|
||||
"rune_status": "RUNE_APPLICABLE",
|
||||
"architecture_impact": "MEDIUM",
|
||||
"falsifier": "none plausible",
|
||||
"experiment_required": false,
|
||||
"classification": "ADAPT (already largely covered; add re-encoding guard)"
|
||||
},
|
||||
{
|
||||
"claim_id": "HM-R1-C011",
|
||||
"claim": "Confidence must never proxy accuracy; track calibration separately",
|
||||
"evidence_for": [
|
||||
"Wixted & Wells 2017; Koriat metamemory"
|
||||
],
|
||||
"evidence_against": [],
|
||||
"external_status": "EXTERNALLY_ESTABLISHED",
|
||||
"rune_status": "RUNE_APPLICABLE",
|
||||
"architecture_impact": "LOW",
|
||||
"falsifier": "none plausible",
|
||||
"experiment_required": false,
|
||||
"classification": "ADAPT"
|
||||
},
|
||||
{
|
||||
"claim_id": "HM-R1-C012",
|
||||
"claim": "Cognitive-science nouns must pass the mechanistic gate (query changed? invariant enforced? falsifier?) or stay out of the architecture",
|
||||
"evidence_for": [
|
||||
"systems-vs-processes stalemate; Schacter & Tulving 1994; Foster & Jelicic 1999"
|
||||
],
|
||||
"evidence_against": [],
|
||||
"external_status": "EXTERNALLY_ESTABLISHED (meta)",
|
||||
"rune_status": "RUNE_APPLICABLE (process rule)",
|
||||
"architecture_impact": "LOW",
|
||||
"falsifier": "none \u2014 process discipline",
|
||||
"experiment_required": false,
|
||||
"classification": "ADAPT (as R1 process rule)"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
# R0 → R1 Reconciliation (#377 Human Memory)
|
||||
|
||||
_R0 source: memory-atlas/families/human_memory_cognitive_science.md_
|
||||
|
||||
| R0 claim | R1 verdict | Why |
|
||||
|---|---|---|
|
||||
| Prospective memory → typed obligation rows (H1) | **OVERTURNED** | Risko & Gilbert 2016 (verified): offloading science says externalize intentions; obligations belong in task authority with state machines. R0 assumed Memory ownership without arguing it. Preserved: cue→action pairs, event-anchored triggers, reminder scaffolding — relocated to task system with memory-evidence links. |
|
||||
| Episodic/semantic kinds (H2) | **REFINED → tags, not stores** | Henke 2010 + systems-vs-processes stalemate: contested ontology; Vargha-Khadem preserves weak distinction. R0's "entry kinds" would reify one faction's taxonomy. Downgraded to query-time tags. |
|
||||
| Autobiographical narratives (H3) | **REFINED → chronicles kept, generativity fenced** | Chronicles exist (COVERED); Conway SMS shows recall is goal-yoked construction — R0 understated the danger. Added fence-and-label rule. |
|
||||
| Source-memory provenance (H4) | **REFINED → schema checklist, not mechanism** | Adversarial #3: analogy backwards (columns already exist); Johnson's cue inventory still earns the origin column. Downgraded from "implement source monitoring" to "store what it wishes it had." |
|
||||
| Recollection/familiarity analogy (H5) | **OVERTURNED** | Wixted 2007 / Dunn 2004 / Wixted & Mickes 2010 (all verified): psychology unsettled; mapping built on sand. Hybrid lanes kept on IR grounds only. |
|
||||
| Cue/context scoping (H6) | **CONFIRMED (expectations capped)** | Encoding specificity + availability/accessibility stand; Godden & Baddeley capped at small-effect (N=18; Smith & Vela). |
|
||||
| Reconsolidation mapping (H7) | **CONFIRMED OVERTURN** (per #376; not reintroduced) | #376 R1 killed the framing; this tranche independently keeps only prediction-error-gated updates. No regression. |
|
||||
| Spacing priority (H8) | **REFINED → durability-only** | Cepeda robust as acquisition; adversarial #5 forbids ranking use (category jump). Split into spaced-durability counter (ADAPT) + ranking ban. |
|
||||
| Confidence mechanism (H9) | **CONFIRMED (strengthened)** | Dissociation robust (Wixted & Wells; Koriat); added separate calibration tracking requirement. |
|
||||
| RIF rejection (H10) | **CONFIRMED** | Fragility confirmed (Murayama meta + reliability literature); hazard framing kept. |
|
||||
| False-memory anti-pattern (H11) | **CONFIRMED (strengthened)** | Maynez 2020 + SSGM 2026 corroborate from software side; added gist-penalty + re-encoding guard. |
|
||||
| Source-monitoring protections (H12) | **CONFIRMED** | Origin column + verbatim-quote rules stand; generation-event labeling added (Jacoby). |
|
||||
|
||||
Tally: CONFIRMED 5 · REFINED 4 · OVERTURNED 2 · STILL_UNKNOWN 0.
|
||||
|
||||
Honest note: R0 was right about error prevention (its strongest half) and wrong
|
||||
about ownership and ontology (obligations-in-memory, dual-process mapping,
|
||||
store-partitioning). The adversarial pass did the most work in this domain —
|
||||
five clean kills, four of them against R0's own conclusions.
|
||||
@@ -0,0 +1,47 @@
|
||||
# Sources Ledger (#377 R1)
|
||||
|
||||
| ID | Citation | Year | Venue | Peer? | Type | Read depth | Status | Rune relevance |
|
||||
|---|---|---|---|---|---|---|---|---|
|
||||
| S001 | Tulving 1972, episodic/semantic (Organization of Memory) | 1972 | book chapter | n/a | primary/theory | RELEVANT_SECTIONS | ROBUST descriptive; CONTESTED neural-systems | taxonomy validity |
|
||||
| S002 | Tulving 1985 autonoetic/noetic; 2002 Ann Rev Psych | 1985/2002 | journal | yes | theory | ABSTRACT | revisions of S001 | taxonomy |
|
||||
| S003 | Squire 1992 Psych Review; Squire & Zola 1996 PNAS | 1992/1996 | journal | yes | primary | RELEVANT_SECTIONS | ROBUST coarse | skill/procedure boundary |
|
||||
| S004 | Conway & Pleydell-Pearce 2000, Psych Review 107(2) | 2000 | journal | yes | synthesis | RELEVANT_SECTIONS | ROBUST/influential | warning label (generative construction) |
|
||||
| S005 | Baddeley & Hitch 1974; Baddeley 2000 TiCS | 1974/2000 | chapter/journal | yes | framework | RELEVANT_SECTIONS | ROBUST, revised | capacity-limited active set |
|
||||
| S006 | Cowan 1999 embedded-processes; Engle executive attention | 1999 | chapter | yes | theory (competitor) | ABSTRACT | active CONTEST | ~4-chunk focus number |
|
||||
| S007 | Tulving & Thomson 1973, encoding specificity | 1973 | journal | yes | primary | RELEVANT_SECTIONS | ROBUST + boundaries | store encoding context |
|
||||
| S008 | Tulving & Pearlstone 1966, availability vs accessibility | 1966 | journal | yes | primary | RELEVANT_SECTIONS | ROBUST; key distinction | retrieval-failure-before-deletion |
|
||||
| S009 | Godden & Baddeley 1975, divers | 1975 | journal | yes | primary | RELEVANT_SECTIONS | WEAK (N=18) | small-gain context tags |
|
||||
| S010 | Smith & Vela 2001, context meta-analysis | 2001 | meta | yes | meta-analysis | ABSTRACT | small/fragile effect | context-match expectations |
|
||||
| S011 | Yonelinas 1994 dual-process | 1994 | journal | yes | primary | RELEVANT_SECTIONS | CONTESTED | two retrieval GRADES (not systems) |
|
||||
| S012 | Wixted 2007 Psych Review (unitary UVSD) | 2007 | journal | yes | theory | RELEVANT_SECTIONS | live dispute | kills lexical/vector mapping |
|
||||
| S013 | Dunn 2004 Psych Review (remember/know = confidence) | 2004 | journal | yes | theory | RELEVANT_SECTIONS | live dispute | same |
|
||||
| S014 | Wixted & Mickes 2010 (continuous dual-process) | 2010 | journal | yes | theory | RELEVANT_SECTIONS | concedes graded recollection | same |
|
||||
| S015 | Einstein & McDaniel 1990, JEP:LMC | 1990 | journal | yes | primary | RELEVANT_SECTIONS | ROBUST | event-anchored triggers |
|
||||
| S016 | Sellen et al. 1997, Memory | 1997 | journal | yes | primary (in-situ) | ABSTRACT | ROBUST | event cues > time cues |
|
||||
| S017 | Smith 2003 PAM theory | 2003 | journal | yes | theory | ABSTRACT | CONTESTED coexistence | monitoring cost is real |
|
||||
| S018 | McDaniel & Einstein 2000/2005 multiprocess | 2000/05 | journal | yes | framework | RELEVANT_SECTIONS | coexistence | spontaneous + watch |
|
||||
| S019 | Altmann & Trafton 2002 goal-activation | 2002 | journal | yes | model | ABSTRACT | ROBUST practical | resumption-lag/reminders |
|
||||
| S020 | McDaniel et al. 2004 (delays/reminders) | 2004 | journal | yes | primary | ABSTRACT | ROBUST | external reminders eliminate cost |
|
||||
| S021 | Gollwitzer 1999 implementation intentions | 1999 | journal | yes | review | ABSTRACT | ROBUST, large lit | cue→action pairs |
|
||||
| S022 | Risko & Gilbert 2016 offloading, TiCS | 2016 | journal | yes | review | RELEVANT_SECTIONS | verified, high-strength | obligations OUTSIDE memory |
|
||||
| S023 | Johnson/Hashtroudi/Lindsay 1993 source monitoring | 1993 | journal | yes | framework | RELEVANT_SECTIONS | ROBUST | schema checklist, not mechanism |
|
||||
| S024 | Loftus & Palmer 1974; Loftus/Miller/Burns 1978 | 1974/78 | journal | yes | primary | RELEVANT_SECTIONS | ROBUST core; mechanism CONTESTED | original-vs-amendment separation |
|
||||
| S025 | McCloskey & Zaragoza 1985 | 1985 | journal | yes | primary (critique) | ABSTRACT | mechanism dispute | same |
|
||||
| S026 | Wixted & Wells 2017 eyewitness; Koriat metamemory | 2017/1993 | journal | yes | review/primary | ABSTRACT | ROBUST dissociation | never confidence-as-accuracy |
|
||||
| S027 | Jacoby et al. 1989 false fame/cryptomnesia | 1989 | journal | yes | primary | ABSTRACT | ROBUST | label generation events |
|
||||
| S028 | Roediger & McDermott 1995 DRM | 1995 | journal | yes | primary | RELEVANT_SECTIONS | ROBUST, replicated | penalize gist-only matches |
|
||||
| S029 | Brainerd & Reyna 2002/2005 Fuzzy Trace | 2002/05 | journal/book | yes | theory | RELEVANT_SECTIONS | ROBUST alternative | verbatim+gist dual representation |
|
||||
| S030 | Bartlett 1932 Remembering | 1932 | book | n/a | foundational | RELEVANT_SECTIONS | foundational; replication partial (Bergman & Roediger 1999) | minimize re-encoding without provenance |
|
||||
| S031 | Shaw & Porter 2015 | 2015 | journal | yes | primary | ABSTRACT | CONTESTED rates, ROBUST possibility | suggestive-pressure caution |
|
||||
| S032 | Anderson/Bjork/Bjork 1994 RIF | 1994 | journal | yes | primary | RELEVANT_SECTIONS | CONTESTED/fragile | hazard, not feature |
|
||||
| S033 | Murayama et al. 2014 RIF meta-analysis | 2014 | meta | yes | meta-analysis | ABSTRACT | small + publication bias | same |
|
||||
| S034 | Cepeda et al. 2006 spacing meta-analysis | 2006 | meta | yes | meta-analysis | RELEVANT_SECTIONS | ROBUST (259/271) | spaced re-presentation policy |
|
||||
| S035 | Roediger & Karpicke 2006; Karpicke & Roediger 2008 | 2006/08 | journal | yes | primary | RELEVANT_SECTIONS | ROBUST | retrieval-as-encoding (durability) |
|
||||
| S036 | Bjork 1994 desirable difficulties | 1994 | chapter | yes | theory | ABSTRACT | ROBUST direction | effortful retrieval |
|
||||
| S037 | Henke 2010 Nat Rev Neurosci (processing modes) | 2010 | journal | yes | theory | RELEVANT_SECTIONS | verified | tag-not-partition |
|
||||
| S038 | Maynez et al. 2020 ACL faithfulness | 2020 | conference | yes | primary | RELEVANT_SECTIONS | corroborates anti-pattern | append-only over destructive |
|
||||
| S039 | SSGM 2026 semantic drift | 2026 | preprint | no | primary | RELEVANT_SECTIONS | corroborates | same |
|
||||
| S040 | Nairne/Thompson/Pandeirada 2007 survival processing | 2007 | journal | yes | primary | ABSTRACT | functional account | dissolve store boundaries |
|
||||
| S041 | Vargha-Khadem et al. 1997 Science (developmental amnesia) | 1997 | journal | yes | primary | ABSTRACT | preserves weak distinction | tag-level distinction survives |
|
||||
| S042 | Conway 2005 self/memory | 2005 | journal | yes | theory | ABSTRACT | goal-constrained construction | fence life-story synthesis |
|
||||
| S043 | Lee & See 2004 trust calibration (via child Z) | 2004 | journal | yes | review | ABSTRACT | anchor | visible fixability |
|
||||
@@ -0,0 +1,109 @@
|
||||
# #378 R1 — 00_issue_scope.md
|
||||
|
||||
## Core question
|
||||
|
||||
Which mechanisms discovered through cognitive-architecture research genuinely
|
||||
solve problems Rune has, which mechanisms should inform Memory/Substrate/
|
||||
learning design, and which architecture concepts should be rejected as
|
||||
unnecessary imitation?
|
||||
|
||||
## Research questions (40 per mandate)
|
||||
|
||||
1. Why were cognitive architectures developed?
|
||||
2. What recurring architectural problems do they solve?
|
||||
3. Which mechanisms independently recur across architectures?
|
||||
4. Which mechanisms actually have empirical support?
|
||||
5. Which are primarily theoretical engineering choices?
|
||||
6. Which have failed to scale?
|
||||
7. Which have survived decades of use?
|
||||
8. Which architectures remain actively developed?
|
||||
9. What happened to abandoned architectures?
|
||||
10. What maintenance burden do full architectures create?
|
||||
11. Do cognitive cycles provide useful properties or artificial rigidity?
|
||||
12. Are declarative/procedural divisions computationally necessary?
|
||||
13. What does activation actually accomplish?
|
||||
14. What is the strongest evidence for ACT-R activation equations?
|
||||
15. How does Soar semantic memory compare?
|
||||
16. How do architectures prevent hub/fan effects?
|
||||
17. What does spreading activation add beyond ordinary retrieval?
|
||||
18. When is procedural compilation/chunking beneficial?
|
||||
19. What is the utility problem?
|
||||
20. Does impasse-driven learning outperform simple outcome learning?
|
||||
21. How are failures represented?
|
||||
22. How are stale procedures handled?
|
||||
23. What does Global Workspace add computationally?
|
||||
24. Is broadcast actually needed in software agents?
|
||||
25. What does attention competition accomplish?
|
||||
26. How do architectures distinguish active state from long-term memory?
|
||||
27. How do symbolic/subsymbolic hybrids work?
|
||||
28. Which mechanisms require numeric tuning that becomes maintenance debt?
|
||||
29. How do architectures handle uncertainty?
|
||||
30. How do architectures handle contradictory knowledge?
|
||||
31. How do architectures represent context?
|
||||
32. How do they represent goals?
|
||||
33. How do they recover from interruption?
|
||||
34. How do they select which memory enters active cognition?
|
||||
35. Which ideas map naturally to Rune's Warm Neurons?
|
||||
36. Which map to procedural learning?
|
||||
37. Which belong to Substrate rather than Memory?
|
||||
38. Which duplicate mechanisms Rune already possesses?
|
||||
39. What would a minimal cognitive architecture for Rune actually contain?
|
||||
40. Would Rune be better served by borrowing isolated mechanisms rather than
|
||||
adopting any architecture?
|
||||
|
||||
## R0 claims under test (HYPOTHESES, not accepted)
|
||||
|
||||
H1: ACT-R base-level activation (B_i ≈ Σ t_j^-d) should inform deterministic
|
||||
Warm Neuron activation.
|
||||
H2: Recency + frequency should replace wash_count-style frequency-only behavior.
|
||||
H3: ACT-R/Soar fan normalization supports graph/PPR anti-hub weighting.
|
||||
H4: Soar chunking supports impasse → successful resolution → procedure promotion.
|
||||
H5: Global Workspace / LIDA suggests selected context → broadcast → learning.
|
||||
H6: Context inclusion itself might be treated as a consolidation/learning event.
|
||||
H7: Activation noise should be rejected for Rune.
|
||||
H8: Production-rule engines should be rejected.
|
||||
H9: Codelet concurrency / strict cognitive-cycle timing should be rejected.
|
||||
H10: Cognitive architectures largely validate Rune's existing separation of
|
||||
memory / active context / procedural execution.
|
||||
|
||||
## Technical correction to verify (§8)
|
||||
|
||||
R0 represented ACT-R base-level activation approximately as:
|
||||
|
||||
B_i = Σ_j t_j^-d
|
||||
|
||||
Verify against original ACT-R sources: the canonical formulation commonly
|
||||
includes a logarithm around the summed decayed accesses:
|
||||
|
||||
B_i = ln(Σ_j t_j^-d)
|
||||
|
||||
Verify: exact canonical formulations, historical revisions, optimized
|
||||
approximations, what d represents, where noise enters, what spreading
|
||||
activation adds, what retrieval threshold adds, whether Soar copied the same
|
||||
formula exactly or approximately. If R0 misstated the formula, record an
|
||||
explicit correction.
|
||||
|
||||
## Falsifiers
|
||||
|
||||
F1: If ACT-R activation's predictive success is confined to laboratory
|
||||
response-time fitting with non-identifiable parameters, it does not
|
||||
justify Rune adoption.
|
||||
F2: If fan-effect → graph-normalization transfer conflates three distinct
|
||||
mathematics (human semantic-network fan, graph-degree normalization,
|
||||
PageRank/PPR), the analogy must be rebuilt per-domain or dropped.
|
||||
F3: If Soar chunking's utility problem dominates (rule explosion outweighs
|
||||
benefit), impasse-driven promotion is rejected for Rune.
|
||||
F4: If Global Workspace broadcast reduces to publish/subscribe that Rune's
|
||||
event/state machinery already implements, GWT adds nothing.
|
||||
F5: If cognitive cycles provide no property that event-driven architecture
|
||||
cannot supply more cheaply (bounded work, fairness, budgets), cycles
|
||||
are rejected as biological imitation.
|
||||
F6: If the scaling/failure history shows architectures fail on maintenance
|
||||
burden rather than mechanism quality, the lesson is anti-architecture:
|
||||
borrow mechanisms, never frameworks.
|
||||
|
||||
## Stopping criterion
|
||||
|
||||
Evidence saturation: new sources repeat known mechanisms/criticisms, add
|
||||
only detail. No arbitrary paper-count target — but a few paragraphs and a
|
||||
handful of citations are NOT sufficient for a foundational field.
|
||||
@@ -0,0 +1,110 @@
|
||||
# #378 R1 — 01_inward.md
|
||||
|
||||
## Current Rune mechanisms vs cognitive-architecture questions (evidence-first)
|
||||
|
||||
_Source: direct read-only inspection of memory.db (924 entries) + behavior.db
|
||||
+ T0/T0.1 archaeology. Status: PROVEN / IMPLEMENTED_UNPROVEN / DESIGNED /
|
||||
DORMANT / ABSENT / BROKEN._
|
||||
|
||||
### Canonical Memory and use_history
|
||||
- 924 entries (729 fact, 195 neuron). wash_count>0 on 304.
|
||||
- Status: PROVEN. Use-history exists; T0.1 found it unvalidated as quality
|
||||
signal (superseded entries carry high wash counts).
|
||||
|
||||
### wash_count — what job does it do?
|
||||
- Currently feeds: promotion_eligible (143 rows), retrieval ranking
|
||||
(frequency term), and nothing else. It does triple duty for truth,
|
||||
activation, and promotion — three unrelated jobs on one counter.
|
||||
- Timestamps available: created_at, last_accessed, last_washed per entry.
|
||||
Per-OCCURRENCE timestamps (ACT-R needs the full access history, not just
|
||||
last-accessed): ABSENT. An access log would be NEW.
|
||||
- Status: PROVEN counter; ABSENT occurrence history.
|
||||
|
||||
### Warm/neuron state
|
||||
- 195 neuron rows; tier='warm' on ALL 924 rows = vestigial (T0.1 R4).
|
||||
- No activation equation, no spreading, no threshold, no noise.
|
||||
- Status: DORMANT as architecture; PROVEN as rows.
|
||||
|
||||
### Retrieval ranking
|
||||
- Hybrid dense+BM25+RRF+floor (T0 PROVEN). Rank terms: importance,
|
||||
wash_count (frequency), recency via last_accessed (coarse).
|
||||
- No decay function, no fan normalization, no threshold gate.
|
||||
- Status: PROVEN; activation mathematics ABSENT.
|
||||
|
||||
### ContextBroker
|
||||
- Planned (T1 target); current: keyword routing + session/task scoping
|
||||
(PROVEN per T0 production entrypoints).
|
||||
- Performs PART of a workspace: bounded selection into context. No
|
||||
broadcast, no competition, no learning-from-inclusion.
|
||||
- Status: IMPLEMENTED (selection) / DESIGNED (workspace semantics).
|
||||
|
||||
### Task/session state
|
||||
- auto_tasks.db (2 tasks), PendingOperation machinery, event-driven waits
|
||||
(PROVEN, R13/M9/M10 PASS). Goal stacks: ABSENT as such — goals live in
|
||||
task records + conversation, not a goal buffer.
|
||||
- Interruption/resume: PROVEN via event-driven continuation (async
|
||||
programme FROZEN_ACCEPTED).
|
||||
|
||||
### Success/failure learning
|
||||
- behavior.db: 2 corrections, 1 habit, 0 activations. Mechanism exists;
|
||||
volume is negligible — no statistical signal has ever flowed through it.
|
||||
- Status: IMPLEMENTED_UNPROVEN (mechanism) / ABSENT (evidence base).
|
||||
|
||||
### Promotion mechanisms
|
||||
- promotion_eligible flag (143 rows); governance scripts (provisional/
|
||||
validated/locked lifecycle, PROVEN as code). Impasse signal: ABSENT —
|
||||
no retrieval-failure vs tool-failure distinction is logged.
|
||||
- Status: DESIGNED (gate semantics) / ABSENT (impasse trigger).
|
||||
|
||||
### Procedural-learning design
|
||||
- Skill files exist; promotion/demotion lifecycle DESIGNED (child G
|
||||
research), not exercised. No chunking, no compilation, no utility
|
||||
tracking. Status: DESIGNED.
|
||||
|
||||
### Graph/PPR plans
|
||||
- graph.sqlite DORMANT (last edge 2026-08-26). PPR: EXPERIMENT (child I
|
||||
protocol defined, bridge-node recall + hybrid ablation). Fan
|
||||
normalization: DESIGNED as requirement, not implemented.
|
||||
- Status: DORMANT / EXPERIMENT.
|
||||
|
||||
### Scaffolding / Spine / Substrate
|
||||
- Scaffolding: construction authority, PROVEN (contracts driven through
|
||||
real flow). Spine: structural truth, evidence-gated maturity (per child P
|
||||
research). Substrate: execution substrate, DESIGNED.
|
||||
- These already solve: executive control (task authority + event-driven
|
||||
continuation), architectural state representation (Spine), execution
|
||||
(Substrate). Cognitive-architecture imports must not duplicate them.
|
||||
|
||||
### Event-driven continuation/recovery
|
||||
- PROVEN (async programme frozen). This is Rune's answer to anything a
|
||||
cognitive cycle might offer (bounded work, fairness, budgets) — the
|
||||
burden is on cycles to show what events cannot do.
|
||||
|
||||
### Growth Delta mechanisms
|
||||
- Outcome-learned utility: DESIGNED (child E/G research); wash_count is
|
||||
the current proxy, unvalidated.
|
||||
|
||||
### Current learning signals (inventory)
|
||||
1. wash_count (frequency of retrieval/use) — PROVEN counter, unvalidated.
|
||||
2. importance (LLM-assigned scalar) — PROVEN field, calibration unknown.
|
||||
3. last_accessed / last_washed (coarse recency) — PROVEN fields.
|
||||
4. corrections (2 rows) — negligible volume.
|
||||
5. promotion_eligible (143 rows) — gate output, not a signal.
|
||||
6. Per-occurrence access history — ABSENT.
|
||||
7. Retrieval-failure events — ABSENT.
|
||||
8. Outcome-verified success/failure per procedure — ABSENT.
|
||||
|
||||
## Inward questions answered (§9)
|
||||
|
||||
- Reliable impasse signal? NO — ABSENT. Retrieval failure vs tool failure
|
||||
is not distinguished anywhere.
|
||||
- Access timestamps sufficient for ACT-R-like activation? PARTIAL —
|
||||
last_accessed/last_washed exist per entry; per-occurrence history ABSENT.
|
||||
- wash_count's jobs? THREE unrelated jobs (truth proxy, activation term,
|
||||
promotion input) on one counter — the core finding.
|
||||
- ContextBroker as workspace? PARTIAL — selection yes; competition,
|
||||
broadcast, learning-from-inclusion no.
|
||||
- Substrate as executive control? DESIGNED — the claim is untested.
|
||||
- Spine as state representation? PROVEN (per T0/T21.5 + child P).
|
||||
- Vocabulary renaming risk? HIGH — "activation," "chunk," "workspace,"
|
||||
"attention" could all rename existing systems without adding mechanism.
|
||||
@@ -0,0 +1,10 @@
|
||||
# 02 — OUTWARD (populated by the deep-research actor; verified by controller)
|
||||
|
||||
Files: field_history.md, act_r.md, soar.md, clarion.md,
|
||||
lida_global_workspace.md, sigma.md, opencog_hyperon.md,
|
||||
other_architectures.md, declarative_memory.md, procedural_learning.md,
|
||||
activation_retrieval.md, spreading_activation.md, working_memory_attention.md,
|
||||
goal_impasse_control.md, symbolic_subsymbolic.md, cognitive_cycles.md,
|
||||
scaling_and_failure.md, modern_agent_relevance.md, competing_models.md,
|
||||
criticism_replication.md, software_transfer.md
|
||||
+ sources.md (ledger) + claims.json (machine-readable).
|
||||
@@ -0,0 +1,20 @@
|
||||
# ACT-R deep pass
|
||||
|
||||
**History/versions:** 4.0 (1998, Lebiere join, perceptual-motor from EPIC), 5.0 (2004 modules+buffers, brain mapping), 6.0 (2005 rewritten, dynamic pattern matching), 7.x (2015+, typeless chunks, JSON-RPC, Python tutorial). Common Lisp; jACT-R, python_actr, pyactup are partial mirrors. Maintained at CMU, active modelling community, 700+ models, cognitive-tutor deployment — but NOT a production agent substrate.
|
||||
|
||||
**Mechanisms:** declarative chunks (typed slot-vectors); productions (buffer-condition → buffer-action, single firing per ~50ms cycle); buffers (goal, imaginal/problem state, retrieval, visual, aural, manual); modules (perceptual-motor + declarative + procedural).
|
||||
|
||||
**VERIFIED CANONICAL BASE-LEVEL EQUATION (load-bearing):** per Anderson et al. 2004; Anderson 2007; ACT-R 7 reference manual:
|
||||
|
||||
> **B_i = ln( Σ_j t_j^(−d) ) + β_i**
|
||||
|
||||
B_i = base-level activation of chunk i; t_j = lag since j-th encounter/use; d = decay rate (default ≈0.5, typically 0.4–0.6); β_i = offset/intercept (prior/familiarity constant). **The logarithm is canonical** — it converts summed recency/frequency trace into log-odds-like need probability under Anderson & Schooler (1991) rational analysis. **R0 CORRECTION: R0 wrote B_i = Σ t_j^−d, missing the ln. Without it the quantity is not activation but raw recency mass.** Historical revisions: early ACT versions used power-law strength without log; rational-analysis integration (1990–93) introduced log-sum form; later work adds β, optional optimized/approximated forms (recency-only or two-point approximations) per reference manual.
|
||||
|
||||
**Full activation:** A_i = B_i + Σ_j W_j·S_ji + P_i + ε, where spreading ΣW·S is context boost, P partial-match penalty, ε logistic/similar noise. Retrieval only if A_i > τ (threshold); latency T = F·e^(−A) (F latency factor); probability logistic in (A−τ). Spreading: W_j source weighting (usually 1/n sources), S_ji ≈ S − ln(fan_j) (association strength minus fan penalty). Utility learning for productions: U updated by reward minus cost with noise; production compilation collapses sequences. Noise enters twice: activation noise (transient retrieval stochasticity) and utility noise — both principled as sampling, but in practice often free parameters.
|
||||
|
||||
**Fitting methodology:** grid-search parameters per experiment to latency/accuracy/BOLD. Strength: genuine quantitative prediction. Weakness (contested): **parameter identifiability — admitted in Anderson 2004 itself**: "the retrieval threshold, τ, and latency factor, F, are parameters that have varied substantially from model to model," with only the empirical relation F ≈ .35·e^τ offered. d = 0.5 is community convention ("has emerged as the default value... over a large range of applications"), not derivation. Replication requires exact parameters + history traces rarely published. Transfer limits: parameters tuned to one paradigm rarely transfer; brittle chunk-type engineering.
|
||||
|
||||
**Anchor-verification note (post-repair):** the author preprint was read in FULL — equation verified verbatim including the logarithm. Anderson & Schooler 1991 (companion OCR'd in full) explicitly states: "We are not too concerned with whether the memory or environmental functions are truly power functions or just good approximations" — the theory itself transfers the SIGNALS, not the power-law form. This is the strongest possible grounding for the R1 conclusion "adopt signals, benchmark the form."
|
||||
|
||||
**Soar copy question — VERIFIED:** Laird (2012, semantic memory ch.; restated Laird 2022 arXiv:2201.09305) says Soar SMEM "implements the base-level activation scheme originally developed for ACT-R." It is **functionally the same form (log-sum power-law) but approximately, not byte-identical**: own decay/parameters, own usage-history storage, plus lazy-evaluation spreading (Jones et al. 2016 ICCM). Cite as approximate adoption, not exact port.
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
# Activation / retrieval compared
|
||||
|
||||
**What is activation FOR?** The literature conflates five functions Rune must separate: (1) retrieval ordering (rank candidates); (2) cache residency (what stays hot — ECAN/STI, warm neurons); (3) context inclusion (what enters prompt — working-memory budget); (4) forgetting (what decays — base-level); (5) procedural selection (which skill fires — utility). ACT-R uses one number for 1/3/4; Soar splits utility vs declarative activation; ECAN splits STI vs LTI. Rune should follow the split: distinct signals per function (relevance, frequency, recency, accessibility, residency, importance, utility, trust, confidence, task affinity), not one "activation."
|
||||
|
||||
Separate dimensions per mandate §20 — do not collapse into one scalar without evidence.
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
# CLARION (fair treatment)
|
||||
|
||||
Sun's dual-representation thesis: every subsystem has **explicit** (localist chunks/rules) and **implicit** (distributed microfeatures/Q-networks) levels, bidirectionally linked (bottom-up rule extraction RER; top-down guidance). Four subsystems: action-centered (procedural), non-action-centered (semantic/episodic), motivational (drives→goals), metacognitive (monitoring/parameter-setting). Explains skill speed-up, verbalization gains, transfer, pressure degradation (Sun et al. 2005 Psych. Rev.; Sun 2016 OUP).
|
||||
|
||||
**Bearing on Rune:** the explicit/implicit split is PARTIALLY but not fully captured by deterministic/LLM/local-model layering. What CLARION adds: (a) redundant encoding with principled bottom-up extraction (experience → rule) and top-down shaping (rule → habit) — Rune's procedural-promotion path lacks the second direction; (b) motivational/metacognitive subsystems as first-class (drives → goals → parameter control) — Rune has trust/authority but no drive economy; (c) synergy accounting (when to trust which level). Weaknesses: implementation fragmented (pyClarion partial), validation mostly lab tasks (serial reaction, artificial grammar, Tower of Hanoi), heavy machinery for modest engineering gain. Borrow the bidirectional learning loop and metacognitive parameter control; skip the four-box ontology as mandatory.
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
# Cognitive cycles
|
||||
|
||||
Cycles provide bounded work, fairness, predictable budgets (challenge accepted). But fixed biological cadence is unjustified for async agents. Recommendation: **event-driven with bounded quantum** (Soar-like decision cycle as budget unit, not clock): each continuation runs propose→select→act with a work cap, yielding fairness without 10 Hz theatre. (Adversarial #7 verdict: strongest attack in the brief — no production agent runtime runs fixed cognitive cycles; event-driven continuation already PROVEN in Rune contradicts, not complements, fixed cycles.)
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
# Competing models / negative evidence
|
||||
|
||||
Connectionism/PDP vs symbols; embodied/situated critiques (Brooks, Varela); single-system vs multi-system memory (carries over from #377); IIT vs GWT (2023 adversarial collaboration unresolved); masking-method critiques (Meyen et al. 2022); BOLD-mapping disputes; parameter-identifiability critiques (Roberts & Pashler 2000; Pitt/Myung/Zhang 2002); power-law-vs-exponential (Heathcote/Brown/Mewhort 2000; Evans et al. 2018; Anderson R.B. 2001 emergence; Murre & Chessa 2011); Kotseruba & Tsotsos 2020 (40 years: fragmentation, near-zero shared benchmarks, few deployed applications).
|
||||
|
||||
Loaded 100 of 506 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user