NameAndTypeOK clause 1 (XSD 1.0 section 3.9.6, Elt:Elt) pairs the declared
element declarations and requires the same {name} and {target namespace};
no clause grants substitution an allowance. The substitution-group
expansion rewrites the compiled term (an abstract head is dropped, members
join a synthetic choice), so the checker previously compared the expanded
names and a head-for-member swap looked name-identical.
Particle.declaredReference now preserves the pre-expansion identity of an
element-ref particle, and the restriction check pairs the declared
references before the structural pairing table (extracted as
structuralValid). Closes XSTS elemZ026 and particlesV020:
invalid-schemas-accepted 8 -> 6, valid buckets unchanged at zero.
Stricter than libxml2, which does not implement this edge; elemZ026 is
pinned in the differential baseline accordingly.
particlesZ008, byte-for-byte the same construct as elemZ026 but carrying
a settled valid expectation contradicting elemZ026's settled invalid, is
reclassified as a spec-divergent schema test with the adjudication
recorded in the suite (exclusion tables split into
Tests/XSTSSuiteExclusions.swift for file length).
Separately attributed: the differential baseline gains ten further pinned
entries (addB070a, addB108, addB177, attO025, elemZ027_c, errC008,
groupH021v, notatB005, notatE002, particlesEb040) that reproduce with
this change stashed. They are pre-existing drift from earlier main-line
fixes, not effects of this commit. Baseline 231 -> 242, differential
green.
2.9 KiB
Roadmap
Living index of open work. Pin #3
(production readiness for IDE use) for the checklist view. Released v0.4.8
(2026-07-05); pre-1.0 until the production-readiness gates in
docs/production-readiness.md are earned.
The tracker was rebuilt on Codeberg after the original issue history was lost with the GitHub repository; pre-migration issue numbers cited in older changelog entries and commit messages refer to that lost tracker.
Current focus (priority order)
- #4: drive invalid
schemas accepted from 6 to 0. The remainder routes through
ParticleRestriction.violation's deliberate under-approximation (docs/release-hurdles.md, Part 1). - #5: drive invalid
instances accepted from 4 to 0 (contested-spec and policy-dependent tail,
docs/xsts-deviations.md). - Proven (not capped) interactive resource bounds beyond the content matcher
(
docs/release-hurdles.md, Part 2; the graph-structured-stack matcher's linear bound is already count-asserted).
Parallel: #7 (Xalan XSLT
suite burn-down, 26 pinned failures),
#6 (performance epic,
live table in docs/benchmarks.md).
XSTS gates (current enforced baselines)
These mirror the ratchet asserted in Tests/XSTSSuiteTests.swift; update both
together.
| Gate | Now | Issue |
|---|---|---|
| Valid schemas rejected | 0 | at floor, enforced by the ratchet |
| Invalid schemas accepted | 6 | #4 |
| Valid instances rejected | 0 | at floor, enforced by the ratchet |
| Invalid instances accepted | 4 | #5 |
Gates are metric trackers, not implementation tasks. Ratchet baselines in
Tests/XSTSSuiteTests.swift when counts fall; a rising count is a regression.
Milestones
| Milestone | Exit criteria | Key issues |
|---|---|---|
| M1: Trust the oracle | Reference differentials + fuzz | done (schema determinism, facet-value, and instance differentials all land opt-in) |
| M2: Schema compiles correctly | #4 to 0 | #4 |
| M3: Instances validate correctly | #5 to 0 | #5 |
| M4: IDE-ready diagnostics | Located errors, proven bounds | located diagnostics done; bounds under #3 |
| M5: 1.0 | All gates at 0 | #3, #6, #7 |
Labels
| Label | Meaning |
|---|---|
epic |
Grouping issue |
gate |
XSTS outcome metric |
task |
Implementation work |
area-schema / area-instance / area-infra / area-xslt / area-perf |
Subsystem |
priority-P0 / P1 / P2 |
Critical path vs parallel |
Related docs
docs/production-readiness.md: the bar for IDE authoritydocs/schema-validity-burndown.md: schema-side burn-down protocoldocs/xsts-deviations.md: deviation taxonomy and documented floors