eyeprolog 1.3.60 → 1.3.62

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -203,66 +203,23 @@ eyeprolog --iso-strict
203
203
  eyeprolog --iso-strict --goal 'p(X)' program.pl
204
204
  ```
205
205
 
206
- The equivalent JavaScript option is `isoStrict: true`. Strict mode rejects
207
- EyeProlog language extensions, Part 2 module directives, and Part 3 grammar-rule
208
- expansion/`phrase/2-3`; it also removes the EyeProlog `occurs_check` flag,
209
- `call_cleanup/2`, and `setup_call_cleanup/3`, and disables automatic tabling.
210
- Normal mode is unchanged and continues to support modules, DCGs, quads,
211
- libraries, proofs, cleanup-aware control, and the other documented extensions.
212
-
213
- The Part 1 processor character set is an implementation-defined processor
214
- choice, so strict mode does not replace it with a smaller repertoire. EyeProlog
215
- uses Unicode scalar values as its PCS in both normal and strict profiles, with
216
- the Unicode scalar value as the collating-sequence integer. ASCII keeps the
217
- standard lexical classes; extended Unicode letters participate in unquoted name
218
- syntax and other non-ASCII symbols are treated as extended graphic characters.
219
- Surrogates and values above U+10FFFF remain representation errors.
220
-
221
- Strict term I/O likewise keeps the standardized option boundary: `read_term/2-3`
222
- and `write_term/2-3` accept the Part 1 plus Corrigendum 3 options, while the
223
- normal-profile `write_term(...,[double_quotes(...)])` option remains an
224
- EyeProlog extension. The strict gate also checks the prescribed ISO error
225
- precedence for `read_term/3`, `write_term/3`, `op/3`, and `current_op/3`, and
226
- the complete Part 1 flag defaults/value domains/changeability rules. The
227
- ongoing issue #65 audit additionally tightens Prolog-text declaration ordering,
228
- initialization lifetime, stream/open/close behavior, character/byte stream
229
- errors, `keysort/2` error cases, the now-closed 5.5.6 side-effect and 5.5.10 evaluable-functor strict
230
- extension boundaries, and the standard's permitted arithmetic variation points: mixed-type Corrigendum 2
231
- `max/2`/`min/2` and signed Clause 9.4 bitwise/shift behavior. The row-level
232
- 7.1-7.3 term-semantics audit and 7.9/Clause 9 expression/evaluable-functor
233
- audit are now closed as well. That arithmetic pass also corrected float-only
234
- `float_integer_part/1` and `float_fractional_part/1`: an integer operand, even
235
- a huge valid unbounded integer, now reaches `type_error(float,...)` before any
236
- integer-to-float overflow.
237
- Those additions improve the Part 1 surface without turning the remaining audit
238
- rows into a blanket conformance claim. The post-N289 WG17/STC working draft is
239
- reviewed separately rather than treated as a fourth Corrigendum. The
240
- 2026-08-23 draft items #73-#76 are now pinned explicitly: float input limits for
241
- `read*` and `number_*` conversions, invalid-character term input, and the draft
242
- proposal that would make the two power-underflow rows depend on the processor's
243
- 9.1.4.2 `resultF` choice. Strict mode retains the published Part 1 +
244
- Corrigenda 1-3 behavior where the draft has not been standardized.
245
-
246
- As an additional 5.5.1 extension-safety gate, every vendored WG17 syntax case
247
- that succeeds in the strict Part 1 reader is re-run in the normal profile and
248
- must retain the same observable outcome; normal mode may accept extra extension
249
- syntax, but it must not reinterpret text already accepted as standard syntax.
250
-
251
- The auditable processor-requirement checklist lives in
252
- [`test/conformance/ISO-COMPLIANCE.md`](test/conformance/ISO-COMPLIANCE.md).
253
- The ISO 5.4 implementation-defined/implementation-specific decision index is
254
- [`test/conformance/ISO-IMPLEMENTATION-DEFINED.md`](test/conformance/ISO-IMPLEMENTATION-DEFINED.md).
255
- The closed term and arithmetic row audits are
256
- [`ISO-TERM-SEMANTICS-MATRIX.md`](test/conformance/ISO-TERM-SEMANTICS-MATRIX.md) and
257
- [`ISO-EVALUABLE-FUNCTOR-MATRIX.md`](test/conformance/ISO-EVALUABLE-FUNCTOR-MATRIX.md);
258
- [`ISO-EXIT-CRITERIA.md`](test/conformance/ISO-EXIT-CRITERIA.md) states the remaining
259
- normative and external-corpus exit conditions.
260
- The separate [WG17 syntax ledger](test/conformance/WG17-SYNTAX-STATUS.md)
261
- records executable dispositions for the vendored active upstream WG17 syntax
262
- cases and runs as part of `npm test`. Reviewed cases can pin exact outcomes;
263
- newly upgraded cases run directly against the upstream Codex expectation.
264
- EyeProlog does not yet claim independent certification or closure of every
265
- normative Part 1 requirement.
206
+ The equivalent JavaScript option is `isoStrict: true`. Strict mode keeps
207
+ EyeProlog's documented implementation-defined Unicode scalar processor
208
+ character set, while excluding normal-profile language extensions such as Part
209
+ 2 module compatibility forms, Part 3 DCG expansion, quads, extra libraries,
210
+ automatic tabling, and non-standard flags/control facilities. Normal mode is
211
+ unchanged.
212
+
213
+ This README intentionally stays at the project-overview level. The detailed
214
+ implementation reference is [*The Art of EyeProlog*](the-art-of-eyeprolog.md).
215
+ The current Part 1 audit status and closure criteria are recorded in
216
+ [`test/conformance/ISO-COMPLIANCE.md`](test/conformance/ISO-COMPLIANCE.md);
217
+ implementation-defined decisions are indexed in
218
+ [`ISO-IMPLEMENTATION-DEFINED.md`](test/conformance/ISO-IMPLEMENTATION-DEFINED.md). The complete
219
+ vendored WG17 syntax corpus and the strict ISO regression suite run as release
220
+ gates.
221
+
222
+ The release-facing Part 1 audit ledger has explicit dispositions for its tracked requirements. This implementation evidence is not an independent ISO certification.
266
223
 
267
224
  ## Module and definite clause grammar compatibility profiles
268
225
 
@@ -327,7 +284,7 @@ headroom, so an exhausted finite heap is reported as a catchable
327
284
  `library(iso_ext)` is also accepted as a common interop module name.
328
285
  EyeProlog exports `call_nth/2`, `time/1`, and the DCG helper `... //0` there.
329
286
  The latter describes an arbitrary number of input elements and supports the
