ekp/.phrase/phases/phase-kp-overhaul-20260726/change_post_audit_hardening_20260820.md

8.6 KiB
Raw Blame History

Change: Post-Audit Hardening 2026-08-20

2026-09-01 — Restore Emacs 31.1 strict byte compilation

  • Modify ekp.el, ekp-utils.el, and ekp-hyphen.el by replacing six obsolete single-binding if-let/when-let forms with the behavior-identical starred variants.
  • Modify tests/ekp-live-commit-evaluator.el in the same mechanical way so maintained performance tooling is strict-compile clean too.
  • Add issue029 and close task044 with exact environment and evidence.
  • Behavior/Risk: no data flow, branch, public API, layout, hyphenation, font, module-path, or evaluator behavior changes.
  • Evidence: root make; Emacs 31.1 WERROR production and changed-tool compilation; normal and seed-20260901 random ERT 296/296; C build; 300-case parity fuzz; release invariants; local 49-entry dictionary manifest/hash; checkdoc; and diff-check. The user explicitly excluded the network-backed fixed-upstream dictionary fetch, so it is not claimed.

2026-08-31 — Restore the Emacs 31 fresh-source baseline

  • Modify ekp.el and ekp-buffer.el so layout and projection marker properties update the toplevel default of Emacs 31's automatically buffer-local text-property-default-nonsticky; new and existing buffers that have no explicit override now inherit the nonsticky protocol.
  • Modify tests/ekp-tests.el and tests/ekp-buffer-tests.el so policy ownership fixtures remain mutable multibyte strings while mutating ASCII code points that Emacs 31 permits in place. The tests still prove that cache keys own the original policy values.
  • Behavior/Risk: no layout algorithm or public policy changes. This fixes marker noninheritance in real buffers and removes an Emacs 31-only fixture mutation error.
  • Evidence: focused ERT 3/3; source-first normal and seed-20260831 random ERT 296/296; source load, release invariants, 49-entry dictionary manifest, and pinned dictionary update checks pass.

2026-08-20 — Lock follow-up goals and task boundaries

  • Add plan_post_audit_hardening_20260820.md with the evidence-backed scope, non-goals, acceptance gates, and stop condition for the post-audit defects.
  • Add task_post_audit_hardening_20260820.md with task037task042 and the remaining task030 performance gate.
  • Add issue records for each user-visible or public-contract defect before implementation, including issue028 for the stale-bytecode evaluator false-green.
  • Behavior/Risk: documentation-only planning. Closed historical issues remain closed; issue018 remains open until its locked gate is met.

Verification

  • Next task ID is task037; no task ID is reused.
  • The plan explicitly separates buffer ownership, live semantics, dictionary lookup, C validation, test gates, integration lifecycle, and performance.
  • No production or test source is changed in this planning pass.

2026-08-20 — Implement correctness and gate hardening

  • Modify ekp-buffer.el and tests/ekp-buffer-tests.el for preflight width validation, backward-delete live stability, and no-projection integration cleanup (task037, task038, task042; issue022, issue023, issue027).
  • Modify ekp-hyphen.el and tests/ekp-tests.el for exact normalized locale lookup (task039, issue024).
  • Modify ekp_c/ekp.c and tests/ekp-c-tests.el for sorted, unique, in-range break-position validation in direct and batch APIs (task040, issue025), with the 15-field ABI unchanged.
  • Modify the showcase, source loader, test runners, Windows CI entry, and complete ERT selection to remove stale-bytecode false greens and restore automatic inline-code verification (task041, issue026).
  • Modify the live evaluator script/bootstrap to load source from the selected baseline/candidate root (task030, issue028). The corrected narrowed matrix still exceeds the source 16 ms target, so issue018 and task030 remain open.
  • Commit: 6a8c7e0.

2026-08-20 — Record source-fresh performance boundary

  • Add postmortem/20260820-source-fresh-live-commit-gate.md to explain why the stale-bytecode evaluator result was invalid and why the corrected source gate remains an open task030 performance target.
  • Evidence: width-80/two-row/GC-excluded source candidate p95/p99 are 23.294 ms (C) and 78.593 ms (Elisp), with parity, zero-work, GC, conflict, and non-regression checks true. The high-row full matrix was stopped after a source DP cell exceeded two minutes of CPU; it is not claimed as complete evidence.
  • Commit: 60b299b and postmortem follow-up commit.

