PureXML/docs/roadmap.md
Mihaela Mihaljevic 2e3d2e25f8 fix(schema): reject substitution-member swaps in particle restriction
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.
2026-07-05 08:27:55 +02:00

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)

  1. #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).
  2. #5: drive invalid instances accepted from 4 to 0 (contested-spec and policy-dependent tail, docs/xsts-deviations.md).
  3. 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
  • docs/production-readiness.md: the bar for IDE authority
  • docs/schema-validity-burndown.md: schema-side burn-down protocol
  • docs/xsts-deviations.md: deviation taxonomy and documented floors