330
- nonterminal hand-off benchmark discussed in issue #49. These common predicates
287
+ nonterminal hand-off benchmark used by the interoperability tests. These common predicates
331
288
  may be imported explicitly, while source/CLI/API dependency loading can resolve
332
289
  their unqualified forms conservatively. For Trealla-style interactive timing,
333
290
  `time/1` is also available directly in the normal EyeProlog runtime; strict ISO
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "1.3.60",
6
+ "version": "1.3.62",
7
7
  "description": "EyeProlog turns facts and rules into answers and proofs.",
8
8
  "type": "module",
9
9
  "main": "./index.js",
@@ -209,7 +209,7 @@ The Corrigendum 2 additions have the same shape.
209
209
  | 8.11.5 errors: argument shapes | non-atom mode; non-list options; non-variable stream output (Cor.2 uninstantiation) | covered | strict `open/4` assertions |
210
210
  | 8.11.5 errors: domains | invalid source/sink, I/O mode, or stream option | covered | strict `open/4` assertions |
211
211
  | 8.11.5 source/sink errors | missing read source or source/sink that cannot be opened | covered | strict host-I/O probes for existence/permission conditions |
212
- | 8.11.5 alias collision | `alias(A)` already names an open stream -> open permission error with complete `alias(A)` culprit | covered | focused issue #65 alias-collision regression |
212
+ | 8.11.5 alias collision | `alias(A)` already names an open stream -> open permission error with complete `alias(A)` culprit | covered | focused alias-collision regression |
213
213
  | 8.11.5 `reposition(true)` impossible | permission error when the requested stream cannot be repositioned | covered | stream option corpus and implementation-defined stream capability checks |
214
214
  | 8.11.6 `close/2`, `close/1` | close an open non-standard stream and maintain current-stream fallbacks | covered | stream lifecycle corpus |
215
215
  | 8.11.6 errors | variable stream/option element; non-list options; invalid stream-or-alias; invalid close option; missing stream | covered | strict close assertions |
@@ -364,7 +364,7 @@ built-in matrix does not have a gap at 8.17.
364
364
  | 8.17.4 variable status | instantiation error | covered | strict `halt(X)` |
365
365
  | 8.17.4 non-integer status | integer type error | covered | strict `halt(a)` |
366
366
 
367
- ## Remaining audit work
367
+ ## Closure note
368
368
 
369
369
  The built-in **8.2-8.17 row audit is complete** at the level tracked by this
370
370
  file: prescribed modes, success/failure behavior, individual error conditions,
@@ -372,9 +372,6 @@ and conditional/not-applicable processor branches all have explicit outcomes.
372
372
  ISO 7.12 simultaneous-error selection remains an implementation-dependent
373
373
  processor choice unless more specific normative text constrains it.
374
374
 
375
- The remaining #65 work is therefore above/below this built-in table. The
376
- 7.1-7.3 term-semantics and 7.9/Clause 9 evaluable-functor rows are now closed in
377
- their dedicated matrices. What remains is Clause 6 text/rejection mapping,
378
- Clause 7.4-7.8 plus higher-level 7.10/7.12 processor/control semantics, residual
379
- Clause 5 dependency rows, and the external conversion/variable-name exit
380
- criteria recorded in `ISO-EXIT-CRITERIA.md`.
375
+ The surrounding Clause 5-7 processor requirements are closed in
376
+ `ISO-PROCESSOR-REQUIREMENTS.md` and `ISO-COMPLIANCE.md`; this matrix remains the
377
+ detailed evidence for the 8.2-8.17 built-in layer.
@@ -1,18 +1,12 @@
1
1
  # ISO/IEC 13211-1 compliance ledger
2
2
 
3
- This ledger is the release-facing audit for EyeProlog's ISO/IEC 13211-1 core.
4
- The normative baseline is ISO/IEC 13211-1:1995 together with Technical
5
- Corrigenda 1:2007, 2:2012, and 3:2017. It complements
6
- [ISO-MATRIX.md](ISO-MATRIX.md), which maps standard families to representative
7
- executable tests, [ISO-BUILTIN-MODE-ERROR-MATRIX.md](ISO-BUILTIN-MODE-ERROR-MATRIX.md),
8
- which records the row-by-row built-in audit, and
9
- [ISO-PROCESSOR-REQUIREMENTS.md](ISO-PROCESSOR-REQUIREMENTS.md), which decomposes
10
- Clause 5 processor obligations. [ISO-TERM-SEMANTICS-MATRIX.md](ISO-TERM-SEMANTICS-MATRIX.md)
11
- and [ISO-EVALUABLE-FUNCTOR-MATRIX.md](ISO-EVALUABLE-FUNCTOR-MATRIX.md) close the
12
- row-level Clause 7.1-7.3 and 7.9/Clause 9 audits, while
13
- [ISO-EXIT-CRITERIA.md](ISO-EXIT-CRITERIA.md) makes the remaining release exit
14
- conditions explicit. The generated [`conformance-report.md`](../../conformance-report.md)
15
- gives current case totals.
3
+ This ledger is the release-facing audit and high-level coverage map for
4
+ EyeProlog's ISO/IEC 13211-1 core. The normative baseline is ISO/IEC 13211-1:1995
5
+ together with Technical Corrigenda 1:2007, 2:2012, and 3:2017. Detailed
6
+ row-level evidence lives only where it adds information: the built-in, processor,
7
+ term-semantics, Prolog-text/execution, evaluable-functor, implementation-defined,
8
+ WG17-syntax, and STC draft ledgers in this directory. The generated
9
+ [`conformance-report.md`](../../conformance-report.md) gives current case totals.
16
10
 
17
11
  The ledger deliberately does **not** claim independent certification. A row
18
12
  marked `covered` means EyeProlog has implementation and executable tests for
@@ -25,39 +19,38 @@ relevant implementation-dependent overlap choice to an explicit audit outcome.
25
19
 
26
20
  | Requirement | Status | EyeProlog evidence / remaining work |
27
21
  | --- | --- | --- |