2026-08-20 — Attribute incremental append cost and preserve raw evidence

  • Modify tests/ekp-live-commit-evaluator.el to time ekp-layout-plan-append and ekp--dp-cache-append separately in each raw sample and report them beside total/publication timings.
  • Modify tests/run-live-commit-evaluator.sh to write each run into a unique raw directory and atomically replace the report after comparison.
  • Evidence: source-fresh width-80/two-row/GC-excluded candidate p95 is 17.161 ms C append / 1.187 ms C append-DP, and 73.293 ms Elisp append / 57.063 ms Elisp append-DP; raw JSONL is nonempty and parity/zero-work/GC/ conflict/non-regression remain true. No production optimization is claimed yet because the measured DP/append owners require an exact redesign.
  • Commit: db6e6b9.

2026-08-20 — Split append preparation, assembly, and DP timings

  • Modify the evaluator to time ekp--append-para and ekp--layout-plan-from-para independently, fixing a wrapper-name collision found by the first red run.
  • Evidence: latest source-fresh candidate p95 is C append/append-DP 16.953/1.015 ms and Elisp append/append-DP 71.896/55.970 ms; both engines spend about 9.753 ms in append preparation and 5.663 ms in plan assembly. The report remains red, raw JSONL is nonempty, and the wrapper itself now passes the same matrix without argument errors.
  • Commit: 01001b9.

2026-08-20 — Implement user-selected native live-append backend

  • Modify ekp-buffer.el and ekp.el to let prepared automatic live append use the loaded C 1D DP when ekp-auto-justify-native-append is non-nil, without changing ordinary full-layout dispatch or the 15-field C ABI. Native-unavailable and option-disabled paths remain Elisp.
  • Add adr_native_live_append_backend_20260820.md, bilingual README guidance, evaluator backend metadata, and a public buffer regression proving the setting toggles the bridge.
  • Verification: native bridge/parity regression 1/1 and source-first ERT 296/296 pass. In the bounded all-width, 2/4/8/16-row, GC-excluded source-fresh round, the candidate width-80 C p95/p99 was 14.190/16.495 ms and the Elisp-configured live path (native append backend) was 13.484/14.334 ms. Layout parity, zero-work, GC, conflict, and width non-regression checks passed; the C p99 remains just above the locked 16 ms target, so issue018/task030 stays open.
  • Commit: 3d3dda6.

2026-08-20 — Close the locked source-fresh live-append gate

  • Verify the complete four-round evaluator after the native backend change: every baseline/candidate round loads its own source root across 64/80/96/ 128/160 px, 2/4/8/16-row fixtures, C/Elisp engines, and default/excluded GC.
  • Evidence: width-80 candidate C p95/p99 is 12.010/14.622 ms and the Elisp-configured live path (native append backend) is 10.980/11.194 ms; paired improvements are 77.72/74.03% and 94.19/94.57%. Ordinary-key p99 is 0.551 ms. Layout parity, zero-work, GC exclusion, conflict-free, and all-width non-regression checks are true. The evaluator then passes full source-first ERT 296/296, fuzz 300/300, and release checks.
  • Result: Mark task030 and issue018 resolved; retain the raw samples under .omx/goals/performance/narrow-live-commit/raw/run.bxULD9 and the JSON report at .omx/goals/performance/narrow-live-commit/latest-report.json.
  • Commit: this closure-record commit.

Verification

  • Source-first normal ERT: 296/296.
  • Source-first seeded random ERT: 296/296, including all nine GUI verifier tests previously omitted by the name filter.
  • Per-test isolated ERT: 294/294 process runs logged 0 unexpected; the later batch-position test is covered by focused isolated C ERT.
  • C focused ERT: 15/15; C portable build warning-clean; source fuzz: 300/300 with zero failures; checkdoc, release, dictionary, and shell gates pass.
  • Complete source evaluator: parity, zero-work, GC, conflicts, and width non-regression pass; width-80 C/Elisp p99 is 14.622/11.194 ms. The formal performance issue is closed.