A new Activity page on the rail (and the home page's recent list) shows, by day,
what the plugin changed. Record only; undo comes later (AD-018).
- api/activity_log.py keeps the newest 500 entries in the ComfyUI user folder.
A middleware records this plugin's and Anomalous_TTS's write requests after
they succeed (including the 200 + {"status": "error"} style as failure), from
one route table; the log never fails the request it records.
- activity_canvas.js: a press inside Anomalous snapshots the canvas; the next
press or key outside it (or the next press inside) logs the difference, so
every button, drag and dialog that writes nodes is covered and the user's own
edits are not. Opening another workflow is logged as that. <html> carries an
Anomalous class and does not count as the plugin's interface.
- activity_diff.js: pure snapshot and difference; activity_log.js: client and
wording; ui_activity.js: the page (filters, details, find on canvas, clear)
and the home list.
- Tests: tests/activity_diff.mjs, tests/test_activity_log.py (local).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Current Architecture Decisions
This index records concise reasons for enduring product and architecture boundaries. It is not a changelog. When a decision becomes obsolete, update or replace the record and rely on Git history for the former implementation.
AD-001 — One command, exclusive browser entries
The floating trigger, action-bar button, and Extensions command share one
openBrowser() command and one browser instance. Presentations are mutually
exclusive, while the Extensions command always remains as a recovery route.
Native ComfyUI command/keybinding infrastructure owns shortcut recording and
modal guards.
AD-002 — Recipes are templates; notebooks are immutable instances
A Workflow Recipe is the authoritative workflow template. Parameter Notebooks are immutable generation-value snapshots attached to a recipe and browsed inside its Parameters tab. The Node Assistant may reuse those snapshots for a selected same-type node, but this does not replace full-skeleton recipe application.
AD-003 — Recipe canvas actions follow graph scope
Recipe cards and detail views append partial recipes because their open required connections make them composition fragments. Complete, independently runnable recipes load through ComfyUI's workflow path and therefore open as a new canvas in the current frontend. Structural editing remains a separate, explicitly confirmed workflow.
AD-004 — Recipe save hides implementation policy
Save collects identity, notes, tags, and cover/source image. Presentation pins and snapshot policy are implementation choices, not per-save questions. Legacy pin data is preserved without exposing a control; new recipes default to none.
AD-005 — Model identity excludes names and previews
Model Doctor automatically proves identity through provenance hash and required category; byte size may disambiguate that hash. A unique size-only match is a manual candidate, never proof or an automatic redirect. Hash/size conflicts are rejected. Local paths, filenames, display names, previews, and similarity are presentation or post-resolution routing data. This boundary prevents silent substitution after local rename or across categories.
AD-006 — Foundation components are hash-only recovery categories
VAE, VAE Approx, CLIP/Text Encoder, and CLIP Vision files can commonly share sizes or ambiguous names. Automated redirection therefore requires one exact in-category hash match. A size-only candidate may still be shown for explicit, one-time confirmation on the current node. Existing native combo values remain usable with a visible identity-change warning when provenance differs. This does not restrict scan coverage: scanning may calculate hashes for any active registered folder, including categories whose Civitai metadata coverage is weak.
AD-007 — Recipe origins and local availability are separate
Official origin metadata can be refreshed or edited independently of saved identity. Exact-path availability checks and previews describe the current machine; they do not rewrite imported provenance or activate a local match.
AD-008 — Prompt roles prefer unknown over a guess
Automatic prompt role tracing follows only allowlisted native prompt, conditioning, and consumer nodes. Unknown third-party nodes are opaque. Legacy full-value recovery must be exact and unambiguous, and users may store explicit recipe-scoped overrides.
AD-009 — Recipe-to-model navigation is recoverable and exclusive
Model detail temporarily replaces all main content surfaces while retaining a small recipe return token. Back reconstructs recipe detail; unrelated navigation abandons the token and cleans stale state. The transition never closes the outer browser or exposes model detail beside Node Assistant.
AD-010 — Parameter selection must identify both panes
The active Parameter Notebook is visible in the list and in a right-pane banner with name and timestamp. Requests are selection-tokened so stale gallery results cannot overwrite the new notebook. Sidebar input/button rows must remain usable in the narrow docked layout.
AD-011 — Output discovery remains bounded and user-refreshed
Recipe matching inspects at most the newest bounded set of PNG metadata and has no persistent index. The main Gallery scans on open and refreshes manually. This avoids background polling and hidden indexing cost while retaining predictable freshness.
AD-012 — Licensing and branding are separate
The standard MIT LICENSE applies to project-owned code and documentation.
TRADEMARKS.md separately governs the Anomalous Model Browser name and official
branding. Project-specific restrictions are not appended to the MIT license.
AD-013 — Beta guidance is scoped to experimental workflow features
Workflow Recipes and recipe-powered Assistant presets carry localized backup and data-safety guidance until an explicit stability decision removes it. Stable Node Assistant model replacement and LoRA insertion are outside that warning. Notices distinguish single-node preset application from full-skeleton Parameter Notebook application.
AD-014 — Architecture documentation is state, not history
Architecture documents change only when an owner, data flow, interface contract,
persistence format, security boundary, or critical invariant changes. Ordinary
fixes do not append “unchanged” entries. Git is the implementation history;
CHANGELOG.md is user-facing release history; .agents/logs/ai_lessons.md holds
only durable recurring traps.
AD-015 — Recipe model mutations update all identity representations
The authoritative workflow widget, structured model reference, and node-scoped Model Doctor Hash index form one mutation boundary. Local matching updates all three through the archived full-recipe path. Partial append remaps Hash records with node IDs and rolls them back with the inserted graph. Personal model notes are recipe-scoped presentation data and may be excluded from package export.
AD-016 — The audio page manages one speech engine
The audio page is built around GPT-SoVITS through the separate Anomalous_TTS
node pack: its characters, emotions, pronunciation and sampling defaults live in
the node's own settings, and the Script Director can run a script without the
canvas. The F5-TTS voice library (files under input/F5-TTS, upload, romanization,
Load Audio drags) was removed rather than kept as a parallel engine, so the page
teaches one set of rules. A zero-shot voice (one clip, no trained model) belongs
in Anomalous_TTS as a character kind, not as a second engine here.
AD-017 — The browser is a rail of pages with a home page
Navigation is one narrow icon rail: a home page, the image pages (models, gallery, workflows, materials), the audio pages (voices, audio gallery), the canvas tools and settings. The rail replaces the header tabs, the image/audio toggle and the tool bar under the folder list, so the list column holds only a list and can close without hiding any command. Each page decides whether it has a list; the open state is remembered per page and narrow windows start with it closed. The home page offers tasks rather than a manual: each card opens its page, and a first visit lands there. AMB stays the chore layer around ComfyUI (AD-016 keeps one engine per page); a new page earns a rail entry only when it is a place users return to, not a one-off tool.
AD-018 — The activity log records what Anomalous changed, without undo for now
Users need to see what the plugin did to their canvas and files. File changes are recorded on the server, after a write request succeeds, from one table of routes, so a new write route is logged by adding a line there. Canvas changes are recorded without each action reporting itself: a press inside Anomalous takes a snapshot, and the difference is logged when the user next presses or types outside it, so the user's own edits are never attributed to the plugin. Opening another workflow is logged as that, not as removed nodes. The log is bounded and never fails the action it records. Undo comes later and only for changes that can be reversed safely (canvas values, renames); deletions go through their own confirmations instead.