Four pictures (Chinese and English) from the isolated test ComfyUI with
scenery only: a Gemini task in the AI workbench, and three saves of one
canvas with the saves bar. Taking them showed the AI workbench stage and
message box and the saves bar staying in the old language after a switch
until a reload: they are drawn again now.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- An answer past Antigravity's size is filed away unread (eight LoRA
searches in the exam): search_models answers small (loaders once,
four trigger words, a LoRA's author weight); describe_canvas gives a
big canvas's last nodes a line each; mcp_fit.py keeps any other list
answer within the size and names what it left out.
- An empty canvas: run_workflow, describe_canvas and get_situation say
to open a workflow first; get_image_info says a picture's workflow
opens with open_workflow.
- ask_user does not put a "test" question to the user; a task's picture
count counts what its runs made.
- AMB failed to load now and then: ComfyUI loads every file at once and
ui_ai_workbench.js set ui_ai_toolbox.js's sideHost before it was made
when the toolbox file ran first. Connected on first draw now;
tests/load_order.mjs runs every file first.
- input_facts moved to api/picture_mask.py to keep mcp_tools.py short.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
It said "waiting for an AI" three times and kept two folds that did what
the message box does. Now it is the sentence and its Copy button, in the
middle of the column; what to say first and pictures go in the message
box, whose words say so. The connect card comes first until an AI has ever
come, and is gone after that. The wish line, the big gallery fold and
what only they used go with it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Follow-ups hang one step in under the first task of their line, so the
list shows what goes on from what; a filter's tasks still show alone. Each
row has the head's menu, without opening the task. Removing a task joins
those after it to the one before. The pick list now stands over everything
at the place the menu opened: the head is drawn anew under an open menu.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Filling the page, the list read as a page of its own rather than the records
of conversations. It now slides over the task shown, which stays visible and
dimmed beside it; a click there goes back. With no task it still fills the
page. The welcome page moved to ui_ai_ready.js to keep the workbench under its
size limit.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With no room for the side column the AI page showed a row of bare icons in the
title bar, and two tabs that changed under the user. It now shows labelled tabs
over the task, the timeline and every view, kept in the head while the
timeline scrolls, and words that named a right side say what they do. One
function gives both strips, in place of tabBar.
On a wide window the Prompts page left two thin boxes over empty space: the
boxes now share the room, side by side and full height, with wider cards. The
Saves page puts its cards side by side like the workflow cards and says how
many canvases and saves there are.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Walking through the AI workbench as a user: the task head held nine loose
controls that wrapped to four or five lines with the side column open. It is
now two lines whatever the width, with rename, privacy, links and remove in a
menu. The stages and what a task made share one line over the timeline, a
failed step is a mark instead of red text, New task opens at once, and a
missing label in the Ways panel is filled in.
The walk also caught AMB not starting at all on one page load. ComfyUI imports
every script under web/ on its own and at once, so any module of the big import
cycle can run first; ui_ai_workbench.js wrote to a const of ui_ai_results.js as
it loaded, which failed when that module was entered first. The value now
lives in a module that imports nothing, and tests/module_cycles.mjs refuses
the pattern.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
AMB only uses: training goes to its own plugin. This takes back the
record of what works (api/ai_evidence.py), the training network and
rounds (api/ai_training.py, ui_ai_network*.js, the round form), the
Gates' record switch, the ways' order by record and the external_skill
field of log_outside that only fed the record.
Kept, as part of using AMB:
- the user's word under a finished run, now only told to the AI
(ai_run_control.set_verdict, ui_ai_verdict.js);
- the Gates' "Custom nodes: only the ways'" rule;
- a picks block left to the AI takes its recommended picture.
Reverts 73518dc, 67bf5b2, 6647b05 and 49d05cf, then puts those three
back with tests in test_ai_run_watch, test_ai_gates and test_ai_panels.
Full suite and structure check pass.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The AI workbench's side column gets a training network view: base models
on the left, ways, skills and node packs on the right, a line for each
pair that ran, coloured by how it turned out (the user's word first, else
the AI's, dashed) and as thick as it ran often. A node or line shows its
record, last pictures and the pairs not tried yet in a card kept in sight.
"Start a training round" picks a skill (the AI's prompts with its advice
and without) or the ways of one use, up to four models and the pictures
each, and makes a task for the next AI (api/ai_training.py). Each run that
ends fills the trial it fits by what it used; the AI is told the next trial
and, once a model's trials are done, to compare them in a picks panel with
its own pick marked recommended. The record keeps the AI's pick apart from
the user's, and a picks block left to the AI takes its pick.
Tests: tests/test_ai_training.py; full suite and structure check pass.
Checked on an isolated ComfyUI: a round started from the view, four real
runs matched to their trials with the next one told each time, the
comparison panel and the user's pick reached the record and the graph.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each task has a lock in its header (task["privacy"]); the Gates window sets the default for
new tasks, and turning the default off pins the tasks it covered. mcp_server hands every
tool result to ai_privacy.guard last, after run pictures and the user's messages were
added, so a private task's image content never leaves; a call tied to no task is private
while the default is on or a private task is unfinished. The card in the AI app shows no
pictures for it, begin_task tells the AI, and turning it on or off is a user step and a
decision. A test calls every tool with a picture in its result and checks none gets out.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each skill the AI fetches with get_toolbox(skill=...) is a "skill" step of its task
(ai_skills.note_use), with the form its advice came in for the canvas's model; the same
advice again before the next run adds nothing. A run's row lists the skills fetched since
the run before it (ai_task_view.skillsBefore). A skill step never names an untitled task.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A question the user began to answer is never answered with the
recommended option on time-out; the AI is told they began an answer
and ends its turn. On the page, what was half typed in a question's
line survives the question being drawn again (another question came,
the AI read an answer), with the cursor; that question stays first in
the strip; a narrow window lights the stage tab instead of taking it
from under the user's typing; Enter that picks an input-method word no
longer sends a stage answer line.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- An AI app calling by an older tool list (tool_help or use_tool not offered,
use_tool for a tool offered directly, a tool the list lacks) is told so, and
the task header shows how to reconnect until the app fetches tools/list again.
- add_lora / set_model compare the base models on the model line
(model_advice.py; the page reports the line) and add base_model_note.
- get_model gives author_examples (sampler, steps, CFG, size, a LoRA's weight
from the Civitai record's example pictures) and the version name.
- run_workflow says ComfyUI's refusal as which node, what is wrong and the tool
that fixes it (run_refusal.py; mcp_run.js passes the refusal as data).
- Gates "When I don't answer": wait for me, or go with the recommendation once
the waiting time runs out (choices with a recommended option only), handed to
the AI in the same call and shown on the stage and under Decisions.
- A tool budget test (count, size, description length, required arguments) and
the exam tasks with their scorecard (docs/architecture/tool-exam.md,
tools/tool_exam.mjs). The tool set's text recommends Full for Antigravity.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The user took an option for something to select and then pressed "skip"
to confirm; boxes shown open read as fields to fill.
- Questions (stage panels, the strip over the message box): options are
buttons with an arrow under "One press sends it to the AI" and show the
pressed one at once; "Let the AI decide" moves to the question's top
right (the panel title for ask_user); a line of one's own is folded as
"None of these, I'll say it…". The Gates card folds its reason the same.
- A waiting task is one page: the sentence for the AI leads and sticks
under the task header while the page scrolls (the workbench measures the
header); "Say what to do" and the gallery are optional folds that say
how many pictures are in. The sentence has the AI do what the task says,
asking only when it says nothing. The Get started / Put ready tabs and
their words are gone.
- Gates window texts fixed (canvas covers building, lines are over the
message box, "Ask me" named as on the button); run_workflow waits up to
55 s by default, so a quick run comes back with its pictures.
- The UI map counts words the backend names (label_key) as used.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Marker: "make a repaint mask" becomes How to change it (leave it to the AI, only the
marked areas, the whole picture anew); the AI reads the choice first as the user's, the
timeline row says it, the repaint brush picks "only the marked areas".
- Task list: folded, it stays laid out out of sight and slides in at once from its button
or the page's left edge; redraws make anew only the rows that changed (sync_rows.js).
A picked task shows at once from the copy read before or read ahead on hover
(ai_task_cache.js), then what changed; activity entries follow instead of holding it up.
Stage pictures load as thumbnails first, the file itself only when shown larger.
- Header: "Own tab" is "AI edits a copy ▾", a two-way menu with what each means (kept open
across redraws), and "Show the copy".
- Materials: the Source list lights the hovered row and ticks the one shown (a later rule
had hidden both), tooltips only for cut names, arrows and Enter (ui_ai_facet_menu.js).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A new panel opens the side column on the stage at that panel, even after
the user closed it or picked another view; the AI changing a panel does not.
A switch in the stage's head turns it off (kept on this browser). In a
narrow window it lights the stage's tab instead of taking the timeline's
place; a question still brings the stage forward.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Three or more reads, canvas changes and decisions in a row, two of them not
reads, become one row: how many steps, chips of what they did, the last one
while the AI is at it, and undo for their canvas changes. It opens to the
steps as before, and a jump to one of them opens it. Words, notes,
questions, panels, runs, errors and waiting or running steps stay rows of
their own. The folded rows move to ui_ai_chain.js.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Anomalous sees only the calls made to it; an AI app's own commands and
scripts are invisible, and one rewrote a result six times. When the AI
calls, Anomalous now looks at the top of the output and input folders
for pictures no ComfyUI run saved and pictures rewritten in place since
its previous call (by the files' own times, bounded, never in the
background; new pictures wait while a prompt runs), shows them as an
"Outside AMB" step and tells the AI with its answer (ai_outside.py).
log_outside is the AI's own word on a command or script it ran.
The connect guide gains rules to paste into the AI app's own rules:
use AMB's tools, change pictures only by running workflows, ask and
explain in AMB, and say what was done outside it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A task now opens at its newest step instead of where the previous task
was scrolled to, and a timeline read at its foot follows new steps
whatever the task's state (before, only while a step was running).
Read further up, it stays put; a round button over the message box
leads back down, with the count of the AI's new steps on its corner.
It replaces the "new steps below" pill (ui_ai_newest.js).
The side column's grip lay over the timeline's scrollbar, so grabbing
the scrollbar often resized the column instead. It now has a gap of its
own beside the scrollbar, drawn as three dots.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A run's progress comes in alone and only moved the timeline's bar and the header's button, so
the strip over the message box stayed at the run's start ("nodes 0/29, 0%"). The strip keeps
its context and the progress fast path updates it too.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
When the AI page is lower than SHORT_PX (a window not maximised), the task's title, state,
time and steps, the task it goes on from and the tools share one line, the room around them
shrinks, the message box's hint shows only for a failure (its words become the input's
tooltip) and the waiting page's picture is smaller: about a fifth more room for the timeline.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- ui_ai_now.js: over the message box, a run's progress with stop, the AI's step still going, a
gate to allow or refuse there, and the AI's open question with its options as buttons (own
words or skip too; several picks and pictures lead to the stage). progressWords is shared
with the run card; the panel's and gate's answers are exported for it.
- ui_ai_drop.js: pictures dropped on the box or pasted are kept in output/ai_inbox
(POST /anomalous/ai_pictures/upload, ai_pictures.save_upload: read as a picture first,
25 MB cap, never over a file) and attached; ComfyUI output pictures dragged in attach as they are.
- Long AI notes are folded to their first lines with "Show all".
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The message box stays at the bottom of the task column however the timeline scrolls. Over the
input, what the message carries (ui_ai_tray.js): pictures with ✎ to mark up (sent on their own)
and ×, chips for what "@" names; gallery pictures are attached, not typed in as "@name". Beside
it the gallery and materials buttons with their counts; the input grows (Enter sends,
Shift+Enter breaks the line) and pictures alone may be sent. "New steps below" appears when the
AI adds steps while the user reads further up; one's own message scrolls into view. Pictures a
message carries show as small image cards with the usual tools. The ready page keeps the big
gallery and what is ready; the box below takes its pictures.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A waiting task now switches between Get started and Put ready at the top. Put ready shows the
gallery as a big searchable grid feeding the note below (click to add or drop a picture), the
note (the message box, moved in), the materials button and what is ready so far. The gallery
grid is split out of the message box's picker so both use it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A task waiting for an AI gets a "Put things ready" step: the message box (gallery pictures,
"@") moves into it beside the materials button, and what the user put ready is drawn there;
the AI gets it all when it takes the task. Pictures a message names show as thumbnails.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A new task an AI begins while on another, or one the user starts while
looking at a task, keeps it as its "from". Links under the title lead both
ways, the list marks follow-ups, the user can link one by hand or take the
link off (never a loop), and an AI beginning a follow-up hears what was
decided in the task before.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The AI records what was settled with log_decision (a card on the timeline:
what, why, what was left out, who decided, the steps it is about); the
user's own choices in Anomalous count as decisions too (panel answers,
gates, materials, the canvas mode, stops). A Decisions view in the side
column lists them all, links each to its step and notes work done since
the AI's last one; begin_task repeats them to an AI picking the task up.
A step's words move to ui_ai_step_body.js.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
"@" lists the task's pictures, combos, models, workflows, prompts, node
packs and node types; what is named rides with the message and the AI gets
each in full (pictures attached with what made them). "/" lists commands
that act at once (stop, undo, side views, new task, canvas mode) or fill in
words to send. get_toolbox shares the lookup.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The side column is a card of its own, narrower by default, its width set
by dragging its left edge (kept; double-click resets; the timeline keeps
its room). The task list folds from a title-bar button and peeks over the
page while pointed at. In the docked materials picker a card's detail opens
from its info button, not on hover.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The stage, a run's node map at full size (pick the run; each run step has
"see it large") and the materials picker share the side column; the switch
sits in the window's title bar on the AI page, the shown one again hides the
column, and each view keeps its state. The task header stays on top while
the timeline scrolls.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every answer, message, set of marks and handed picture shows a pill:
sent and waiting, then the AI has it with the time it did (delivered_at).
Panel questions can be skipped; the AI reads skipped: true.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Each run keeps its shape read from the prompt ComfyUI queued (ai_run_map.py): boxes by role
with their settings, typed links, plumbing wired through, and what changed since the task's
run before. The run step shows a one-line summary, the changes as chips and the boxes (top
down, fitted to the column, each locating its node); show_run_map puts it on the stage.
- By default the AI works in a tab of the task's own (ai_task_canvas.py, mcp_task_tab.js): the
open workflow is copied before its first change, the tab is brought back (a click on
ComfyUI's tab) before later changes, reads and runs, and the user's tab stays untouched.
Per-task switch in the header, default in the Gates window; the AI is told once.
- Output pictures can be handed to the task an AI is on (gallery card menu, the inspector's
✦), with the user's words: the AI gets them attached with what made them (ai_pictures.py).
search_images(with_pictures) attaches the first six.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- A stop button on a running run (timeline, and beside the run-status button), and stop_run for
the AI: only this run's prompts leave the queue or are interrupted; the step ends "cancelled"
and a user's stop reaches the AI as a "stop" message (ai_run_control.py).
- The run's progress carries ComfyUI's console since it began (the bar's note, models loading),
time left and per step, and VRAM; once queued, each sampler's working size is estimated from
the prompt, with warnings for an upscaled picture sampled again, a size past the card and a
huge decode, for the user and in the AI's run news (ai_run_watch.py, ui_ai_run_live.js).
- The materials picker opens as a side panel that leaves the page usable (the full-screen
browser makes room), expands to the large window and back, and remembers the choice.
- Esc closes the run-status card only (data-anomalous-escape).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
report takes reply_to, the id of the user's message or marks it answers:
the two steps point at each other and the timeline links them both ways
("Reply to step 2" / "The AI replied · step 4"). The AI's notes are laid
out (headings, lists, bold, code) by ai_text_format.js with textContent
only. The notice that brings the user's marks and messages, the report
description and the server instructions tell the AI to answer in
Anomalous, and to ask which fix with ask_user.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The task column (now ui_ai_task_list.js) leads with a New task button, icon
buttons for Connect an AI and the gates, which AI came last, quick filters
by state with counts, and state icons; the current task has an accent bar.
A task's header uses icon buttons (Materials, Undo all, show the stage,
rename and remove as pencil and bin). A waiting task shows a picture, three
numbered steps joined by a line (what to do, the sentence with a large
Copy button, a faint preview of steps) and a connect card that opens the
guide in place; the empty page matches. One set of line icons for the AI
pages (ui_ai_icons.js). Illustrations made with ChatGPT.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A Materials button on each AI task opens a picker: every node type of this
ComfyUI grouped by source (built-in, each custom node pack from
/object_info's python_module, page-only helpers, paid API nodes last), plus
combos, saved workflows, prompts and models by the names the AI's tools
use. Picks go to the AI as a user_toolbox step (message kind toolbox), in
begin_task and in full from get_toolbox; "only" makes add_node and
new_workflow refuse other custom or paid node types (built-in stay
allowed). Favourites stand in for tasks without picks. find_nodes lists
picks first and marks paid API nodes. open_workflow opens a saved
workflow in a new tab; a workflow's page can hand it to the AI.
Checked on the isolated ComfyUI with copies of the user's 10 node packs:
all 1642 node types can be placed, and a Comfyroll workflow ran.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- ui_ai_marker.js: ✎ on a picture of the AI page opens the marker (box, circle, arrow, pen; three
colours; a note per mark and one for the whole picture). Send draws the marks onto the picture
and hands both to the task; the timeline shows the marked picture and the notes.
- api/ai_marks.py: the PNG is checked (signature, size, dimensions) and kept with the task in
anomalous/ai_marks/ (never the output folder; removed with the task); a user_marks step the AI
gets as a message of kind "marks", where each mark is in fractions of the picture, with the
marked picture attached as an image to the same answer (also from get_answers, whose tool now
returns the answer and those pictures).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- ai_task_runs.py reads where a run stands from ComfyUI's queue and progress registry (never
changing them): queued and how many are ahead, or the node running, its steps and the nodes
done. It is kept on the step in memory and sent as "progress" events that only move the
step's bar; the run's step is saved only when something new is kept.
- run_status (read-only): the task's latest run and its progress, its pictures once done;
wait_seconds (<= 55) waits for the end. run_workflow's answer tells the AI to use it instead
of guessing from the time.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The card of a task waiting for an AI (ui_ai_connect.js waitingCard) is centred: a line for
what the AI should do (it renames the task), the sentence to send the AI with Copy, three small
steps, and the first-time connection folded under "AI not connected yet?". No message box and no
timeline line while nobody has taken the task.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- api/ai_gates.py: changing the canvas, using the GPU, downloading and scanning online can each
go ahead, ask first or never (downloads ask by default; anomalous/ai_gates.json). A call that
asks waits on its step (state "asking", what it would do listed) up to 50 s for Allow or No
(with the user's reason for the AI); unanswered, the AI is told to wait and call again, the
later answer reaches it as a message, and the same call after an Allow goes ahead.
- ui_ai_gate.js: the card under a waiting step and the Gates window; a toast while elsewhere.
- ui_ai_flow.js + ai_task_view.flowStages: the task's stages in order, each done, running,
waiting or failed; a stage leads to its first step.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- api/action_catalog.py: every MCP tool's kind, stage of the work and gate in one place (a test
keeps it and the tools in step); steps now carry their stage.
- api/ai_task_changes.py: changes the user makes in Anomalous while an AI works become steps of
its task, reach the AI once with its next call (kind "change": keep it), and the activity
entry names the task; the activity page links to it ("AI task ->").
- api/ai_task_runs.py: run watching moved out of ai_tasks.py (600-line rule); a step a restart
left "running" is marked stopped when the record is read again.
- Pictures: inspector / compare with canvas / keep as tools on hover instead of three buttons
under every picture; tick any two (any step or task) and compare from the bar at the foot of
the page; the results strip shows thumbnails again.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>