Skip to content

Consolidate Classic into Ledger and protect drafts and local APIs - #262

Open
Coding-Dev-Tools wants to merge 35 commits into
codex/dashboard-local-audit-20261011from
ui/ledger-only
Open

Coding-Dev-Tools wants to merge 35 commits into
codex/dashboard-local-audit-20261011from
ui/ledger-only

Conversation

@Coding-Dev-Tools

@Coding-Dev-Tools Coding-Dev-Tools commented Oct 12, 2026 •

Copy link
Copy Markdown
Owner

Consolidates Classic capabilities into Ledger, redirects /classic, protects hidden drafts across refreshes and workspace changes, and enforces complete browser origins for token-free local APIs. Timeline filtering precedes limits and follows world/system time. This PR follows #261 and includes the verified #260/#261 fixes.

Community legend names and colors now remain stable when filtering changes their visible rank. Relation pagination focuses the first newly revealed row, including the final partial page. Existing draft, scope, temporal, CSP and origin review safeguards remain covered.

Validation: 95 focused graph, polling, spec API, evidence, MCP and skill tests; 13 documentation/distribution tests; the new relation-pagination Chromium regression; Ruff. Fresh immutable evidence, SVG/PNG provenance and README source links match this branch. Remote CI validates the complete matrix at the pushed head.

Coding-Dev-Tools and others added 2 commits October 12, 2026 02:24
The dashboard now has one interface. Each capability Classic had was rebuilt
into the Ledger view where people look for it, then Classic was removed:

- Library: Markdown rendering (DOM-only renderer, never parses HTML) with a
  Write/Preview editor, unsaved-changes guard and Ctrl/Cmd+S; word-level
  history diffs; per-memory audit trail; drag and Alt+Arrow ordering; one
  Import menu (Quick import of files, folders or a server path, document
  import, code indexing and PostgreSQL schema import).
- Ask: per-result retrieval scores. Home: memory health and the selected
  project's last-session handoff (GET /api/proactive gains `repo`).
- Explore: colour by cluster, type or connections, palettes, editable type
  colours, a legend, an entity and relation explorer, keyboard navigation.
- Activity: bi-temporal Timeline cards with a superseded-only filter
  (replacing the Supersessions tab), receipt-chain status, packed-context
  accounting.
- Settings: workspace Describe, Copy, Merge, Export and Delete; plan status
  and plan-aware hosted messages; automation run status and proposals.
- Everywhere: connection and semantic-search banners, an accessible in-page
  dialog instead of native confirm/prompt, Solarized and Sepia themes.

Removed: engraphis/classic_assets, the duplicate engraphis/static tree, the
dashboard switcher, the graph compat adapter, and the Marked and DOMPurify
copies. /classic redirects to /. Shipped dashboard assets drop from 3.51 MB
in three trees to 1.85 MB in one.

Hardening found on the way: the zero-config API refuses requests a browser
marks as cross-site unless they passed a CORS preflight; the Markdown
renderer is linear on adversarial input; dialogs drop bidi controls; secure
erase sends its required confirmation; a stalled graph download no longer
blocks Reload; the CSP release gate covers Ledger and every first-party
script. Tests, docs, packaging and the public offline evidence artifact are
updated to match (fixture results unchanged).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QRXYjdLRbDr9oEUU4qdZ2m
Without ENGRAPHIS_API_TOKEN the dashboard trusts loopback peers. A website
that points its own name at 127.0.0.1 (DNS rebinding) becomes same-origin
with that name, so its requests came from a loopback peer, passed every
Origin check and could read or write the whole /api surface.

- The zero-config gate now also checks Host: it accepts exactly
  `localhost`, IP literals (an address cannot be rebound), the bind host,
  the ENGRAPHIS_DASHBOARD_URL host and the new ENGRAPHIS_ALLOWED_HOSTS
  names. `localhost.` and `*.localhost` are refused because some resolvers
  send them to DNS. Token mode is unchanged.
- The check covers the `/dashboard/review` routes as well as `/api`; `/mcp`
  keeps the SDK's own Host allow-list.
- The read-only graph server (engraphis-graph-server) applies the same
  check when it runs without a token.
- The cross-site guard no longer lets a header vouch for another site's
  page: with ENGRAPHIS_CORS_ORIGINS=* any page could pass the preflight
  and send the dashboard's header.
- Ledger shows the server's reason when a request is refused instead of
  reporting the server as unreachable.

The helpers live in engraphis/netutil.py and are unit-tested; the public
offline evidence artifact is re-exported for the new sources (fixture
results unchanged).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QRXYjdLRbDr9oEUU4qdZ2m
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 12, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-16T05:31:46.097059Z faa65a4 New commits
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@Coding-Dev-Tools
Coding-Dev-Tools changed the base branch from main to codex/dashboard-local-audit-20261011 October 12, 2026 13:59

