Active Context
Last updated: 2026-08-05
Current focus: Markdown for Agents + DNS-AID (2026-08-05)
Docs site agent surface for chaosnexus.ai:
- robots.txt: origin allows all crawlers + sitemap (AGPL comment). Cloudflare managed robots.txt may still prepend training-bot Disallows until “block training in robots.txt” is turned off in the zone dashboard.
- llms.txt:
vitepress-plugin-llmsemits/llms.txtand/llms-full.txt; linked from nav More + footer. - Link headers (RFC 8288): Cloudflare Pages
public/_headersadvertisesapi-catalog,describedby(/llms.txt,/.well-known/agent-index.json),service-doc, andlicenseon/and/index.html. Catalog atpublic/.well-known/api-catalog(RFC 9727 linkset+json). - DNS-AID: HTTP index/card at
public/.well-known/agent-index.jsonandagent-card.json. Zone DNS viatools/launch/provision-chaosnexus-dns-aid.sh: HTTPS_index._agents/_mcp._agents, SVCB_docs-search._mcp._agents, TXT index. DNSSEC active (DS at Spaceship /.aiparent; Cloudflare statusactive). isitagentreadychecks.discoverability.dnsAidpass withdnssecValidated: true(2026-08-05). - Markdown negotiation: Pages Function
functions/_middleware.tsconverts HTML → markdown whenAcceptpreferstext/markdown(Content-Type: text/markdown,x-markdown-tokens,Vary: Accept). Deploy viapnpm website:deploy(runs fromchaosnexus-website/so Wrangler picks upfunctions/). Native Cloudflarecontent_converterneeds Pro+ (tools/launch/provision-chaosnexus-markdown-for-agents.sh). - OAuth/OIDC discovery:
public/.well-known/oauth-authorization-server,openid-configuration,oauth-protected-resource,jwks.json, plus/auth.md. Issuerhttps://chaosnexus.ai. Public docs/MCP remain anonymous;/oauth/{authorize,token,register,claim}stubs document that. isitagentreadyoauthDiscovery,oauthProtectedResource, andauthMdpass (2026-08-05). Link header advertises PRM + auth.md. - MCP Server Card:
public/.well-known/mcp/server-card.json(SEP-1649 / SEP-2127 discovery shape used by isitagentready):serverInfo, Streamable HTTPurl/transport.endpoint→ AI Search MCP,capabilities.tools. Linked fromapi-catalog. isitagentreadymcpServerCardpass (2026-08-05). - Agent Skills index:
public/.well-known/agent-skills/index.json(Discovery RFC v0.2.0) with$schema,skills[](agent-auth,docs-search) each havingname,type,description,url,digest(sha256:). isitagentreadyagentSkillspass (2026-08-05). - Web Bot Auth:
public/.well-known/http-message-signatures-directoryJWKS (Ed25519). Content-Typeapplication/http-message-signatures-directory+json. Private key local (chaosnexus-website/.web-bot-auth/, gitignored); regenerate viatools/launch/generate-chaosnexus-web-bot-auth.py. isitagentreadywebBotAuthpass (2026-08-05). - WebMCP: Client tools registered on load via
.vitepress/webmcp.ts(search_docs,navigate_to,get_discovery_info,get_current_page) using@mcp-b/webmcp-polyfill+registerTool. - AI Search: Tuned Chaos LLC instance
chaosnexus(website crawler of chaosnexus.ai, sitemap parse, attributions excluded). Hybrid search; public MCP/search/chat; rate limit 60/min. Public base in.vitepress/ai-search.ts. Provision:AI_SEARCH_MODE=web-crawler tools/launch/provision-chaosnexus-ai-search.sh. - UI: Cmd/Ctrl+K
search-modal-snippetweb component when public endpoint is configured. - Docs:
/guide/ai-agents,/guide/privacy(Cloudflare AI Search processor disclosure). License meta tags on pages. - Follow-up: disable managed robots.txt training Disallows if full AI crawler allow is desired; optional Pro upgrade for native edge Markdown for Agents.
Prior focus: Full-project testing rollout (2026-08-01)
Tiered automated tests are wired at the monorepo root and in Forgejo CI.
How to run
| Recipe | What it runs |
|---|---|
just test-unit | cargo test (Anvil, Codex, Crucible, Forge src-tauri, local rhai-*) + Forge Vitest + Tuned uv run pytest |
just test-e2e | Forge Playwright (MOCK_TAURI, JSON+list reporters) |
just test-website-smoke | VitePress build + website Playwright smoke (/, /guide/quickstart, /api/rhai/) |
just test | test-unit then test-e2e then test-website-smoke |
Timing hint for agents: .agents/test-timing.txt and chaosnexus-forge/.agents/test-timing.txt (~252s full Forge E2E).
CI
- Workflow:
.forgejo/workflows/chaosnexus-tests.yml - Job
unit: always on PR/push (cargo + Vitest + Tuned pytest) - Job
e2e:main+workflow_dispatch(Forge Playwright + website smoke)
Coverage matrix
| Surface | Suite |
|---|---|
| Anvil | cargo test (strong) |
| Codex | cargo test (config/fetch helpers) |
| Crucible | cargo test (model_store/sessions) |
| Forge Rust | cargo test in src-tauri |
| Local rhai-* | cargo test per crate under src-tauri/crates/ |
| Forge frontend unit | Vitest (pnpm --filter chaosnexus-forge test:unit) |
| Forge E2E | Playwright under chaosnexus-forge/tests/e2e/ (incl. Skills/Rules, Anvil MCP, Settings Engine, Node Palette) |
| Tuned | pytest in chaosnexus-tuned/tests/unit/ (eval markdown under tests/eval/) |
| Website | Playwright smoke in chaosnexus-website/tests/ |
Residual gaps (explicit non-goals this pass)
- Real Tauri desktop E2E (needs display/AppImage harness)
- Tuned GPU train/eval in CI
- Monaco 0.56 migration (pinned at 0.55.1 for
edcore.main; 0.56 needs worker/init follow-up) - Some Forge canvas/group E2E assertions remain timing-sensitive under parallel load
Prior focus: Latest-everywhere dependency refresh (2026-08-01)
- pnpm: Workspace pinned to
pnpm@11.18.0; removed nested Forge lockfile; Forgetestscript usespnpmonly; removed legacy npmtauri@0.15.0. Node packages bumped (SvelteKit 2.70, Vite 8.2, Playwright 1.62, etc.). TypeScript held at6.0.3(SvelteKit peers reject TS 7). - Cargo: Aligned forge/anvil
reqwest/notify; majors includerust-mcp-*1.x,sea-orm2,redis1.5,skytable0.8,hf-hub1.0 (Crucible model_store migrated),sysinfo0.39, Tauri 2.11.5. Editions bumped to 2024 for forge + localrhai-*.bincode/smartcorestay pinned forvendor/rhai-ml(bincode3.0.0 is a broken placeholder). Logos/rowan left on 0.12/0.15 pending lexer/AST migration;lsp-typesheld at 0.93 forlsp-async-stub0.7. Transitivereqwest0.12 remains via Polarsobject_store. - Python/uv: Tuned lock upgraded (
transformers5.14.1,peft0.20, etc.); freshuv syncsmoke imports OK. - CI pins: Node 24, Just 1.57.0, Forgejo runner 12.13.2,
actions/checkout@v7/setup-node@v7; Zig 0.16.0 and Flatpak GNOME 50 already latest stable. - Verified: Forge
check+ 211 unit tests; anvil/codex/crucible/forgecargo check; VitePress website build; Tuned import smoke.
Prior focus: ChaosNexus Suite packaging + polyrepo
- Suite prefix (2026-07-28): Monorepo
chaosnexus-suite/holds packaging recipes (stage/pack Linux AppImage, Windows zip, macOS.app),manifest.toml, and Release publish helpers. Subtree sync wired incodeberg-sync.yml(create empty CodebergTunedChaos/chaosnexus-suitewhen ready; GitHub push-mirror + Release clone viapublish-suite-release.shwhenSUITE_PUBLISH=1). - Scripts prune: Public
chaosnexus-scripts/plugins/keeps onlytranslation_test(+lib/). Terminal moved tochaosnexus-forge/fixtures/scripts/plugins/terminal/for canvas parity E2E. - Runtime paths: Forge
suite_paths.rs+ AnvilCHAOSNEXUS_SCRIPTS_DIR; AppRun / bat / macOS launcher setCHAOSWRENCH_BIN, Crucible, Codex, Scripts. - CI:
chaosnexus-release-builds.ymladdssuite-linux/suite-crossjobs; Actions artifacts always; public Releases gated. - Docs: Quickstart leads with Suite downloads;
REPOSITORY_ARCHITECTURE.mdlists suite prefix.
Prior focus: Vhai canvas performance + GPU headroom
- GPU paint (2026-07-28): Removed
backdrop-blurfrommain_groupand generating overlay; NodeShell shadows only when selected/trace/error; all edgeanimated: false;onlyRenderVisibleElementson SvelteFlow. - Edge cascade: Shared
edge_obstaclessnapshot (nodata.nodesstamp); reconcile skips position-only updates; publish gated during spring + mid-drag; route cache + bezier-only while dragging; A* resumes on drop. - Physics/cycles: Sibling-scaled physics iterations; drag-stop physics scoped to affected parents;
getCyclicEdgesvia Tarjan SCC (O(V+E)). - Overlap: Bubble + hard AABB unchanged on regenerate / measure / drag-stop.
Prior focus: Bubble physics + spring settle (Vhai canvas)
- Bubble pad (2026-07-27):
illustrative_layout.tssoft circular personal-space (BUBBLE_PAD=28) plus hard AABB; taller unknown-size floorNODE_H=150. Post-measure pass inDualEditorFlowCanvasre-runs bubble physics when measured leaf sizes still overlap. - Spring settle:
layout_spring.tsdamped spring animates Regenerate / first-open to layout targets (~0.5s); live keystroke merge path does not spring. InstantfitView(duration 0) after settle so the camera does not tween/fight pan-drag; toolbar Fit keeps the animated camera zoom.
Prior focus: Automated Vhai canvas visual parity
- Regenerate / first-open (2026-07-27): Rhai → canvas uses a semantic block-stack parser in
chaosnexus-forge/src-tauri/src/visualizer.rs(events, for-each, labeled branches with true/false, set-variable, script calls). Tool-name prefix stripping coalesces into onenormalize tool_namescript node. - Layout:
finalizeCanvasDocumentLayout(..., { force: true })on Regenerate always recomputes function lanes (no stale X/Y merge). Branch false/completed arms drop to lower rows. CatalogflowTypeForKindmaps kinds to eventNode/scriptNode/forEachNode/etc. for header colors. - Editable: Never sets
displayOnly;isDisplayOnlyCanvasstays false. Terminal fixture canvas underchaosnexus-forge/fixtures/scripts/plugins/terminal/is regenerated viapnpm generate:ast-canvases(Rustdump_visual_canvasexample + TS lane layout). - Parity guards: Rust
visualizer::tests +terminal_canvas_parity.test.ts. Parser/group fix: null group x/y must become finite or xyflow stacks children at 0,0.
Prior focus: Ubuntu 24.04 release CI image (chaosnexus-release)
- Runner label (2026-07-25):
runs-on: [chaosnexus-release]→ job image fromtools/deploy/Dockerfile.chaosnexus-releaseviachaosnexus-release:docker://…/chaosnexus-release-ci:24.04. - Coolify: Dockerfile app (context
tools/deploy); Forgejo compose daemon fragmentforgejo-compose.chaosnexus-release.yml(register-then-daemon creates/data/.runner); container options inrunner-config.chaosnexus-release.example.yaml. - Bootstrap script:
ubuntu-24.04-runner-setup.sh(also used by the Dockerfile). Flatpak runtimes skipped in image (CHAOSNEXUS_SKIP_FLATPAK=1); installed inforge-linuxjob. - SDK:
hydrate-sdk-lfs.shprefers host cache/hdd/tunedchaos/macos-sdk/MacOSX.sdk, else localfile://clone of Forgejo bare repo + on-diskgit/lfs(no Traefik HTTPS LFS). Cache seeded 2026-07-25.
Prior focus: Zero-warning builds + AppImage strip fix
- Warnings (2026-07-25): Fixed rustc/clippy issues in Anvil, Crucible, Codex, Forge (incl. rhai-rowan/rhai-hir). Bumped transitive
sea-bae0.2.1 → 0.2.2 to drop brokenproc-macro-error2future-incompat. Debug+release andclippy -D warningsclean for main crates; Forgesvelte-check0 warnings. - AppImage: Failure was not missing linuxdeploy - Tauri's cached AppImage embeds binutils strip 2.35, which cannot strip modern Arch/CachyOS libs with
SHT_RELR(.relr.dyn/ type 0x13). Fix:NO_STRIP=1(+APPIMAGE_EXTRACT_AND_RUN=1) in rootJustfileandchaosnexus-forge/Justfileforge-release-linux. Verified AppImage produced (~115MB).
Prior focus: Licenses & attributions (website)
- Audit (2026-07-25): All polyrepos ship
LICENSE(AGPL-3.0). SPDXAGPL-3.0-or-lateron Anvil/Forge/Codex/Crucible Cargo.toml, Forgepackage.json, monorepo rootpackage.json, and Tunedpyproject.toml. Scripts/Website document AGPL in README +LICENSE. - Generator fixes:
generate-licenses.shnow runs cargo-about for Anvil, Forge backend, Codex, and Crucible; pnpm inventories for Forge frontend and Website use--filterso they are not identical workspace dumps. Codex was previously generated as root frontend JSON and broke attributions (.sorton a dict). - Website:
/guide/licensinglists every component with CodebergLICENSE+ attribution links; footer points to Licensing + Attributions; sidebar Guide includes Attributions; about pages link License sections. Static attribution pages for Scripts and Tuned. Regenerate viapnpm generate-licenses(Forge) thenpython3 chaosnexus-forge/scripts/generate-attributions-page.py(also hooked fromwebsite:generate-api).
Prior focus: Crucible GGUF download + Forge Models
- Tuned GGUF (2026-07-25): Default Crucible download is
TunedChaos/ChaosNexus_Tuned_v1-GGUF(Q4_K_M, published). Cache:~/.chaosnexus/crucible/models. Export/upload:tools/launch/export-chaosnexus-tuned-v1-gguf.sh,upload-chaosnexus-tuned-v1-gguf.sh. LoRA adapter repo remains for trainers; card cross-links to GGUF. - Forge Models tab: HF token (
hf_tokenin settings.toml), preset Tuned GGUF / custom Hub ID, Pull/Ensure via Crucible/models/*. Supervisor injectsHF_TOKEN+HF_HOME(never writes token intocrucible.toml). - Crucible:
model_id/models_dir/gguf_fileconfig; Candle GGUF load with Granite-aware path (granite.*metadata + embedding/residual/attention/logit scales);/models/status|pull|list.
Prior focus: Dockable Agent Chat + Crucible ecosystem config
- Forge Agent Chat (2026-07-25): Dockable right panel (default), float/undock, close (session hide) vs disable (preference). Chrome persisted via
agentChat.svelte.ts. Sessions SSOT is Crucible under<project>/.chaosnexus/crucible/sessions/(HTTP API). Forge holds no message store. - Crucible supervisor: Forge spawns/attaches Crucible; health on configurable port (default 8080); Start/Stop from chat chrome. LLM restarts do not require restarting the Forge agent UI.
- Skills/Rules: Dual scope
~/.chaosnexus/{rules,skills}+project/.chaosnexus/{rules,skills}(project overrides). Forge Skills sidebar; Crucible context packer with Codex-style chunking (16k char windows). - Anvil MCP Servers UI: Separate from Mesh. Sidebar Anvil MCP edits
[mcp_servers]inchaosnexus-anvil.toml; Apply + Restart restarts Anvil then Crucible. Mesh stays for Rhai authors. - Bridge fix:
crucible_bridgeuses Crucible{ result }on the configured port.
Prior focus: Open-source alpha launch
- Release compile pipeline (2026-07-25): Multi-platform builds on Forgejo
chaosnexus-release(Ubuntu 24.04 CI image). Workflow:.forgejo/workflows/chaosnexus-release-builds.yml(workflow_dispatchonly; Actions artifacts, no public Releases / Flathub / AUR yet). No Codexembed-docs/get-docson the release path (docs stay user-defined at runtime).- Just entrypoints:
just anvil-release,just forge-release-linux,just forge-flatpak,just forge-cross. - Local/dev path (unchanged):
just build target=… profile=debug|release features=…andjust rebuild …still supportget-docs(Codex fetch) andembed(Codex--features embed-docs). Separate from release staging. - Anvil: Linux native + Windows zigbuild + macOS universal →
artifacts/anvil/. Draft unpublished AUR PKGBUILD:chaosnexus-anvil/packaging/aur/. - Forge Linux: Tauri
--bundles deb,rpm,appimage+ Flatpak (just forge-flatpak, manifest underchaosnexus-forge/packaging/flatpak/) →artifacts/forge/linux/. Draft unpublished AUR PKGBUILD:chaosnexus-forge/packaging/aur/. - Forge Win/Mac cross: host binaries via zigbuild; CI soft-fail. Still not signed MSI/DMG.
- Zig linker warning (2026-07-26):
ignoring deprecated linker optimization setting '1'is rustc passing-Oto Zig (rust-lang/rust#158192). Anvil/Forge Justfiles set-Alinker_messageson zigbuild RUSTFLAGS only (Windows + macOS); native Linux mold builds unchanged. - Runner kit:
cargo-zigbuild,zig,llvm-lipo, mingw sync lib, macOS SDK, AppImage tooling,flatpak-builder+ GNOME Platform/Sdk 50.
- Just entrypoints:
- Alpha-launch pack in progress: Codeberg polyrepos (contribute primary), GitHub mirrors + Sponsors, VitePress launch pages (roadmap, status, licensing, support, why-local-sandboxing), social drafts under
launch/social/. - Topology: private monorepo SSOT → Codeberg polyrepos → GitHub mirrors (see
REPOSITORY_ARCHITECTURE.md). - AI disclosure (2026-07-23): Codeberg ToU update on generative AI. Project discloses assisted authorship via root/
AI_ASSISTANCE.md(per polyrepo), VitePress/guide/ai-assistance, README/CONTRIBUTING pointers. Wording is generic (no vendor/model names). Framing: human-directed review, not mostly unreviewed vibe-code. - Pages prune:
chaosnexus-website.ymlrunstools/launch/prune-cloudflare-pages.shafter publish and keeps the newest 5 production deployments for projectchaosnexus. - Naming (2026-07-23): Dropped leftover
docs:*/deploy.ymllabels. Root scripts arewebsite:*; Forgejo workflow is.forgejo/workflows/chaosnexus-website.yml(jobwebsite). Cloudflare Pages project remainschaosnexus(chaosnexus.ai). - Actions LFS (2026-07-23):
FORGEJO_TOKENis present; website job still failed until git-lfs was upgraded past Bookworm 3.3.x and URL-scopedhttp.*.extraheaderfromactions/checkoutwas cleared (duplicate Authorization → CF 400 on object GET). - Actions deploy green (2026-07-23 ~21:36 EDT):
chaosnexus-website.ymlrun 359 succeeded ond918a7c4(LFS hydrate + Corepack pnpm 11 + python3 + Pages publish). Live https://chaosnexus.ai returns 200; contribute listschaosnexus-tuned. - Live site (2026-07-23 ~22:28 UTC): Redeployed VitePress via
pnpm website:deploy(Pages productiona184d59b). Verified https://chaosnexus.ai: home tagline Early alpha launch, contribute lists crucible + scripts,/og-image.png200. Custom domain laggedchaos-nexus.pages.devbriefly after deploy. - Forgejo runner labels: monorepo Actions (
chaosnexus-website.yml,codeberg-sync.yml) useruns-on: [local]on FM-3900X (node:22-bookworm, not catthehacker). - Public polyrepos reset (2026-07-25 20:51:48 UTC): Full orphan republish with matched timestamps via
MATCHED_COMMIT_DATE(chore: refresh public polyrepos as a clean alpha snapshot): anvil, forge, website, codex, tuned, crucible, scripts. Codeberg-only force-push viatools/launch/publish-initial-commits.sh; GitHub follows mirrors. Do not run non-forcecodeberg-syncuntil ready to rebaseline (dispatchforce_push=trueonly when intentionally replacing the orphan with subtree history). - Sync policy: alpha orphan publish = Codeberg-only (
tools/launch/publish-initial-commits.sh); ongoing = Forgejocodeberg-sync.yml→ Codeberg; GitHub mirrors only. - Branding:
images/chaosnexus-crucible/committed in Forgejo monorepo (parity with otherimages/chaosnexus-*packs); Crucible polyrepo shipsassets/banner.png+assets/icon.png. - Wording: public launch called alpha launch (not soft launch).
- Component guides (2026-07-23): VitePress guides added for Crucible and Scripts (about / getting-started / usage / config or layout); sidebar under Component Guides.
- Social embeds (2026-07-23): VitePress head now ships Open Graph + Twitter Card tags with absolute
https://chaosnexus.ai/og-image.png(1200x630 brand banner), apple-touch-icon, and theme-color so Discord / X / Telegram / Slack link previews show ChaosNexus branding. - Granite 4.1-8B LoRA eval gated before announce; weights not on Hugging Face until ≥70% Anvil rubric (alpha) / ≥90% (full-version claim).
- Docs drift (2026-07-24): roadmap M1 marks Tuned + public repos + Codeberg sync done; status drops Visibility item; Tuned row says eval in progress.
- Eval iter-1 (2026-07-24): studio checkpoint scored mean 0.444 on 18 prompts (Pass/Partial/Fail); smoke failed on 4 and 5. Hold HF + social. Scores in
chaosnexus-tuned/tests/eval_scores_iter1.md; retrain outlinechaosnexus-tuned/TRAIN_ITER2.md. Announce drafts stay Variant A/B ready underlaunch/social/but unpublished. - Eval iter-2 (2026-07-24): ROCm PEFT checkpoint
~/.unsloth/studio/outputs/chaosnexus-tuned-iter2-rocmmean 0.472; smoke Fail (tool-call spam). Hold again. Scoreschaosnexus-tuned/tests/eval_scores_iter2.md; iter-3 outline inTRAIN_ITER2.md. - Train iter-3 (2026-07-24): Goldens-only injector
inject_iter3_api_goldens.py(exact Anvil signatures, no augmented ShareGPT); planchaosnexus-tuned/TRAIN_ITER3.md; checkpoint~/.unsloth/studio/outputs/chaosnexus-tuned-iter3-rocmmean 0.556 (smoke clear). Hold HF/announce (<0.70). - Public freeze (2026-07-24): Codeberg sync was paused for announce orphan; resumed same day -
.forgejo/workflows/codeberg-sync.ymllive again (dispatchforce_pushfor rebaseline only). Private Forgejo SSOT continues. - Train iter-4 (2026-07-24): Hard-negative goldens (
inject_iter4_api_goldens.py); checkpoint~/.unsloth/studio/outputs/chaosnexus-tuned-iter4-rocmmean 0.389 (smoke Fail; regression vs 0.556). Hold. Codex still deferred. Prefer iter-3 adapter as interim baseline until iter-5 shrinks upsample. - Train iter-5 (2026-07-24): Small positive goldens (700 rows); checkpoint
~/.unsloth/studio/outputs/chaosnexus-tuned-iter5-rocmmean 0.722 but smoke Fail on prompt 4. Hold HF/announce until smoke clears; Codex deferred. - Train iter-6 (2026-07-24): Focus 4/6/8/17; checkpoint
~/.unsloth/studio/outputs/chaosnexus-tuned-iter6-rocmmean 0.833, smoke CLEAR. Alpha gate PASS. - Train iter-7 (2026-07-24): Over-focus×45 collapsed floor; mean 0.611, smoke Fail. Do not ship.
- Train iter-8 (2026-07-24): Continue from iter-6 + mild focus 12/1/2/7/8; checkpoint
~/.unsloth/studio/outputs/chaosnexus-tuned-iter8-rocmmean 0.944, smoke CLEAR. Full-version gate PASS (≥0.90). - Release name (2026-07-24): ChaosNexus Tuned v1 live at https://huggingface.co/TunedChaos/ChaosNexus_Tuned_v1 (Anvil mean 0.944). Alpha announce live (docs site, Codeberg polyrepos, tunedchaos.dev, LinkedIn, X/Twitter). Public trees re-orphaned then live Codeberg sync resumed. Codex deferred; desktop packaging CI compile matrix next (see release compile pipeline above). Hero logo scaled down on mobile viewports. ChaosCanvas: compact height + tap-to-explore so mobile page scroll is not captured by Vue Flow.
- Absolute paths scrubbed from example
chaosnexus-anvil/chaoswrench.toml;artifacts/untracked.
Prior focus retained below
Architecture flow diagram refresh (complete)
- Refreshed the ChaosNexus architectural and ChaosNexus Anvil mechanics flow charts in
docs/guide/architecture.md.
Remote UI removal (complete)
- Dropped
tauri-remote-ui(Rust plugin + npm package); all IPC now uses@tauri-apps/apidirectly. - Removed Vite
remote_ui_ws/remote_ui_disconnectproxies; Playwright mocks alias@tauri-apps/api/coreand@tauri-apps/api/eventonly.
ChaosNexus Anvil plugin disable + PowerShell shell (complete)
ChaosNexus Anvil_disable_plugin: built-in MCP tool movesplugins/<name>/→plugins/disabled/<name>/and reloads the engine (matches existing discovery skip for thedisabledfolder).run_command: PowerShell/pwsh use-NoProfile -NonInteractive -Command; POSIX shells keep-c(shell_exec.rs).
Menu-bar + sidebar UI polish (complete)
- Removed status-bar
WORKSPACE:: the top-right metadata now shows only the theme. THEME:is a shortcut: the status-bar theme label is a button with the tooltip "Change theme in settings." that dispatchesopen-settings-modalwithdetail.tab = "appearance", deep-linking straight to Settings > Appearance (SettingsModal.sveltereads the optional tab).- Removed the menu-bar Themes dropdown:
MenuBarMenus.svelteno longer renders the hierarchical Themes menu;MenuBar.sveltedropped its themes keyboard-navigation,topLevelMenusentry, andAlt+Taccelerator (theme selection lives solely in Settings > Appearance). The native-menutheme_*handler/handleSelectThemeremain. - Workspace anchor:
RegistrySidebar.svelterenames "Workspace Anchor" → "Workspace" and renders the path as a read-only, select-all input plus a Copy button (copyToClipboard) that confirms with "Copied!". - Tests:
settings-ui.spec.tsasserts the THEME shortcut opens the Appearance tab; newworkspace-anchor.spec.tscovers the read-only field + copy; theme visual baselines regenerated (Themes menu removed from the bar).
Canvas polish (complete)
Illustrative bundled canvases use spacing-first layout, Unreal-style boundary pins, typed connectors, display-only parse isolation, and header-aware edge routing.
- Layout SSOT:
illustrative_layout.ts:NODE_W=260,GAP_X=40, row/column-awaredeOverlapNodes(),col()/row()grid; terminal/db_test lifecycle rows on grid - Boundary pins (Unreal-style):
NodeShell.svelterenders exec pins as near-white right-pointing triangles on the left (inputs) / right (outputs), stacked above the circular typed data pins on the same sides; handle ids unchanged - Edge geometry:
edge_routing.tsrouteEdge(): clean horizontal cubic bezier as primary; auto-falls back to obstacle-avoiding A* (routeEdgePath()) only when sampled bezier points cross a node body or group-header band. Kills the old top/bottom-pin zig-zag. - Pathfinder: binary min-heap open set, span-scaled iteration budget (fallback router only)
- Typed wire colors:
edge_visuals.tsresolves the wire color from the specific source pin'sdataType(sourceDataTypeFor()→pinRoleFromDataType→--pin-<role>), overriding the catalog default.VhaiNodederives pin colors the same way fromdata.pins. Builder declares intentionalScriptreturn types (terminal/db_test keys/query →array, ws_connect →object). Exec stays--pin-execwhite/solid; data dashed 3px. - Round-trip:
buildCanvasMetadatapreserves explicit per-nodepinsoverrides - Display-only parse:
parseRhaiToFlowskips Rhai[NODE:]anchors whendisplayOnly: true - Tests: E2E overlap (all 12 plugins), group-header wire avoidance, stroke width, connected pins, hover, typed data-wire color (array=violet); Vitest for layout, edge routing (bezier vs A* fallback), edge visuals (typed colors), pathfinder
Security fast-follow + illustrative canvas wiring (complete)
get_envhard error: Denied env access now raises a Rhai error instead of returning""- Grid identity fix:
run_lifecycle_grid/try_execute_gridwrapexecute_assembly_gridinwith_plugin_context - Display-only sidecars: all 12 bundled sample plugins ship
displayOnly: trueillustrative graphs; Rhai remains runtime SSOT - Generator:
ChaosNexus Forge/scripts/generate-illustrative-canvases.ts - Builder SSOT:
ChaosNexus Forge/src/lib/dual_editor/illustrative_canvas_builder.ts
Prior: Security hardening (LITL/HITL)
Implemented phased security model per security_model.md:
- Phase 1: Threat model + capability taxonomy documented
- Phase 2: Fail-closed quarantine (
.pending/),ChaosNexus Anvil_create_pluginstaging-only, ChaosNexus Forge approval UI - Phase 3: Per-plugin
[capabilities]inplugin.toml, native gating,CURRENT_PLUGINidentity - Phase 4: Identity binding, KV/global namespacing, reserved events, recursion budget
- Phase 5: Rhai engine hardening (
evaldisabled, limits, module resolver) - Phase 6: Secret broker for
get_env, OS sandbox documentation - Phase 3.5 (DX follow-up): Per-plugin immutable
CONFIGconstant injected into every Rhai scope (config_inject.rs). Delivers scopedCONFIG.cvars+ grantedCONFIG.secretsso scripts authenticate viaCONFIGinstead of ambientget_env. Event hooks now also run underCURRENT_PLUGIN.
Key paths
- Staging:
chaosnexus-scripts/.pending/<plugin_name>/(logical scripts root) - Live plugins:
chaosnexus-scripts/plugins/<plugin_name>/ - Illustrative sidecars:
chaosnexus-scripts/plugins/<plugin_name>/.chaosnexus-forge/<script>.canvas.json - Pending manifest:
ChaosNexus Forge.pending.tomlinside each staging folder
LLM workflow (post-hardening)
ChaosNexus Anvil_create_plugin-> writes.pending/, returns PENDING- Human approves in ChaosNexus Forge -> promotes to
plugins/with granted capabilities ChaosNexus Anvil_reload_plugins-> re-list tools -> invoke new tool