Skip to content

Close core parser perf gates and restore package type safety#4

Open
Clickin wants to merge 5 commits intomasterfrom
feature/core-parser-perf-gates-final
Open

Close core parser perf gates and restore package type safety#4
Clickin wants to merge 5 commits intomasterfrom
feature/core-parser-perf-gates-final

Conversation

@Clickin
Copy link
Copy Markdown
Owner

@Clickin Clickin commented Mar 25, 2026

Summary

  • fix DTD/internal-subset chunk-boundary handling so mixed-content async parsing completes reliably
  • recover cursor hot-path performance with scalar token state and deferred attribute parsing
  • restore sync public wrapper performance with a direct parser path and sequential benchmark discipline
  • align benchmark/profiling tooling around fixed main/checkpoint/feature worktrees and built-dist-only measurements
  • fix package type mismatches so package-wide TypeScript checking passes again

Perf Results

  • Cursor gate: PASS
    • sync-cursor-consume: 55.31ms -> 31.03ms, +43.89%
    • sync-cursor-attr-unused: 52.14ms -> 31.81ms, +38.99%
    • async-cursor-midsize-4kb ratio: 0.82x vs checkpoint
    • async-cursor-midsize-64kb ratio: 0.87x vs checkpoint
  • Wrapper gate: PASS
    • sync-parser-books regression: +2.13% vs main baseline
    • sync-parser-complex improvement: +6.05% vs main baseline
    • async-parser-midsize-4kb: feature completes, checksum stable
    • async-parser-midsize-64kb: feature completes, checksum stable
    • async-parser-mixed-256b: feature completes, checksum stable
  • Stress suite: signal-only, feature async-parser-single-chunk completed with stable checksum

Validation

  • pnpm build
  • pnpm test
  • bunx tsc --noEmit -p packages/stax-xml/tsconfig.json
  • node ./scripts/evaluate-core-parser-gates.mjs cursor /tmp/stax-compare/checkpoint/benchmarks/cursor.json /tmp/stax-compare/feature/benchmarks/cursor.json
  • node ./scripts/evaluate-core-parser-gates.mjs wrapper /tmp/stax-compare/main/benchmarks/wrapper.json /tmp/stax-compare/feature/benchmarks/wrapper.json
  • node ./scripts/evaluate-core-parser-gates.mjs stress /tmp/stax-compare/main/benchmarks/wrapper.json /tmp/stax-compare/feature/benchmarks/stress.json
  • node ./scripts/verify-core-parser-baselines.mjs /josh/programs/stax-xml /josh/programs/stax-xml-core-parser-checkpoint /josh/programs/stax-xml-core-parser-refactor --expect-main 7d6c713 --expect-checkpoint 97dbf5b --expect-feature 97dbf5b

Clickin added 3 commits March 25, 2026 10:42
…isons

The parser split now needs a stable internal baseline before cursor-only and wrapper-facing performance can be judged independently. This commit captures the current refactor state, cursor surface, focused tests, and comparison scripts so a checkpoint worktree can be cut from a known SHA without mixing in later optimization passes.

Constraint: Upcoming perf analysis must compare feature work against a fixed internal checkpoint and main separately
Rejected: Use the moving feature branch head as the internal baseline | comparisons would drift as optimization work lands
Confidence: medium
Scope-risk: moderate
Reversibility: clean
Directive: Treat this SHA as the checkpoint source and avoid mutating the derived checkpoint worktree during perf comparisons
Tested:
> stax-xml@0.4.0 test /josh/programs/stax-xml-core-parser-refactor/packages/stax-xml
> vitest run "test/cursor-sync.test.ts" "test/cursor-async.test.ts" "test/parser-sync.test.ts" "test/parser.test.ts"

 RUN  v3.2.4 /josh/programs/stax-xml-core-parser-refactor/packages/stax-xml

 ✓ test/cursor-sync.test.ts (3 tests) 9ms
 ✓ test/parser-sync.test.ts (30 tests) 23ms
 ✓ test/cursor-async.test.ts (3 tests) 22ms
 ✓ test/parser.test.ts (13 tests) 41ms

 Test Files  4 passed (4)
      Tests  49 passed (49)
   Start at  10:42:42
   Duration  612ms (transform 341ms, setup 0ms, collect 616ms, tests 95ms, environment 1ms, prepare 691ms),
> stax-xml@0.4.0 build /josh/programs/stax-xml-core-parser-refactor/packages/stax-xml
> tsdown

ℹ tsdown v0.15.12 powered by rolldown v1.0.0-beta.45
ℹ Using tsdown config: /josh/programs/stax-xml-core-parser-refactor/packages/stax-xml/tsdown.config.ts
ℹ Build start
ℹ Cleaning 8 files
Not-tested: Full vitest suite, benchmark/profiling runs against the new scripts
The core-parser refactor needed a stable comparison harness, a restored mixed-content correctness floor, and enough hot-path work to recover both cursor-only wins and public wrapper behavior. This commit freezes that baseline workflow, fixes DTD/chunk-boundary handling, restores sync wrapper performance with a direct parser path, and defers no-namespace attribute parsing so the cursor gate can be measured against a fair built-dist comparison.

Constraint: Benchmarking and profiling must use built dist artifacts from fixed main/checkpoint/feature worktrees
Constraint: Main async wrapper midsize baselines do not complete reliably, so async wrapper cases are recorded as feature-side completion signals
Rejected: Keep sync public wrapper layered on the cursor path | wrapper gate stayed materially slower than main
Rejected: Compare main and feature wrapper suites in parallel | contention distorted sync benchmark means and invalidated the gate
Confidence: medium
Scope-risk: moderate
Reversibility: clean
Directive: Re-run main/checkpoint/feature suites sequentially when validating future perf work; parallel benchmark runs skew the gate
Tested:
> stax-xml-monorepo@0.4.0 build /josh/programs/stax-xml-core-parser-refactor
> pnpm -r --filter=stax-xml build

> stax-xml@0.4.0 build /josh/programs/stax-xml-core-parser-refactor/packages/stax-xml
> tsdown

