- Models page: "+ Import" chip and model files dropped on the grid open an import
window. model_kind.py tells a file's type (LoRA, checkpoint, VAE, text encoder,
diffusion model, ControlNet, embedding, CLIP Vision, upscaler) and base model from
its safetensors / GGUF header only; .ckpt/.pt are never opened. api/model_import.py
finds the dropped file in Downloads/Desktop (name, size, time) and moves it, or
takes an upload; checks it against Civitai and the scanned models; never replaces
a file (" (2)"). New files are scanned after.
- Model cards show the Civitai version name (metadata version_name).
- Settings page in tabs (Look, Models, Workflows, Prompts, Backup, Help); the
download folder is a choice of ready-made folders or typed by hand; default is now
by base model ({base}).
- The scanner's offline base model uses model_kind (LoRAs, Qwen, Wan, Chroma...).
- AD-019: no Civitai browser inside the plugin.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
163 lines
8.8 KiB
Markdown
163 lines
8.8 KiB
Markdown
# 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; `docs/architecture/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.
|
|
|
|
## AD-019 — No Civitai browser inside Anomalous; imported files are put in place
|
|
|
|
New users' trouble is not finding models but knowing which folder a downloaded file goes
|
|
in. A Civitai browser inside the plugin would not reach many users (Civitai is often
|
|
unreachable from mainland China, where most models come from LiblibAI, cloud drives and
|
|
chat groups), would mirror a large site's search, filters and content rating, and would
|
|
show its picture feed inside the plugin. Instead the plugin takes a file from wherever it
|
|
came from: dropped on the models page, it is told apart by its header (never by running
|
|
it), checked against Civitai when that answers, and moved into the folder its type and
|
|
base model call for, with every guess shown and changeable before anything moves.
|