adapter check: read the LoRA's safetensors metadata, not just its filename (Realism People LoRA passes on ref2va) #870
Description
What happened
The fal Realism People LoRA (fal/MiniMax-H3-Realism-People-LoRA, h3-realism-people-t2v-i2v-r2v.safetensors) was tried on a Ref2VA (transformer_ref) step to fix faces. It was inert - output indistinguishable from no LoRA - and cost a full render to find out.
dw/adapter_compatibility.py decides from the filename tokens ref2v / fl2v. This filename has neither (it says r2v), so validate only warns "names neither". The r2v actively suggests reference support.
The file's own header settles it: __metadata__ has base_model: minimax-h3-fl2va, training: text_to_video, rank 32. On FL2VA/I2VA it works (R3: 4/5 faces).
Proposal
- When the weight file is local (or in the HF cache), read the safetensors
__metadata__(8-byte length + JSON, no tensor load) and preferbase_modelover the filename.minimax-h3-fl2vaon aref2vastep -> the same error the filename rule gives today. - Fall back to the filename rule when there's no metadata or the file isn't downloaded yet (or fetch just the header with a ranged GET on the Hub file).
- Add the Realism LoRA to
references/checkpoints-and-loras.mdwith "FL2VA/T2VA/I2VA only, not reference-to-video" spelled out.
Question
- Other vendors' metadata keys differ (
ss_base_model_version,modelspec.architecture). Map a few known keys, or only trustbase_model?
Source: H3 quality matrix on lem (2x RTX 3090 24 GB, 125 GB host RAM), workspace h3-quality, Known Issues ep 6 shots, seed 42. Full data and per-run assessments: ~/testing/opus/known-issues/quality/matrix.json, report quality/REPORT.md; every run in h3-quality carries a note with its config, minutes and score. Related: #861 (follow-up experiments).
Activity
dkackman commentedon Oct 14, 2026
Plan v2: #870, a LoRA's partition from the catalog first, its filename second
Lead design by
claude-opus-5-5(provideranthropic), 2026-10-13; v2 2026-10-14 after Don's ruling (a) on #888's stop.Verdict: build smaller
The proposal reads the LoRA's safetensors header. The sweep found something better that already exists: the LoRA catalog already says which partition Realism People is for.
loras/minimax-h3/realism-people.jsonhas"workflow": "t2va"and"status": "proven".adapter_compatibility.pynever looks at the catalog, though, so validate fell back to the filename and only warned. The plan wires the catalog into the check and leaves the header read out.ref2vatemplate") was there too, and the render still ran. A warning is not enough for this mistake. The class has come up before (Reference-conditioned H3 templates can drop 20 steps to 8: a Ref2VA turbo LoRA trained for transformer_ref now exists #149, validate_workflow accepts an FL2VA turbo LoRA on a ref2va step, the one H3 misconfiguration that never shows in the output #155). Today 30 H3 catalog entries exist, and 20 of them declare a partition. About 12 of those have names the filename rule can't settle:r2v,flf2v, or no token. The catalog settles them for free:provenentries by refusing,trialentries by a warning that names the entry.workflowfield, on aprovenentry, becomes something validate enforces, not just a ranking filter.docs/LORAS.mdalready describes it as a constraint ("constrains a MiniMax-H3 entry to a partition"), so the meaning doesn't change.["t2va","fl2va"]records the new evidence but enforces nothing. It is part of this stage.for_eachmember and every composed child, and today that path is free and offline.model_nameread during validate is a directory-existence oracle.plan.py:905refuses exactly that.lora_hub.pyis the only place dw searches the Hub" (docs/LORAS.md:173).__metadata__is written by the uploader. Letting it turn a warning into a refusal trusts uncurated data.base_model) is the only evidence. The 10 catalog entries withworkflow: nullare the only ones a header could help, and nobody has checked whether they carry the key.save_lora/recommend_loras, which already read Hub headers throughlora_hub.py:102, to pre-fill a catalog entry'sworkflow. The validator would stay free.Problem and non-goals
Problem. The H3 adapter check decides from
ref2v/fl2vinweight_name. When a file name has neither token, the check only warns, even when the catalog states the adapter's partition.Non-goals:
proven(v2: Don's ruling).Design
Lookup.
adapter_compatibilitytakes an optional catalog index:(model_name, weight_name) -> (entry name, workflows, status), built from the entries that declare aworkflow. Revision is ignored (Q2). With no index, behavior is exactly today's.Partition, not workflow. A catalog entry decides the partition:
{t2va, fl2va}meanstransformer;ref2vameanstransformer_ref;So Realism People (
t2va) is cleared on anfl2vastep and conflicts on aref2vastep. This is the right granularity: the check guards partitions. Which workflows were tried is a ranking matter, andmatches()keeps handling that.Order, and what the entry's
statusallows (v2):provenentry that decides: its answer is used. A conflict with the step's partition is an error naming the entry as the source: "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 with the step's partition is a warning naming the entry and its status, never an error. Agreement clears the "names neither" warning (the entry is better evidence than nothing), but a filename-token error still stands. Onlyprovenentries can refuse.workflowis null or mixed, the filename rule runs unchanged.provenentry and a filename token disagree, it is a warning naming both, never an error (Q1). A filename-token error is kept only when noprovenentry decides the other way.Who supplies the index (v2, rewritten). The catalog is one library shared by every workspace:
server_lora_library(state)(dw/server/deps.py:386) is the server's writableloras/then the examples'loras/, and takes no workspace (docs/LORAS.md:141). v1 assumed a per-workspace layer; there isn't one, and this plan doesn't add one. Only server callers pass the index:/api/validate(and MCPvalidate_workflow);routes/library.py.It is built from the same
catalog_entries(state)thelist_lorasroute reads, cached per catalog listing the wayceiling_indexis (deps.py:165), so the same answer holds in every workspace. The CLIdw.validate, the worker's sub-workflow re-validation andwarn_adaptersat run start pass none and keep today's rule. The server is therefore stricter than the worker, never looser. Nothing is refused at run time that admit let through.Cost. The index is built once per catalog listing (cached), and looked up per step; never rebuilt per step or per
for_eachmember.Data and docs in the same stage:
realism-people.json:workflowbecomes["t2va","fl2va"], with 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.checkpoints-and-loras.md:28-33(already rewritten by docs: minimax-h3 skill + RECIPES_24GB/ACCELERATION - base-model (no LoRA, int8) quality path and measured speed levers #863): change "validate warns the name fits neither partition" to "validate refuses it onref2va".docs/ARCHITECTURE.md:105,docs/SERVER.md:368-375, anddocs/LORAS.md(aprovenentry'sworkflowis enforced by validate on the server; atrialentry's only warns; promoting toprovenis what makes it refuse).Surfaces touched: engine (validation gains an optional input; a warning becomes an error for mismatches a
provencatalog entry decides) and data/plugin docs. There is no MCP, REST or syntax change. This isn'tbreaking-change: the only workflows newly refused are ones a proven catalog entry says are misconfigured.Stages
Stage A: catalog-backed adapter check (the whole feature)
tests/test_h3_adapters.py:provencatalogued no-token file is an error onref2vaand clean onfl2vaandt2va;trial(and arejected) entry is a warning naming the entry onref2va, not an error, and clean onfl2va;workflowfalls back to the filename rule;provencatalog entry that disagrees with the filename token is a warning, not an error;trialentry never lifts a filename-token error;arguments.<name>path is kept when the value came from a variable;for_eachstep.workflows/**/*.jsonalso runs with the packaged catalog and must stay error-free. That is what catches a template the new rule would break.loras/data), restart on lem and mini-ai.validate_workflowon an H3ref2vastep whoselorasholdsfal/MiniMax-H3-Realism-People-LoRA/h3-realism-people-t2v-i2v-r2v.safetensors:weight_namepath;transformerpartition and the catalog entry;run_workflowwith the same workflow is refused before queueing, and no job is created.t2vaorfl2vastep validates with no adapter error and no "names neither" warning.ref2v/fl2vtoken that no catalog entry covers still gets today's "names neither" warning on any H3 step and is not refused.ref2vastep is still an error, and aref2vfile onfl2vais still an error.arguments.<name>.list_lorasshowsminimax-h3/realism-peoplewithworkflow["t2va","fl2va"],status: proven, and the new evidence.trialentry that decides against the step only warns, naming the entry; it never refuses. Use entries already in the catalog, so nothing is written to the shared catalog:minimax-h3/wushu-action-reference(trial,["ref2va"], filewushu_h3_r2v_v7_2000.safetensors, no token) on at2vastep: valid, with a warning naming the entry and itstrialstatus;minimax-h3/better-human-motion(trial,["t2va","fl2va"], no token) on aref2vastep: valid, with a warning naming the entry;list_workflowsplusvalidate_workflowover the H3 shapes).Order and dependencies
The feature is a single stage with no blockers.
Risks
save_lorais agent-writable, so one careless entry would reach every workspace. v2 mitigates it this way:provenentry can refuse; atrialorrejectedentry that conflicts only warns, so a fresh trial can't block anyone;provenis a deliberate act that already needsevidence(docs/LORAS.md:165);save_lora;dw.validateon its own stays on the filename rule. This is documented, and it is the safe direction.Questions
Answered by Don on v1, unchanged: Q1 warn on a catalog/filename disagreement; Q2 ignore the revision; Q3 not needed (if a
save_lorapre-fill comes back,base_modelonly). v2's status rule is Don's ruling (a) on #888's stop; no new questions.Reply in comments and hand back with
owner:lead. Approve by addingstatus:plan-approvedyourself. No agent may set it.dkackman commentedon Oct 14, 2026
Review of plan v1: approve as written. Using the catalog instead of reading the safetensors header is the better design. The plan's figures were checked against current develop:
loras/minimax-h3/has 30 entries, 20 of which declare aworkflowand 10 arenull.realism-people.jsonalready says"workflow": "t2va".adapter_compatibility.pyjust never asks the catalog.workflowtoday.flf2vdoesn't match thefl2vtoken, and ther2v/ref2vanames all sit onref2vaentries. So the Q1 disagreement warning won't fire on anything shipped, and the planned sweep against the packaged catalog keeps it that way.Notes
21a6f602) rewrotecheckpoints-and-loras.md:28-33to explain the header and say "inert onreference-to-video". This stage only needs to change "validate warns the name fits neither partition" to "validate refuses it onref2va".Questions: Q1 warn on a disagreement. Q2 ignore the revision. Q3 not needed; if the
save_lorapre-fill comes back, usebase_modelonly.claude-opus-5-5 / anthropic, for Don
26 remaining items
dkackman commentedon Oct 14, 2026
Spec for plan v2 by the tester (claude-opus-5-5 via anthropic). Before writing it I pinned today's catalog on lem with one read-only
list_loras(model="MiniMaxAI/MiniMax-H3")call. No GPU time was spent.Stage #888 (reshaped). All cases are in
regression-suite-model-specific.mdand pending on #888.minimax-h3/wushu-action-referenceont2va/fl2va, andminimax-h3/better-human-motiononref2va, are valid with a warning that names the entry andtrial.reference-to-videois covered too.use_workspace.ref2vanames(proven).trialentry never downgrades a filename-token error:turbo-4step-reference(ref2v) ont2va, andwushu-action(fl2v) onref2va, stay errors.workflowtrial entry (360-orbit-loop, whoseflf2vis not a token) onref2vaonly warns.suite+status:needs-approval) to retire it.Notes, none blocking:
Edges not observable over MCP without a catalog write. No shipped entry exercises any of the following:
provenentry that disagrees with its own filename token (M-F144's Q1 edge as the lead re-scoped it);trialentry that agrees with the step while its token disagrees;["t2va","ref2va"]list;rejectedentry with a non-nullworkflow(every rejected H3 entry isnull).Probing any of these needs
save_lorainto the shared catalog, which has no removal route. So I left them to the plan's unit tests and didn't write a case that would leave stray entries behind.Admission of a trial conflict. M-F152 checks the trial-only-warns rule at validate time only. Showing that
run_workflowadmits it would queue a real H3 render, so the case doesn't do that. M-F142(c) already covers the refusal side of admission.dkackman commentedon Oct 14, 2026
Close-out: feature built, handed to the tester for the final check. (lead,
claude-opus-5-5/anthropic)developas 9a21058 and was verified on lem with no bounces. It had one build stop on plan v1, which was re-planned as v2.docs/proposals/complete/catalog-adapter-check-complete.md, plus a Shipped since the ranking entry indocs/proposals/todo.md. Commit 70a64a7, merged todevelopas 581bfff. These are docs only, so nothing was deployed.verify: run every case whose
source:names one of this feature's stages, and close the parent if they all pass.dkackman commentedon Oct 14, 2026
verify (tester,
claude-opus-5-5viaanthropic, lem on develop @ 581bfff): every case whosesource:names #888 passes. All were run over MCP this session.Catalog pins are unchanged. realism-people is still
proven(t2va, fl2va). wushu-action-reference, better-human-motion and 360-orbit-loop aretrial. turbo-keyframe and turbo-reference areproven.M-F145. The
list_lorasentry has the right shape. Thefl2vaandt2vafilters include realism-people, and theref2vafilter excludes it.M-F142.
steps[0].pipeline.loras[0].weight_name. The message names the catalog entryminimax-h3/realism-people(proven), 't2va, fl2va' vs 'ref2va', andtransformer_ref.arguments.lora_weight_name.run_workflowwith the same args andacknowledged_cost=truewas refused with the same message and returned no job_id.list_jobswas unchanged (newest5828e643e28d, total 200).M-F143 (a)–(d). All valid, with no adapter warnings.
M-F144.
minimax-h3/turbo-keyframe(proven) andtransformer.minimax-h3/turbo-reference(proven). The refusal cites the catalog entry rather than the bare filename rule. Either one is a refusal.adapter_modelon ref2va is valid, with "names neither".h3-realism-people…on ref2va is valid, with "names neither". It does not cite the realism entry."revision":"main"to the realism entry raises no schema error and gives the same proven-entry refusal.M-F152.
minimax-h3/wushu-action-reference(trial).minimax-h3/better-human-motion(trial).arguments.lora_weight_name.qa-c870-other, inregression-model-specific, and afteruse_workspace(qa-c870-other)with no workspace argument, with matching fingerprints. The scratch workspace has been deleted, and the session is back onregression-model-specific.M-F153.
minimax-h3/360-orbit-loop(trial).M-F147. I ran
validate_workflowon every H3 template fromlist_workflows(shape=shot|sequence). Templates that need media gotasset:qa-cast/priya-portrait.jpg. The templates checked: chain-matched-and-aligned, chain-matched-to-audio, chain-video-continuity, chained-segments, composable-references, enhance-prompt, enhance-prompt-with-image, first-and-last-frame, generated-subject-reference, image-to-video, last-frame-only, reference-to-video, shots-batch, storyboard, video-with-audio, video-with-audio-768p, voice-timbre-reference, dialogue-short and music-video. All arevalid: true, with no lora, weight_name or partition errors or warnings. The only warnings are the no-seed ones.Not run. M-F146 is still marked
pending: #888, but plan v2 contradicts it: v2 makes trial entries warn-only. Its retire request is dkackman/harnest#122.No new regression case: the #888 cases already cover this.