ℹ tsdown v0.21.4 powered by rolldown v1.0.0-rc.9
ℹ config file: /josh/programs/stax-xml-core-parser-refactor/packages/stax-xml/tsdown.config.ts
ℹ Build start
ℹ Cleaning 4 files,
> stax-xml-monorepo@0.4.0 test /josh/programs/stax-xml-core-parser-refactor
> vitest run "test/parser-sync.test.ts" "test/dtd-chunk-boundary.test.ts" "test/cursor-sync.test.ts" "test/cursor-async.test.ts" "test/parser.test.ts"

 RUN  v3.2.4 /josh/programs/stax-xml-core-parser-refactor

 ✓ packages/stax-xml/test/parser-sync.test.ts (30 tests) 14ms
 ✓ packages/stax-xml/test/cursor-sync.test.ts (3 tests) 8ms
 ✓ packages/stax-xml/test/parser.test.ts (13 tests) 25ms
 ✓ packages/stax-xml/test/cursor-async.test.ts (3 tests) 16ms
 ✓ packages/stax-xml/test/dtd-chunk-boundary.test.ts (4 tests) 31ms

 Test Files  5 passed (5)
      Tests  53 passed (53)
   Start at  12:41:26
   Duration  672ms (transform 463ms, setup 0ms, collect 924ms, tests 93ms, environment 2ms, prepare 901ms), {
  "suite": "cursor",
  "gateType": "checkpoint-vs-feature",
  "pass": true,
  "baselineLabel": "checkpoint",
  "featureLabel": "feature",
  "baselineHead": "97dbf5b487be958ad0e8a16d53cc18473e5f157c",
  "featureHead": "97dbf5b487be958ad0e8a16d53cc18473e5f157c",
  "timestamp": "2026-03-25T03:41:27.572Z",
  "checks": [
    {
      "caseName": "sync-cursor-consume",
      "rule": "improvement >= 10%",
      "pass": true,
      "baselineMeanMs": 55.30580987500001,
      "featureMeanMs": 31.034145624999994,
      "improvementPct": 43.88628302317218
    },
    {
      "caseName": "sync-cursor-attr-unused",
      "rule": "improvement >= 25%",
      "pass": true,
      "baselineMeanMs": 52.138011600000006,
      "featureMeanMs": 31.80711329999999,
      "improvementPct": 38.994387542005946
    },
    {
      "caseName": "async-cursor-midsize-4kb",
      "rule": "completed and ratio <= 1.5x",
      "pass": true,
      "baselineMeanMs": 979.1994456666665,
      "featureMeanMs": 803.3950179999998,
      "ratio": 0.8204610629176019,
      "featureTimedOut": false,
      "correctnessMatch": true
    },
    {
      "caseName": "async-cursor-midsize-64kb",
      "rule": "completed and ratio <= 1.5x",
      "pass": true,
      "baselineMeanMs": 917.1792821666668,
      "featureMeanMs": 796.0090850000003,
      "ratio": 0.8678882095107684,
      "featureTimedOut": false,
      "correctnessMatch": true
    }
  ]
}, {
  "suite": "wrapper",
  "gateType": "main-vs-feature",
  "pass": true,
  "baselineLabel": "main",
  "featureLabel": "feature",
  "baselineHead": "7d6c713ff218468c28b889c413917a896c7f88aa",
  "featureHead": "97dbf5b487be958ad0e8a16d53cc18473e5f157c",
  "timestamp": "2026-03-25T03:41:27.624Z",
  "checks": [
    {
      "caseName": "sync-parser-books",
      "rule": "regression <= 5%",
      "pass": true,
      "baselineMeanMs": 0.3677802500000003,
      "featureMeanMs": 0.37561641666666407,
      "regressionPct": 2.1306654358584374
    },
    {
      "caseName": "sync-parser-complex",
      "rule": "regression <= 5%",
      "pass": true,
      "baselineMeanMs": 0.3200750000000004,
      "featureMeanMs": 0.3007127500000024,
      "regressionPct": -6.049285323751604
    },
    {
      "caseName": "representative-wrapper-improvement",
      "rule": "at least one representative wrapper case improves by >= 5%",
      "pass": true,
      "improvements": [
        {
          "caseName": "sync-parser-books",
          "improvementPct": -2.1306654358584374,
          "pass": false
        },
        {
          "caseName": "sync-parser-complex",
          "improvementPct": 6.049285323751604,
          "pass": true
        }
      ]
    },
    {
      "caseName": "async-parser-midsize-4kb",
      "rule": "completed without timeout",
      "pass": true,
      "featureTimedOut": false,
      "featureMeanMs": 1027.1698019999997,
      "featureChecksum": "952994351aa4e961df116ca9bac45f54396cfba3729b818a14946757c25ad11d"
    },
    {
      "caseName": "async-parser-midsize-64kb",
      "rule": "completed without timeout",
      "pass": true,
      "featureTimedOut": false,
      "featureMeanMs": 1029.4327503333332,
      "featureChecksum": "952994351aa4e961df116ca9bac45f54396cfba3729b818a14946757c25ad11d"
    },
    {
      "caseName": "async-parser-mixed-256b",
      "rule": "completed without timeout",
      "pass": true,
      "featureTimedOut": false,
      "featureMeanMs": 0.6944303750000014,
      "featureChecksum": "9aeebb500fac7d8d5039b9dc963897d44ee4072d179dfc5bf70ed318f7837357"
    }
  ]
}, {
  "suite": "stress",
  "gateType": "signal-only",
  "pass": true,
  "baselineLabel": "main",
  "featureLabel": "feature",
  "timestamp": "2026-03-25T03:41:27.675Z",
  "checks": [
    {
      "caseName": "async-parser-single-chunk",
      "status": "missing",
      "pass": true,
      "note": "signal only; missing result does not fail the suite"
    }
  ]
}, {
  "timestamp": "2026-03-25T03:41:27.788Z",
  "repoRoots": {
    "main": "/josh/programs/stax-xml",
    "checkpoint": "/josh/programs/stax-xml-core-parser-checkpoint",
    "feature": "/josh/programs/stax-xml-core-parser-refactor"
  },
  "worktrees": [
    {
      "worktree": "/josh/programs/stax-xml",
      "head": "7d6c713ff218468c28b889c413917a896c7f88aa",
      "branch": "main"
    },
    {
      "worktree": "/josh/programs/stax-xml-core-parser-checkpoint",
      "head": "97dbf5b487be958ad0e8a16d53cc18473e5f157c",
      "detached": true
    },
    {
      "worktree": "/josh/programs/stax-xml-core-parser-refactor",
      "head": "97dbf5b487be958ad0e8a16d53cc18473e5f157c",
      "branch": "feature/core-parser-cursor-refactor"
    }
  ],
  "repos": {
    "main": {
      "repoRoot": "/josh/programs/stax-xml",
      "git": {
        "head": "7d6c713ff218468c28b889c413917a896c7f88aa",
        "branch": "main"
      },
      "status": {
        "dirty": false,
        "entries": []
      },
      "entrypoint": "/josh/programs/stax-xml/packages/stax-xml/dist/index.mjs",
      "expectedHead": "7d6c713",
      "headMatchesExpected": true
    },
    "checkpoint": {
      "repoRoot": "/josh/programs/stax-xml-core-parser-checkpoint",
      "git": {
        "head": "97dbf5b487be958ad0e8a16d53cc18473e5f157c",
        "branch": null
      },
      "status": {
        "dirty": false,
        "entries": []
      },
      "entrypoint": "/josh/programs/stax-xml-core-parser-checkpoint/packages/stax-xml/dist/index.mjs",
      "expectedHead": "97dbf5b",
      "headMatchesExpected": true
    },
    "feature": {
      "repoRoot": "/josh/programs/stax-xml-core-parser-refactor",
      "git": {
        "head": "97dbf5b487be958ad0e8a16d53cc18473e5f157c",
        "branch": "feature/core-parser-cursor-refactor"
      },
      "status": {
        "dirty": true,
        "entries": [
          "A  docs/core-parser-replan.md",
          "M  package.json",
          "M  packages/stax-xml/package.json",
          "M  packages/stax-xml/src/StaxXmlCursor.ts",
          "M  packages/stax-xml/src/StaxXmlCursorSync.ts",
          "M  packages/stax-xml/src/StaxXmlParserSync.ts",
          "M  packages/stax-xml/src/internal/AttributeCollector.ts",
          "M  packages/stax-xml/src/internal/XmlCursorParserUtil.ts",
          "A  packages/stax-xml/test/dtd-chunk-boundary.test.ts",
          "A  packages/stax-xml/tsconfig.build.json",
          "M  packages/stax-xml/tsdown.config.ts",
          "M  scripts/compare-runner-lib.mjs",
          "A  scripts/evaluate-core-parser-gates.mjs",
          "M  scripts/parser-benchmark-case.mjs",
          "M  scripts/run-benchmark.mjs",
          "M  scripts/run-node-cpu-prof.mjs",
          "A  scripts/verify-core-parser-baselines.mjs"
        ]
      },
      "entrypoint": "/josh/programs/stax-xml-core-parser-refactor/packages/stax-xml/dist/index.mjs",
      "expectedHead": "97dbf5b",
      "headMatchesExpected": true
    }
  },
  "issues": [],
  "ok": true
}
Not-tested: Full vitest suite outside parser/cursor coverage, converter typecheck cleanup under error TS5058: The specified path does not exist: 'tsconfig.build.json'.
The performance work left a small set of parser and converter type mismatches that blocked package-level typechecking. This commit narrows the remaining nullable parser reads, aligns recursive parsing context signatures, and adds explicit generic assertions where the schema helpers are intentionally covariant.

