Repository navigation
#870 stage A: catalog-backed H3 adapter partition check #888
Description
Stage A of #870 (the whole feature). Plan: plan v2, "Stage A: catalog-backed adapter check". The plan comment is authoritative; this restates it.
Reshaped for plan v2 (Don's ruling (a) on this stage's stop). What changed since the v1 body:
- Only a
provenentry can refuse. A conflictingtrial/rejectedentry only warns, naming the entry and its status.- There is one shared catalog with no per-workspace layering, and the index is cached per catalog listing.
- Acceptance intent 7 is now "shipped
trialentries only warn, and give the same result in every workspace". It replaces v1's workspace layering.
Builds
Plan v2 Design items 1-6:
-
dw/adapter_compatibility.pytakes an optional catalog index(model_name, weight_name) -> (entry name, workflows, status), built from entries that declare aworkflow. Revision is ignored (Q2). With no index, behavior is exactly today's. -
An entry decides the partition: all of
{t2va, fl2va}->transformer;ref2va->transformer_ref; a mix decides nothing. -
Order, gated by the entry's
status:provenentry that decides: a conflict with the step's partition is an error naming the entry ("catalog entryminimax-h3/realism-people(proven) lists it fort2va, which denoises againsttransformer"). Agreement clears the step with no "names neither" warning.trialorrejectedentry that decides: a conflict is a warning naming the entry and its status, never an error. Agreement clears "names neither", but a filename-token error still stands.- Uncovered file, or null or mixed
workflow: the filename rule runs unchanged. - A
provenentry that disagrees with a filename token gives a warning naming both, never an error (Q1). A filename-token error is kept only when noprovenentry decides the other way.
-
The catalog is one library shared by every workspace (
server_lora_library(state),dw/server/deps.py:386, which takes no workspace). Only server callers pass the index:/api/validate(MCPvalidate_workflow);- submit and rerun admission;
- save and enhance-admit in
routes/library.py.
Build it from the same
catalog_entries(state)thatlist_lorasreads, and cache it per catalog listing the wayceiling_indexis (deps.py:165). The CLIdw.validate, the worker's sub-workflow re-validation andwarn_adapterspass none, so the server is stricter than the worker, never looser. -
The index is built once per catalog listing (cached), looked up per step, and never rebuilt per step or per
for_eachmember. -
Data and docs:
loras/minimax-h3/realism-people.json:workflow->["t2va","fl2va"], plus anevidencenote for the h3-quality matrix (R3, 4/5 faces on FL2VA/I2VA; the ref2va run inert).use_whensays "not reference-to-video". It staysproven.plugins/dw/skills/minimax-h3/references/checkpoints-and-loras.md:28-33: change only "validate warns the name fits neither partition" to "validate refuses it onref2va".- Catalog-first rule in the module docstring,
docs/ARCHITECTURE.md:105,docs/SERVER.md:368-375anddocs/LORAS.md. The server's validate enforces aprovenentry'sworkflow; atrialentry's only warns; promoting an entry toprovenis what makes it refuse.
Don's answers: Q1 warn on a catalog/filename disagreement; Q2 ignore the revision; Q3 not needed (a future save_lora pre-fill would use base_model only). The status rule is his ruling (a).
Owes
tests/test_h3_adapters.py:- a
provencatalogued no-token file is an error onref2vaand clean onfl2va/t2va; - the same file under a
trial(and arejected) entry is a warning naming the entry onref2va, not an error, and clean onfl2va; - no index gives today's "names neither" warning;
- a null or mixed
workflowfalls back to the filename rule; - a
provenentry that disagrees with the filename token gives a warning, not an error; - a
trialentry never lifts a filename-token error; - the
arguments.<name>path is kept for a variable-supplied value; - one index build per catalog listing, including a
for_eachstep.
- a
- The existing sweep of every
workflows/**/*.jsonalso runs with the packaged catalog and stays error-free. - The docs in item 6.
Deploy
Server (engine plus loras/ data); restart on lem and mini-ai.
Passes when
The plan's acceptance intent 1-8 holds over MCP:
- Realism People is refused on
ref2va, and no job is created. - Realism People is clean on
t2va/fl2va, with no "names neither" warning. - Uncatalogued files keep today's rule.
- A variable-supplied value keeps the
arguments.<name>path. list_lorasshows the new entry.- The shipped
trialentrieswushu-action-reference(ont2va) andbetter-human-motion(onref2va) are valid with a warning naming the entry, and the result is the same in two workspaces. - Every catalog template validates clean.
It also passes every pending: #<this issue> case the tester writes.
No blockers.
Filed by the lead, claude-opus-5-5 / anthropic, decomposing plan v1; body reshaped for plan v2 by the lead, claude-opus-5-5 / anthropic.
Activity
dkackman commentedon Oct 14, 2026
Build stopped: plan v1 assumption fails against the code. (lead,
claude-opus-5-5/anthropic)Plan v1 design item 4 and acceptance intent 7 assume the LoRA catalog is layered per workspace ("scoped to the caller's selected workspace"; "with another workspace selected, the same validate only warns"). It isn't:
server_lora_library(state)(dw/server/deps.py:386) is "shared by every workspace": the server'sloras/(writable), then the examples'loras/. It takes no workspace.catalog_entries(state)and thesave_loraroute (PUT /api/loras/{name}) take no workspace either, anddocs/LORAS.md:141documents the catalog as "writable, shared by every workspace".So a
save_loratrial entry in a "qa-*workspace" lands in the one shared catalog and would refuse the file in every workspace. Intent 7 can't pass as written. The plan's first risk mitigation ("the workspace layering confines the effect" of a careless agent-written entry) doesn't hold either: one wrong entry would block valid runs server-wide.Everything else checks out:
workflowlists are already in the catalog schema and data, and validation already has a per-request catalog-index precedent (ceiling_index, cached per listing indeps.py:165) to copy.Options for plan v2 (Don's call):
provenentry refuses, and atrialentry that decides against the step only warns, naming the entry. No new surface.loras/in front of the shared one, plussave_lora/list_lorasworkspace scoping). That is new MCP/REST behavior and a larger stage.Nothing is built and nothing is pushed for this stage.
dkackman commentedon Oct 14, 2026
Parked by the loop driver: 2 sessions in a row ended without changing this issue's state or labels (NO_PROGRESS_PARK_AFTER=2), so the next cycle would run the same session again. Read the latest session comments, then hand it back with
owner:leadand withoutstatus:needs-approval, or decide it here.dkackman commentedon Oct 14, 2026
Don ruled (a) on #870 (2026-10-14). Back to the lead for plan v2 and re-spec.
dkackman commentedon Oct 14, 2026
Body reshaped for #870 plan v2 (Don's ruling (a)): only a
provencatalog entry refuses, and atrial/rejectedone only warns, naming the entry. There is one shared catalog cached per listing, with no workspace layering. Acceptance intent 7 is replaced. Scope is narrower than v1. lead,claude-opus-5-5/anthropicfeat(loras): #888 - realism-people proven for t2va/fl2va; catalog-fir…
dkackman commentedon Oct 14, 2026
Stage A handed to the tester. (lead,
claude-opus-5-5/anthropic)What shipped:
feat/870-A-catalog-adapter-check(2767429, 687e288), merged todevelopas 9a21058. An earlier session built and merged it but ended before handing off. This session reviewed the diff against plan v2. lem is already ondevelop@ f73088a, which contains 9a21058, so I didn't redeploy. mini-ai isn't deployed from the agents' loop; the plan's "restart on mini-ai" is Don's.Plan v2 coverage:
Lookup:
adapter_compatibility.catalog_index(entries)returns(model_name, weight_name) -> (entry, workflows, status). Revision is ignored. With no index, the result is today's rule (test_no_index_is_todays_rule).Partition:
_catalog_partitionmaps all of{t2va,fl2va}totransformerandref2vatotransformer_ref. A mix decides nothing (test_a_null_or_mixed_workflow_falls_back_to_the_name).Status order:
provenconflict is an error naming the entry ("catalog entry 'minimax-h3/realism-people' (proven) lists it for 't2va, fl2va', which denoises against 'transformer'…").trial/rejectedconflict is a warning naming the entry and its status.trialentry clears "names neither", but never lifts a file-name error.provenentry that disagrees with a file-name token is a warning naming both.test_a_proven_*/test_a_weaker_*cases intests/test_h3_adapters.py. Thearguments.<name>path is pinned bytest_the_caller_is_told_where_they_wrote_it.Callers:
deps.lora_index(state)is built from the sharedcatalog_entries(state), which moved fromroutes/loras.pytodeps.pysolist_lorasand validation read the same function. It is passed by:admit_for, which covers/api/validate, submit, rerun and enhance-admit;routes/library.py.The CLI, the worker and
warn_adapterspass none.Cost: the index is cached on
state.lora_indexes, keyed on the listing's (name, path, mtime).test_one_build_per_listing_for_every_member(server,for_each) andtest_a_trial_entry_warns_and_promoting_it_refusesexercise the real server path.Data and docs:
realism-people.json:workflowis now["t2va","fl2va"],use_whensays "not reference-to-video", and there's a newevidencenote (issue 870). It staysproven.ref2va".ARCHITECTURE.md,SERVER.mdandLORAS.md.workflows/**/*.jsonsweep also runs with the packaged catalog (test_no_stored_workflow_mispairs_an_adapter).Deviations:
test_a_stronger_entry_wins_a_shared_file). The plan doesn't address this case.trialconflict on a no-token file gives the entry's warning in place of "names neither", not both.Checks:
ruffis clean.pytest: 14481 passed, 17 failed. All 17 are Kandinsky-6 tests (ModuleNotFoundError: diffusers.pipelines.kandinsky6in this checkout's diffusers) and none touch this stage's files.There's no MCP shape change, so this isn't
breaking-change.dkackman commentedon Oct 14, 2026
Verified over MCP against lem
develop@ f73088a (includes 9a21058), workspaceregression-model-specific. Tester: claude-opus-5-5 via anthropic.The carrier for every case was a one-step
ModularPipelineonMiniMaxAI/MiniMax-H3, varyingworkflowandloras. Every case markedpending: #888passes, except M-F146, which was excluded as explained below:ref2vais refused atvalidate_workflow. (c):run_workflowontemplates/minimax/reference-to-videowith Realism'slora_model_name/lora_weight_nameandacknowledged_cost=trueis refused atarguments.lora_weight_name, naming "catalog entry 'minimax-h3/realism-people' (proven)". No job id was returned, andlist_jobsstill shows 5828e643e28d as the newest job, so nothing was queued.t2vaandfl2va, and on the video-with-audio and image-to-video templates, is valid with no "names neither" warning.minimax-h3/turbo-keyframe (proven).minimax-h3/turbo-reference (proven)), not the filename-rule message. Plan v2 lets a proven entry decide, so I count it as a pass.qa-nonexistent) on t2va, fl2va and ref2va is valid, with "names neither".revision:"main"on ref2va is still refused by the catalog.list_loras(model=H3, workflow=…, status="proven")listsminimax-h3/realism-peoplefor botht2vaandfl2va(workflow["t2va","fl2va"], adapter check: read the LoRA's safetensors metadata, not just its filename (Realism People LoRA passes on ref2va) #870 evidence, "not reference-to-video"use_when). It is absent forref2va.shape=shotandshape=sequencevalidatesvalid: true, with no adapter error or adapter warning. That is the 17templates/minimax/*shot templates (video-with-audio, image-to-video and reference-to-video were validated under M-F143 and M-F152(d)) plusdialogue-shortandmusic-video.arguments.lora_weight_name. (e):C(t2va, wushu)andC(ref2va, better-motion)give identical warnings and fingerprints in three cases: withworkspace="qa-c870-other", withworkspace="regression-model-specific", and afteruse_workspace("qa-c870-other")with no argument. The scratch workspace is deleted.valid: falsewith the filename-rule error, so a trial entry doesn't lift it. (c) 360-orbit on ref2va is valid, with a "(trial)" warning.Not counted: M-F146 is wrong against plan v2, because it assumes per-workspace catalog layering. It was not run, and its
pending: #888line stays until the retire request dkackman/harnest#122 is ruled on. Thepending: #888lines on M-F142–M-F145, M-F147, M-F152 and M-F153 are now removed.Not checked: mini-ai (MPS). This verify covers lem only.