|
| 1 | +# 7.x Release verifies — working report(2026-07-06) |
| 2 | + |
| 3 | +Panel per tag: 2 Claude reviewers (sonnet; correctness + spec-conformance) + 1 Codex (gpt-5.5 xhigh). |
| 4 | +**Degradation record**: all 6 Codex runs hit OpenAI usage limit (resets 20:48); 9 of 12 Claude |
| 5 | +reviewers hit the account session limit (resets 21:00 Asia/Taipei). Completed before the wall: |
| 6 | +v30-spec, v32-spec (full reports), v30-correctness (report requested). Remaining 9 + codex |
| 7 | +re-run after reset. |
| 8 | + |
| 9 | +## Status |
| 10 | + |
| 11 | +| Round | Tag | correctness | spec-conformance | codex | |
| 12 | +|-------|-----|-------------|------------------|-------| |
| 13 | +| 7.1 | v0.30.0 | ✅ CONCERNS(3 real defects — **fixed in v1.0.1**)| ✅ CONCERNS | ⏳ limit, re-run | |
| 14 | +| 7.2 | v0.31.5 | ⏳ limit | ⏳ limit | ⏳ limit | |
| 15 | +| 7.3 | v0.32.0 | ⏳ limit | ✅ CONCERNS | ⏳ limit | |
| 16 | +| 7.4 | v0.33.1 | ⏳ limit | ⏳ limit | ⏳ limit | |
| 17 | +| 7.5 | v0.34.1 | ⏳ limit | ⏳ limit | ⏳ limit | |
| 18 | +| 7.6 | v1.0.0 | ⏳ limit | ⏳ limit | ⏳ limit | |
| 19 | + |
| 20 | +## Findings so far |
| 21 | + |
| 22 | +### v0.30.0 correctness — CONCERNS → 3 real defects, FIXED in v1.0.1(same day) |
| 23 | + |
| 24 | +1. **[P1] Unbounded parse recursion** — 60k-level nesting empirically SIGSEGVed (uncatchable); |
| 25 | + primary parse path, DoS surface for consumers opening third-party docx. |
| 26 | + → Fixed: depth guard (limit 1024) throwing catchable `nestingTooDeep`. |
| 27 | +2. **[P2] UTF-8 BOM unfhandled** — BOM-prefixed parts (LibreOffice et al.) failed the whole parse. |
| 28 | + → Fixed: BOM skip in skipProlog. |
| 29 | +3. **[P2] Attribute control chars unescaped** — literal \n/\r/\t pass through; conformant |
| 30 | + readers (libxml2 — which the v1.0 read projection feeds) normalize to spaces, corrupting |
| 31 | + values on dirty re-serialize. → Fixed: character-reference escaping ( / /	). |
| 32 | +4. [P3] Test file hardcoded a personal path to a third party's thesis (privacy + CI). |
| 33 | + → Fixed: env-gated (OOXML_LOCAL_THESIS_FIXTURE) + XCTSkip. |
| 34 | +5. [Info] CDATA collapses to text-kind on dirty re-emit (contract not violated; noted). |
| 35 | +6. [Info] deepClone marks all nodes dirty → clone→serialize canonicalizes empty-tag forms |
| 36 | + (design consequence, noted for reducer awareness). |
| 37 | + |
| 38 | +Verified sound by the same panel: entity round-trip, attribute order, namespace scoping, |
| 39 | +comment/PI, mixed content, empty-tag forms on clean nodes, subtree-dirty propagation, |
| 40 | +fingerprint canonicalization, DTD byte-skip (no XXE). |
| 41 | + |
| 42 | +All fixes shipped as **ooxml-swift v1.0.1** (4 new pinning tests; 1178 green). |
| 43 | + |
| 44 | +### (doc/test-coverage class findings) |
| 45 | + |
| 46 | +### v0.30.0 spec-conformance — CONCERNS |
| 47 | + |
| 48 | +1. **[P1] Golden-corpus acceptance criteria never met as written** — ooxml-tree-io spec names |
| 49 | + committed fixtures (multi-section-thesis 3×sectPr, vml-rich with mc:AlternateContent, …) and |
| 50 | + byte-equal assertions on header*/footer*/[Content_Types].xml. Reality: programmatic builders |
| 51 | + (CorpusFixtureBuilder), 2×sectPr, zero AlternateContent, header/footer/Content_Types never |
| 52 | + byte-equal-asserted. Persisted unchanged v0.30.0→v1.0.0. (Consistent with the task-1.8 |
| 53 | + overmark disclosed during the apply phase.) |
| 54 | +2. **[P1] Task 2.4 overmarked** — "SectionProperties tree-backed view verified against |
| 55 | + multi-section-thesis" — no test connects SectionPropertiesTreeProjectionTests (synthetic |
| 56 | + nodes only) to that fixture; the matching-named test file at v0.31.0 was an XCTSkip stub |
| 57 | + from an unrelated change. |
| 58 | +3. [P2] Tree reader/writer never exercised against header*/footer* parts in any fixture test |
| 59 | + (customXml covered since v0.31.5). |
| 60 | +4. [P2] Fingerprint attribute identity keyed by (localName, prefix), not resolved URI — |
| 61 | + contradicts spec's literal "prefix variations on same URI" scope for attributes |
| 62 | + (self-documented in code comment). |
| 63 | +5. [P3] API naming drift (spec prose: read/write/id; shipped: parse/serialize/stableID). |
| 64 | +6. [P3] "Pure-Swift" requirement has no automated pin (manual dependency check only). |
| 65 | + |
| 66 | +Clean/well-pinned: lossless tree (mixed content/comments/PIs/entities), untouched-subtree |
| 67 | +identity, stableID, text-as-child; byte-faithful design wording already correctly hedged. |
| 68 | + |
| 69 | +### v0.32.0 spec-conformance — CONCERNS |
| 70 | + |
| 71 | +1. **[P1] Taxonomy count drift in archived spec** — `openspec/specs/ooxml-operation-log/spec.md` |
| 72 | + still says "21 cases"; reality: 24 at v0.32.0 (Phase 2c +3), 32 at v1.0.0 (§4b +8). Spec |
| 73 | + never updated as additive extensions landed. |
| 74 | +2. **[P2] Change delta spec's JSONL prose stale** — describes `timestamp`/nested `payload`/ |
| 75 | + snake_case op_types; shipped wire (and archived spec) is flat `ts`/`op_id`/`source`/`op_type` |
| 76 | + with camelCase. Never reconciled. |
| 77 | +3. [P3] Delta/tasks ElementID chain prose omits `w:bookmarkId` step (code + archived spec have it). |
| 78 | +4. [P3] Reducer spec Purpose wording implies later shipping; actually shipped in v0.32.0. |
| 79 | + |
| 80 | +Clean: sidecar stem naming exact per spec; tasks.md section 3 spot-check — no overmarking; |
| 81 | +reducer + JSONL codec match archived normative spec. |
| 82 | + |
| 83 | +## Disposition queue(fix after panel completes) |
| 84 | + |
| 85 | +- Fix archived op-log spec case-count (scope as baseline + pointer to additive extensions). |
| 86 | +- Reconcile change delta JSONL/ElementID prose with shipped wire. |
| 87 | +- Golden-corpus spec: reword to programmatic-builder reality OR expand corpus |
| 88 | + (AlternateContent + header/footer round-trip + Content_Types assertion — small test adds). |
| 89 | +- tasks.md 2.4 annotation (overmark correction). |
0 commit comments