Skip to content

release: prepare Engraphis 1.0.1 client reliability - #59

Merged
Coding-Dev-Tools merged 2 commits into
mainfrom
codex/v1.0.1-client
Jul 23, 2026
Merged

release: prepare Engraphis 1.0.1 client reliability#59
Coding-Dev-Tools merged 2 commits into
mainfrom
codex/v1.0.1-client

Conversation

@Coding-Dev-Tools

Copy link
Copy Markdown
Owner

Summary

Prepares the public Engraphis 1.0.1 client reliability release.

  • Routes Cloud Sync through https://relay.engraphis.com, while migrating the old dashboard and Railway relay origins without changing customer relay URLs.
  • Makes Automation and maintenance requests honor the dashboard's selected workspace; explicit unknown workspaces return 404 and legacy callers retain their fallback.
  • Enables entitlement-gated managed compute automatically, preserves secret/session/unknown-sensitivity/metadata/16 MiB snapshot boundaries, and adds the required upload disclosure beside the sole proposal action.
  • Updates 1.0.1 package, plugin, commercial manifest, release metadata, documentation, and tests.
  • Adds pinned CodeQL analysis for Python and JavaScript/TypeScript and reduces Dependabot's weekly PR limits.

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/ -q
  • ruff check .
  • python scripts/externalize_dashboard_assets.py
  • node --check engraphis/static/dashboard.js
  • python -m eval.harness --dataset eval/datasets/sample.jsonl --k 5
  • python -m eval.harness --dataset eval/datasets/codemem.jsonl --k 5
  • python -m eval.ablation
  • python -m build
  • python -m twine check dist/*
  • clean wheel install plus 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.

@github-advanced-security

Copy link
Copy Markdown

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:

  • The 'Security' tab will display more code scanning analysis results (e.g., for the default branch).
  • Depending on your configuration and choice of analysis tool, future pull requests will be annotated with code scanning analysis results.
  • You will be able to see the analysis results for the pull request's branch on this overview once the scans have completed and the checks have passed.

For more information about GitHub Code Scanning, check out the documentation.

@Coding-Dev-Tools

Copy link
Copy Markdown
Owner Author

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.

@Coding-Dev-Tools
Coding-Dev-Tools marked this pull request as ready for review July 23, 2026 18:50
@Coding-Dev-Tools
Coding-Dev-Tools merged commit b662dde into main Jul 23, 2026
1 check passed

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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>'}}}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

@Coding-Dev-Tools
Coding-Dev-Tools deleted the codex/v1.0.1-client branch July 25, 2026 20:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants