mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-09-02 23:06:49 +00:00
f3fa3a34bd14cb0d710ea66587449d7200fa75eb
13 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
f7c1b290fd |
v3.2: vendor-bundle re-mint under the product-triple rule
Every remaining legacy filament_id outside the BBL/QD_* islands re-derives from its product triple (filament_vendor / filament_type / family name), completing the content-addressed id model of filament_id_plan_v3.md: - Relocation pre-step: 14 fdm_filament_* template forks (Cubicon x3, Prusa x6, RH3D x6 minus the pc fork already re-homed) stop declaring ids; the 16 presets that rode Prusa's forks now declare the id they already resolved (verified zero effective-id drift over all 5892 instantiated presets). - --drop-redundant-ids: 6 Custom/MyToolChanger generics drop copied GF ids and ride their OFL families. - --remint over all 62 non-island vendors: 2647 declarations re-derived; identical products converge cross-bundle (showcase: PolyLite PLA is now OF5CgdDq in OrcaFilamentLibrary, Qidi, OrcaArena and Snapmaker). - Prusament @XL completions surfaced by the relocation: filament_vendor ["Prusa Polymers"] on the 8 @XL declarers; Prusament PA-CF typed PA11-CF (the product is Prusament PA11CF) and PC-CF typed PC-CF (-CF family typed as base polymer); each family converges on one id. - Succession: 331 ids retired with mode-rule successors, 355 never-shipped v1 mints forgotten with chain splicing, 151 GF-shaped ids released to the island space with hints, 27 curated BBL-generic -> OFL-generic hints (GFL99 -> OFDSrzZ8 class). New --retire "OLD=NEW" maintenance mode records lineage for OGFC99/OGFG99/OGFN99 (the shipped ids of OFL's Generic PC/PETG/PA in released versions, whose claims migrated in v3.1 while Cubicon's inert fork declarations kept them alive). - Retiring the P-hex system ids removes the last system ids from check_ams_filament_valid's destructive P-gate. - AMS-ambiguity fixes surfaced by convergence (validator -f): 4 presets riding another family's id through inherits now declare their true family id (Elegoo Generic ASA-CF/PETG-CF, Snapmaker PolyLite Dual PLA / PolyLite J1 PLA); 9 Cubicon @base presets and Dremel Generic PLA, which duplicate their per-printer variants on the same printers, split onto the salt-1 iteration of their triple (sanctioned by the mint-conformance check; --remint now leaves salt-conformant declarations alone). Gates: assign_filament_ids --check 0; orca_extra_profile_check 0; 116 python unit tests; config-equivalence over all 5892 instantiated presets (byte-identical configs except the 14 sanctioned Prusament vendor/type corrections; setting_id and compatible_printers unchanged; per-family convergence and ledger conservation verified); profile validator base/-f/-r(BBL)/-r(Qidi) all green; libslic3r_tests 48610 assertions; Moonraker OFL generic map check; custom-preset fixture archives v1.9.0-v2.4.1. |
||
|
|
acd5dd0794 |
v3.1: OrcaFilamentLibrary re-mint under the product-triple rule
Phase v3.1 of filament_id_plan_v3.md: every OFL-declared filament_id
re-derives from its product triple; the succession ledger absorbs the old
ids. Config-equivalence verified: flattened effective configs differ ONLY
in filament_id (284 consistent old->new changes tree-wide, including every
vendor preset that rides an OFL family), zero config/compatible_printers/
setting_id drift.
Structural pre-step (id-value-neutral, verified): OFL generic family ids
move from the shared fdm_filament_* template bases onto the product-named
"Generic X @System" presets, so the v3 triple's family component is the
product name, not an internal file name (12 relocations; 2 dead duplicate
declarations on fdm_filament_pa/pet pruned; every consumer chain itemized
first - the +12 instantiated_with_id entries are this deliberate pattern,
matching the 11 generics that already declared on @System).
fdm_filament_pc keeps its declaration this phase: 7 Prusa presets (Prusa
Generic PC, Prusament PC Blend) inherit it directly and re-home in the
v3.2 Prusa worksheet; its transitional id is documented in the plan.
Re-mint: 301 declarations re-derived (e.g. Generic PLA OGFL99 ->
OFDSrzZ8 = mint("filament_product/Generic/PLA/Generic PLA")). Snapshot:
1477 ids (+300/-292). Ledger:
- 230 shipped ids retired with mode-rule successors (OGF* library ids,
OFLSBS99, DREMC/FILAR/AliZ/eSUN/... legacy strings). DREMC010 had been
shared by a PPA-CF and a TPU family - a data bug this split resolves;
its successor follows its only shipped claim (DREMC PPA-CF).
- 25 GF-shaped ids OFL had copied from the Bambu catalog (GFOT00x
Overture, GFSEP0xx) are RELEASED to the BBL island space with hints at
the re-minted families - never retired, so a future legitimate BBL
catalog addition is never blocked; plus an explicit GFOT001 ->
OFxA1p01 hint (Overture PLA Pro, still live in BBL).
- 37 never-shipped v1 branch mints dropped from lineage
(--forget-never-shipped; they exist in no release, no forwarding
needed).
- OGFC99/OGFG99/OGFL96/OGFN99/OGFSNL08 stay live (still declared by
vendor bundles); they retire in v3.2 when those declarers re-mint.
Gates: 106 unit tests OK; --check exit 0; orca_extra_profile_check exit 0;
validator -l 2 / -f tree-wide / -r BBL+Qidi exit 0; Moonraker OFL map
check resolves all 29 aliases against the re-minted presets; flatten
equivalence pre/post as above; snapshot regen idempotent.
|
||
|
|
2c0867619c |
v3.0: content-addressed mint tooling, succession runtime, W1 hardening
Implements phase v3.0 of filament_id_plan_v3.md - tooling and client
prerequisites. No filament_id values change in this commit.
Tooling (scripts/assign_filament_ids.py; 106 unit tests):
- The mint key becomes "filament_product/<filament_vendor>/<filament_type>/
<family_name>", resolved loader-faithfully from the declarer's flattened
config - bundle-independent and content-addressed; identity fixes re-id
by design and are made safe by the succession ledger. --mint now takes
the triple.
- The snapshot gains "triples" and "triple_exceptions" sections, folded
into the equality gate: any vendor/type/name change surfaces as a
reviewable snapshot diff. Check 3 rewritten to triple-mint conformance
with (id, triple) grandfathering; check 5 generalized from OFL generics
to every OFL-riding vendor preset; new check 8 (triple integrity) and
check 9 (succession integrity).
- The retired ledger moves to resources/profiles/retired_filament_ids.json
so it ships with the app; schema {claims, successor} plus cross-island
"hints". The 14 v1 entries are migrated with mode-rule successors.
Vanished ids in a foreign island's space (GF*/QD_*) are RELEASED with a
hint instead of retired: the island catalog owns them and may
legitimately (re)ship them, which check 4 must never block.
- New maintenance modes: --remint VENDOR, --drop-redundant-ids VENDOR,
--add-hint "OLD=NEW", and --update-snapshot --forget-never-shipped FILE
(never-shipped ids drop from lineage; chains splice through them).
Runtime (C++):
- Succession helpers in libslic3r/Preset (pure chain-follow + lazy ledger
load from resources), consulted only on resolution miss in
get_filament_by_filament_id, both AMS sync predicates,
add_ams_filaments, setting_id_to_type, and the calibration-history
lookup; behavior is byte-identical while the ledger has no matching
entry. Catch2 coverage in tests/libslic3r.
- W1 hardening: check_ams_filament_valid no longer remote-wipes trays or
rewrites temps for P-shaped ids that a system preset carries (ten such
system ids ship today); the size==8 && [0]=='P' assert is relaxed; the
unguarded filament_list find deref in the temp-equation check returns
non-destructively on a miss.
- MoonrakerPrinterAgent: the 23 hardcoded OFL generic ids are replaced by
a runtime lookup of "Generic <family> @System" (id-equivalent on
today's shipped profiles, follows future re-mints automatically);
scripts/test_moonraker_lane_data.py derives its expectations from the
shipped profiles and gains --check-ofl-map.
Profile data (W3 - type is now a key component, so type bugs are fixed
before any re-mint):
- 17 same-name-different-type groups corrected across 50 files (OFL
Generic PETG-CF/PE-CF/PP-CF; Flashforge ASA Basic/ASA-CF/ABS-CF/HIPS/
PAHT-CF/PLA Silk; FusRock PAHT; Creality Generic PA6-CF; InfiMech PETG;
Anycubic TPU 95A / TPU for ACE; Prusa Generic PA-CF/PLA-CF) - every
value validated against MaterialType::all(); 3 Snapmaker U1 roots gain
their missing filament_vendor. Flattened-config equivalence vs the
previous commit: exactly the 54 intended diffs, zero BBL.
- doc/developer-reference/filament_id.md rewritten for the v3 rule.
Ambiguous type divergences (Prusa Generic TPU/TPU HF FLEX-vs-TPU, FusRock
S-Multi/S-PAHT) and all same-type vendor-tag divergences are deferred to
the v3.2 vendor worksheets, catalogued with analysis.
|
||
|
|
33923464ae |
Cubicon: keep @base presets selectable; mint the variant tier instead
The custom-preset fixture validation (check_profiles.yml step 5, run locally
against the v2.3.2/v2.4.0/v2.4.1 archives) caught a real regression in the
previous Cubicon fix: those archives contain user presets whose inherits
names the @base presets directly ("can not find parent Cubicon ABS @base").
A system preset with instantiation:false is not added to the preset
collection, so flipping the nine @bases was equivalent to deleting their
names - exactly the user-preset drop hazard the migration rules forbid.
Repair: restore all nine @bases byte-identically to their pre-flip state
(instantiated, setting_id, original P510cf* ids; Cubicon PC @base keeps its
minted OFnLnZQo from the copy-paste fix). The AMS ambiguity is instead
resolved Dremel-style: each family's three passthrough variants share one
fresh variant-tier mint as own keys, so on every printer the base and the
variant carry different ids. Zero preset-set change, zero config change,
user presets and fixtures resolve exactly as before the migration.
Verified: fixture archives v2.3.2/v2.4.0/v2.4.1 no longer report missing
parents; config-equivalence holds; orca_extra_profile_check.py exit 0;
assign_filament_ids.py --check exit 0; validator -l 2 exit 0; tree-wide
extended -f still exit 0.
|
||
|
|
55a3114ec9 |
Long-tail vendors: family filament_ids (17 vendors, 41 collision groups)
Phase 2 completion - Volumic, Ratrig, Chuanying, Afinia, Eryone, FLSun, Tiertime, Blocks, CONSTRUCT3D, Co Print, CoLiDo, DeltaMaker, Ginger Additive, OrcaArena, Peopoly, Wanhao France, iQ. All are P1 copy-paste or small structural fixes; owners keep their ids by Bambu-catalog/OFL/historic- introducer precedence, impostor families get fresh deterministic mints, zero effective-config change: - Volumic 10 mints (ABS/ASA/PP, PETG/PCTG/ESD, PLA/UNIVERSAL, PA/PPS lines); Ratrig 10 (BigNozzle/PunkFil lines off the Generic line's ids); Chuanying 8 (plus 3 redundant own-id lines removed so parents' minted ids flow to the 0.25-nozzle variants); FLSun 4 (S1/T1 High Speed + Silk); Peopoly 4 (Lancer lines off Generic PLA's GFL99); Afinia 3 (Value PLA/ABS+/Value ABS inside the frozen GFx##_## scheme); Co Print 3 (ABS/PETG/TPU off GFL99). - Tiertime: Generic SBS had copy-pasted Generic PLA's ids on both printer lines - one family mint on both variants collapses the split. Eryone: PP copy-pasted PETG-CF's EFL43 (same introducing commit) - PP minted. Blocks: ASA-CF copy-pasted PLA-CF's BSFI010 - ASA-CF minted. CONSTRUCT3D: High Flow PETG minted off GFG99. CoLiDo: both claimants of the invented GFA99 re-minted. DeltaMaker: Brand PLA minted off GFL99. OrcaArena: Generic PLA Silk minted; the Bambu-clone Arena PLA Silk keeps GFA05 (catalog precedence). iQ: Grauts HPP4GF25 minted off Fiberthree's IQM1. - Ginger Additive (P5): the shared fdm_filament_common template carried P510eff9; moved onto the two pellet families (Generic PETG keeps it as first claimant, Generic PLA minted), template key removed after verifying every inheritor still resolves an id. - Wanhao France (P4): YUMI PLA Bowden stops over-claiming the six direct-drive printers covered by YUMI PLA Direct Drive (trim only, no mints). Verified: config-equivalence gate zero unexpected diffs; extra check exit 0; --check exit 0; validator -l 2 exit 0; and with all 30 vendor migrations now applied, the extended validator's -f check is clean TREE-WIDE (0 ambiguity errors, down from 1256 baseline / 16448 with the library-aware extension); -r exit 0 for BBL and Qidi. |
||
|
|
ee125975cf |
Snapmaker, FlyingBear, Sovol: family filament_ids
Phase 2 long-tail migrations (25 collision groups), zero effective-config change: Snapmaker (11 + the tree's one live library-cross group): three Benchy demo presets coexisting via compatible_prints gating (invisible to the -f check) get their own mints; the TPE/TPU-High-Flow lines riding shared bases get family mints across the plain/U1/Dual/J1 variants; 'Snapmaker PLA Matte @U1' minted; 'Snapmaker PET @Dual' unified onto its own family root id; 'Snapmaker PA-CF @U1' had its compatible_printers triple-duplicated (self-collision) - deduplicated. The PolyTerra J1/Dual PLA presets that re-exposed the library's PolyTerra PLA (alias rename) get family mints while 'PolyTerra PLA @0.2 nozzle' keeps the library id via inheritance. Fiberon families keep their authentic byte-copied Bambu catalog ids (sanctioned multi-vendor brand sharing, frozen in the snapshot). FlyingBear (8): every preset carries an own-key Bambu generic id; owners keep theirs, 15 impostor families (S1/Ghost7/Hyper lines) re-minted family-atomically - '@S1' and '@Ghost7' siblings move together (20 edits). Sovol (6): the GFL99 copy-paste epidemic. The five same-alias 'Generic * @Sovol SV08 MAX' tunings just DROP their wrong own-id lines so the library family ids flow through inheritance (alias-shadow-verified); Generic PLA Silk / SUNLU PETG adopt their library family ids as own keys (their inherits point at other families, so deletion would collide); the 21 dedicated Sovol/Polymaker families get fresh mints (23 edits). 'Sovol SV07 PLA' keeps GFL99 unambiguously (sole claimant on SV07), frozen in the snapshot. Verified: config-equivalence gate zero unexpected diffs; extra check exit 0; --check exit 0; validator -l 2 exit 0; extended -f -v Snapmaker/FlyingBear/ Sovol all exit 0. |
||
|
|
23b0aabb35 |
Cubicon, Dremel, Anycubic, Artillery, InfiMech, Creality: family filament_ids
Phase 2 long-tail migrations (56 collision groups across six vendors), zero effective-config change except where stated: Cubicon (17): 'Cubicon PC @base' verbatim-copied PA-CF's P510cfd0 at introduction (90a6c53ad5; PC was the config-light stub) - the PC family gets a fresh mint via its root. The other groups were all one shape: nine @base presets instantiated on exactly the two printers their dedicated variants cover with byte-identical passthrough configs, so no compatible_printers trim exists that CI would accept (instantiated presets must claim a printer). Fix: flip the nine @bases to instantiation:false and drop their setting_ids (bases carry none by convention). Every printer keeps an identical-config selectable preset per family - verified programmatically before flipping; no machine default_materials references an @base name. Dremel (3): 'Dremel Generic PLA' is deliberately selectable alongside its per-printer variants (#6837 re-exposed it), and the variants carry real overrides - a genuine AMS ambiguity with no config-neutral trim. The three variants share the fresh family mint OFUYjPc4 as own keys; the root keeps GFL99. A deliberate same-family id split (P8 shape): Dremel has no device ecosystem consuming filament_id, and every alternative is a user-visible regression of #6837. default_materials resolve unchanged. Anycubic (14): copy-paste/generic-riding across three id eras; 2022-era Anycubic Generic ABS/PETG/PLA/TPU keep the catalog ids, 13 families re-minted atomically (72 edits incl. 48 forced same-family re-ids), retiring the invented GFABS/GFL92/GFL93/GFPLA* space-containing ids. Artillery (8): GFL99 umbrella + P-hex copy-pastes; Artillery Generic PLA keeps GFL99, Artillery PLA keeps Pfcf9c4c, 17 families minted (52 edits), P284941e retired. InfiMech (14): pure verbatim Bambu-generic copy-paste; the six InfiMech Generic owners keep their ids, 15 impostor families minted (34 edits). Creality (8): HF generics copy-pasted GFL99 + id-less sub-brand lines riding keeper families; owners keep their git-verified ids, 8 families minted (17 edits, own-key layout for members inheriting heterogeneous per-series parents). Verified per batch: config-equivalence gate zero unexpected diffs (the nine Cubicon @base instantiation flips are the only preset-set changes, reviewed above); orca_extra_profile_check.py exit 0; assign_filament_ids.py --check exit 0; validator -l 2 exit 0; extended -f exit 0 for all six vendors (-v Cubicon/Dremel/Anycubic/Artillery/InfiMech/Creality); 14 fully-vanished ids appended to the retirement ledger. |
||
|
|
095fd9fba4 |
Prusa: move filament_ids off shared templates onto family roots
Phase 2 of the filament_id cleanup (31 collision groups, all one mechanism: material-class ids on shared fdm_filament_* templates collapsing HF/-CF/ Prusament lines onto one id, plus 3 overclaims). 18 new @base family roots (owner generic keeps the legacy id, 12 impostor families get deterministic mints), 72 config-neutral inherits repoints, 6 template filament_id keys removed (only where every id-less inheritor is covered by a new root; fdm_filament_asa/pc keep theirs for the frozen Prusament @XL riders), 3 compatible_printers trims on MINIIS printers covered by dedicated @MINIIS variants. Frozen name-shaped and _NN per-variant ids stay byte-identical. Verified: config-equivalence gate zero unexpected diffs; extra check exit 0; --check exit 0; validator -l 2 exit 0; extended -f -v Prusa exit 0 (was 31 groups / 1035 printer-level errors on the pre-apply copy). |
||
|
|
674344b3c1 |
Elegoo: per-product-line roots and filament_ids
Phase 2 of the filament_id cleanup (37 collision groups; one systematic mistake: every commercial line inherits the material-class @base and its E<MAT>B00 id). 23 new per-line @base roots with fresh deterministic mints (no per-line roots existed, contrary to the plan text), 155 inherits repoints, 23 index entries inserted between the parent @base and the line's members (load-bearing order), 6 in-place mints on single-member generic derivatives. The @base-owning families keep their ids (Elegoo PLA=EPLAB00 etc.); 2 forced family-atomic re-ids outside collision groups (Elegoo Rapid TPU 95A @EN2 Series/@Elegoo Giga follow their family). Residual 2-family shares (GPETGB00/GASAB00 with the Centauri -CF lines, pure-template ETPUB00/ EPAHTB00) are printer-disjoint, validator-clean, and frozen in the snapshot. Verified: config-equivalence gate zero unexpected diffs; extra check exit 0; --check exit 0; validator -l 2 exit 0; extended -f -v Elegoo exit 0 (was 37 groups / 1332 printer-level errors on the pre-apply copy). |
||
|
|
4fc964d293 |
Flashforge: re-mint umbrella and OFL-riding filament_ids per family
Phase 2 of the filament_id cleanup (69 within-vendor collision groups plus the 9 live library-cross groups on Creator 5/5 Pro). 507 filament_id edits + 12 compatible_printers trims (G3U 0.6/0.8 bases and HS bases over-claiming printers covered by dedicated variants): - The FFG01 umbrella (~140 presets across many families) is broken up: the git-verified introducing family (Flashforge Generic PLA) keeps FFG01, and 83 other families get fresh deterministic mints; the GFB99/GFG99/GFL99 G3U-era block is resolved the same way. - Flashforge-branded presets riding OrcaFilamentLibrary generic ids (OGFB99/OGFG99/OGFL98/OGFL99/OGFN96/OGFN98/OGFS98/OGFS99/OGFU99) get their own family mints; true generic tunings (Generic PLA / PLA Silk / BVOH) keep the library id with the library base name (alias-shadow-consistent). - Layout deviation, signed off: minted ids are declared as own keys on every instantiated member instead of new @base roots, because these families inherit up to six heterogeneous per-era umbrella parents and config-preserving roots would add ~80 artificial files. The snapshot ledger records the resulting instantiated_with_id/id_overrides growth, which is exactly the ratchet mechanism for keeping such shapes visible. Verified: config-equivalence gate zero unexpected diffs; extra check exit 0; --check exit 0; validator -l 2 exit 0; extended -f -v Flashforge exit 0 (was 69 groups + 9 library-cross). |
||
|
|
516267d869 |
Qidi: re-mint copy-pasted filament_ids per material family
Phase 2 of the filament_id cleanup, worst vendor first (97 collision groups, the GFB99/GFG99/GFL99 copy-paste epidemic). 435 in-place filament_id edits + 5 compatible_printers trims (broader 0.2-nozzle PETG presets over-claiming Qidi Q1 Pro 0.2 nozzle, covered by dedicated variants): - The Bambu-catalog generic owners keep their ids byte-identical (Qidi Generic ABS/PETG/PLA/TPU/PA/PA-CF/PLA-CF); 6 stray members inside owner families are aligned to their family id. - 64 brand/product-line families (Bambu/HATCHBOX/Overture/PolyLite/Tinmorry, QIDI-brand lines, PLA+/High Speed/TPU-95A) get fresh deterministic mints, the same id landing in every per-series root of a family (@Q2-Series/@Q2C-Series/@X-Max 4-Series bases are multi-root families). - QD_* device-protocol ids untouched (frozen contract with QidiPrinterAgent). Verified: config-equivalence gate zero unexpected diffs (5892 presets); orca_extra_profile_check.py exit 0; assign_filament_ids.py --check exit 0; validator -l 2 exit 0; extended -f -v Qidi exit 0 (was 97 groups); -r -v Qidi exit 0 (all references still resolve). |
||
|
|
ab60229311 |
OrcaFilamentLibrary: give every material family its own filament_id
Phase 1 of the filament_id cleanup (filament_id_plan.md section 5): resolve the 16 library-internal ids that covered several different materials at once and were visible on every printer of every vendor (empty compatible_printers = compatible with all). - 7 existing @base roots get their copy-pasted id replaced with a fresh deterministic mint (Elas PLA/ASA copy-pastes of Bambu-mirror ids, eSUN copy-pastes incl. the OGFL06 eSUN PLA-Marble / Fiberon PETG-ESD polymer mismatch). - 30 rootless families (23 Elegoo product lines riding the material-class E*B00 ids, Generic PETG HF / PETG-CF / PP-CF / PP-GF / PE-CF / PLA Matte riding their parent generic's template id, PolyLite Dual PLA) each get a new config-equivalent @base root carrying the minted id, inheriting the family's previous parent; members re-pointed; index entries inserted before the @System entries (loader's filament_id map is built in file order). - Keepers by precedence stay byte-identical: Bambu-catalog mirrors (OGFA00/OGFB01/OGFG00, PolyLite/Overture/Fiberon lines), the OFL generics (OGFG99/OGFL99/OGFP97/OGFP99), and the Elegoo root-owning families. Verified: config-equivalence gate — flattened effective configs of all 5892 instantiated presets are byte-identical to pre-migration except the prescribed filament_id changes; orca_extra_profile_check.py exit 0; assign_filament_ids.py --check exit 0; validator -l 2 exit 0 (66 vendors); extended validator -f -v OrcaFilamentLibrary exit 0 (16 collision ids resolved) and -f -v BBL exit 0 (all 26 BBL-shared ids are same-material mirrors, alias-shadowed on every overlapping BBL printer — no BBL file touched). Snapshot: +37 minted ids, id_overrides +30 (new roots override their template parents by design). |
||
|
|
1482fb81fd |
filament_id: deterministic mint rule, sanctioned-state ledger, validator hardening
Phase 0 of the filament_id cleanup (filament_id_plan.md): - scripts/assign_filament_ids.py: mint OF-prefixed 8-char ids as uuid5(FILAMENT_ID_NAMESPACE, filament_family/<vendor>/<family>) in the base62 derivation of the setting_id precedent; loader-faithful effective-id resolver (vendor inherits chain + OrcaFilamentLibrary fallback); CLI: default assign run (idempotent no-op on a fully-idded tree), --mint Vendor/Family, --update-snapshot, --check. - scripts/filament_id_snapshot.json: the sanctioned-state ledger (1092 ids, 1965 family claims over the current tree). The tree must equal it exactly, both directions, so every id/claim change lands as a reviewable diff; a PR snapshot diff is the maintainer gate. scripts/retired_filament_ids.json is the append-only retirement ledger; --update-snapshot refuses to resurrect retired ids and to sanction new reserved-namespace claims (GF*/QD_*/P-hex/ null) for non-owner vendors without --allow-shared-catalog. - orca_extra_profile_check.py: runs check_filament_ids() tree-wide (format, snapshot equality, mint conformance, retired reuse, alias hygiene for tuned OFL generics, reserved namespaces, structure ratchet). The pre-existing check_filament_id() 8-char rule stays BBL/OFL-scoped: grandfathered longer ids exist elsewhere (e.g. Prusa's 36-char name ids) and are frozen via the snapshot instead. - PresetBundle::check_duplicate_filament_subtypes now includes OrcaFilamentLibrary presets in every vendor's per-printer duplicate check; alias-shadowed library presets are excluded via the existing m_excluded_from population (verified live in the validator load path), so only genuinely visible duplicates are flagged. AMS tray-id resolution logs a warning when a filament_id matches 2+ compatible presets (pick unchanged). - doc/developer-reference/filament_id.md: the authoring rule; PR template gains a no-hand-written-ids checkbox. - scripts/tests/test_filament_id.py: 46 stdlib-unittest tests (mint vectors, resolver semantics, every check firing/silent, ledger round-trips, byte preservation, real-tree smoke). Verified: python -m unittest discover -s scripts/tests (46 OK); python scripts/orca_extra_profile_check.py exit 0 on the unmigrated tree; assign run is a no-op; rebuilt OrcaSlicer_profile_validator -l 2 exit 0; extended -f is strictly additive vs baseline (every baseline group preserved, all new groups involve library presets, alias exclusion proven by BBL-mirror absence on BBL printers). |