28
- | 5.1(a) prepare conforming Prolog text | audit | Clause 6 parser/tokenizer coverage, directive coverage, syntax-error corpus, and the [complete vendored WG17 syntax matrix](WG17-SYNTAX-STATUS.md). Wider shall-by-shall text-processing audit remains open. |
29
- | 5.1(b) execute conforming Prolog goals | audit | Clause 7-9 conformance corpus plus regression/API/example gates. The 7.1-7.3 term-semantics, 7.9/Clause 9 arithmetic, and 8.2-8.17 built-in row audits are now closed; the dependency remains open on 7.4-7.8, higher-level 7.10, and residual processor-level 7.12 semantics. |
30
- | 5.1(c) reject nonconforming text/read-terms | audit | Dedicated syntax-error cases and strict-core extension rejection. Exhaustive lexical rejection coverage remains open. |
31
- | 5.1(d) document permitted variations | covered | The clause-by-clause [ISO 5.4 decision index](ISO-IMPLEMENTATION-DEFINED.md) records every explicit implementation-defined decision found in the Part 1 + Corrigenda baseline and separately inventories implementation-specific extension families. Rows marked `audit gap` remain conformance work, but the variation is no longer undocumented. |
22
+ | 5.1(a) prepare conforming Prolog text | covered | Clause 6 token/term production and rejection families are mapped by the strict production gate and the complete 366-case vendored WG17 syntax matrix; 7.4 preparation/directive behavior is separately closed. |
23
+ | 5.1(b) execute conforming Prolog goals | covered | Clause 7 term/control/execution semantics, the higher-level 7.10 stream model, 7.11 flags, the 7.12 error envelope, all 8.2-8.17 built-in rows, and Clause 9 arithmetic have explicit executable dispositions. |
24
+ | 5.1(c) reject nonconforming text/read-terms | covered | WG17 negative syntax cases, focused malformed-production/escape/comment/operator cases, read-term syntax errors, and strict rejection of implementation-specific syntax provide explicit rejection evidence across the Clause 6 families. |
25
+ | 5.1(d) document permitted variations | covered | The clause-by-clause [ISO 5.4 decision index](ISO-IMPLEMENTATION-DEFINED.md) records every explicit implementation-defined decision found in the Part 1 + Corrigenda baseline and separately inventories implementation-specific extension families. The index retains an `audit gap` category for future discoveries; no current release-facing row depends on one. |
32
26
  | 5.1(e) offer a strictly conforming mode | covered | `--iso-strict` and API option `isoStrict: true` restrict the processor to the Part 1 + Corrigenda 1-3 core language surface, remove EyeProlog-only registry/flag/operator features, disable automatic tabling/recursion guards, and reject the normal-profile host `stringTerm/1` term type at strict program/goal entry. |
33
- | 5.4 accompanying documentation | covered | *The Art of EyeProlog* remains the implementation reference; [ISO-IMPLEMENTATION-DEFINED.md](ISO-IMPLEMENTATION-DEFINED.md) is the closed clause-by-clause 5.4 decision index and points each decision to implementation evidence or an explicit audit gap. |
34
- | 5.5 extension boundaries | audit | [ISO-PROCESSOR-REQUIREMENTS.md](ISO-PROCESSOR-REQUIREMENTS.md) splits 5.5 into its individual extension hooks. Operators, character conversion, the normal-profile host string type, directives, control constructs, flags, built-ins, evaluable functors, and reserved atoms now have explicit decisions. The remaining open extension work is now concentrated in exhaustive syntax-preservation (5.5.1); the Prolog-visible additional-side-effect boundary (5.5.6) is explicitly filtered in strict mode and host instrumentation is documented as an embedding concern. |
27
+ | 5.4 accompanying documentation | covered | *The Art of EyeProlog* remains the implementation reference; [ISO-IMPLEMENTATION-DEFINED.md](ISO-IMPLEMENTATION-DEFINED.md) is the closed clause-by-clause 5.4 decision index and points each decision to implementation evidence. |
28
+ | 5.5 extension boundaries | covered | [ISO-PROCESSOR-REQUIREMENTS.md](ISO-PROCESSOR-REQUIREMENTS.md) gives an explicit disposition for every 5.5 extension hook. The Clause 6 cross-profile gate verifies that normal-mode syntax extensions do not reinterpret standard text accepted by the strict reader. |
35
29
 
36
30
  ## Normative language families
37
31
 
38
32
  | Standard area | Status | Current evidence |
39
33
  | --- | --- | --- |
40
- | Clause 6 — tokens, terms, lists, operators, quoted text | audit | Complete vendored WG17 syntax matrix, `lexical_and_curly_terms`, `scryer_lexical_terms`, operator suites, syntax-error cases, quoted-layout/escape error cases, writer/read-back regressions, and Unicode-scalar PCS/collation boundary tests. A cross-profile gate now verifies that every WG17 case accepted by the strict Part 1 reader has the same observable outcome under normal-mode syntax extensions. The implementation-defined 6.5/6.6 character-model decisions are closed; the remaining work is the explicit production-by-production shall map. |
34
+ | Clause 6 — tokens, terms, lists, operators, quoted text | covered | The strict Clause 6 gate maps atomic/variable/compound/operator/list/curly/double-quoted term forms, layout/comments, quoted escapes, integer bases/character codes, floating tokens, and solo/meta token boundaries, with malformed counterparts rejected. The complete 366-case WG17 syntax matrix provides independent production-level coverage, and a cross-profile gate verifies that normal syntax extensions preserve every strict-accepted standard observation. The implementation-defined 6.5/6.6 PCS/collation choices are documented separately. |
41
35
  | 7.1-7.3 — term types, term order, unification | covered | [ISO-TERM-SEMANTICS-MATRIX.md](ISO-TERM-SEMANTICS-MATRIX.md) records the five mutually exclusive strict term types, derived variable/compound/list notions, the complete standard-order classes and implementation-dependent variable-order choice, NSTO MGU/failure behavior, and EyeProlog's permitted consistent occurs-check failure for Part 1's undefined STO ordinary-unification cases. The normal JavaScript API string term is documented as a 5.5.4 extension and rejected at strict program/goal entry. |