Constraint: Package-wide node_modules/.pnpm/@astrojs+starlight@0.36.3_astro@5.18.1_@types+node@24.12.0_jiti@2.6.1_rollup@4.60.0_tsx@4.21._rn4eqbqbtrhepetnldy46ry5wq/node_modules/@astrojs/starlight/integrations/expressive-code/theming.ts(2,26): error TS2307: Cannot find module './themes/night-owl-dark.jsonc?raw' or its corresponding type declarations.
node_modules/.pnpm/@astrojs+starlight@0.36.3_astro@5.18.1_@types+node@24.12.0_jiti@2.6.1_rollup@4.60.0_tsx@4.21._rn4eqbqbtrhepetnldy46ry5wq/node_modules/@astrojs/starlight/integrations/expressive-code/theming.ts(3,27): error TS2307: Cannot find module './themes/night-owl-light.jsonc?raw' or its corresponding type declarations.
node_modules/.pnpm/@astrojs+starlight@0.36.3_astro@5.18.1_@types+node@24.12.0_jiti@2.6.1_rollup@4.60.0_tsx@4.21._rn4eqbqbtrhepetnldy46ry5wq/node_modules/@astrojs/starlight/schema.ts(2,36): error TS2307: Cannot find module 'astro:content' or its corresponding type declarations.
node_modules/.pnpm/@astrojs+starlight@0.36.3_astro@5.18.1_@types+node@24.12.0_jiti@2.6.1_rollup@4.60.0_tsx@4.21._rn4eqbqbtrhepetnldy46ry5wq/node_modules/@astrojs/starlight/schemas/hero.ts(2,36): error TS2307: Cannot find module 'astro:content' or its corresponding type declarations.
node_modules/.pnpm/@astrojs+starlight@0.36.3_astro@5.18.1_@types+node@24.12.0_jiti@2.6.1_rollup@4.60.0_tsx@4.21._rn4eqbqbtrhepetnldy46ry5wq/node_modules/@astrojs/starlight/utils/error-map.ts(7,24): error TS2307: Cannot find module 'astro:content' or its corresponding type declarations.
node_modules/.pnpm/@astrojs+starlight@0.36.3_astro@5.18.1_@types+node@24.12.0_jiti@2.6.1_rollup@4.60.0_tsx@4.21._rn4eqbqbtrhepetnldy46ry5wq/node_modules/@astrojs/starlight/utils/error-map.ts(53,62): error TS7006: Parameter 'i' implicitly has an 'any' type.
node_modules/.pnpm/@astrojs+starlight@0.36.3_astro@5.18.1_@types+node@24.12.0_jiti@2.6.1_rollup@4.60.0_tsx@4.21._rn4eqbqbtrhepetnldy46ry5wq/node_modules/@astrojs/starlight/utils/error-map.ts(58,34): error TS7006: Parameter 'baseError' implicitly has an 'any' type.
node_modules/.pnpm/@astrojs+starlight@0.36.3_astro@5.18.1_@types+node@24.12.0_jiti@2.6.1_rollup@4.60.0_tsx@4.21._rn4eqbqbtrhepetnldy46ry5wq/node_modules/@astrojs/starlight/utils/error-map.ts(58,45): error TS7006: Parameter 'ctx' implicitly has an 'any' type.
node_modules/.pnpm/@astrojs+starlight@0.36.3_astro@5.18.1_@types+node@24.12.0_jiti@2.6.1_rollup@4.60.0_tsx@4.21._rn4eqbqbtrhepetnldy46ry5wq/node_modules/@astrojs/starlight/utils/error-map.ts(67,55): error TS7006: Parameter 'e' implicitly has an 'any' type.
node_modules/.pnpm/@astrojs+starlight@0.36.3_astro@5.18.1_@types+node@24.12.0_jiti@2.6.1_rollup@4.60.0_tsx@4.21._rn4eqbqbtrhepetnldy46ry5wq/node_modules/@astrojs/starlight/utils/plugins.ts(51,24): error TS7006: Parameter 'translations' implicitly has an 'any' type.
node_modules/.pnpm/@astrojs+starlight@0.36.3_astro@5.18.1_@types+node@24.12.0_jiti@2.6.1_rollup@4.60.0_tsx@4.21._rn4eqbqbtrhepetnldy46ry5wq/node_modules/@astrojs/starlight/utils/plugins.ts(87,17): error TS7006: Parameter 'newConfig' implicitly has an 'any' type.
node_modules/.pnpm/@astrojs+starlight@0.36.3_astro@5.18.1_@types+node@24.12.0_jiti@2.6.1_rollup@4.60.0_tsx@4.21._rn4eqbqbtrhepetnldy46ry5wq/node_modules/@astrojs/starlight/utils/plugins.ts(114,19): error TS7006: Parameter 'integration' implicitly has an 'any' type.
node_modules/.pnpm/@astrojs+starlight@0.36.3_astro@5.18.1_@types+node@24.12.0_jiti@2.6.1_rollup@4.60.0_tsx@4.21._rn4eqbqbtrhepetnldy46ry5wq/node_modules/@astrojs/starlight/utils/plugins.ts(118,23): error TS7006: Parameter 'middlewareConfig' implicitly has an 'any' type.
node_modules/.pnpm/@astrojs+starlight@0.36.3_astro@5.18.1_@types+node@24.12.0_jiti@2.6.1_rollup@4.60.0_tsx@4.21._rn4eqbqbtrhepetnldy46ry5wq/node_modules/@astrojs/starlight/utils/routing/types.ts(2,52): error TS2307: Cannot find module 'astro:content' or its corresponding type declarations.
node_modules/.pnpm/@astrojs+starlight@0.36.3_astro@5.18.1_@types+node@24.12.0_jiti@2.6.1_rollup@4.60.0_tsx@4.21._rn4eqbqbtrhepetnldy46ry5wq/node_modules/@astrojs/starlight/utils/translations.ts(1,77): error TS2307: Cannot find module 'astro:content' or its corresponding type declarations.
packages/benchmark/async-parser.ts(2,64): error TS2307: Cannot find module 'stax-xml' or its corresponding type declarations.
packages/benchmark/async-parser.ts(3,37): error TS6133: 'LargeStreamConfig' is declared but its value is never read.
packages/benchmark/async-parser.ts(40,16): error TS6133: 'testAsyncStaxParserBatch' is declared but its value is never read.
packages/benchmark/async-writer.ts(5,50): error TS2307: Cannot find module 'stax-xml' or its corresponding type declarations.
packages/benchmark/builder-big.ts(3,50): error TS2307: Cannot find module 'stax-xml' or its corresponding type declarations.
packages/benchmark/builder-small.ts(4,50): error TS2307: Cannot find module 'stax-xml' or its corresponding type declarations.
packages/benchmark/builder-small.ts(80,9): error TS6133: 'stream' is declared but its value is never read.
packages/benchmark/large-file-parser-compare.ts(2,64): error TS2307: Cannot find module 'stax-xml' or its corresponding type declarations.
packages/benchmark/large-file-parser-compare.ts(3,37): error TS6133: 'LargeStreamConfig' is declared but its value is never read.
packages/benchmark/parser-13mb.ts(5,23): error TS7016: Could not find a declaration file for module 'txml'. '/josh/programs/stax-xml-core-parser-refactor/node_modules/.pnpm/txml@5.2.1/node_modules/txml/dist/index.mjs' implicitly has an 'any' type.
  There are types at '/josh/programs/stax-xml-core-parser-refactor/packages/benchmark/node_modules/txml/dist/index.d.ts', but this result could not be resolved when respecting package.json "exports". The 'txml' library may need to update its package.json or typings.
