ekp/.phrase/phases/phase-kp-overhaul-20260726/change_final_pass_emergency_stretch_20260802.md
2026-08-02 15:30:12 +08:00

5.4 KiB

Change: Final-Pass Emergency Stretch 2026-08-02

2026-08-02 — Close issue021 after user visual confirmation

  • Modify the global issue index and issue detail to close issue021.
  • User confirmation: the user accepted the visible result with “可以了, 提交吧” and requested the commit.
  • Behavior/Risk: no runtime change; this closes the required user-visible acceptance gate after the developer, dynamic GUI, and independent review gates had already passed.

2026-08-02 — Complete task036 with TeX active-path preservation

  • Modify ekp.el and ekp_c/ekp_kp.c: keep strict K-P unchanged; use fixed ekp-emergency-stretch-pixel for ordinary final-pass underfull candidates; and, only when an overfull candidate would otherwise extinguish the final active path to a breakpoint, install the best provisional path with tight fitness and zero incremental demerits.
  • Delete the wrong-layer rule that forbade an otherwise legal boundary immediately before an explicit hard atom. Hard atoms forbid only their interior breaks; an overwide atom remains intact but need not stand alone.
  • Modify the renderer to distribute the chosen line's actual rest using its actual TeX glue-set proportions. Elisp 1D, looseness/parshape, and C behavior match; the public 15-field/15-argument C contract is unchanged.
  • Strengthen tests so isolated-CJK oracles require a nonempty plan that exactly covers the source, preventing an empty result from false-greening.
  • Review remediation: make the changed test fixtures warning-clean under byte-compile-error-on-warn and document the optional eighth EMERGENCY-STRETCH argument in the C README API example.
  • Verification: focused root regressions 8/8, emergency selector 10/10, core/buffer/GUI oracle 8/8, full ERT 288/288, seeded and isolated suites 279/279, fuzz 300/300, warning-clean portable/native/debug/sanitize C builds, warning-as-error production and changed-test Elisp compilation, checkdoc/package/static/release gates, formal performance gates, and reviewed 42.78-second dynamic GUI evidence at /tmp/ekp-g009-evidence-retry.UOpPNp with VERDICT=PASS. Final independent code review returns APPROVE and architecture review returns CLEAR.
  • Behavior/Risk: no CJK-orphan, unit, atom-adjacency, or screenshot heuristic exists. task036 is complete; issue021 closed after the user's 2026-08-02 visual confirmation.

The entries below are historical steps. Their hard/atomic fixed-cost wording was superseded by the completed task036 semantics above.

2026-08-02 — Open task036 after task035 full-regression failure

  • Modify task035 to record the line-width-sized emergency stretch as a falsified attempt, not accepted current behavior.
  • Add task036 for TeX-style fixed-dimension final-pass emergency stretch. The implementation must expose ekp-emergency-stretch-pixel where nil auto-resolves to roughly three display-font M widths and a non-negative integer fixes the pixel value.
  • Preserve the constraints: strict pass unchanged, 15-field C paragraph ABI unchanged, renderer semantics synchronized, fixed artificial emergency transition only for truly overfull first permitted hard/atomic runs, and no CJK-orphan/unit/screenshot-specific penalty.
  • Verification planned: five new RED cases for fixed dimension behavior, nil auto, integer override, C parity without ABI growth, and renderer width/glue consistency; the three regressions broken by task035; focused G009 GUI/core/public-buffer/C parity; final fullscreen dynamic GUI evidence; full ERT/fuzz/build/static/release gates.
  • Behavior/Risk: Documentation records the next atom of work only. Runtime behavior is not claimed fixed by this entry.

2026-08-02 — Close task035 as falsified

  • Modify core K-P documentation to state the attempted final-pass model: strict pass unchanged; final pass gives ordinary underfull candidates a line-width-sized finite background emergency stretch; those candidates still use adjustment ratio, badness, fitness, and demerits.
  • Modify user-facing hard-atom documentation to avoid claiming a hard-coded fullest-prefix fallback. A hard atom may occupy one overflow line, while the ordinary prefix remains a normal K-P decision with finite emergency stretch.
  • Modify issue021, task035, the spec, plan, changelog, developer docs, C README, and global change/issue indexes to record the corrected owner and current acceptance boundary.
  • Add postmortem/20260802-final-pass-emergency-stretch.md to explain why the ordinary-underfull fixed fallback was the wrong layer, why the TeX-style emergency-stretch model is used, and why the earlier 84px oracle was invalid.
  • Verification: Focused core single-CJK regressions pass 2/2. The implementation lane reports focused G009 core/C/hard-atom/buffer/GUI-oracle coverage 18/18, warning-as-error byte compilation pass, and C build pass. Full regression then falsified the line-width stretch detail and forced the task036 fixed-dimension follow-up. This documentation pass ran stale-text search and git diff --check.
  • Behavior/Risk: task035 is not current truth. No public configuration, C ABI, or renderer ownership change is accepted by this record. issue021 remains open until task036 and the final user-visible visual acceptance gate pass.