Changes for version 0.08 - 2026-10-01

  • Reworked with Claude (claude-opus-5-5), driven by a review checklist; all changes to the docs audited.
  • Name Resolution. Incompatible: unqualified recipes (#emb x, or out__embed() with an undefined namespace) are resolved late, during assembly: from the lens vertex if the promise sets aim=, otherwise starting from the namespace in which the enclosing section was requested (which may be a child of the namespace where the section's text was found). The resolution order (depth-first through the parents, in the declared order) is documented.
  • Operands. Operands of a promise are bound when it is expanded, in the caller's context: NS:name starts at NS, an unqualified name at the caller's namespace, and $ARGVn passes on the caller's own operand, so recipes can forward their operands. Stopgap: when a promise switches the lens (aim=), every operand must be tagged old=... or new=... (E_UNTAGGED_OPERAND).
  • Prefix-scoped Settings. Fab's own settings (list_keys, hash_keys, lens_affects, inheritance_graph, group_flavors, group_nesting, blinders/*, callbacks, callbacks_bundle/*, hash_key_sort_order, max_recursion_depth) are looked up under each prefix of Fab/call_stack_prefixes, the most recent first; NS__set_parents() writes under the current prefix.
  • Errors. Incompatible: E_UNDEFINED_PARENT is raised during assembly, when the search reaches a parent with neither sections nor parents; #set_parents accepts parents declared before they exist. New codes: E_UNKNOWN_BLINDER (was silently ignored), E_UNTAGGED_OPERAND. The permitted_joiners_modulo error now starts with E_TYPE_MISMATCH.
  • Directives. Incompatible: #target_section / #create_section take any non-space names (so lens namespaces like LaTeX/as_TOC work), and extra words are E_SYNTAX_ERROR. Incompatible: the count of #pop / cfg__pop() must be a non-negative integer, and 0 pops nothing (it used to empty the list). Incompatible: the legacy alias asiffrom= of aim= is removed.
  • Lenses. Incompatible: the lens stack starts empty (it used to start with _main).
  • Documentation. The SYNOPSIS runs with the default callbacks, and the not-yet-implemented constructs are kept at its end, marked as such. New: the syntax of the default directives, an example of partial undo, and the callback signatures in PLACEHOLDERS. Planned features (#emb[callbacks=...], uplevel directives, the #set_root errors) are marked [Planned]. Fixed a POD syntax error.
  • Makefile.PL: MIN_PERL_VERSION 5.022; FreezeThaw 1.00 is required.
  • Tests. Review items still open are TODO tests named after the item.
    • t/13-directives-synopsis.t SYNOPSIS extracted from the POD, run and compared; default directive syntax t/14-config-and-groups.t Configuration, call stack, callbacks and groups t/15-assembly.t Resolution order, late resolution, operands, lenses t/16-dist.t Prerequisites and POD syntax t/17-coverage-gaps.t Documented behaviour not exercised before

Modules

A powerful, general-purpose document expansion framework (currently Control Flow, Loops, and Caching are unimplemented {???})