Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,16 @@ completeness, recovery, truncation, unsupported states, mapping, and classified
differences. Unexplained semantic, transport, or mapping differences fail the
command.

Issue #52 resolves the seven named rollout observations without broadening the
producer category. Conformance schema v5 keeps every selected fact in a second,
CI-enforced accounting denominator, which must remain exactly 100%. The
supported-record compatibility metric therefore cannot hide unsupported,
budget, or mapping selections. Each of the four unsupported selections and
three recovery-file mapping gaps is a stable regression fixture with a
machine-readable owner and concrete action required for reclassification. A
changed code, state, diagnostic, or mapping outcome is unexplained and blocks
the gate.

Runtime and output sizes are retained as two ordered measurement samples.
Artifact sizes and the controller's peak or current resident memory are
recorded with their measurement method and scope. These measurements are
Expand All @@ -49,11 +59,23 @@ Rust remains shadow-only. Go remains both the serving semantic authority and
the production fallback. There is no authority switch, TS7 producer protocol
change, external consumer behavior change, or Palamedes change.

## Remaining blockers
## Resolved rollout observations

- The local enum literal remains owned by `rust-primitive-literal-producer`
until local enum declaration and member-value resolution is implemented.
- The value and type import selections remain owned by
`rust-project-resolution` until project-aware cross-file resolution exists.
- The object selection remains owned by `object-category-rollout`; object
semantics are intentionally not folded into the primitive/literal producer.
- The three recovery selections remain owned by `oxc-occurrence-mapping` until
OXC parses or recovers the file and supplies each exact `NodeId` mapping.

These are resolved, explicit limitations rather than authority-readiness
blockers or hidden exclusions. Their fixture contracts remain CI-blocking when
the observed behavior changes.

## Remaining authority blockers

- Four explicitly classified selections remain outside the supported Rust
slice.
- Three recovery selections retain the expected OXC parser/mapping gap.
- Rust is not integrated into the serving path, so production fallback,
rollback, and shadow observation at that boundary have not been exercised.
- Runtime and output-size samples do not yet use one production-equivalent
Expand Down Expand Up @@ -82,3 +104,4 @@ that proposal.
- [ADR-0019](0019-compute-primitive-literals-independently-in-rust.md)
- [Checked rollout evidence](../evidence/primitive-literal-rollout-2026-08-17.json)
- [Issue #47](https://github.com/swernerx/typescript-semantic-kernel/issues/47)
- [Issue #52](https://github.com/swernerx/typescript-semantic-kernel/issues/52)
6 changes: 6 additions & 0 deletions docs/evidence/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,5 +49,11 @@ separate measurement section because those values or their comparison boundary
vary by host. The report is a shadow rollout artifact, not an authority switch
or a general benchmark.

Conformance schema v5 reports both the exact supported-record compatibility
and a CI-enforced 100% accounting denominator over every selected fact. The
four unsupported primitive/literal observations and three recovery-file
mapping gaps remain present as stable regression limitations with explicit
owners and reclassification actions.

[ADR-0020](../adr/0020-keep-primitive-literals-shadow-only-after-dual-run.md)
records why the category is not ready for a later authority decision.
195 changes: 176 additions & 19 deletions docs/evidence/primitive-literal-rollout-2026-08-17.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
{
"schemaVersion": 1,
"schemaVersion": 2,
"evidenceKind": "primitive-literal-controlled-go-rust-dual-run",
"command": "./internal/oxc_reference/run-rollout.sh --output <path>",
"environment": {
"operatingSystem": "macos",
"architecture": "aarch64",
"rustc": "rustc 1.97.1 (8bab26f4f 2026-07-14)",
"rustc": "rustc 1.95.0 (59807616e 2026-04-14)",
"go": "go version go1.26.6 darwin/arm64",
"buildProfile": "release"
},
Expand All @@ -20,15 +20,15 @@
"determinism": {
"completeRuns": 2,
"conformanceReportsByteEqual": true,
"compactConformanceReportBytes": 52766
"compactConformanceReportBytes": 54311
},
"conformance": {
"schemaVersion": 4,
"schemaVersion": 5,
"gateKind": "go-vs-independent-rust-semantic-conformance",
"candidate": "independent-primitive-literal-v2",
"shadowOnly": true,
"execution": {
"repositoryRevision": "24c138ae4c7a2b9a42c1e68eb25329fbf8a3a5a9",
"repositoryRevision": "20d726c587bc612b5be8311530a553f70b0ed79b",
"typescriptVersion": "7.1.0-dev",
"typescriptRevision": "1bcfa18d79a3be41772223d5c05dfe4480e614ff",
"requestSchemaVersion": 1,
Expand All @@ -41,6 +41,7 @@
"threshold": {
"minimumSupportedRecords": 15,
"requiredSupportedCompatibilityPpm": 1000000,
"requiredSelectionAccountingPpm": 1000000,
"maxUnexplainedSemanticDifferences": 0,
"maxUnexplainedTransportDifferences": 0,
"maxUnexplainedMappingDifferences": 0,
Expand Down Expand Up @@ -977,6 +978,11 @@
"proves": "enum-like literal values remain explicitly outside the narrow Rust category",
"expectedClassification": "unsupported",
"expectedCode": "enum-literal-outside-category",
"limitationResolution": {
"stability": "stable",
"owner": "rust-primitive-literal-producer",
"action": "Implement local enum declaration and member-value resolution before reclassifying this selection as supported."
},
"expectationMatched": true,
"goOracle": {
"occurrence": {
Expand Down Expand Up @@ -1074,6 +1080,11 @@
"proves": "imported value literals are observed without pretending cross-file Rust resolution",
"expectedClassification": "unsupported",
"expectedCode": "cross-file-import-outside-category",
"limitationResolution": {
"stability": "stable",
"owner": "rust-project-resolution",
"action": "Implement project-aware value import resolution before reclassifying this selection as supported."
},
"expectationMatched": true,
"goOracle": {
"occurrence": {
Expand Down Expand Up @@ -1171,6 +1182,11 @@
"proves": "imported literal aliases are observed without pretending cross-file Rust resolution",
"expectedClassification": "unsupported",
"expectedCode": "cross-file-import-outside-category",
"limitationResolution": {
"stability": "stable",
"owner": "rust-project-resolution",
"action": "Implement project-aware type-alias import resolution before reclassifying this selection as supported."
},
"expectationMatched": true,
"goOracle": {
"occurrence": {
Expand Down Expand Up @@ -3115,6 +3131,11 @@
"proves": "out-of-category type remains explicit",
"expectedClassification": "unsupported",
"expectedCode": "object-outside-category",
"limitationResolution": {
"stability": "stable",
"owner": "object-category-rollout",
"action": "Keep object types outside this primitive/literal producer and cover them in a separately gated object-category rollout."
},
"expectationMatched": true,
"goOracle": {
"occurrence": {
Expand Down Expand Up @@ -3359,6 +3380,11 @@
"proves": "type-error recovery remains an explicit fact state",
"expectedClassification": "mapping",
"expectedCode": "oxc-parse-error",
"limitationResolution": {
"stability": "stable",
"owner": "oxc-occurrence-mapping",
"action": "Reclassify only when OXC parses the recovery file and produces an exact NodeId mapping for this type-error selection."
},
"expectationMatched": true,
"goOracle": {
"occurrence": {
Expand Down Expand Up @@ -3452,6 +3478,11 @@
"proves": "syntax-error recovery remains queryable",
"expectedClassification": "mapping",
"expectedCode": "oxc-parse-error",
"limitationResolution": {
"stability": "stable",
"owner": "oxc-occurrence-mapping",
"action": "Reclassify only when OXC recovers the malformed initializer and produces an exact NodeId mapping for this syntax-error selection."
},
"expectationMatched": true,
"goOracle": {
"occurrence": {
Expand Down Expand Up @@ -3545,6 +3576,11 @@
"proves": "recursive advanced graph hits the configured depth budget",
"expectedClassification": "mapping",
"expectedCode": "oxc-parse-error",
"limitationResolution": {
"stability": "stable",
"owner": "oxc-occurrence-mapping",
"action": "Reclassify only when OXC parses the recovery file and produces an exact NodeId mapping for this recursive-budget selection."
},
"expectationMatched": true,
"goOracle": {
"occurrence": {
Expand Down Expand Up @@ -3907,6 +3943,8 @@
"summary": {
"cases": 4,
"facts": 28,
"accountedSelections": 28,
"selectionAccountingPpm": 1000000,
"candidateRecords": 42,
"supportedRecords": 29,
"matchedSupportedRecords": 29,
Expand Down Expand Up @@ -3942,38 +3980,157 @@
{
"ordinal": 1,
"cases": 4,
"goOracleNanoseconds": 486867126,
"rustProducerNanoseconds": 1284832,
"rustDeterminismCheckNanoseconds": 197668,
"totalNanoseconds": 490094084,
"goSnapshotBytes": 36799,
"goOracleNanoseconds": 700402249,
"rustProducerNanoseconds": 1367000,
"rustDeterminismCheckNanoseconds": 236041,
"totalNanoseconds": 704086084,
"goSnapshotBytes": 36671,
"rustCandidateBytes": 22615
},
{
"ordinal": 2,
"cases": 4,
"goOracleNanoseconds": 124067458,
"rustProducerNanoseconds": 598000,
"rustDeterminismCheckNanoseconds": 191250,
"totalNanoseconds": 125660750,
"goSnapshotBytes": 36799,
"goOracleNanoseconds": 127294084,
"rustProducerNanoseconds": 789167,
"rustDeterminismCheckNanoseconds": 237917,
"totalNanoseconds": 129383625,
"goSnapshotBytes": 36671,
"rustCandidateBytes": 22615
}
],
"artifacts": {
"goExecutableBytes": 25670354,
"rustExecutableBytes": 3521008,
"peakOrCurrentControllerResidentBytes": 5226496,
"rustExecutableBytes": 3345040,
"peakOrCurrentControllerResidentBytes": 4964352,
"residentMeasurement": "macos-getrusage-peak",
"memoryScope": "Rust rollout controller including decoded Go snapshots; excludes child Go process RSS"
}
},
"readiness": {
"readyForLaterAuthorityDecision": false,
"status": "not-ready",
"resolvedRolloutLimitations": [
{
"case": "primitive-literal-conformance",
"factIndex": 6,
"occurrence": {
"file": "src/matrix.ts",
"span": {
"start": 657,
"end": 670
},
"syntaxKind": "KindIdentifier"
},
"classification": "unsupported",
"code": "enum-literal-outside-category",
"stability": "stable",
"owner": "rust-primitive-literal-producer",
"action": "Implement local enum declaration and member-value resolution before reclassifying this selection as supported."
},
{
"case": "primitive-literal-conformance",
"factIndex": 7,
"occurrence": {
"file": "src/matrix.ts",
"span": {
"start": 672,
"end": 687
},
"syntaxKind": "KindIdentifier"
},
"classification": "unsupported",
"code": "cross-file-import-outside-category",
"stability": "stable",
"owner": "rust-project-resolution",
"action": "Implement project-aware value import resolution before reclassifying this selection as supported."
},
{
"case": "primitive-literal-conformance",
"factIndex": 8,
"occurrence": {
"file": "src/matrix.ts",
"span": {
"start": 689,
"end": 701
},
"syntaxKind": "KindIdentifier"
},
"classification": "unsupported",
"code": "cross-file-import-outside-category",
"stability": "stable",
"owner": "rust-project-resolution",
"action": "Implement project-aware type-alias import resolution before reclassifying this selection as supported."
},
{
"case": "primitive-literal-independent",
"factIndex": 10,
"occurrence": {
"file": "src/primitives.ts",
"span": {
"start": 624,
"end": 635
},
"syntaxKind": "KindIdentifier"
},
"classification": "unsupported",
"code": "object-outside-category",
"stability": "stable",
"owner": "object-category-rollout",
"action": "Keep object types outside this primitive/literal producer and cover them in a separately gated object-category rollout."
},
{
"case": "recovery-budgets",
"factIndex": 0,
"occurrence": {
"file": "src/recovery.ts",
"span": {
"start": 247,
"end": 256
},
"syntaxKind": "KindIdentifier"
},
"classification": "mapping",
"code": "oxc-parse-error",
"stability": "stable",
"owner": "oxc-occurrence-mapping",
"action": "Reclassify only when OXC parses the recovery file and produces an exact NodeId mapping for this type-error selection."
},
{
"case": "recovery-budgets",
"factIndex": 1,
"occurrence": {
"file": "src/recovery.ts",
"span": {
"start": 258,
"end": 264
},
"syntaxKind": "KindIdentifier"
},
"classification": "mapping",
"code": "oxc-parse-error",
"stability": "stable",
"owner": "oxc-occurrence-mapping",
"action": "Reclassify only when OXC recovers the malformed initializer and produces an exact NodeId mapping for this syntax-error selection."
},
{
"case": "recovery-budgets",
"factIndex": 2,
"occurrence": {
"file": "src/recovery.ts",
"span": {
"start": 266,
"end": 270
},
"syntaxKind": "KindIdentifier"
},
"classification": "mapping",
"code": "oxc-parse-error",
"stability": "stable",
"owner": "oxc-occurrence-mapping",
"action": "Reclassify only when OXC parses the recovery file and produces an exact NodeId mapping for this recursive-budget selection."
}
],
"blockers": [
"4 explicitly classified primitive/literal selections remain unsupported",
"3 recovery selections retain expected OXC mapping gaps",
"the Rust producer is not integrated into the serving path, so production fallback and rollback have not been exercised",
"runtime and output measurements compare a one-shot Go process with an in-process Rust shadow path; a production-equivalent boundary is not selected",
"controller RSS excludes the child Go process, so per-producer peak-memory parity is not established"
Expand Down
12 changes: 11 additions & 1 deletion docs/porting/migration-contract.md
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,15 @@ memory, artifact size, and producer-output size remain separately scoped
characterization evidence. The lane is shadow-only and does not exercise or
authorize production routing.

Issue #52 adds conformance schema v5's all-selection accounting gate. Every
selected fact must be classified, the classification count must remain equal
to the fact count, and the accounting ratio must remain 1,000,000 ppm. The
four unsupported primitive/literal selections and three recovery-file mapping
gaps are retained as stable regression limitations with machine-readable
owners and concrete reclassification actions. They are neither dropped from
the corpus nor counted as supported. Go remains semantic authority and the
production fallback.

## Gate ladder

1. Focused `internal/semanticfacts` and `internal/tsfacts` tests pass, including
Expand All @@ -124,7 +133,8 @@ authorize production routing.
9. `./internal/oxc_reference/run-conformance.sh --output <path>` emits the
byte-stable ADR-0019 report and fails on any unexplained semantic, transport,
or mapping mismatch while retaining named unsupported, budget, and expected
mapping cases outside the supported denominator.
mapping cases. Its supported-record metric is paired with a mandatory 100%
all-selection accounting denominator, so no classified case is hidden.
10. `./internal/oxc_reference/run-rollout.sh --output <path>` executes two
release-profile dual-runs, requires byte-identical embedded conformance,
records the controlled measurements in ADR-0020, and retains Go as serving
Expand Down
Loading