packages/benchmark/parser-2kb.ts(3,67): error TS2307: Cannot find module 'stax-xml' or its corresponding type declarations.
packages/benchmark/parser-4kb.ts(5,23): error TS7016: Could not find a declaration file for module 'txml'. '/josh/programs/stax-xml-core-parser-refactor/node_modules/.pnpm/txml@5.2.1/node_modules/txml/dist/index.mjs' implicitly has an 'any' type.
  There are types at '/josh/programs/stax-xml-core-parser-refactor/packages/benchmark/node_modules/txml/dist/index.d.ts', but this result could not be resolved when respecting package.json "exports". The 'txml' library may need to update its package.json or typings.
packages/benchmark/parser-98mb.ts(6,49): error TS2307: Cannot find module 'stax-xml' or its corresponding type declarations.
packages/benchmark/parser-98mb.ts(18,14): error TS6133: 'event' is declared but its value is never read.
packages/docs/src/content.config.ts(1,34): error TS2307: Cannot find module 'astro:content' or its corresponding type declarations.
packages/docs/src/pages/og/[...slug].ts(1,31): error TS2307: Cannot find module 'astro:content' or its corresponding type declarations.
packages/docs/src/pages/og/[...slug].ts(5,49): error TS7031: Binding element 'data' implicitly has an 'any' type.
packages/docs/src/pages/og/[...slug].ts(5,55): error TS7031: Binding element 'id' implicitly has an 'any' type.
packages/stax-xml/performance/large-file.ts(64,38): error TS2307: Cannot find module 'bun:jsc' or its corresponding type declarations.
packages/stax-xml/performance/large-file.ts(74,16): error TS2867: Cannot find name 'Bun'. Do you need to install type definitions for Bun? Try `npm i --save-dev @types/bun`.
packages/stax-xml/performance/large-file.ts(79,3): error TS2867: Cannot find name 'Bun'. Do you need to install type definitions for Bun? Try `npm i --save-dev @types/bun`.
packages/stax-xml/performance/large-file.ts(174,40): error TS2307: Cannot find module 'bun:jsc' or its corresponding type declarations.
packages/stax-xml/performance/large-file.ts(179,5): error TS2867: Cannot find name 'Bun'. Do you need to install type definitions for Bun? Try `npm i --save-dev @types/bun`.
packages/stax-xml/performance/large-file.ts(233,18): error TS2867: Cannot find name 'Bun'. Do you need to install type definitions for Bun? Try `npm i --save-dev @types/bun`.
packages/stax-xml/performance/large-file.ts(251,18): error TS2867: Cannot find name 'Bun'. Do you need to install type definitions for Bun? Try `npm i --save-dev @types/bun`.
packages/stax-xml/performance/large-file.ts(268,7): error TS2867: Cannot find name 'Bun'. Do you need to install type definitions for Bun? Try `npm i --save-dev @types/bun`.
packages/stax-xml/performance/large-file.ts(269,42): error TS2307: Cannot find module 'bun:jsc' or its corresponding type declarations.
packages/stax-xml/performance/large-file.ts(336,40): error TS2307: Cannot find module 'bun:jsc' or its corresponding type declarations.
packages/stax-xml/performance/large-file.ts(345,29): error TS2867: Cannot find name 'Bun'. Do you need to install type definitions for Bun? Try `npm i --save-dev @types/bun`.
packages/stax-xml/performance/large-file.ts(350,5): error TS2867: Cannot find name 'Bun'. Do you need to install type definitions for Bun? Try `npm i --save-dev @types/bun`.
packages/stax-xml/performance/large-file.ts(407,42): error TS2307: Cannot find module 'bun:jsc' or its corresponding type declarations.
packages/stax-xml/performance/large-file.ts(417,20): error TS2867: Cannot find name 'Bun'. Do you need to install type definitions for Bun? Try `npm i --save-dev @types/bun`.
packages/stax-xml/performance/large-file.ts(424,7): error TS2867: Cannot find name 'Bun'. Do you need to install type definitions for Bun? Try `npm i --save-dev @types/bun`.
packages/stax-xml/test/attribute-prefix.test.ts(122,9): error TS2322: Type '{ value: string; prefix: string; }' is not assignable to type 'string | AttributeInfo'.
  Property 'localName' is missing in type '{ value: string; prefix: string; }' but required in type 'AttributeInfo'.
