SPEC-ISSUE registry
Every SPEC-ISSUE: LEAN-NNN tag in UsdSpec/** has a row here. Status: candidate (found by the formalization), confirmed (checked against the specification and OpenUSD v26.11.1 source/runtime as applicable), note (verified observation without an established specification defect), openusd-differs, rejected, drafted <NN> (an issues/aousd/NN-*.md draft exists; humans decide about filing).
Numbering: 0xx ListOp, 1xx Dict/LayerOffset, 2xx Path, 3xx Schema, 4xx Crate, 5xx Composition, 6xx Population, 7xx Value resolution, 8xx USDA grammar.
| id | decl | spec | claim / defect | status |
|---|---|---|---|---|
| LEAN-001 | UsdSpec.ListOp.exists_congruent_reduce_ne | L1626-1637 | A ≅ B ⟹ reduced(A) = reduced(B) is false as stated: congruence never observes the order of the deleted sequence (delete ⟨1,2⟩ ≅ delete ⟨2,1⟩, both reduced, unequal). True form: prepended/appended equal, deleted equal as sets (reduce_congruent_of_congruent'). | confirmed: pxr 26.11 Sdf.IntListOp with deletedItems=[1,2] vs [2,1] compare unequal (a == b → False) and ApplyOperations agree on every input; composing deletes keeps weaker-then-stronger order; drafted 08 |
| LEAN-401 | UsdSpec.Crate.IntegerCoding (spec example) | L11663-11667 | The worked example's input ends in 10026 but its difference array and output encode 100126; with 10026 the stream would be 16 bytes with a 11 code. Typo. | confirmed (computed; LightUSD C coder reproduces the listed output from 100126); drafted 12 |
| LEAN-402 | UsdSpec.Crate.IntegerCoding | L11640 | "converted to a code point and a value relative to the previous value" reads as a second delta pass; both OpenUSD and the example encode each difference directly. | confirmed; drafted 12 |
| LEAN-101 | UsdSpec.Dict.merge_not_assoc | L1243-1244 | "Combining of two dictionaries … is a closed and associative operation": associativity is false, even up to entry order. a={x={}}, b={x=1}, c={x={y=2}}: (a∪b)∪c = {x={y=2}}, a∪(b∪c) = {x={}}. True when operands agree on leaf-vs-dict shape at shared keys (merge_assoc_of_compat); key sequences always associate. | confirmed: pxr 26.11 customData over sublayers a>b>c → {x:{y:2}}; a over {x:1} → {x:{}}; drafted 09 |
| LEAN-102 | UsdSpec.Dict.resolveDict_ne_resolveDictR | L6200-6206 | Dictionary value resolution does not fix the fold association; because of LEAN-101 a strongest-first left fold (LightUSD) and a right fold differ. | confirmed: pxr 26.11 stage a>b>c gives {x:{y:2}} = left fold, pre-merging b∪c first gives {x:{}}; drafted 09 |
| LEAN-111 | UsdSpec.LayerOffset (O7 examples) | L6505-6537 vs L5436-5440 | §12 example computes the sublayer sample time as offset + scale·t (12 → 16), but §10 makes the effective offset the layer→root map, under which stage time 12 samples the layer at (12−10)/0.5 = 4. Direction is ambiguous. | confirmed (example is reversed): pxr 26.11 and LightUSD map layer samples {4,12,16} to stage {12,16,18}; stage Get(12) reads layer time 4; drafted 10 |
| LEAN-112 | UsdSpec.LayerOffset.stackLevel_offset_ne_recursive | L5462-5467 | The note claiming "the same effective offsets" leaves accumulated offset undefined. An authored-only fold plus the stack-level tcps ratio fails for offsets: root 24 tcps, A 48 tcps ⟨10,1⟩, B 48 tcps ⟨5,1⟩ → recursive ⟨12.5, 1/2⟩ vs stack-level ⟨15, 1/2⟩ or ⟨7.5, 1/2⟩. | confirmed: pxr 26.11 and LightUSD put B's sample at 0 at stage 12.5 (recursive form); drafted 11 |
| LEAN-113 | UsdSpec.LayerOffset.composeLiteral_ne | L4285-4288 vs L5483-5487 | §10.3.1 says the child's offset is added; the TCPS section says the parent's. Only the latter is affine composition (literal reading drops the parent offset). | confirmed: pxr adds the parent offset (stage = 10 + 0.5·t above); drafted 10 |
| LEAN-501 | UsdSpec.Strength.ArcKind | L5035-5064, L4876-4891 | Modeling note: Strength.ArcKind orders arcs by LIVERPS rank (L5035-5050) then depth, authored/implied and index (L5052-5064), without encoding the same-layer-stack precondition or relocate-graph validity. Layer-stack relocation metadata need not be a list-op field to create relocation nodes; clean OpenUSD v26.11.1 creates the direct node with parent=origin and sibling index 0 and compares arc type before origin depth/strength (tagged-source audit). No spec contradiction established. | note (verified text + tagged-source audit; not filed) |
| LEAN-201 | UsdSpec.ElemOrder.example_leadingZero_deferred | L3528-3532 vs L3556-3557 | Prose decides "the group with the lower number of leading '0' values shall be ordered first" at the digit group; the example lists foo00001bar before foo001bar001abc; only a tie-break deferred to the end of the string (OpenUSD TfDictionaryLessThan) fits. | confirmed (OpenUSD probe); drafted 14 |
| LEAN-202 | UsdSpec.PathGrammar.peg_rejects_mixed_separators | L3712-3717 | PrimElements: as a PEG the first alternative never fails after PrimName, so the variant alternative is unreachable; mixed paths /a{v=x}b/c and the spec's own L3452 example are rejected. OpenUSD SdfPath accepts them. | confirmed (OpenUSD probe); drafted 13 |
| LEAN-203 | UsdSpec.PathGrammar.peg_property_asymmetry | L3727-3733 | PathElements (L3727-3730) admits repeated PropElements (a.b.c) while PrimFirstPathElements (L3732) admits one; the spec has no prose on nested properties, and OpenUSD rejects a.b.c. | confirmed (OpenUSD probe); drafted 13 |
| LEAN-204 | UsdSpec.ElemOrder.example_spec_list_not_sorted | L3525 vs L3550-3557 | The listed order places foobar (L3555) before foo00001bar (L3556), contradicting L3525 ("ASCII numbers shall be ordered before ASCII letters"; cf. a0 before ab, L3550-3551). derivedOrder is the order the stated rules give. | confirmed (OpenUSD sorts differently); drafted 14 |
| LEAN-205 | UsdSpec.ElemOrder.elemCompare | L3520 | Spec orders _ before letters and numbers; OpenUSD TfDictionaryLessThan orders digits before _ (0a < _a). | openusd-differs; drafted 14 |
| LEAN-206 | UsdSpec.PathGrammar.peg_rejects_double_dotdot | L3736-3741 vs L3379-3381, L3784 | Path admits a single ..; the spec's own ../.. and ../../ParentSibilng/Cousin are unparseable. | confirmed (OpenUSD accepts ../..); drafted 13 |
| LEAN-207 | UsdSpec.PathGrammar.spec_intro_variant_example_rejected | L3338 vs L3712-3717, L3452 | The intro example /Root/Child/Grandchild{size=1}/GreatGrandchild puts / after a variant selection, which the rules forbid; OpenUSD rejects it too. | confirmed (OpenUSD probe); drafted 13 |
| LEAN-511 | UsdSpec.NamespaceMap.mapPath_internalRef_not_injective | L5384-5387 vs L5389-5400 | "Namespace mappings are bijections; as such they can be inverted": the stated prefix-replacement rule is not injective even on the internal-reference mapping ([(/B,/A),(/,/)] sends both /A and /B to /A). True property: partial bijection with a round-trip check (mapChecked_inverse). | confirmed: pxr 26.11 Pcp.MapFunction blocks /A via the invertibility check (pcp/mapFunction.cpp:777-809); drafted 15 |
| LEAN-512 | UsdSpec.NamespaceMap (reference example) | L4430, L4447, L4673 | Reference/inherit examples print pairs as (target, source); §10.5 defines (source, target); relocates example uses (source, target). | confirmed (by reading) (internal inconsistency); drafted 15 |
| LEAN-513 | UsdSpec.NamespaceMap.compose_relocates_example_noIdentity | L4924-4929 vs L4962-4966 | The relocates "additional mapping" omits the identity pair; composing as written drops (/Ref,/A), so the stated result needs an implicit (/,/). | confirmed: pxr Pcp.MapFunction.Compose without identity gives only {/Ref/B: /A/C}; drafted 15 |
| LEAN-514 | UsdSpec.Relocates.chain_valid_literal | L4900, L4910 | "A target path must not be the same as a source path" can be read per entry, which admits /P/A→/P/B + /P/C→/P/A; pxr reads it across entries and ignores both. | confirmed: pxr 26.11 and LightUSD (cache-layers.cc:176-177) reject both entries; drafted 16 |
| LEAN-601 | UsdSpec.Population.rename_target_dropped | L5948-5950 vs L5975, L5981 | Code filters relocated_names once at the end, dropping a same-stack rename target equal to an old name; prose only forbids stronger stacks introducing it. | confirmed (by reading) (reachable only under LEAN-514's literal reading); drafted 16 |
| LEAN-602 | UsdSpec.Population (header) | L5855-5899, L5847-5849 | populate_stage: return create_stage(layer) is inside the while body; the population mask's payload flag never reaches compose. | confirmed by reading; drafted 17 |
| LEAN-603 | UsdSpec.Population.reorder_ne_pxr | L5951-5954 | Spec reorder emits ordered names then the rest; pxr primOrder keeps the unordered prefix in front and carries following runs (_ReorderKeysHelper): children x a b, order [b,a] → spec b a x, pxr x b a. | confirmed: pxr 26.11 stage gives [x, b, a]; drafted 17 |
| LEAN-604 | UsdSpec.Population.dup_without_specs | L5966-5976 | unique runs only inside the per-spec loop, so a rename onto an existing child yields duplicates when the renaming stack and every stronger stack have no spec for the prim. | openusd-differs: pxr gives [Y]; drafted 17 |
| LEAN-605 | UsdSpec.Population.propertyOrder_dup | L5999-6000 vs L5980 | propertyOrder is not passed through unique (primOrder is), so ["a","a"] yields [a, a]. | openusd-differs: pxr gives [a, b]; drafted 17 |
| LEAN-411 | UsdSpec.Crate.Header (version table) | L11738-11744 vs L11768-11782 | "Compressed the Table of Contents Sections" (0.4.0 row): the TOC is never compressed; OpenUSD's history says Compressed structural sections (crateFile.cpp L408). (Wording ambiguity: the compressed items are the structural sections the TOC points to.) | confirmed (source); drafted 21 |
| LEAN-412 | UsdSpec.Crate.ValueRep.readings_differ_on_pxr_token | L12067-12079 | "The third last bit" (with "The last bit", "The second last bit") does not fix bit order; OpenUSD and LightUSD use bits 63/62/61, the LSB reading misreads any file with array, inlined or compressed reps. | confirmed (pxr 26.11 bytes); drafted 21 |
| LEAN-413 | UsdSpec.Crate.Paths.specAlg_diverges_on_pxr | L11943-11948, L11980-11982 | Path construction recurses at X+jump for jump ≥ 0, so jump 0 never terminates; pxr writes 0 for every sibling-only row, meaning sibling at X+1. >0 means child and sibling at X+jump. | confirmed (pxr 26.11 file decoded); drafted 21 |
| LEAN-414 | UsdSpec.Crate.ListOpEncoding.pxr_0x22_drops_explicit | L12577-12602 | Non-canonical headers unspecified: OpenUSD setters switch mode and clear lists in wire order; 0x02 enters explicit mode and 0x22 drops explicit items. LightUSD production readers now normalize this behavior. | verified (source + stock 26.11, 2,048 real crate cases; implementation fixed; not filed) |
| LEAN-415 | UsdSpec.Crate.Header.spec_vs_pxr_bootstrapLen | L11753-11761 | Spec bootstrap reserves 8 bytes (32-byte bootstrap); OpenUSD _BootStrap reserves int64_t[8] = 64 bytes (88-byte bootstrap) and rejects shorter files. | confirmed (pxr bytes + source); drafted 21 |
| LEAN-416 | UsdSpec.Crate.Paths (module doc) | L11896-11905 | PATHS starts with two u64 counts (path-table size, encoded-row count); the empty path is never encoded, so indexes are not dense. The spec shows one count. | confirmed (references layer writes 3, 2); drafted 21 |
| LEAN-801 | UsdSpec.Usda (module doc) | L10123, L10383 | ListOpValue cannot be [] (non-empty List<ListItem>), while ReferenceList allows []. Stock 26.11 rejects prepend apiSchemas = [] but accepts a nonempty list and references = []; qualified empty references are separately rejected by semantic validation. This is a syntax limitation consistent with the reference, not an established specification defect. | note (verified source + stock 26.11; not filed) |
| LEAN-701 | UsdSpec.ValueResolution.Metadata.specifier_bullets_overlap | L6124-6131 | The class and def specifier bullets are neither exclusive nor exhaustive and can contradict OpenUSD: [over, def via direct inherit, class via reference] satisfies both; [over, class via direct inherit, def via direct inherit] neither; adding a class-via-reference opinion satisfies only class but resolves to def. Implemented rule: strongest-first scan, skip over, def wins, a non-direct-inherit class wins, a direct-inherit class is remembered. | confirmed: pxr 26.11 GetSpecifier() = Def on all three; drafted 18 |
| LEAN-702 | UsdSpec.ValueResolution.Attribute.readings_disagree | L6325-6336, L6492-6503, L6586-6590, L7006-7011 | Source priority is under-specified: L6325-6331 lists the field order without saying whether it applies within each spec or across the stack (L6334 "on each spec" favours within); L6492-6503 ranks timeSamples above spline and clips without placing default; L7006-7011 anchors clips below the anchoring layer's local data. Naive cross-stack readings (perFieldA, perFieldB) disagree with each other and with pxr; only the per-spec / clip-anchored reading matches pxr. | confirmed: pxr 26.11 Get(5) on 4 stacks; drafted 19 |
| LEAN-703 | UsdSpec.ValueResolution.Attribute.pyGetValue | L6366-6443, L6484-6486, L7616-7617 | Reference python get_value: syntax errors (split return annotation, : =), missing time argument, fallback branch re-runs default, no spline/clip/block handling, single spec instead of the stack, lerps non-interpolable types, truthiness test inconsistent with the is not None test at L6405, empty timeSamples IndexError. | confirmed (by reading); drafted 19 |
| LEAN-521 | UsdSpec.Composition.PrimIndex (module doc) | L4218-4242 | Outline pseudocode: no return; compose_arcs/compose_layer_stack undefined; LIFO queue.pop() and no strength ordering; payload input unused; !queue.empty() not Python; unbalanced parentheses; loop variable shadows prim_path. | confirmed (by reading); drafted 20 |
| LEAN-522 | UsdSpec.Composition.PrimIndex.ex6_table_ne | L5315-5374 vs L4234-4242 | Example 6 tables list root.usda /Class_1 and /Class_2, which have no specs; they are implied prim-index nodes, not opinions, and compose drops spec-less layers. | confirmed: pxr 26.11 GetPrimStack omits them (index shows them as nospecs); drafted 20 |
| LEAN-311 | UsdSpec.Schema.PrimDefinition.l8922_schemas | L8761-8791, L8677-8711, L8922, L8949 | Literal pseudocode duplicates included schemas (pre-appends inclusions, then compose appends their schema lists); L8949 omits inherited BarBaz:otherInstance. Its literal recursion has no building-state cycle guard (cycle_diverges concerns this model, without an implicit implementation cache). Clean OpenUSD v26.11.1 deduplicates schema family/instance/version and tracks Building/Complete states to skip cyclic inclusions. Seven stock built-in definitions confirm unique expanded schema lists; these are controls, not a runtime recreation of the hypothetical FooBar examples. | confirmed (text + kernel examples + tagged-source audit; stock controls; not filed) |
| LEAN-741 | UsdSpec.Spline.autoEase_nextDual_ne | L7717-7766 | AutoEase pseudocode blends toward nextKnot.value and zeroes both slopes when a neighbour is missing; OpenUSD blends toward the next knot's pre-value and keeps the off-end tangent ((0,0),(1,1),(4,10 pre 2): 27/16 vs 37/48). | confirmed: pxr 26.11 Ts (knotData.cpp:132-262); LightUSD matches pxr |
| LEAN-742 | UsdSpec.Spline.Knot | L2050-2052, L7709-7712 | "does not consult the algorithm", yet OpenUSD re-solves autoEase tangents of authored knots (same stored tangents: 0.289 vs 0.500 at t=0.5). | openusd-differs (LightUSD also recomputes) |
| LEAN-743 | UsdSpec.Spline.evalBasic_pre_held | L7865-7867 | Held pre-extrapolation "retains the value of the terminal knot"; for a dual-valued first knot pxr uses the pre-value. | openusd-differs |
| LEAN-744 | UsdSpec.Spline.postSlope | L7891-7903 | Linear-extrapolation slope with a dual-valued terminal knot unspecified; pxr uses slope 0. | openusd-differs |
| LEAN-745 | UsdSpec.Spline.evalBasic | L2109-2135, L7829, L7866 | The spec describes extrapolation regions "before all knots and after all knots" (L2109-2135) and held extrapolation at the terminal knot (L7866) but does not say whether a query exactly at t_last is a knot value or post-extrapolation; ambiguous rather than unspecified. pxr puts it in extrapolation (post: none → no value; loop reset → first value), except with inner loops. Lean evalBasic models the pxr reading. | confirmed (pxr probes) |
| LEAN-746 | UsdSpec.Spline.postSlope | L7878-7903 | Linear extrapolation of a single-knot spline has no segment from which to obtain the specified slope. Clean OpenUSD v26.11.1 ts/eval.cpp explicitly uses a flat slope when there is only one knot. Isolated stock 26.11 confirms constant value and zero derivative before/after the knot for all four interpolation modes, even with nonzero authored tangents. | confirmed (spec omission; tagged source + 36 stock queries; not filed) |
| LEAN-747 | UsdSpec.Spline.loopEval | L7843, L7922-7926 | Oscillate "every other copy reversed" omits that reflected copies take left limits at mirrored knots (pre-value / held value). | confirmed (pxr probes) |
| LEAN-748 | UsdSpec.Spline.expandInner | L7962-8016 | Inner-loop semantics only implied (cumulative valueOffset, closing knot copy, interior knots dropped); typos L7991-7992; pxr marks inner loops deprecated. | confirmed (pxr probes) |
| LEAN-761 | UsdSpec.Clips.example_quad_ne_spec | L6889-6909 | Template start 0, end 2, stride 1 said to give quad_001…003; the rules give 000…002. | confirmed: pxr derives 000/001/002 |
| LEAN-762 | UsdSpec.Clips.Template | L6896, L6829-6838, L7262/7279/7293 | string templateAssetPath = [@./quad_###.usda@] is ill-typed and quad_### is not a .###. token (pxr rejects it); [@./clip1.usd@. clip_2.usd] malformed. | confirmed (pxr warning; LightUSD accepts quad_###) |
| LEAN-763 | UsdSpec.Clips.ClipSet | L6657, L6662 vs L7213 | Headings say manifestPath/interpolateMissingClipsValue; examples and OpenUSD use manifestAssetPath/interpolateMissingClipValues. | confirmed (pxr UsdClipsAPIInfoKeys) |
| LEAN-764 | UsdSpec.Clips.Template.expand | L6867-6882 | The spec generates two extra times knots depending on "the absolute value of their offset" (L6879-6881), but its only example has templateEndTime equal to the last derived time, so it does not say which end value is used (start - abs(offset) and end + abs(offset), regardless of sign). pxr places the end knot off the derived grid, using templateEndTime. | confirmed: pxr clipSetDefinition.cpp:251-293 |
| LEAN-765 | UsdSpec.Clips.Template.times | L6847-6857 | "Start time … truncated to an integer": pxr truncates only the file name (12.5 → f.012, times/active at 12.5). | confirmed (pxr probe) |
| LEAN-766 | UsdSpec.Clips.Template.expand | L6887-6915 | Behaviour for unresolvable derived template paths unspecified; pxr skips and renumbers active indices. | confirmed (pxr probe) |
| LEAN-767 | UsdSpec.Clips.activeIndex | L6684-6687, L6941-6958 | Authored-list interval prose does not require sorted or unique activation times. Clean OpenUSD v26.11.1 normalizes chronological order and rejects any duplicate activation time, including repeated identical indices. Isolated stock 26.11 confirms equal sampled values for sorted/unsorted controls and no clip values for three duplicate-time cases. Literal activeIndex stays separate from compatibility prepareActive/pxrActiveIndex; native parsing now rejects duplicates too. | confirmed (text + tagged source + 25 stock queries; implementation fixed; not filed) |
| LEAN-768 | UsdSpec.Clips.clipTime | L6688-6691, L6962-6994 | Unauthored times not covered; pxr and LightUSD agree on identity mapping. | confirmed (pxr probe) |
| LEAN-769 | UsdSpec.Clips.clipTime_clamp_before | L6983-6990, L7035-7037 | Clip time is clamped (L6983-6990) and the active clip is "opened and queried" at that time (L7035-7037); pxr instead interpolates values across the clip boundary in the clamped regions. The spec has no example of this. | openusd-differs |
| LEAN-421 | UsdSpec.Crate.Lz4 (header) | L11590-11592 | Per-chunk "size of the chunk in bytes" does not say compressed or uncompressed; OpenUSD writes/reads the compressed size. LightUSD's multi-chunk writer wrote the uncompressed size and could not read its own output (>2 GiB blobs). | confirmed: pxr fastCompression.cpp; LightUSD bug fixed in c/crate-blob.c |
| LEAN-422 | UsdSpec.Crate.Lz4.lz4MaxInputSize | L11583-11598 | Per-chunk uncompressed size (pxr 0x7E000000), chunk-count limit (≤127, signed char read) and empty-buffer framing (pxr [0,0], LightUSD [0]) unspecified. Field widths: issue 01. | confirmed (source) |
| LEAN-531 | UsdSpec.Instancing.ex_ancestralOnly | L5519-5522 | "Contains one or more composition arcs" does not say whether ancestral arcs count; pxr and LightUSD require an arc on the prim itself. | confirmed (pxr 26.11 + LightUSD) |
| LEAN-532 | UsdSpec.Instancing.key | L5537-5543 | "Exactly the same" arcs leaves arc identity undefined; pxr PcpInstanceKey compares (arc type, target site, layer offset) + variant selections, so offset-only differences do not share. | confirmed (pxr + LightUSD agree) |
| LEAN-533 | UsdSpec.Instancing.ex_unresolvedArc | L5522 | pxr counts only arcs whose node has specs; an instanceable prim whose only arc is unresolved is not an instance and keeps local children. LightUSD previously followed the literal reading and dropped them; the follow-up fixes contributing-arc detection. | openusd-differs (LightUSD corrected in follow-up: contributing direct arcs require specs; one-thread/four-thread regression) |
| LEAN-211 | UsdSpec.Unicode.Norm (header) | L3903-3909 vs L1805-1817 | "Normalization is out of scope" appears only under path runtime considerations, not under Names; NFC and NFD café are distinct sibling names. | confirmed (pxr and LightUSD keep two children) |
| LEAN-212 | UsdSpec.Unicode.Norm.nfc_roman_nine | L3905-3909 | "NKFD" typo for NFKD; the IX/Ⅸ example is a compatibility, not canonical, equivalence. | confirmed |
| LEAN-802 | UsdSpec.Usda.Peg.undefinedRefs_usda | L10779-10787, L11376-11387, L11489-11490 | Normative RelationshipSpec references TimeSampleOrDefault, defined only in the optional legacy section (the only undefined nonterminal). The legacy boundary explicitly makes additional rules optional and their semantics unspecified. Clean OpenUSD v26.11.1 defines .default = PathRef directly rather than depending on this undefined symbol. | confirmed (normative-text + tagged-source audit; kernel grammar check; not filed) |
| LEAN-804 | UsdSpec.Usda.Peg.keywords_unused | L9935-9993, L10431, L10271, L9715-9717, L11204 | Normative keyword table reserves varying (unused by normative productions), while literals autoEase, inf, nan, usda are not reserved. These kernel-checked grammar facts do not establish a defect: L9940-9946 explains contextual recognition, and the optional legacy rules use varying. Clean OpenUSD v26.11.1 likewise reserves varying, omits autoEase from Keywords despite declaring it separately, and handles inf/nan through math-keyword rules. | note (verified text + tagged-source audit; not filed) |
| LEAN-805 | UsdSpec.Usda.Peg.number_decimal_rejected | L9704-9706 | BasePart tries (Digit)+ before (Digit)+ Dot (Digit)*; PEG ordered choice commits, so 1.5 is not a Number. | confirmed: pxr accepts 1.5 |
| LEAN-806 | UsdSpec.Usda.Peg.keyword_prefix_rejected | L10021, L9935-9993 | !(Keyword) BaseIdentifier rejects identifiers with a keyword prefix (defaultPrim, customLayerData, prefix…); fix !(Keyword !XidContinue). Cause of 67 of 103 rejections. | confirmed: pxr accepts |
| LEAN-807 | UsdSpec.Usda.Peg.attr_special_unreachable | L10466-10471, L10779-10787 | AttributeSpec alternative 1 matches the bare declaration, making .timeSamples/.connect/.spline unreachable; mechanized for attributes; RelationshipSpec alternative 3 is shadowed likewise (by inspection of L10779-10787). | confirmed: pxr accepts |
| LEAN-808 | UsdSpec.Usda.Peg.customData_metadata_rejected | L9953, L10369, L10839 | customData is a keyword, so prim/property/layer customData = {…} has no production. | confirmed: pxr accepts |
| LEAN-809 | UsdSpec.Usda.Peg.multiline_newline_rejected | L9680-9697, L9750-9776, L9895-9897 | Utf8Character starts at U+0020, so multiline strings and /* */ comments cannot contain newlines; !(SingleQuote) forbids a lone quote in '''…'''. | confirmed: pxr accepts |
| LEAN-810 | UsdSpec.Usda.Peg.tab_in_string_rejected | L9680-9697 | U+0009 is not a Utf8Character, so tabs inside strings/comments are excluded. | confirmed: pxr accepts |
| LEAN-811 | UsdSpec.Usda.Peg (module doc; vector rows) | L4692, L4753, L5288, L5332, L6545, L4844 | Six spec examples are not valid USDA (missing ), curly quotes, commas between variants). | confirmed: pxr 26.11 rejects all six |
| LEAN-812 | UsdSpec.Usda.Peg (module doc; vector row) | L10342-10348 vs L10388 | Prose shows append rel myRel (list op without assignment) as a no-op, but the grammar requires an assignment. | confirmed: pxr rejects |
| LEAN-515 | UsdSpec.Relocates.OkRootOpenUsd, rootTarget_openUsd_only | L4902 | The root-prim restriction is ambiguous about source and target. OpenUSD forbids root-prim sources but allows root-prim targets. | openusd-differs: clean v26.11.1 layerStack.cpp and stock usd-core 26.11 runtime (/P/Child to /Moved, no composition errors); preserve compatibility |