IBEX DOCUMENTATION

Error experience evidence

Bounded diagnostics, repair behavior, and the evidence boundary for parser errors.

JSON error UX evidence

This report fixes the Phase 14 error-experience baseline against ten malformed inputs for the gallery JSON grammar. It is generated from json-errors-v1.json by:

bundle exec ruby tool/error_ux_snapshot.rb

Use --write only after reviewing a deliberate diagnostic, parser-table, racc, or repair-policy change. CI regenerates the evidence and requires byte-for-byte equality.

Independent review gate

The fixed observations include a maintainer repair assessment. They do not include an independent diagnostic or repair assessment.

R001: HOLDawaiting_independent_review. <!-- r001-review-status:end -->

Third-party reviewers use the versioned rubric and closed review-record schema. Run:

bundle exec rake quality:error_ux_review_kit
bundle exec rake quality:error_ux_review_status
bundle exec ruby tool/error_ux_review.rb template review.json

The generated payload contains the reviewer identity, reviewed maintainer roster, structured consent, labels, rationales, and disagreements, but no permalink. Publication metadata is kept separately in the status registry so a reviewer can commit the final payload without a self-referential SHA. The first command verifies the immutable snapshot, corpus identities, schema, local byte/digest bindings, reports, claims, and truthful status entirely offline while allowing the expected HOLD in ordinary CI.

bundle exec rake release:error_ux_review is the separate promotion gate and returns nonzero until a valid published external payload exists. When PASS is claimed, it additionally fetches the full-SHA blob without redirects, compares the exact imported bytes, and requires the source repository owner, GitHub commit API author, status publisher login, and reviewer login to agree case-insensitively. This verifies control of the named GitHub namespace and GitHub account metadata, not a cryptographic identity or signature. Network or account-metadata uncertainty fails closed. Neither path changes the normative observation fixture.

Comparison method

At Ibex revision cc20c5eb799cc218ebea665df64261f10d030f75, on ten fixed malformed JSON inputs with the Ruby, OS, CPU, kernel, processor-count, and YJIT environment unrecorded, the committed result artifact records Ibex diagnostics, Racc 1.8.1's public on_error callback values, and a maintainer assessment of ten bounded repairs; independent subjective review is pending, so this is not a completed comparative UX claim.

Evidence record ID: racc-error-ux-json-v1. The observations and assessment are registered in claims.yml, including every unrecorded environment field and the still-pending independent review.

Ibex uses examples/json.y, including its generated lexer locations. The migration from its previous handwritten lexer is guarded by exact location and error-snapshot tests. The comparison uses the self-authored compatible grammar json_racc.y, racc 1.8.1, and only the public racc executable and on_error(token, value, value_stack) callback. Neither racc implementation files nor generated source are inspected. Both parsers receive the same source strings and equivalent token streams.

The racc column records the neutral callback wrapper's token argument. It does not claim that an application cannot build richer diagnostics around racc; it shows what the compared parser runtime exposes at that boundary without an additional state-to-message layer.

CaseInvalid sourceIbex diagnostic evidenceracc callbackSelected repairUseful
EUX-01{"a":,}line 1, column 6; 7 expected values; carettoken 9delete ,, insert STRINGyes
EUX-02{"a" 1}line 1, column 6; expected :; carettoken 3insert :yes
EUX-03{"a":1,}line 1, column 8; expected STRING; carettoken 8insert a complete memberno
EUX-04[1,]line 1, column 4; 7 expected values; carettoken 12insert STRINGno
EUX-05[1 2]line 1, column 4; expected , or ]; carettoken 3insert ,yes
EUX-06{"a":[true false]}line 1, column 12; expected , or ]; carettoken 5insert ,yes
EUX-07{"a":null "b":2}line 1, column 11; expected } or ,; carettoken 2insert ,yes
EUX-08{]line 1, column 2; expected STRING or }; carettoken 12replace ] with }yes
EUX-09[}line 1, column 2; 8 expected values/closer; carettoken 8replace } with ]yes
EUX-10true falseline 1, column 6; expected EOF; carettoken 5delete extra FALSEyes

The committed JSON is the normative snapshot and also retains exact messages, LR states, expected-token arrays, token values, repair costs, configuration counts, and edit positions. Its public structure is validated by schema/error-ux-v1.schema.json.

SP-4 decision

The bounded insertion/deletion/replacement search produced a completing plan for all ten cases. Eight plans are reasonable representations of the likely human edit; two trailing-comma cases invent a missing value/member where deleting the comma would usually be preferable. The measured useful rate is therefore 8/10 (80%), above the required majority.

SP-4 is go for the existing opt-in bounded single-plan repair described by ADR 0012. It remains experimental: a selected edit can require a nil semantic value, and the search does not enumerate every equal-cost CPCT+ repair. The stable default answer remains exact expected tokens plus explicit yacc/synchronization recovery. <!-- comparative-evidence:racc-error-ux-json-v1:end -->