packages/stax-xml/test/attribute-prefix.test.ts(123,9): error TS2322: Type '{ value: string; prefix: string; }' is not assignable to type 'string | AttributeInfo'.
  Property 'localName' is missing in type '{ value: string; prefix: string; }' but required in type 'AttributeInfo'.
packages/stax-xml/test/attribute-prefix.test.ts(137,9): error TS2322: Type '{ value: string; prefix: string; }' is not assignable to type 'string | AttributeInfo'.
  Property 'localName' is missing in type '{ value: string; prefix: string; }' but required in type 'AttributeInfo'.
packages/stax-xml/test/attribute-prefix.test.ts(138,9): error TS2322: Type '{ value: string; prefix: string; }' is not assignable to type 'string | AttributeInfo'.
  Property 'localName' is missing in type '{ value: string; prefix: string; }' but required in type 'AttributeInfo'.
packages/stax-xml/test/attribute-prefix.test.ts(173,9): error TS2322: Type '{ value: string; prefix: string; }' is not assignable to type 'string | AttributeInfo'.
  Property 'localName' is missing in type '{ value: string; prefix: string; }' but required in type 'AttributeInfo'.
packages/stax-xml/test/attribute-prefix.test.ts(191,9): error TS2322: Type '{ value: string; prefix: string; }' is not assignable to type 'string | AttributeInfo'.
  Property 'localName' is missing in type '{ value: string; prefix: string; }' but required in type 'AttributeInfo'.
packages/stax-xml/test/converter/event-stream.test.ts(87,13): error TS6133: 'fullXml' is declared but its value is never read.
packages/stax-xml/test/converter/integration.test.ts(370,12): error TS6196: 'Expected' is declared but never used.
packages/stax-xml/test/converter/object-position.test.ts(137,31): error TS2345: Argument of type '{ asAttribute: string; }' is not assignable to parameter of type 'XmlElementWriteConfig'.
  Property 'element' is missing in type '{ asAttribute: string; }' but required in type 'XmlElementWriteConfig'.
packages/stax-xml/test/converter/transform-errors.test.ts(11,13): error TS2654: Non-abstract class 'MinimalSchema' is missing implementations for the following members of 'XmlSchemaBase<string, string>': '_write', '_writeAsync', '_parseText'.
packages/stax-xml/test/converter/transform-errors.test.ts(44,13): error TS2654: Non-abstract class 'MinimalSchema' is missing implementations for the following members of 'XmlSchemaBase<string, string>': '_write', '_writeAsync', '_parseText'.
packages/stax-xml/test/converter/writer-internal.test.ts(28,51): error TS2345: Argument of type '{ comment: string; }' is not assignable to parameter of type 'XmlElementWriteConfig'.
  Property 'element' is missing in type '{ comment: string; }' but required in type 'XmlElementWriteConfig'.
packages/stax-xml/test/converter/writer-internal.test.ts(38,51): error TS2345: Argument of type '{ comment: string; }' is not assignable to parameter of type 'XmlElementWriteConfig'.
  Property 'element' is missing in type '{ comment: string; }' but required in type 'XmlElementWriteConfig'.
packages/stax-xml/test/converter/writer-internal.test.ts(48,51): error TS2345: Argument of type '{ namespace: { prefix: string; uri: string; }; }' is not assignable to parameter of type 'XmlElementWriteConfig'.
  Property 'element' is missing in type '{ namespace: { prefix: string; uri: string; }; }' but required in type 'XmlElementWriteConfig'.
packages/stax-xml/test/converter/writer-internal.test.ts(106,9): error TS2345: Argument of type '{ namespace: { prefix: string; uri: string; }; }' is not assignable to parameter of type 'XmlElementWriteConfig'.
  Property 'element' is missing in type '{ namespace: { prefix: string; uri: string; }; }' but required in type 'XmlElementWriteConfig'.
