release: prepare Engraphis 1.0.1 client reliability - #59
Conversation
|
You are seeing this message because GitHub Code Scanning has recently been set up for this repository, or this pull request contains the workflow file for the Code Scanning tool. What Enabling Code Scanning Means:
For more information about GitHub Code Scanning, check out the documentation. |
|
Follow-up release review aligned the Pro billing unit with the shipped entitlement model: one named owner across that owner's local installations. Prices remain $10/month and $100/year; Team remains per named seat. The manifest gate now enforces those units. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 8a086fa624
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| async function loadAutomation(){const el=document.getElementById('automation-body'),lock=document.getElementById('au-lock');el.innerHTML='<div class="spinner" data-csp-style="s86"></div>';try{const p=await api('/automation');setPlanPill(lock,(LIC&&LIC.is_trial)?'TRIAL':'CLOUD','pill pill-accent');const last=p.last_run?fmtRel(p.last_run):'never',dream=p.dream_enabled!=null?p.dream_enabled:p.dream;el.innerHTML=`<div class="cols-2"><div class="card"><div class="card-head">Hosted maintenance policy</div><label data-csp-style="s88"><input type="checkbox" id="au-enabled" ${p.enabled?'checked':''}> Enable hosted automation</label><div class="field"><label class="field-lbl">Run every (hours)</label><input class="input" id="au-cadence" type="number" min="1" value="${p.cadence_hours||24}"></div><label data-csp-style="s88"><input type="checkbox" id="au-consolidate" ${p.consolidate?'checked':''}> Auto Consolidation</label><div class="field"><label class="field-lbl">Min cluster size</label><input class="input" id="au-mincluster" type="number" min="2" max="20" value="${p.min_cluster||3}"></div><div class="field"><label class="field-lbl">Archive proposal threshold</label><input class="input" id="au-archive" type="number" step="0.01" min="0" max="0.5" value="${p.archive_below!=null?p.archive_below:0.05}"><div class="field-hint">The cloud returns reviewable proposals. Pinned memories remain protected.</div></div><label data-csp-style="s88"><input type="checkbox" id="au-dream" ${dream?'checked':''}> Auto Dreaming after accumulation and idle time</label><div class="field"><label class="field-lbl">Min new memories</label><input class="input" id="au-dream-min" type="number" min="1" value="${p.dream_min_new||20}"></div><div class="field"><label class="field-lbl">Idle minutes</label><input class="input" id="au-dream-idle" type="number" min="0" value="${p.dream_idle_minutes!=null?p.dream_idle_minutes:15}"></div><button class="btn btn-primary btn-sm" data-onclick="h88">Save hosted policy</button></div><div class="card"><div class="card-head">Cloud worker status</div><div class="cfg-row" data-csp-style="s48"><span>Status</span><span class="pill ${p.enabled?'pill-green':'pill-muted'}" data-csp-style="s9">${p.enabled?'ENABLED':'OFF'}</span></div><div class="cfg-row" data-csp-style="s48"><span>Last run</span><span data-csp-style="s50">${esc(last)}</span></div><div data-csp-style="s89"><button class="btn btn-ghost btn-sm" data-onclick="h89">Preview snapshot</button><button class="btn btn-primary btn-sm" data-onclick="h90">Request proposal</button></div><div id="au-result" data-csp-style="s90"></div><div class="field-hint" data-csp-style="s91">Automation executes in Engraphis Cloud. This public client contains no local scheduler or cron worker. Managed compute requires explicit consent; secrets are excluded.</div></div></div>`}catch(e){if(e.status===401||e.status===402||e.status===501){setPlanPill(lock,'PRO','pill pill-muted');el.innerHTML=unlockHtml('Automation, Auto Consolidation, and Auto Dreaming','pro')}else{el.innerHTML='<div class="empty" data-csp-style="s87">'+esc(e.message)+'</div>'}}} | ||
| async function saveAutomation(){const body={enabled:document.getElementById('au-enabled').checked,cadence_hours:Number(document.getElementById('au-cadence').value)||24,consolidate:document.getElementById('au-consolidate').checked,min_cluster:Number(document.getElementById('au-mincluster').value)||3,archive_below:Number(document.getElementById('au-archive').value)||0.05,dream_enabled:document.getElementById('au-dream').checked,dream_min_new:Number(document.getElementById('au-dream-min').value)||20,dream_idle_minutes:Number(document.getElementById('au-dream-idle').value)};try{await api('/automation',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(body)});toast('Hosted policy saved','ok');loadAutomation()}catch(e){toast((e.status===402||e.status===501)?'Hosted Automation requires Pro or Team':e.message,'err')}} | ||
| async function runMaintenance(){const el=document.getElementById('au-result');if(el)el.innerHTML='<div class="spinner" data-csp-style="s93"></div>';try{const d=await api('/maintenance/run',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({dry_run:true})});if(el)el.innerHTML=`<span class="pill pill-green" data-csp-style="s9">PROPOSAL</span> Hosted work was submitted for review.<pre data-csp-style="s94">${esc(JSON.stringify(d,null,2))}</pre>`;toast('Managed proposal requested','ok')}catch(e){if(el)el.innerHTML='<div class="empty" data-csp-style="s85">'+esc(e.message)+'</div>';toast((e.status===402||e.status===501)?'Hosted Automation requires Pro or Team':e.message,'err')}} | ||
| async function loadAutomation(){const el=document.getElementById('automation-body'),lock=document.getElementById('au-lock'),ws='?workspace='+encodeURIComponent(WS||'');el.innerHTML='<div class="spinner" data-csp-style="s86"></div>';try{const p=await api('/automation'+ws);setPlanPill(lock,(LIC&&LIC.is_trial)?'TRIAL':'CLOUD','pill pill-accent');const last=p.last_run?fmtRel(p.last_run):'never',dream=p.dream_enabled!=null?p.dream_enabled:p.dream;el.innerHTML=`<div class="cols-2"><div class="card"><div class="card-head">Hosted maintenance policy</div><label data-csp-style="s88"><input type="checkbox" id="au-enabled" ${p.enabled?'checked':''}> Enable hosted automation</label><div class="field"><label class="field-lbl">Run every (hours)</label><input class="input" id="au-cadence" type="number" min="1" value="${p.cadence_hours||24}"></div><label data-csp-style="s88"><input type="checkbox" id="au-consolidate" ${p.consolidate?'checked':''}> Auto Consolidation</label><div class="field"><label class="field-lbl">Min cluster size</label><input class="input" id="au-mincluster" type="number" min="2" max="20" value="${p.min_cluster||3}"></div><div class="field"><label class="field-lbl">Archive proposal threshold</label><input class="input" id="au-archive" type="number" step="0.01" min="0" max="0.5" value="${p.archive_below!=null?p.archive_below:0.05}"><div class="field-hint">The cloud returns reviewable proposals. Pinned memories remain protected.</div></div><label data-csp-style="s88"><input type="checkbox" id="au-dream" ${dream?'checked':''}> Auto Dreaming after accumulation and idle time</label><div class="field"><label class="field-lbl">Min new memories</label><input class="input" id="au-dream-min" type="number" min="1" value="${p.dream_min_new||20}"></div><div class="field"><label class="field-lbl">Idle minutes</label><input class="input" id="au-dream-idle" type="number" min="0" value="${p.dream_idle_minutes!=null?p.dream_idle_minutes:15}"></div><button class="btn btn-primary btn-sm" data-onclick="h88">Save hosted policy</button></div><div class="card"><div class="card-head">Cloud worker status</div><div class="cfg-row" data-csp-style="s48"><span>Status</span><span class="pill ${p.enabled?'pill-green':'pill-muted'}" data-csp-style="s9">${p.enabled?'ENABLED':'OFF'}</span></div><div class="cfg-row" data-csp-style="s48"><span>Last run</span><span data-csp-style="s50">${esc(last)}</span></div><div data-csp-style="s89"><button class="btn btn-primary btn-sm" data-onclick="h90">Request proposal</button></div><div id="au-result" data-csp-style="s90"></div><div class="field-hint" data-csp-style="s91">Requesting managed work uploads the selected workspace’s normal and sensitive memory content, excluding secret and session-scoped rows, capped at 16 MiB, over HTTPS without end-to-end encryption. Results are proposals and never automatically write the local database.</div></div></div>`}catch(e){if(e.status===401||e.status===402||e.status===501){setPlanPill(lock,'PRO','pill pill-muted');el.innerHTML=unlockHtml('Automation, Auto Consolidation, and Auto Dreaming','pro')}else{el.innerHTML='<div class="empty" data-csp-style="s87">'+esc(e.message)+'</div>'}}} |
There was a problem hiding this comment.
Omit the workspace query until a workspace is selected
When the dashboard has no active workspace (for example, on a new database or after deleting the last workspace), WS is null, so this sends ?workspace=. The new server path treats that as an explicit workspace and _clean_ws("") raises a ValidationError, which the dashboard error middleware turns into a 500; previously /automation used the legacy fallback and returned the actionable no-workspace response. Only append the query parameter when WS is nonempty, or render the existing workspace-required state before requesting automation.
AGENTS.md reference: AGENTS.md:L148-L149
Useful? React with 👍 / 👎.
Summary
Prepares the public Engraphis 1.0.1 client reliability release.
https://relay.engraphis.com, while migrating the old dashboard and Railway relay origins without changing customer relay URLs.Why
The previous public client could direct sync traffic to the account dashboard and could run cloud automation against the first workspace instead of the one the user selected.
Validation
python -m pytest tests/ -qruff check .python scripts/externalize_dashboard_assets.pynode --check engraphis/static/dashboard.jspython -m eval.harness --dataset eval/datasets/sample.jsonl --k 5python -m eval.harness --dataset eval/datasets/codemem.jsonl --k 5python -m eval.ablationpython -m buildpython -m twine check dist/*pip-audit(no known vulnerabilities)Launch status
Draft intentionally. Do not merge, tag, publish, or deploy until the private-cloud contract fixes and current staging/production billing, email, restore, and 24-hour canary evidence are complete.