Skip to content

Commit 81d5115

Browse files
committed
v50: Synta full recorded action archive and active-goal ML evidence
1 parent b910f7b commit 81d5115

14 files changed

Lines changed: 295 additions & 17 deletions

‎V100_AUDIT.md‎

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -507,3 +507,31 @@ deselected; one existing PEFT warning. Node runtime exercises the trusted render
507507
on older guest layouts. Browser visual QA could not run because the local browser
508508
binary is unavailable. Ruff, shell syntax and diff checks passed. Hardware execution
509509
and LAN publication of v49 await operator installation.
510+
511+
512+
## v50: Synta, paginated actions and active-goal learning evidence
513+
514+
Synta is the system name in host-rendered HTML, terminal chat, chat instructions,
515+
preferences and dashboard service description. Existing binary names and model
516+
aliases stay compatible. The read-only /api/actions endpoint pages exact recorded,
517+
already-redacted daily journals by byte cursor, with bounded pages, date validation,
518+
symlink exclusion and retry-safe incomplete-tail handling. The dashboard exposes
519+
day selection and all recorded fields, arguments, outputs and correlation IDs.
520+
Activity events record the operator goal ID at event time; this does not override
521+
an experiment's original goal snapshot. No missing historical events are fabricated.
522+
523+
The goal ML panel exposes task inputs, observed targets, metrics, training admission,
524+
optimizer evidence and accepted weights. New goal examples default to the active
525+
goal; older verified labels remain archived and independently revalidated when
526+
used for retention replay. Old or unattributed admission counters are not shown as
527+
current goal admission. Malformed evidence/target objects fail validation before
528+
set membership or database binding. This is a generic source-based numerical
529+
forecast task and independently verified auxiliary tasks, not a claim that any
530+
natural-language goal automatically supplies labels, a reward oracle or profit.
531+
532+
Validation: 996 passed, 65 skipped, one resource-dependent owned-worker integration
533+
deselected and one existing PEFT warning. Final focused renderer/telemetry checks
534+
passed after replacing missing ML counters with explicitly unknown values. Tests
535+
cover archive pagination, goal attribution, incomplete tails, path/symlink rejection,
536+
HTTP action routes and goal-change separation while preserving verifiable replay.
537+
No hardware training improvement or universal goal oracle is certified.

‎pyproject.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ name = "rlms"
33
authors = [
44
{name = "Alex Zhang", email = "altzhang@mit.edu"},
55
]
6-
version = "0.1.3+v100.49"
6+
version = "0.1.3+v100.50"
77
description = "Recursive Language Models."
88
readme = "README.md"
99
license = "MIT"

‎rlm/v100/activity.py‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ def write(self, category: str, kind: str, payload: dict, **context) -> str:
7777
raise ValueError("Unknown activity category")
7878
now = datetime.now(UTC)
7979
event_id = uuid.uuid4().hex
80+
goal_path = self.root / "research/goal.json"
81+
if goal_path.exists() and goal_path.stat().st_size <= 8192:
82+
context["operator_goal_id_at_event"] = json.loads(goal_path.read_text()).get("id")
8083
event = {
8184
"time": now.isoformat(timespec="milliseconds"),
8285
"id": event_id,

‎rlm/v100/activity_browser.py‎

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
"""Read-only pagination over exact, already-redacted daily execution journals."""
2+
3+
import json
4+
from datetime import date
5+
from pathlib import Path
6+
7+
8+
def days(root: Path) -> list[str]:
9+
base = (root / "research/logs/activity").resolve()
10+
result = []
11+
for path in sorted(base.glob("*/timeline.jsonl")):
12+
if path.is_symlink() or path.parent.is_symlink() or not path.resolve().is_relative_to(base):
13+
continue
14+
try:
15+
if date.fromisoformat(path.parent.name).isoformat() != path.parent.name:
16+
continue
17+
except ValueError:
18+
continue
19+
result.append(path.parent.name)
20+
return result
21+
22+
23+
def page(root: Path, day: str, cursor: int = 0, limit: int = 100) -> dict:
24+
if date.fromisoformat(day).isoformat() != day or type(cursor) is not int or cursor < 0:
25+
raise ValueError("Invalid action archive date or cursor")
26+
if type(limit) is not int or not 1 <= limit <= 100:
27+
raise ValueError("Action archive page limit must be 1-100")
28+
base = (root / "research/logs/activity").resolve()
29+
path = base / day / "timeline.jsonl"
30+
if path.is_symlink() or path.parent.is_symlink() or path.resolve().parent != base / day:
31+
raise ValueError("Action archive path is outside its day")
32+
events = []
33+
with path.open("rb") as stream:
34+
stream.seek(0, 2)
35+
size = stream.tell()
36+
if cursor > size:
37+
raise ValueError("Action cursor exceeds archive size")
38+
stream.seek(cursor)
39+
while len(events) < limit and stream.tell() - cursor < 1024 * 1024:
40+
position = stream.tell()
41+
line = stream.readline(65537)
42+
if not line:
43+
break
44+
if len(line) > 65536:
45+
raise ValueError("Action event exceeds journal budget")
46+
if not line.endswith(b"\n"):
47+
stream.seek(position)
48+
break
49+
event = json.loads(line)
50+
if not isinstance(event, dict):
51+
raise ValueError("Invalid action event")
52+
events.append(event)
53+
following = stream.tell()
54+
return {
55+
"day": day,
56+
"events": events,
57+
"cursor": cursor,
58+
"next_cursor": following,
59+
"has_more": following < size,
60+
"archive_bytes": size,
61+
"scope": "Recorded actions only; unlogged operations cannot be reconstructed",
62+
}

‎rlm/v100/dashboard_layout.py‎

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@
4040
for(const j of a.jobs||[]){const p=document.createElement('p');p.textContent=[j.kind,j.branch,j.state||j.phase,j.id,j.assignment].filter(Boolean).join(' | ');node.append(p)}
4141
const proof=document.createElement('details'),summary=document.createElement('summary'),raw=document.createElement('pre');summary.textContent='Dane źródłowe';raw.textContent=JSON.stringify(a,null,2);proof.append(summary,raw);node.append(proof);$('actors').append(node)
4242
}
43+
const plans=data.live?.goals||{};$('goals').textContent=JSON.stringify(plans,null,2);$('goals').style.display='none';const oldPanel=$('goals').parentElement;if(oldPanel?.tagName==='SECTION')oldPanel.style.display='none';
44+
}
45+
4346
function textField(parent,label,value){if(value===undefined||value===null||value==='')return;const p=document.createElement('p'),b=document.createElement('strong');b.textContent=label+': ';p.append(b,document.createTextNode(String(value)));parent.append(p)}
4447
function detailsField(parent,label,value,key){if(!value)return;const d=document.createElement('details'),h=document.createElement('summary'),p=document.createElement('pre');d.dataset.key=key;h.textContent=label;p.textContent=String(value);d.append(h,p);parent.append(d)}
4548
function panel(id,title,after){let p=$(id);if(!p){p=document.createElement('section');p.id=id;const h=document.createElement('h2');h.textContent=title;p.append(h);after.after(p)}return p}
@@ -61,14 +64,19 @@
6164
for(const e of [...(data.live?.events||[])].reverse()){const d=document.createElement('details');d.className='event-row';d.dataset.key=(e.request_id||e.time)+'-'+e.actor+'-'+e.kind;const h=document.createElement('summary');h.textContent=[e.time,e.branch,e.actor,e.kind,e.tool].filter(Boolean).join(' | ');d.append(h);textField(d,'Returned local reasoning (unverified)',e.returned_trace);textField(d,'Task / arguments',e.task);textField(d,'Public output / result',e.summary);textField(d,'Error / status',e.detail);if(e.usage&&Object.keys(e.usage).length)textField(d,'Tokens',JSON.stringify(e.usage));textField(d,'Seconds',e.seconds);textField(d,'Evidence',e.source);$('events').append(d)}
6265
for(const n of document.querySelectorAll('details[data-key]'))if(opened.has(n.dataset.key))n.open=true;
6366
}
64-
const plans=data.live?.goals||{};$('goals').textContent=JSON.stringify(plans,null,2);$('goals').style.display='none';const oldPanel=$('goals').parentElement;if(oldPanel?.tagName==='SECTION')oldPanel.style.display='none';
67+
function archivePanel(){
68+
if($('action-archive'))return;
69+
const p=document.createElement('section');p.id='action-archive';const h=document.createElement('h2');h.textContent='Full recorded action archive';const note=document.createElement('p');note.textContent='Browse daily journals from their first event. Live activity above is the latest 200 events. Archives contain recorded actions, not proof that an unlogged action occurred.';const select=document.createElement('select');select.id='archive-day';const button=document.createElement('button');button.textContent='Load action history';const status=document.createElement('p');const rows=document.createElement('div');p.append(h,note,select,button,status,rows);$('timeline-panel').after(p);let cursor=0;
70+
async function load(reset=false){button.disabled=true;try{if(reset){cursor=0;rows.replaceChildren()}const query=new URLSearchParams({cursor:String(cursor),limit:'100'});if(select.value)query.set('day',select.value);const response=await fetch('/api/actions?'+query,{cache:'no-store'});if(!response.ok)throw Error('HTTP '+response.status);const result=await response.json();if(!select.options.length){for(const day of result.days||[]){const option=document.createElement('option');option.value=day;option.textContent=day;select.append(option)}select.value=result.day||''}
71+
for(const e of result.events||[]){const d=document.createElement('details'),title=document.createElement('summary'),body=document.createElement('pre');title.textContent=[e.time,e.branch,e.actor,e.kind].filter(Boolean).join(' | ');body.textContent=JSON.stringify({context:e.context,payload:e.payload,id:e.id},null,2);d.append(title,body);rows.append(d)}cursor=result.next_cursor;status.textContent=`${rows.children.length} events shown | ${cursor} / ${result.archive_bytes||0} archive bytes`;button.textContent=result.has_more?'Load next 100 actions':'Check for new actions';}catch(error){status.textContent='Archive unavailable: '+error.message}finally{button.disabled=false}}
72+
button.onclick=()=>load();select.onchange=()=>load(true);
6573
}
66-
74+
function learningPanel(data){const p=panel('goal-learning-panel','Goal-directed ML pipeline',$('plan-panel'));let body=$('goal-learning-view');if(!body){body=document.createElement('div');body.id='goal-learning-view';p.append(body)}body.replaceChildren();const evidence=data.report?.mission_evidence||{},g=evidence.goal_learning||{};textField(body,'Active goal ID',g.goal_id||'No goal recorded');for(const [k,v] of Object.entries(g.learning_task||{}))textField(body,k,v);textField(body,'Recent forecasts',fmt(g.forecasts?.length));textField(body,'Recent resolved forecasts',g.recent_resolved);textField(body,'Recent Brier score',g.recent_brier);textField(body,'Admitted training examples',g.training_admission?.admitted);textField(body,'Confirmed optimizer updates',fmt(evidence.optimizer_updates_observed));textField(body,'Accepted weight updates',fmt(evidence.accepted_weight_updates_this_run));detailsField(body,'Training admission evidence',JSON.stringify(g.training_admission||{}),'goal-admission')}
6775
function svg(tag,attrs,text){let node=document.createElementNS('http://www.w3.org/2000/svg',tag);for(const [key,val] of Object.entries(attrs))node.setAttribute(key,val);if(text!==undefined)node.textContent=text;return node}
6876
function render(data){const m=data.mission||{},r=data.report||{},ev=(m.state?.phase==='official-public-baseline'?r.mission_evidence?.official_benchmark:null)||m.evaluation||{},learn=m.learning||{},gpu=data.gpu||{};
6977
if(data.layout?.active_sha256&&layoutVersion!==data.layout.active_sha256){location.reload();return}$('layout').textContent='HTML mastera: /workspace/dashboard/index.html | '+(data.layout?.state||'oczekiwanie')+(data.layout?.error?' | '+data.layout.error:'');
7078
$('fresh').textContent='Zebrano: '+new Date(data.collected_at*1000).toLocaleString()+' | Raport zbierany co 20 s | Przebieg: '+fmt(m.run);
71-
workView(data);$('warning').textContent=(data.errors||[]).join('\n');$('cards').replaceChildren();card('Misja',m.running?'działa':'zatrzymana');card('Faza',m.state?.phase);card('Cykle uczenia',learn.completed_cycles);card('Zaakceptowane aktualizacje wag',r.accepted_weight_updates_this_run);card('Potwierdzone kroki optymalizatora',r.mission_evidence?.optimizer_updates_observed);card('Kontekst',m.state?.context_window);card('GPU - wykorzystanie',gpu.utilization===undefined?null:gpu.utilization+'%');card('VRAM zajęty / razem',gpu.memory_used===undefined?null:gpu.memory_used+' / '+gpu.memory_total+' MiB');card('GPU - temperatura / moc',gpu.temperature===undefined?null:gpu.temperature+' °C / '+gpu.power+' W');
79+
workView(data);learningPanel(data);archivePanel();$('warning').textContent=(data.errors||[]).join('\n');$('cards').replaceChildren();card('Misja',m.running?'działa':'zatrzymana');card('Faza',m.state?.phase);card('Cykle uczenia',learn.completed_cycles);card('Zaakceptowane aktualizacje wag',r.accepted_weight_updates_this_run);card('Potwierdzone kroki optymalizatora',r.mission_evidence?.optimizer_updates_observed);card('Kontekst',m.state?.context_window);card('GPU - wykorzystanie',gpu.utilization===undefined?null:gpu.utilization+'%');card('VRAM zajęty / razem',gpu.memory_used===undefined?null:gpu.memory_used+' / '+gpu.memory_total+' MiB');card('GPU - temperatura / moc',gpu.temperature===undefined?null:gpu.temperature+' °C / '+gpu.power+' W');
7280
$('evaluation').textContent=ev.total?`${ev.completed}/${ev.total} ukończonych, ${ev.passed===undefined?'ocenianie oficjalnym graderem':ev.passed+' zaliczonych'} (${ev.state})`:'Brak bieżącego licznika ewaluacji';$('progress').max=ev.total||1;$('progress').value=ev.completed||0;$('case').textContent=ev.current_case?('Obecny przypadek: '+ev.current_case):'';
7381
const ledger=r.paper||{};$('paper').textContent=Object.entries(ledger.branches||{}).map(([name,b])=>`${name} | Equity ${fmt(b.equity)} ${ledger.currency||''} | Net P&L ${fmt(b.net_pnl_before_personal_tax)} | Costs ${fmt(b.modeled_costs)} | Resolved fills ${fmt(b.resolved_fills)}`).join('\n\n')||'No recorded paper ledger';$('blockers').textContent=(r.paper_blockers||[]).join('\n')||'No reported paper blockers';$('workers').textContent=JSON.stringify({drones:r.drones,external_compute:r.external_compute,desktop:r.desktop,official_benchmark:r.official_benchmark},null,2);$('log').textContent=data.controller_log||'Brak logu';$('evidence').textContent=JSON.stringify({last_cycle:learn.last_cycle,evidence:r.mission_evidence,collection_errors:data.errors},null,2);
7482
$('backtests').replaceChildren();$('chart').replaceChildren();const tests=r.recent_exploratory_backtests||[];let largest=Math.max(.01,...tests.map(t=>Math.abs(t.development_test?.net_return||0)));$('chart').append(svg('line',{x1:400,y1:0,x2:400,y2:220,stroke:'#8296b1'}));tests.forEach((test,i)=>{const result=test.development_test||{},tr=document.createElement('tr');[`${i+1}. ${test.parameters?.rule||''}`,pct(result.net_return),pct(result.max_sampled_drawdown),fmt(result.fills)].forEach(v=>{let td=document.createElement('td');td.textContent=v;tr.append(td)});$('backtests').append(tr);if(typeof result.net_return==='number'&&Number.isFinite(result.net_return)){let width=Math.abs(result.net_return)/largest*280,y=15+i*48;$('chart').append(svg('rect',{x:result.net_return<0?400-width:400,y,width,height:26,fill:result.net_return<0?'#e68d80':'#75c5ae'}),svg('text',{x:8,y:y+19,fill:'#dce6f5','font-size':14},`${i+1}. ${pct(result.net_return)}`))}});if(!tests.length)$('chart').append(svg('text',{x:20,y:50,fill:'#adbdd1'},'Brak zapisanych wyników'));
@@ -173,6 +181,7 @@ def validate_template(content):
173181

174182

175183
def render_template(content, identity):
184+
content = content.replace("V100 - postęp misji", "Synta - mission control")
176185
script = (
177186
"<style>"
178187
+ HOST_STYLE

0 commit comments

Comments
 (0)