packages/stax-xml/test/coverage.test.ts(110,71): error TS2345: Argument of type 'null' is not assignable to parameter of type 'string | undefined'.
packages/stax-xml/test/coverage.test.ts(111,67): error TS2345: Argument of type 'null' is not assignable to parameter of type 'string | undefined'.
packages/stax-xml/test/coverage.test.ts(118,71): error TS2345: Argument of type 'null' is not assignable to parameter of type 'string | undefined'.
packages/stax-xml/test/coverage.test.ts(119,67): error TS2345: Argument of type 'null' is not assignable to parameter of type 'string | undefined'.
packages/stax-xml/test/coverage.test.ts(127,71): error TS2345: Argument of type 'null' is not assignable to parameter of type 'string | undefined'.
packages/stax-xml/test/coverage.test.ts(143,71): error TS2345: Argument of type 'null' is not assignable to parameter of type 'string | undefined'.
packages/stax-xml/test/coverage.test.ts(173,25): error TS2339: Property 'name' does not exist on type 'ErrorEvent'.
packages/stax-xml/test/coverage.test.ts(174,25): error TS2339: Property 'localName' does not exist on type 'ErrorEvent'.
packages/stax-xml/test/coverage.test.ts(175,25): error TS2339: Property 'prefix' does not exist on type 'ErrorEvent'.
packages/stax-xml/test/coverage.test.ts(176,25): error TS2339: Property 'uri' does not exist on type 'ErrorEvent'.
packages/stax-xml/test/coverage.test.ts(177,25): error TS2339: Property 'attributes' does not exist on type 'ErrorEvent'.
packages/stax-xml/test/coverage.test.ts(178,25): error TS2339: Property 'attributesWithPrefix' does not exist on type 'ErrorEvent'.
packages/stax-xml/test/coverage.test.ts(179,25): error TS2339: Property 'value' does not exist on type 'ErrorEvent'.
packages/stax-xml/test/dtd-chunk-boundary.test.ts(4,1): error TS6133: 'XmlEventType' is declared but its value is never read.
packages/stax-xml/test/empty-elements.test.ts(3,27): error TS6133: 'EndElementEvent' is declared but its value is never read.
packages/stax-xml/test/empty-elements.test.ts(3,44): error TS6133: 'StartElementEvent' is declared but its value is never read.
packages/stax-xml/test/writer-async.test.ts(33,16): error TS6133: 'objectToXmlAsync' is declared but its value is never read.
packages/stax-xml/test/writer-async.test.ts(55,17): error TS6133: 'key' is declared but its value is never read.
packages/stax-xml/test/writer-async.test.ts(55,22): error TS6133: 'value' is declared but its value is never read.
packages/stax-xml/test/writer-async.test.ts(632,21): error TS6133: 'getOutput' is declared but its value is never read.
packages/stax-xml/test/writer-async.test.ts(768,9): error TS2322: Type '{ value: string; prefix: string; }' is not assignable to type 'string | AttributeInfo'.
  Property 'localName' is missing in type '{ value: string; prefix: string; }' but required in type 'AttributeInfo'.
packages/stax-xml/test/writer-async.test.ts(800,9): error TS2322: Type '{ value: string; prefix: string; }' is not assignable to type 'string | AttributeInfo'.
  Property 'localName' is missing in type '{ value: string; prefix: string; }' but required in type 'AttributeInfo'.
packages/stax-xml/test/writer-async.test.ts(801,9): error TS2322: Type '{ value: string; prefix: string; }' is not assignable to type 'string | AttributeInfo'.
  Property 'localName' is missing in type '{ value: string; prefix: string; }' but required in type 'AttributeInfo'.
packages/stax-xml/test/writer-async.test.ts(907,9): error TS2322: Type '{ value: string; prefix: string; }' is not assignable to type 'string | AttributeInfo'.
  Property 'localName' is missing in type '{ value: string; prefix: string; }' but required in type 'AttributeInfo'.
packages/stax-xml/test/writer.test.ts(638,9): error TS2322: Type '{ value: string; prefix: string; }' is not assignable to type 'string | AttributeInfo'.
  Property 'localName' is missing in type '{ value: string; prefix: string; }' but required in type 'AttributeInfo'.
specs/002-xpath-mapping-with/contracts/converter-package-api.ts(10,3): error TS6196: 'StaxXmlParser' is declared but never used.
specs/002-xpath-mapping-with/contracts/converter-package-api.ts(12,8): error TS2307: Cannot find module 'stax-xml' or its corresponding type declarations.
specs/002-xpath-mapping-with/contracts/converter-package-api.ts(64,22): error TS2515: Non-abstract class 'XMLElementSchema<TOutput>' does not implement inherited abstract member _parse from class 'XMLSchema<AnyXmlEvent, TOutput>'.
specs/002-xpath-mapping-with/contracts/converter-package-api.ts(80,22): error TS2515: Non-abstract class 'XMLAttributeSchema<TOutput>' does not implement inherited abstract member _parse from class 'XMLSchema<AnyXmlEvent, TOutput>'.
specs/002-xpath-mapping-with/contracts/converter-package-api.ts(84,22): error TS2515: Non-abstract class 'XMLTextSchema<TOutput>' does not implement inherited abstract member _parse from class 'XMLSchema<AnyXmlEvent, TOutput>'.
specs/002-xpath-mapping-with/contracts/converter-package-api.ts(88,22): error TS2515: Non-abstract class 'XMLObjectSchema<TInput, TOutput>' does not implement inherited abstract member _parse from class 'XMLSchema<TInput, TOutput>'.
specs/002-xpath-mapping-with/contracts/converter-package-api.ts(92,22): error TS2515: Non-abstract class 'XMLArraySchema<TInput, TOutput>' does not implement inherited abstract member _parse from class 'XMLSchema<TInput, TOutput>'.
specs/002-xpath-mapping-with/contracts/converter-package-api.ts(113,27): error TS2307: Cannot find module 'stax-xml' or its corresponding type declarations.
specs/002-xpath-mapping-with/contracts/converter-package-api.ts(261,22): error TS2515: Non-abstract class 'ConditionalSchema<T>' does not implement inherited abstract member _parse from class 'XMLSchema<any, T>'.
specs/002-xpath-mapping-with/contracts/converter-package-api.ts(265,22): error TS2515: Non-abstract class 'LazySchema<T>' does not implement inherited abstract member _parse from class 'XMLSchema<any, T>'.
specs/002-xpath-mapping-with/contracts/converter-package-api.ts(269,22): error TS2515: Non-abstract class 'PreprocessSchema<T, U>' does not implement inherited abstract member _parse from class 'XMLSchema<T, U>'. must pass without undoing the parser performance changes
Rejected: Revert the recent parser/cursor optimizations to silence types | would discard validated perf gains and correctness fixes
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Keep the parser benchmark harness and converter typings in sync; helper signature drift now breaks package typecheck quickly
Tested: ,
> stax-xml-monorepo@0.4.0 test /josh/programs/stax-xml-core-parser-refactor
> vitest run

 RUN  v3.2.4 /josh/programs/stax-xml-core-parser-refactor

 ✓ packages/stax-xml/test/empty-elements-updated.test.ts (7 tests) 24ms
 ✓ packages/stax-xml/test/writer-async.test.ts (28 tests) 41ms
 ✓ packages/stax-xml/test/parser.test.ts (13 tests) 39ms
 ✓ packages/stax-xml/test/samples.test.ts (8 tests) 40ms