@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: 679dcbb1f9

ℹ️ 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".

Comment thread engraphis/dashboard_assets/ledger.js Outdated

@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: 22ce45e0da

ℹ️ 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".

Comment thread engraphis/dashboard_assets/ledger.js Outdated

@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: a1af2b2224

ℹ️ 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".

Comment thread engraphis/dashboard_assets/ledger.js Outdated

@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: f1f85a4925

ℹ️ 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".

Comment thread engraphis/dashboard_assets/ledger.js Outdated

@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: de8c168b95

ℹ️ 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".

Comment thread engraphis/dashboard_assets/index.html Outdated
Comment thread engraphis/dashboard_assets/ledger.js Outdated

@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: 606d3e579b

ℹ️ 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".

Comment thread engraphis/dashboard_assets/engraphis-graph.js Outdated

@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: 95999cb42e

ℹ️ 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".

Comment thread engraphis/dashboard_app.py Outdated
Comment thread engraphis/routes/v2_api.py

@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: f07db1ff95

ℹ️ 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".

Comment thread engraphis/core/store.py Outdated
@Coding-Dev-Tools Coding-Dev-Tools changed the title Fold Classic into Ledger and refuse DNS-rebinding hosts Consolidate Classic into Ledger and protect drafts and local APIs Oct 12, 2026

@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: 7a1b05e8da

ℹ️ 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".

Comment thread engraphis/dashboard_assets/ledger.js

@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: 12102ec86c

ℹ️ 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".

Comment on lines +105 to +107
function keep(name) {
const parts = String(name || '').split('/').filter(Boolean);
return !parts.slice(0, -1).some(SKIPPED_DIRECTORY);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Exclude credential files from folder imports

When a user selects a project folder, this predicate checks only ancestor directories, so sensitive leaf files such as a root .env, credentials.json, or id_rsa are uploaded. The folder-path flow has the same exposure because its new default * pattern reaches the server-side walker, which also excludes hidden directories but not sensitive filenames. Content scanning does not close this gap for every credential format—for example, an .env containing an authenticated SMTP URL is accepted and persisted—after which the record can enter exports or shared-workspace sync. Reject sensitive filenames server-side for both upload and path imports rather than relying on content detection.

AGENTS.md reference: AGENTS.md:L248-L249

Useful? React with 👍 / 👎.

Validated local candidate: fc13a0c414b4422b8925d81ab154b464702751ed

- fc13a0c414b4422b8925d81ab154b464702751ed docs(readme): pin chart to verified evidence commit
- 15a17a0712b411a43e5d4d9ea62f355ca4598d2d docs(evidence): bind offline fixtures to import safety repairs
- d6c8252f09334ebb3ddb3df1864c77925017ab5f fix(dashboard): filter credential rc files before upload
- 98d48c33d207c66bfa24e74b3974e8cad2e5b123 fix(import): exclude standard credential rc files before processing
- d81d0df34c3e285d551c06791311f13dd1f427e8 fix(packaging): align MCP install paths with the patched SDK floor
- e1cab5d0555824700e92a612ebda41b1f294eed3 fix(deps): require the patched MCP 1.30 transport
- b21f3ecf6986e726c47d4db733b5378f70117c8f fix(spec): bound audit similarity and match policy words exactly
- 1e90c47f6f97a4953d425b9cc41a54fb64a101c0 fix(import): exclude credentials from quick imports

@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: 7dc9bb3add

ℹ️ 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".

Comment on lines 1562 to 1565
setLayers(value) {
state.layers = value && typeof value === 'object' ? { ...value } : null;
explorerData = null;
uploadEdges();

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 Publish updated stats after Every-node layer changes

In the Every-node renderer, toggling a non-code relation layer reaches this method and immediately changes the rendered edges via uploadEdges(), but it never calls stats(). The Ledger handler does not refresh the count itself, so graphStatsChanged() retains the previous drawnLinks/hidden-relationship values until another unrelated action emits stats, leaving the graph summary inconsistent with the canvas; publish stats after the layer update as setScope() and setGhosts() do.

Useful? React with 👍 / 👎.

@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: faa65a4cac

ℹ️ 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".

Comment thread engraphis/core/engine.py
Comment on lines 2881 to +2882
flt, include_invalid=include_invalid, limit=500, prompt_only=prompt_only,
closed_only=closed_only,

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 Rank closed records before applying the candidate cap

When a workspace contains more than 500 closed memories, this call still caps list_memories at 500 records ordered by ingestion time before _relatedness scores them against the query. Although superseded filtering now happens server-side, fresh evidence is that an older exact-topic match is omitted when 501 newer unrelated closed records exist, causing “Only superseded versions” to report no history; rank or page the closed candidates before imposing this cap.

AGENTS.md reference: AGENTS.md:L175-L177

Useful? React with 👍 / 👎.

This branch has not been deployed

No deployments
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.

3 participants