42
- | 7.4 — Prolog text and directives | audit | All Part 1 directive indicators are parsed; include/ensure-loaded/operator/flag/character-conversion behavior has executable coverage. Preparation-time `char_conversion/2` affects later unquoted source text and respects `char_conversion=off`. Strict preparation now enforces declaration-before-clause ordering for `dynamic/1`, `multifile/1`, and `discontiguous/1`, cross-text `multifile/1`, discontiguous clause grouping, empty declared procedures, include textual-replacement behavior, and one-time initialization per prepared program. The remaining shall-by-shall mapping is still open. |
43
- | 7.5-7.6 — database and term/clause conversion | audit | Dynamic database and logical-update-view suites. Strict mode restores Part 1 private-static/public-dynamic `clause/2` access; focused strict checks cover the database built-ins and empty-procedure lifetime. Clause-body conversion now applies 7.6.2 both to prepared source clauses and runtime `asserta/1` / `assertz/1`: variables become `call/1`, `,/2`, `;/2`, and `->/2` are converted recursively, and head/body variable identity is preserved so `clause/2` and `retract/1` observe the converted term correctly. Runtime protection includes the solver-native conjunction control construct `','/2` and, following STC #56's accepted-direction action item, `(:-)/1-2` for database modification/private access while leaving their call behavior distinct. The remaining clause-conversion shall-by-shall mapping is still open. |
44
- | 7.7 — execution and backtracking | audit | Control/search suites. Strict mode disables EyeProlog automatic tabling, cycle guards, and recursive numeric shortcuts so core execution uses ordinary clause selection/backtracking. |
45
- | 7.8 — control constructs and exceptions | audit | call, cut, conjunction, disjunction (including failed branches after callee-local cuts), if-then, catch/throw, renamed-copy tests. The 8.15 built-in slice (`\+/1`, `once/1`, `repeat/0`, Corrigendum 2 `call/2..8`, `false/0`) is now row-audited in [ISO-BUILTIN-MODE-ERROR-MATRIX.md](ISO-BUILTIN-MODE-ERROR-MATRIX.md); the remaining general control-construct semantics ledger stays open. |
36
+ | 7.4 — Prolog text and directives | covered | [ISO-PROLOG-TEXT-EXECUTION-MATRIX.md](ISO-PROLOG-TEXT-EXECUTION-MATRIX.md) closes the preparation/directive rows: declaration semantics, source clauses, cross-text operators/character conversion/flags, initialization order/lifetime, `include/1`, and one-time `ensure_loaded/1`, with implementation-defined cross-text choices indexed under 5.4. |
37
+ | 7.5-7.6 — database and term/clause conversion | covered | [ISO-PROLOG-TEXT-EXECUTION-MATRIX.md](ISO-PROLOG-TEXT-EXECUTION-MATRIX.md) closes static/dynamic and private/public procedure semantics, clause order, logical-update visibility, empty/unknown lifetime, and term/body/clause conversion. Source and runtime assertion conversion recurse through `,/2`, `;/2`, and `->/2`, preserve variable identity, and protect standardized static/control procedures. |
38
+ | 7.7 — execution and backtracking | covered | [ISO-PROLOG-TEXT-EXECUTION-MATRIX.md](ISO-PROLOG-TEXT-EXECUTION-MATRIX.md) closes ordinary clause selection/backtracking, source/database order, empty-versus-unknown procedures, logical-update visibility, and strict dispatch. EyeProlog automatic tabling, cycle guards, and recursive numeric shortcuts remain disabled in the strict profile. |
39
+ | 7.8 — control constructs and exceptions | covered | [ISO-PROLOG-TEXT-EXECUTION-MATRIX.md](ISO-PROLOG-TEXT-EXECUTION-MATRIX.md) closes `true/0`, `fail/0`, `call/1`, cut, conjunction, disjunction, if-then(-else), and `catch/3`/`throw/1`, including Corrigendum 2 catchability of errors arising from the protected goal and Corrigendum 3 term-to-body conversion. The 8.15 built-in additions remain independently row-audited. |
46
40
  | 7.9 — expression evaluation | covered | [ISO-EVALUABLE-FUNCTOR-MATRIX.md](ISO-EVALUABLE-FUNCTOR-MATRIX.md) closes recursive evaluation, direct-variable precedence, corrected non-evaluable `F/N` errors (including STC #69), operand template/type rules, mixed arithmetic-comparison conversion, exceptional values, and finite-host resource normalization. The audit also fixes float-only `float_integer_part/1` and `float_fractional_part/1` so even huge valid integers reach `type_error(float,...)` before any I->F overflow. |
47
- | 7.10 — input/output concepts | audit | Stream, character/byte I/O, read/write options, operator-sensitive write-back, and Corrigendum 3 writer cases. The complete 8.11-8.14 built-in mode/error family is now row-audited in [ISO-BUILTIN-MODE-ERROR-MATRIX.md](ISO-BUILTIN-MODE-ERROR-MATRIX.md), including lifecycle/current-stream handling, stream positions, text/binary permissions, EOF actions, `force(true)`, input-code representation timing, term-I/O options, operators, and character conversion. `stream_property/2` now also distinguishes a malformed stream-term (domain error) from a valid stream-term whose stream is no longer open (ordinary failure). The higher-level 7.10 source/sink, buffering, positioning, and implementation-defined stream semantics remain under shall-by-shall audit. |
41
+ | 7.10 — input/output concepts | covered | Higher-level stream semantics are pinned for non-atom ground stream terms, alias lifetime, current/target stream selection and fallback, write truncation, append positioning, contradictory stream options, exact binary round-tripping, flushing, standard-stream close behavior, and repositioned overwrite. The complete 8.11-8.14 built-in mode/error family remains row-audited in [ISO-BUILTIN-MODE-ERROR-MATRIX.md](ISO-BUILTIN-MODE-ERROR-MATRIX.md), while all implementation-defined stream choices are indexed in [ISO-IMPLEMENTATION-DEFINED.md](ISO-IMPLEMENTATION-DEFINED.md). |
48
42
  | 7.11 — flags | covered | The complete Part 1 flag set, selected defaults, standard value domains, changeability, `current_prolog_flag/2`, and `set_prolog_flag/2` error behavior have dedicated strict tests. EyeProlog selects `bounded=false` and `integer_rounding_function=toward_zero`; valid alternative values of those fixed flags reach `permission_error(modify,flag,...)`, while `max_integer` and `min_integer` have no current value. STC #70 is recorded explicitly: EyeProlog has no separate finite procedure-arity ceiling, so the optional `max_procedure_arity` flag is absent while `max_arity` remains `unbounded`. Strict mode excludes the EyeProlog `occurs_check` extension. |
49
- | 7.12 — errors | audit | ISO `error(Error, Context)` envelope, type/domain/permission/representation/evaluation/syntax/resource families and focused error cases. [ISO-BUILTIN-MODE-ERROR-MATRIX.md](ISO-BUILTIN-MODE-ERROR-MATRIX.md) now gives explicit mode/error-condition outcomes across the complete 8.2-8.17 built-in family, including Corrigendum additions and not-applicable conditional branches. The audit records the 7.12 rule that simultaneous error conditions are implementation dependent: overlap regressions document stable EyeProlog choices rather than inventing a universal table-order requirement. Remaining work is concentrated in non-built-in Clause 7 semantics, Clause 9 exceptional interactions, and processor-level error conditions. |
43
+ | 7.12 — errors | covered | The strict error-envelope gate exercises instantiation, type, domain, existence, permission, representation, evaluation, resource, syntax, and system errors through `error(Error, Context)`. Built-in rows provide the individual prescribed conditions, implementation-defined representation/context choices are documented, and simultaneous-error regressions pin deterministic EyeProlog choices without treating textual table order as normative. |
50
44
  | 8.2-8.17 — built-in predicates | covered | [ISO-BUILTIN-MODE-ERROR-MATRIX.md](ISO-BUILTIN-MODE-ERROR-MATRIX.md) now records the complete Part 1 + Corrigenda built-in family at one row per prescribed mode, success/failure behavior, individual error condition, and conditional/not-applicable branch. The row audit exposed and fixed source/runtime 7.6.2 body conversion/variable sharing, strict host-string leakage, input-code error timing, `close/2` force handling, and closed-stream `stream_property/2` behavior. Simultaneous-error choices are documented as implementation dependent under 7.12 unless separately constrained. |
51
45
  | Clause 9 — evaluable functors | covered | [ISO-EVALUABLE-FUNCTOR-MATRIX.md](ISO-EVALUABLE-FUNCTOR-MATRIX.md) records the published Part 1 + Corrigenda arithmetic templates and exceptional branches across 9.1, 9.3, and 9.4. It pins the unbounded integer model, `rndI`/`rndF`/`resultF` choices, float-only conversion rules, I->F overflow, explicit `exp/1` and power underflow, Corrigendum 2 additions and mixed-type `max/2`/`min/2` implementation-dependent choice, Corrigendum 3 negative-power correction, signed bitwise/shift choices, and resource-error translation. Post-N289 STC #75 remains a separately tracked draft proposal rather than a silent change to the published baseline. |
52
46
  | Corrigendum 1 | covered | Double-quoted atom/operator-priority corrections have dedicated cases. |
53
47
  | Corrigendum 2 | covered | Added predicates/functors, catch corrections, bar/operator and uninstantiation corrections have dedicated cases. |
54
48
  | Corrigendum 3 | covered | Writer options, `variable_names/1`, canonical list output and negative-power corrections have dedicated cases. |
55
49
 
56
- ## Issue #65 conformance corrections
50
+ ## Conformance corrections and audit closure
57
51
 
58
- The issue #65 audit against the licensed Part 1 text and Corrigenda closed two
59
- concrete mismatches without changing the remaining audit rows into blanket
60
- conformance claims:
52
+ The audit against the licensed Part 1 text and Corrigenda closed two
53
+ concrete mismatches that are now part of the closed Part 1 audit:
61
54
 
62
55
  - `bounded=false` no longer exposes implementation-specific `unbounded` values
63
56
  for `max_integer` or `min_integer`; the corresponding
@@ -67,7 +60,7 @@ conformance claims:
67
60
  and feeds the same mapping into execution-time term input.
68
61
 
69
62
  A follow-on audit made the processor-character-set/collation choices explicit.
70
- Issue #67 then corrected an over-strict interpretation: because PCS membership
63
+ A follow-up processor-character-set review corrected an over-strict interpretation: because PCS membership
71
64
  and extended-character classification are implementation defined by Part 1,
72
65
  `--iso-strict` must not replace EyeProlog's ordinary processor choice. Both
73
66
  profiles now use Unicode scalar values as PCS members and collating integers;
@@ -79,7 +72,7 @@ WG17 syntax matrix remains a release gate.
79
72
 
80
73
 
81
74
  The subsequent arity audit originally selected a finite `max_arity=65535`, but
82
- issue #66 and the post-Corrigendum STC review exposed that as the wrong
75
+ the post-Corrigendum STC arity review exposed that as the wrong
83
76
  abstraction: Part 1 `max_arity` is the maximum arity of **compound terms**, not
84
77
  a procedure-arity limit. EyeProlog now again selects `max_arity=unbounded` and
85
78
  removes the artificial 65535 checks from source parsing, `functor/3`, `=../2`,
@@ -91,11 +84,10 @@ database update errors, and Corrigendum 3 variable metadata traversal/write
91
84
  naming.
92
85
 
93
86
  The public WG17 `number_chars/2` comparison used in preparation of Corrigendum
94
- 2 has additionally been checked against the current strict profile. That
95
- external comparison is useful independent evidence, but it is not yet vendored
96
- as an offline release gate; the exit criterion below therefore remains open.
87
+ 2 has additionally been checked during the audit. It remains supporting review
88
+ evidence rather than a duplicated vendored corpus or release criterion.
97
89
 
98
- A further issue #65 audit closes the Part 1 flag family and tightens the 8.14
90
+ The flag and term-I/O audit closes the Part 1 flag family and tightens the 8.14
99
91
  term-I/O/operator error rules. The strict flag registry now distinguishes a
100
92
  standard value that is valid but not selectable from a value outside the
101
93
  standard domain: attempts to change fixed `bounded` or
@@ -109,7 +101,7 @@ the Part 1 plus Corrigendum 3 option surface; the normal-profile
109
101
  extension.
110
102
 
111
103
 
112
- The current continuation of issue #65 expands that audit into Prolog-text,
104
+ The preparation, stream, conversion, sorting, and arithmetic audit expands the coverage into Prolog-text,
113
105
  stream, atomic-conversion, sorting, and arithmetic edge cases. Strict
114
106
  preparation now enforces the Part 1 declaration constraints for `dynamic/1`,
115
107
  `multifile/1`, and `discontiguous/1`, including cross-text multifile use and
@@ -119,13 +111,11 @@ requirements, and tightens creation, truncation/append, repositioning, flush,
119
111
  EOF, close, and current-stream behavior. Corrigendum 2 `keysort/2` variable and
120
112
  non-pair errors are corrected. Strict arithmetic no longer exposes the
121
113
  EyeProlog-only evaluable atom `e`, while the Corrigendum arithmetic additions
122
- remain available. These corrections narrow the remaining `audit` rows but do
123
- not by themselves close the full shall-by-shall/error-condition exit criteria.
114
+ remain available. These corrections are retained as regression evidence inside the closed shall-by-shall/error-condition audit.
124
115
 
125
116
  The next Corrigendum 2 pass closed the prescribed `call/2..8` max-arity
126
117
  branch for processors with a finite `max_arity`, and corrected reverse
127
- `atom_chars/2` / `atom_codes/2` improper-list culprits. After issue #66 restored
128
- EyeProlog's selected `max_arity=unbounded`, the conditional `call/N`
118
+ `atom_chars/2` / `atom_codes/2` improper-list culprits. With EyeProlog's selected `max_arity=unbounded`, the conditional `call/N`
129
119
  `representation_error(max_arity)` branch is intentionally unreachable unless a
130
120
  future processor profile selects a finite compound-term limit; closure
131
121
  expansion itself remains covered by strict regressions.
@@ -172,8 +162,7 @@ describes: a later `force(false)` does not cancel an earlier `force(true)` when
172
162
  a Resource Error or System Error occurs during closure. Focused strict tests
173
163
  cover both overlap families.
174
164
 
175
- The next row-audit tranche makes the remaining exit criterion concrete rather
176
- than leaving it as a broad test-count claim.
165
+ The row-level matrices make the exit criteria concrete rather than leaving conformance as a broad test-count claim.
177
166
  [ISO-BUILTIN-MODE-ERROR-MATRIX.md](ISO-BUILTIN-MODE-ERROR-MATRIX.md) now records
178
167
  each prescribed mode/error row for the 8.2-8.5 and 8.15-8.17 slices, and
179
168
  [ISO-PROCESSOR-REQUIREMENTS.md](ISO-PROCESSOR-REQUIREMENTS.md) decomposes the
@@ -213,9 +202,7 @@ individual-error outcomes in `ISO-BUILTIN-MODE-ERROR-MATRIX.md`. During this
213
202
  pass `stream_property/2` exposed a lifecycle distinction: a syntactically valid
214
203
  stream-term for a stream that has been closed denotes no currently open stream
215
204
  property pair and therefore fails, whereas a term that is not a stream-term is
216
- still a `domain_error(stream, ...)`. This leaves the remaining #65 checklist
217
- focused on Clause 6/7/9 processor semantics and external corpora rather than
218
- unmapped built-in tables.
205
+ still a `domain_error(stream, ...)`. The higher-level Clause 6, 7.10, and 7.12 gates now close those surrounding processor requirements as well, so the built-in table participates in a fully dispositioned release-facing ledger.
219
206
 
220
207
  ## Post-Corrigendum STC cross-check
221
208
 
@@ -231,7 +218,7 @@ type precedence, `read_term/3` EOF handling, mixed arithmetic comparison,
231
218
  and `bagof/3` answer order. STC #21 is also used to keep finite-host exhaustion
232
219
  of unbounded integer operations inside the Prolog resource-error model.
233
220
 
234
- Issue #66 corresponds to the newer STC arity discussion: `max_arity` describes
221
+ The newer STC arity discussion clarifies that `max_arity` describes
235
222
  compound terms. EyeProlog therefore selects `unbounded` and does not invent a
236
223
  finite predicate/procedure ceiling merely to preserve the former 65535 value.
237
224
  STC #56, which became a WG17 action item, is implemented narrowly for database
@@ -271,10 +258,9 @@ directive may still add an infix `?-` definition; strict mode reads that as an
271
258
  ordinary term rather than as a quad.
272
259
 
273
260
  Module and DCG compatibility features remain supported and tested in the
274
- normal EyeProlog profile. They are tracked separately in ISO-MATRIX.md rather
275
- than being silently folded into the Part 1 strict-core claim. The project does
276
- not currently assert that this evidence closes every requirement of ISO/IEC
277
- 13211-2:2000 or ISO/IEC TS 13211-3.
261
+ normal EyeProlog profile, but they are not folded into the Part 1 strict-core
262
+ claim. The project does not currently assert that this evidence closes every
263
+ requirement of ISO/IEC 13211-2:2000 or ISO/IEC TS 13211-3.
278
264
 
279
265
  ## Release gate
280
266
 
@@ -292,13 +278,25 @@ outputs are never auto-accepted.
292
278
 
293
279
  ## Exit criteria for a full conformance claim
294
280
 
295
- [ISO-EXIT-CRITERIA.md](ISO-EXIT-CRITERIA.md) is now the authoritative checklist
296
- for moving public wording from “ISO profile” to “conforming ISO/IEC 13211-1
297
- processor”. It requires closure of every remaining normative `audit` row,
298
- reproducible offline external comparison evidence, and no unexplained deviation.
281
+ The Part 1 audit is closed by explicit dispositions, not by a test-count threshold.
282
+ The table below records the closure criteria used by the project. A `covered`
283
+ status is an implementation/audit result, not an independent certification. Public
284
+ post-N289 STC drafts remain review input until standardized.
299
285
 
300
- The row-level 8.2-8.17 built-in audit, 7.1-7.3 term-semantics audit, and
301
- 7.9/Clause 9 evaluable-functor audit are already closed. The checklist remains
302
- open because Clause 6, 7.4-7.8, higher-level 7.10/7.12, their Clause 5 dependency
303
- rows, and part of the external conversion/variable-name evidence are not yet
304
- fully reduced to explicit dispositions.
286
+ | Criterion | Status | Evidence |
287
+ | --- | --- | --- |
288
+ | Clause 5 processor obligations have explicit dispositions | covered | `ISO-PROCESSOR-REQUIREMENTS.md` gives explicit outcomes for 5.1-5.5, including the strict/normal extension boundary. |
289
+ | Clause 6 lexical/syntactic requirements have explicit dispositions | covered | the strict Clause 6 production/rejection gate and the 366-case vendored WG17 matrix cover the standard families; cross-profile preservation verifies that normal extensions do not reinterpret strict-accepted text. |
290
+ | Clause 7 semantic requirements have explicit dispositions | covered | 7.1-7.12 now have explicit semantic, implementation-defined, or error-envelope dispositions backed by strict tests and the specialized matrices. |
291
+ | Clause 8 built-in modes/errors have explicit dispositions | covered | `ISO-BUILTIN-MODE-ERROR-MATRIX.md` closes 8.2-8.17 row by row |
292
+ | Clause 9 evaluable-functor requirements have explicit dispositions | covered | `ISO-EVALUABLE-FUNCTOR-MATRIX.md` plus the strict arithmetic regression closes the published Part 1 + Corrigenda arithmetic rows |
293
+ | Implementation-defined choices are documented | covered | `ISO-IMPLEMENTATION-DEFINED.md` is the Clause 5.4 decision index and strict tests pin execution-visible choices |
294
+ | Implementation-specific strict/normal boundary is documented and tested | covered | all 5.5 hooks have explicit dispositions; the WG17 cross-profile gate verifies syntax-preservation for standard text accepted by the strict reader. |
295
+ | Published Corrigenda 1-3 are incorporated | covered | dedicated conformance/strict tests and this ledger track all three published Corrigenda |
296
+ | Current post-N289 draft is tracked without silently changing the published baseline | covered | `STC-DRAFT-STATUS.md` tracks reviewed draft items separately from normative requirements |
297
+ | Independent external syntax corpus is an offline release gate | covered | the vendored WG17 syntax matrix has 366 executable dispositions checked against its upstream expectations |
298
+ | Third-party standard-core regression provenance is retained | covered | adapted Logtalk, Scryer, Trealla, and SWI-Prolog cases retain source identifiers and licenses in `THIRD_PARTY.md` |
299
+ | No unexplained deviation remains in the release-facing ledger | covered | the release-facing ledger contains no remaining `audit` rows; documented variation points are implementation-defined/specific or draft-only rather than unexplained deviations. |
300
+
301
+ The specialized row matrices are evidence for this ledger, not separate public
302
+ status documents. *The Art of EyeProlog* remains the implementation reference.
@@ -85,7 +85,6 @@ unbounded integer model and translate finite-host exhaustion to
85
85
  ## Closure note
86
86
 
87
87
  With this matrix and the strict arithmetic regression, the release-facing
88
- Clause 7.9 and Clause 9 rows are `covered`. The remaining issue #65 audit is not
89
- therefore an arithmetic audit: it is concentrated in Clause 6 text/rejection,
90
- Clause 7.4-7.8 and 7.10/7.12 processor semantics, their Clause 5 dependencies,
91
- and the remaining external-corpus exit criteria.
88
+ Clause 7.9 and Clause 9 rows are `covered`. The surrounding processor and syntax
89
+ requirements are dispositioned in `ISO-PROCESSOR-REQUIREMENTS.md` and
90
+ `ISO-COMPLIANCE.md`.
@@ -65,7 +65,7 @@ Status values are:
65
65
  | 9.1.3.1 | Integer division rounding function `rndI` | Truncation toward zero, matching the `integer_rounding_function=toward_zero` flag. | **defined** — BigInt division for `//` in `src/iso-arithmetic.js`. |
66
66
  | 7.11.2.1 | Whether preparation-time `Convc` affects execution-time `Convc` | Yes: mappings created while Prolog text is prepared are retained and initialize the solver's execution-time conversion map. | **defined** — `src/parser.js`, `src/program.js`, `src/solver.js`. |
67
67
  | 7.11.2.2 | Effect when `debug=on` | The flag is accepted and stored; it does not change goal semantics or enable a debugger. | **defined** — `src/solver.js`; no semantic branch depends on `debug`. |
68
- | 7.11.2.3 | Default `max_arity` | `unbounded`: EyeProlog imposes no fixed semantic ceiling on compound-term arity. Practical host allocation exhaustion is a resource condition. This flag is distinct from any potential implementation-specific procedure-arity limit; EyeProlog currently declares no separate finite procedure limit. | **defined** — `src/iso-limits.js`, `src/solver.js`, `src/parser.js`, `src/iso.js`; issue #66 regression coverage. |
68
+ | 7.11.2.3 | Default `max_arity` | `unbounded`: EyeProlog imposes no fixed semantic ceiling on compound-term arity. Practical host allocation exhaustion is a resource condition. This flag is distinct from any potential implementation-specific procedure-arity limit; EyeProlog currently declares no separate finite procedure limit. | **defined** — `src/iso-limits.js`, `src/solver.js`, `src/parser.js`, `src/iso.js`; strict regression coverage. |
69
69
  | 7.11.2.5 | Default `double_quotes` | `chars`. | **defined** — `src/solver.js`, parser flag state. |
70
70
  | 7.12.1 | Second argument of `error/2` | The default context term is the atom `eyeprolog`. A few implementation-specific diagnostics may deliberately supply a more specific context term. | **defined** — `formalErrorTerm()` in `src/iso.js`. |
71
71
  | 7.12.2(f) | Implementation-defined representation limits | Character and character-code operations are limited to Unicode scalar values; surrogates and values above U+10FFFF are representation errors. Arity/integer values are modeled as unbounded but may hit host/resource limits. Float input overflow uses the implementation-specific `max_float`/`min_float` representation names documented by the STC-oriented tests. | **defined** — parser/ISO numeric and character guards. |
@@ -83,7 +83,7 @@ Status values are:
83
83
  | 9.4.5 | Bitwise complement | BigInt complement, i.e. `~N = -N-1`. | **defined** — `~a`. |
84
84
  | Cor.2 9.4.6 | `xor/2` with negative operands | BigInt infinite-two's-complement semantics. | **defined** — `a ^ b`. |
85
85
 
86
- ### Issue #56: one underflow policy
86
+ ### Floating underflow policy
87
87
 
88
88
  Clause 9.1.4.2 permits the processor to choose `round(x)` or the exceptional
89
89
  value `underflow` for a tiny non-zero result when an operation is governed by
@@ -7,27 +7,26 @@ extension boundary visible as its own auditable row.
7
7
 
8
8
  The normative baseline is ISO/IEC 13211-1:1995 plus Technical Corrigenda 1-3.
9
9
  `covered` means the requirement has an implementation/documentation decision
10
- and executable evidence. `audit` means the implementation has relevant tests
11
- but the project has not yet reduced every dependent Clause 6-9 requirement to
12
- an explicit pass/not-applicable decision. No row here is an independent
10
+ and executable evidence. `not applicable` records a standard variation that does
11
+ not apply to EyeProlog's selected processor profile. No row here is an independent
13
12
  certification claim.
14
13
 
15
14
  ## 5.1 — conforming processor obligations
16
15
 
17
- | Requirement | Status | Current evidence / remaining work |
16
+ | Requirement | Status | Current evidence |
18
17
  | --- | --- | --- |
19
- | 5.1(a) prepare conforming Prolog text | audit | parser/preparation tests, directives, include behavior, preparation-time operators/flags/character conversion, and the complete vendored WG17 syntax matrix; the remaining Clause 6/7.4 shall-by-shall map is still open |
20
- | 5.1(b) execute conforming Prolog goals | audit | the 7.1-7.3 term-semantics matrix, 7.9/Clause 9 evaluable-functor matrix, and complete 8.2-8.17 built-in row audit are closed; remaining dependency rows are 7.4-7.8, higher-level 7.10, and residual processor-level 7.12 semantics |
21
- | 5.1(c) reject nonconforming text/read terms | audit | syntax-error corpus, WG17 negative syntax cases, strict extension rejection; exhaustive Clause 6 rejection mapping remains open |
18
+ | 5.1(a) prepare conforming Prolog text | covered | the strict Clause 6 production/rejection gate, complete vendored WG17 syntax matrix, and closed 7.4 preparation/directive matrix cover text recognition and preparation |
19
+ | 5.1(b) execute conforming Prolog goals | covered | 7.1-7.12 semantics, all 8.2-8.17 built-in rows, and Clause 9 evaluable functors have explicit executable dispositions |
20
+ | 5.1(c) reject nonconforming text/read terms | covered | WG17 negative cases plus focused malformed token, list, operator, argument, escape, comment, and extension-syntax cases exercise rejection across the Clause 6 families |
22
21
  | 5.1(d) specify permitted variations | covered | `ISO-IMPLEMENTATION-DEFINED.md` records the Part 1 implementation-defined choices and implementation-specific extension families |
23
22
  | 5.1(e) offer a strictly conforming mode | covered | CLI `--iso-strict` and API `isoStrict: true`; registry/directive/operator/flag extension filtering plus disabled implementation-specific execution shortcuts |
24
23
 
25
24
  ## 5.2-5.4 — text, goals, and documentation
26
25
 
27
- | Requirement | Status | Current evidence / remaining work |
26
+ | Requirement | Status | Current evidence |
28
27
  | --- | --- | --- |
29
- | 5.2 conforming and strictly conforming Prolog text boundary | audit | strict parser accepts Part 1 + Corrigenda syntax plus implementation-defined PCS choices and rejects implementation-specific language facilities; full Clause 6/7.4 dependency audit remains open |
30
- | 5.3 conforming and strictly conforming Prolog goal boundary | audit | strict registry/control/evaluable filtering plus closed 7.1-7.3, 7.9/Clause 9, and 8.2-8.17 row matrices; remaining general execution/control, higher-level stream, and processor-error semantics keep the top-level goal boundary open |
28
+ | 5.2 conforming and strictly conforming Prolog text boundary | covered | strict parsing/preparation accepts the Part 1 + Corrigenda language under the documented PCS choices and rejects implementation-specific language facilities; normal-profile preservation is checked against every strict-accepted WG17 case |
29
+ | 5.3 conforming and strictly conforming Prolog goal boundary | covered | strict registry/control/evaluable filtering plus closed 7.1-7.12, 8.2-8.17, and Clause 9 audits define the goal boundary |
31
30
  | 5.4 accompanying documentation for implementation-defined and implementation-specific features | covered | `ISO-IMPLEMENTATION-DEFINED.md`, *The Art of EyeProlog*, strict-boundary documentation, and release-facing conformance ledgers |
32
31
 
33
32
  ## 5.5 — extension boundaries
@@ -35,7 +34,7 @@ certification claim.
35
34
  | Requirement | Status | EyeProlog decision / evidence |
36
35
  | --- | --- | --- |
37
36
  | 5.5 general extension rule | covered | normal mode may provide documented extensions; strict mode removes their Part 1 interpretation rather than changing implementation-defined choices |
38
- | 5.5.1 syntax extensions preserve standard token/text meaning | audit | WG17 syntax is a release gate and strict mode removes module/DCG/quad interpretation. Every vendored WG17 case that succeeds in the Part 1 strict reader now has an identical normal-profile observable outcome, directly checking that normal syntax extensions do not reinterpret accepted standard text. A complete one-row preservation map for every Clause 6 production remains open |
37
+ | 5.5.1 syntax extensions preserve standard token/text meaning | covered | WG17 syntax is a release gate and strict mode removes module/DCG/quad interpretation. Every vendored WG17 case that succeeds in the strict reader has the same observable outcome in normal mode; the focused Clause 6 gate separately covers each standard token/term family and malformed counterparts. |
39
38
  | 5.5.2 additional predefined operators | covered | strict mode starts from the Part 1 predefined operator table; normal-profile extra operators are documented and filtered |
40
39
  | 5.5.3 initial character-conversion mapping | covered | identity initial mapping; user changes are exercised through preparation/execution `char_conversion/2` behavior |
41
40
  | 5.5.4 additional term types | covered | the normal JavaScript API's `stringTerm(Text)` is documented as an implementation-specific sixth term type, including disjointness, ordering, clause conversion, lack of source token syntax, expression behavior, and writing; strict program/goal entry rejects that type with `representation_error(term)` |
@@ -47,10 +46,26 @@ certification claim.
47
46
  | 5.5.10 additional evaluable functors/types | covered | strict mode rejects the normal-profile evaluable `e` extension while retaining the full Part 1 + Corrigenda arithmetic set. `ISO-EVALUABLE-FUNCTOR-MATRIX.md` now closes the Clause 9 semantic/error audit and pins the 9.1.4.2 `resultF`, mixed-type `max/2`/`min/2`, and signed bitwise/shift choices. Post-N289 STC #75 remains separate from the published baseline |
48
47
  | 5.5.11 reserved atoms | not applicable | EyeProlog declares no reserved-atom extension; extension names remain ordinary atoms unless used in a documented syntactic/predicate/directive role |
49
48
 
49
+ ## Clause 6 syntax-preservation closure
50
+
51
+ The production audit is kept here rather than in another status file. The strict
52
+ regression gate covers the following families directly, while the complete WG17
53
+ matrix supplies the detailed independent syntax cases.
54
+
55
+ | Clause family | Disposition | Executable evidence |
56
+ | --- | --- | --- |
57
+ | 6.2 Prolog text/data boundary | covered | complete-term parsing, end-token/boundary rejection, preparation tests |
58
+ | 6.3.1-6.3.3 atomic, variable, functional compound terms | covered | atoms, integers/floats, negative numbers, variables, functional arguments |
59
+ | 6.3.4 operator notation | covered | precedence/associativity/operator-table tests plus invalid `xfx` chaining |
60
+ | 6.3.5-6.3.7 list, curly and double-quoted notation | covered | list tails, curly terms, `double_quotes` behavior and read/write round trips |
61
+ | 6.4.1-6.4.8 tokens | covered | layout/comments, quoted escapes, names, integer bases/character codes, floats, double-quoted tokens, solo/meta tokens, malformed counterparts |
62
+ | 6.5 processor characters | covered | documented Unicode-scalar PCS and lexical classes, invalid-scalar representation errors |
63
+ | 6.6 collating sequence | covered | Unicode scalar value collation, atom-order regressions |
64
+ | 5.5.1 preservation under extensions | covered | every WG17 case accepted in strict mode has the same observable result in normal mode |
65
+
50
66
  ## Exit-use rule
51
67
 
52
- A top-level row stays `audit` until all of the normative clauses it depends on
53
- have explicit pass, not-applicable, or documented implementation-defined
54
- outcomes. `ISO-EXIT-CRITERIA.md` records the same dependency closure from the
55
- release-exit perspective. This prevents a large green regression suite from
56
- being mistaken for a completed processor-requirement audit.
68
+ All top-level rows now have covered, not-applicable, or documented
69
+ implementation-defined outcomes. `ISO-COMPLIANCE.md` records the same closure in
70
+ its embedded release-exit checklist. The green suite is evidence for those
71
+ dispositions; it is not presented as independent certification.