stdout | packages/stax-xml/test/performance.test.ts > StaxXmlParser Streaming and Performance Tests > should handle large XML documents efficiently
Testing with large XML document (254722 characters)

 ✓ packages/stax-xml/test/attribute-prefix.test.ts (5 tests) 26ms
 ✓ packages/stax-xml/test/advanced.test.ts (12 tests) 24ms
 ✓ packages/stax-xml/test/cursor-async.test.ts (3 tests) 23ms
 ✓ packages/stax-xml/test/parser-trace-oracle.test.ts (3 tests) 35ms
 ✓ packages/stax-xml/test/namespace.test.ts (8 tests) 35ms
 ✓ packages/stax-xml/test/dtd-chunk-boundary.test.ts (4 tests) 51ms
stdout | packages/stax-xml/test/performance.test.ts > StaxXmlParser Streaming and Performance Tests > should handle large XML documents efficiently
Processed 14004 events in 39ms
Found 1000 books

stdout | packages/stax-xml/test/performance.test.ts > StaxXmlWriter Performance and Edge Cases > should handle writing large documents efficiently
Generated XML document with 120444 characters in 12ms

 ✓ packages/stax-xml/test/performance.test.ts (8 tests) 134ms
 ✓ packages/stax-xml/test/converter/parser-internal.test.ts (8 tests) 53ms
 ✓ packages/stax-xml/test/converter/transform.test.ts (24 tests) 58ms
 ✓ packages/stax-xml/test/converter/xpath.test.ts (25 tests) 30ms
 ✓ packages/stax-xml/test/converter/complex-shapes.test.ts (14 tests) 44ms
 ✓ packages/stax-xml/test/converter/parser-advanced.test.ts (6 tests) 61ms
 ✓ packages/stax-xml/test/converter/transform-errors.test.ts (6 tests) 73ms
 ✓ packages/stax-xml/test/converter/array-position.test.ts (4 tests) 73ms
 ✓ packages/stax-xml/test/converter/string-position-parsing.test.ts (4 tests) 71ms
 ✓ packages/stax-xml/test/converter/object-position.test.ts (9 tests) 80ms
 ✓ packages/stax-xml/test/converter/xpath-mapping.test.ts (9 tests) 81ms
 ✓ packages/stax-xml/test/converter/writer.test.ts (20 tests) 73ms
 ✓ packages/stax-xml/test/converter/basic.test.ts (25 tests) 95ms
 ✓ packages/stax-xml/test/converter/error.test.ts (22 tests) 74ms
 ✓ packages/stax-xml/test/converter/number-validation.test.ts (37 tests) 97ms
 ✓ packages/stax-xml/test/converter/integration.test.ts (13 tests) 106ms
 ✓ packages/stax-xml/test/converter/edge-cases.test.ts (38 tests) 79ms
 ✓ packages/stax-xml/test/converter/deep-nesting.test.ts (17 tests) 96ms
stdout | packages/stax-xml/test/converter/performance-benchmark.test.ts > Performance Benchmark Tests > Parsing Speed Benchmarks > should benchmark small document parsing (1KB)
Small document (1KB): 2.89ms per parse

 ✓ packages/stax-xml/test/empty-elements.test.ts (7 tests) 38ms
 ✓ packages/stax-xml/test/writer.test.ts (24 tests) 24ms
 ✓ packages/stax-xml/test/writeoptions.test.ts (8 tests) 10ms
 ✓ packages/stax-xml/test/selfclosing.test.ts (3 tests) 10ms
 ✓ packages/stax-xml/test/converter/writer-internal.test.ts (12 tests) 13ms
 ✓ packages/stax-xml/test/parser-sync.test.ts (30 tests) 26ms
 ✓ packages/stax-xml/test/coverage.test.ts (17 tests) 35ms
 ✓ packages/stax-xml/test/cursor-sync.test.ts (3 tests) 12ms
 ✓ packages/stax-xml/test/converter/large-file.test.ts (13 tests) 370ms
 ✓ packages/stax-xml/test/converter/optional-write.test.ts (26 tests) 18ms
stdout | packages/stax-xml/test/converter/performance-benchmark.test.ts > Performance Benchmark Tests > Parsing Speed Benchmarks > should benchmark medium document parsing (50KB)
Medium document (50KB): 51.85ms per parse

 ✓ packages/stax-xml/test/converter/event-stream.test.ts (15 tests) 710ms
stdout | packages/stax-xml/test/converter/performance-benchmark.test.ts > Performance Benchmark Tests > Parsing Speed Benchmarks > should benchmark large document parsing (500KB)
Large document (500KB): 141.63ms per parse

stdout | packages/stax-xml/test/converter/performance-benchmark.test.ts > Performance Benchmark Tests > Parsing Speed Benchmarks > should show linear scaling characteristics
Size 500: 4.51ms, 110.9 items/ms
Size 1000: 6.59ms, 151.8 items/ms

stdout | packages/stax-xml/test/converter/performance-benchmark.test.ts > Performance Benchmark Tests > Memory Usage Benchmarks > should handle large arrays efficiently
Processing time for 5000 items: 12.95ms

stdout | packages/stax-xml/test/converter/performance-benchmark.test.ts > Performance Benchmark Tests > Memory Usage Benchmarks > should be memory efficient with complex objects
Complex objects parsing: 26.98ms

stdout | packages/stax-xml/test/converter/performance-benchmark.test.ts > Performance Benchmark Tests > Memory Usage Benchmarks > should handle streaming memory efficiently
Streaming 5000 items: 85.00ms

