|
1 | 1 | # Eon Core / Minimal Dependency Production Plan |
2 | 2 |
|
3 | | -Last updated: 2026-03-30 |
| 3 | +Last updated: 2026-03-31 |
4 | 4 | Branch: `add-lsp-and-zed-extension` |
5 | 5 | Baseline commit: `ea2f5c1` |
6 | 6 |
|
@@ -91,17 +91,48 @@ Deliverables: |
91 | 91 |
|
92 | 92 | Tasks: |
93 | 93 |
|
94 | | -- [ ] Write a short spec for `eon_core` parse semantics |
95 | | -- [ ] Write a short spec for `eon_core` write semantics |
96 | | -- [ ] Define exact roundtrip guarantees |
97 | | -- [ ] Define which legacy behaviors are compatibility-only and not core guarantees |
98 | | -- [ ] Document unsupported or intentionally ambiguous cases |
| 94 | +- [x] Write a short spec for `eon_core` parse semantics |
| 95 | +- [x] Write a short spec for `eon_core` write semantics |
| 96 | +- [-] Define exact roundtrip guarantees |
| 97 | +- [-] Define which legacy behaviors are compatibility-only and not core guarantees |
| 98 | +- [-] Document unsupported or intentionally ambiguous cases |
99 | 99 |
|
100 | 100 | Exit criteria: |
101 | 101 |
|
102 | 102 | - every fuzz/property invariant matches a documented contract |
103 | 103 | - unsupported cases are identified instead of silently drifting |
104 | 104 |
|
| 105 | +Current semantics draft: |
| 106 | + |
| 107 | +- Parse semantics: |
| 108 | + - Root shape is determined from local syntax only. |
| 109 | + - A top-level `value:` pair starts an implicit root map. |
| 110 | + - Multiple top-level values without root braces become an implicit root list. |
| 111 | + - Otherwise the document is a single root value. |
| 112 | + - On the core-backed owned `Value` path, identifiers in value position parse as unit variants, while quoted tokens parse as strings. |
| 113 | + - On owned `Value` parse paths, identifiers in map-key position canonicalize to string keys rather than identifier/variant values. |
| 114 | + - Variant payload `(` must be inline with the variant head; comments or newlines between the head and `(` are rejected on the formatter-core path. |
| 115 | +- Write semantics: |
| 116 | + - Formatter-core canonicalizes non-empty root maps without outer braces by default. |
| 117 | + - Empty root maps remain explicit because brace-less output cannot represent them. |
| 118 | + - Composite first keys do not force outer braces; callers can opt in with `always_include_outer_braces`. |
| 119 | + - Whitespace and newlines between a map key and `:` are canonicalized away. |
| 120 | + - Comments between a map key and `:` are rejected. |
| 121 | + - Comments between `:` and the value normalize to entry-prefix comments. |
| 122 | + - Simple lists and variants stay on one line when they are short and comment-free; multiline containers omit commas in canonical output. |
| 123 | + - On the compact owned `Value` core writer, unit variants may be bare only in root/value position; map-key variants stay explicit with `()`. |
| 124 | + - On the legacy owned `Value` formatter, unit variants collapse to quoted strings. |
| 125 | +- Exact roundtrip guarantees currently documented: |
| 126 | + - Formatter-core canonical output is idempotent on the tested subset of root maps/lists/values, variants, strings, comments, and composite-root-key shapes. |
| 127 | + - Exact owned `Value` roundtrip through the compact core path is expected on the tested subset except for the explicit exclusions below. |
| 128 | + - Exact owned `Value` roundtrip through the legacy formatter/parser path is expected on the tested subset except for the explicit exclusions below. |
| 129 | +- Current explicit non-guarantees and tolerated boundaries: |
| 130 | + - Exact owned legacy `Value::format` roundtrip is not guaranteed for unit variants with empty payloads; they serialize as quoted strings. |
| 131 | + - Exact owned legacy/core `Value` roundtrip is not guaranteed for `null`/`true`/`false` in map-key position; both parse paths canonicalize those keys to strings. |
| 132 | + - Byte-for-byte preservation of commas, braces, indentation, or trivia is not guaranteed. |
| 133 | + - Legacy parity is guaranteed only on the documented and tested overlapping formatter subset. |
| 134 | + - Remaining unsupported or merely tolerated ambiguous forms should be promoted into this list as fuzz/property exclusions are reviewed. |
| 135 | + |
105 | 136 | ## WS2 - Zero-Copy Parsing |
106 | 137 |
|
107 | 138 | Status: `[-]` |
@@ -195,7 +226,7 @@ Current formatter compatibility contract: |
195 | 226 | - Matching legacy error messages. |
196 | 227 | - Full legacy parity outside the documented and tested overlapping syntax subset. |
197 | 228 | - Exact owned `Value::format` roundtrip for unit variants with empty payloads; the legacy formatter renders them as quoted strings. |
198 | | - - Exact owned `Value::to_string_with_core` roundtrip for `null`/`true`/`false` in map-key position; the core parser canonicalizes those key-position keywords to strings. |
| 229 | + - Exact owned `Value::format` and `Value::to_string_with_core` roundtrip for `null`/`true`/`false` in map-key position; both parse paths canonicalize those key-position keywords to strings. |
199 | 230 |
|
200 | 231 | Exit criteria: |
201 | 232 |
|
@@ -298,7 +329,7 @@ Tasks: |
298 | 329 | - [ ] Keep byte-level parser fuzzing in place |
299 | 330 | - [ ] Keep hidden-Unicode rejection fuzzing in place |
300 | 331 | - [ ] Keep typed-path fuzzing in place |
301 | | -- [ ] Stabilize value-roundtrip fuzzing around documented guarantees |
| 332 | +- [-] Stabilize value-roundtrip fuzzing around documented guarantees |
302 | 333 | - [ ] Add every real fuzz-found bug as a normal regression test |
303 | 334 | - [ ] Add longer-running fuzz jobs outside the fast CI lane |
304 | 335 |
|
@@ -419,4 +450,5 @@ Entries: |
419 | 450 | - `2026-03-31 | codex1 | WS1/WS3/WS4 | Documented the key/colon boundary: whitespace and newlines before ':' are canonicalized, comments there are rejected, and comments after ':' normalize to entry-prefix comments | this narrows the remaining ambiguity work to other still-undocumented map-key forms rather than generic separator trivia` |
420 | 451 | - `2026-03-31 | codex1 | WS3 | Added formatter-core roundtrip coverage for literal keys plus multiline basic/literal string tokens in both key and value position | string-family coverage is broader, but full writer determinism across all nested shapes is still not declared complete` |
421 | 452 | - `2026-03-31 | codex1 | WS1/WS8 | Documented and regression-tested the owned-Value exact-roundtrip exclusions already assumed by fuzzing: legacy unit variants collapse to strings, and core keyword map keys canonicalize to string keys | next contract work is to decide whether any additional fuzz exclusions should be promoted to documented non-guarantees` |
| 453 | +- `2026-03-31 | codex1 | WS1/WS8 | Added a short semantics draft to the tracker and tightened the documented exact-roundtrip exclusions: legacy and core keyword map keys canonicalize to strings, legacy unit variants collapse to strings, and fuzz-contract comments now point at tested behavior | next semantics work is to finish the remaining unsupported/tolerated ambiguity list rather than leave it implied` |
422 | 454 | - `2026-03-31 | codex2 | WS7/WS9 | Added scripts/run_benchmark_baseline.sh and benchmark-data/README.md with a reproducible local baseline for bench_parse and bench_core_vs_serde at 477118a | next performance slice is release-size tracking or stronger benchmark automation` |
0 commit comments