stdout | packages/stax-xml/test/converter/performance-benchmark.test.ts > Performance Benchmark Tests > Complex Query Performance > should efficiently handle basic XPath queries
Basic XPath queries: 3.68ms
Found 6 titles, 20 electronics items

stdout | packages/stax-xml/test/converter/performance-benchmark.test.ts > Performance Benchmark Tests > Complex Query Performance > should optimize repeated XPath evaluations
Repeated XPath queries on 200 users: 5.75ms

stdout | packages/stax-xml/test/converter/performance-benchmark.test.ts > Performance Benchmark Tests > Sync vs Async Performance > should compare sync and async parsing performance
Sync parsing: 11.83ms
Async parsing: 34.96ms
Async overhead: 23.13ms

stdout | packages/stax-xml/test/converter/performance-benchmark.test.ts > Performance Benchmark Tests > Sync vs Async Performance > should show async benefits with streaming
Streaming 2000 items: 15.06ms

stdout | packages/stax-xml/test/converter/performance-benchmark.test.ts > Performance Benchmark Tests > Transformation Performance > should benchmark data transformations
Sales analysis (500 records): 13.38ms
Revenue: $286042.64, Customers: 167

stdout | packages/stax-xml/test/converter/performance-benchmark.test.ts > Performance Benchmark Tests > Transformation Performance > should benchmark nested transformations
Nested transformations: 1.07ms
Company: 15 employees, 3 departments

stdout | packages/stax-xml/test/converter/performance-benchmark.test.ts > Performance Benchmark Tests > Performance Regression Tests > should maintain consistent performance across runs
Performance consistency over 5 runs:
  Average: 4.84ms
  Min: 4.15ms, Max: 5.75ms
  Std Dev: 0.56ms

 ✓ packages/stax-xml/test/converter/performance-benchmark.test.ts (14 tests) 1364ms
   ✓ Performance Benchmark Tests > Parsing Speed Benchmarks > should benchmark medium document parsing (50KB)  520ms
   ✓ Performance Benchmark Tests > Parsing Speed Benchmarks > should benchmark large document parsing (500KB)  428ms

 Test Files  40 passed (40)
      Tests  552 passed (552)
   Start at  13:05:12
   Duration  2.51s (transform 5.21s, setup 0ms, collect 18.64s, tests 4.34s, environment 11ms, prepare 5.89s)
Not-tested: Separate converter-only build pipeline beyond package-wide typecheck
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 70893bebb2

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

entry: ['src/index.ts'],
format: ['cjs', 'esm'],
dts: true,
dts: false,
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Re-enable declaration output in package build

Setting dts: false here (and again for the converter entry) disables .d.ts generation, but the package still advertises ./dist/index.d.ts and ./dist/converter.d.ts in packages/stax-xml/package.json. With the current build script (tsdown only), a publish from this commit can ship JS without declarations, causing TypeScript consumers to hit missing-type entrypoints.

Useful? React with 👍 / 👎.

const targetSize = size || this._calculateOptimalBatchSize();
const startTime = Date.now();
const timeout = this.options.batchTimeout || 10;
const targetSize = size ?? 1;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Honor configured batch size in async parser batches

This hardcodes the default batch size to 1, so StaxXmlParserOptions.batchSize is effectively ignored unless callers pass an explicit size every time. Because batchedIterator() forwards undefined by default, it now emits single-event batches regardless of parser configuration, regressing the batch API behavior/performance path.

Useful? React with 👍 / 👎.

Clickin added 2 commits March 25, 2026 13:28
The PR review surfaced two real regressions: the package build stopped emitting declaration files even though package exports still referenced them, and the async batch API ignored the configured parser-level batch size unless callers passed an explicit override. This commit re-enables declaration generation in tsdown and restores the documented batch-size default behavior while updating the focused coverage test to match the intended batching semantics.

Constraint: Published package exports must continue to resolve their advertised type declaration entrypoints
Constraint:  must influence  and  without extra caller overrides
Rejected: Keep declaration generation disabled and rely on separate build steps | package exports would still point at missing  files
Rejected: Preserve the hardcoded single-event batch default | silently regresses the configured batch API contract
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: When perf-tuning the async parser, preserve the parser-level batch configuration contract and keep package exports aligned with actual build artifacts
Tested:
> stax-xml-monorepo@0.4.0 build /josh/programs/stax-xml-pr-fix
> pnpm -r --filter=stax-xml build

> stax-xml@0.4.0 build /josh/programs/stax-xml-pr-fix/packages/stax-xml
> tsdown

ℹ tsdown v0.21.4 powered by rolldown v1.0.0-rc.9
ℹ config file: /josh/programs/stax-xml-pr-fix/packages/stax-xml/tsdown.config.ts
ℹ Build start
ℹ Cleaning 8 files,
> stax-xml-monorepo@0.4.0 test /josh/programs/stax-xml-pr-fix
> vitest run "test/coverage.test.ts" "test/parser.test.ts"

 RUN  v3.2.4 /josh/programs/stax-xml-pr-fix

 ✓ packages/stax-xml/test/coverage.test.ts (17 tests) 17ms
 ✓ packages/stax-xml/test/parser.test.ts (13 tests) 25ms

 Test Files  2 passed (2)
      Tests  30 passed (30)
   Start at  13:28:17
   Duration  583ms (transform 214ms, setup 0ms, collect 366ms, tests 42ms, environment 1ms, prepare 314ms),
Not-tested: Full monorepo vitest rerun in this temporary review-fix worktree
The sync parser now avoids namespace pre-scans and extra done-state bookkeeping, while the sync cursor stops paying duplicated namespace-scan and tiny setter costs on its hot path. The changes keep the public parser contract intact and add regression coverage for namespace scoping and terminal error behavior.

Constraint: Public sync parser error semantics and cursor async behavior had to remain compatible
Rejected: Rewriting sync cursor around a new collector contract | too risky while async still shares the collector/util path
Confidence: medium
Scope-risk: moderate
Reversibility: clean
Directive: Keep sync hot paths single-pass and local; do not reintroduce helper fan-out or namespace pre-scans without rerunning package benchmarks
Tested: pnpm test; bunx tsc --noEmit -p packages/stax-xml/tsconfig.json; package benchmark parser-2kb/parser-4kb/parser-13mb/parser-98mb spot checks; scripts/parser-benchmark-case.mjs sync cursor cases
Not-tested: before/after CPU profile artifact regeneration
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant