Revision history for Perl extension Text::Fab.

0.01		  Fri Sep  5 07:50:43 2025
	- original version; created by h2xs 1.23 with options
		-Xn Text::Fab

	A lot of technical work on the stub implementation, documentation and the test suite was passed to Gemini 2.5 Pro
		(with 32K thinking budget + very delicate system instructions).

	The implementation supports the most basic parts of processing pipeline only.  Only the pure-config__* subsystem is
	covered by the test suite.

0.02	Reworked with Gemini 3.8 Flash Medium (and one iteration with High) in a pure-chat in AI Studio; no system instructions.
	The only target was to make the test suite to match the docs (and fix the implementation accordingly).
	Only the updates to the docs checked by a human.
	The model claims that all the APIs (except Control Flow, Loops, Caching, Root Directives) are implemented and covered by
	the test suite.

0.03	Continue reworking with Gemini 3.8 Flash Medium in a pure-chat in AI Studio; no system instructions.
	Restore the original comments in the code.  Add new comments likewise.
	Fix a mismatch of the semantic of preserved blinding lists with what is written in the docs.
	Fix the scalar set/append with multiple arguments (only one allowed), allow string "offset" for hashes.
	Implement priority-based group__postpone; support insertion of undo actions from undo actions.
	Even if errors happen, all the postponed actions are performed.

	  t/10-corner-cases.t		New file

0.04    Better coverage:

	  t/11-coverage-expansion.t	New file

0.05    POD: Preview of the architecture on a (contrived) example.  (Might not map 100% to the current implementation.)
		Completeness of Directive Parser:
	Added handlers for #prepend, #pop, and #create_section, wiring them to cfg__prepend, cfg__pop, and out__create_section.
	Added target section tracking stack ($fab->{target_stack}) to support #end_section (as shown in the SYNOPSIS), restoring
	  the target section to the enclosing context.
	Extended #emb parsing to support qualified namespace:basename syntax (e.g., #emb ChapterLayout:title and #emb _main:title).
	Standardized default directive syntax errors to include E_SYNTAX_ERROR while maintaining compatibility with _handle_error.
		Prefix Call Stack Lifecycle & Prefix-Aware Types:
	Implemented call_stack__push($prefix, [$filter_name]) and call_stack__pop(), with underflow protection for the base prefix
	  'Fab/'.
	Updated _get_key_type to resolve hash_keys and list_keys using cfg__get_prefixed_scan (without redundant fallbacks),
	  enabling localized prefix-scoped type definitions.
		Introspection of Inclusion State:
	Initialized and maintained $self->{config}{'opened_includes'} alongside 'opened_groups' inside include__text, cleanly
	  exposing the include path chain.

	  Makefile.PL		put
	    use 5.022000;
            TEST_REQUIRES => {
                'Test::Exception' => 0,	## Present (?) since Perl 5.18 (which bundles MakeMaker 6.90 >= 6.64)
            },

	Better coverage:

	  t/12-parser-and-prefix-lifecycle.t New file

0.06  2026-10-22
    [ Architecture & Callbacks ]
    - Canonical engine callbacks moved to 'Fab/callbacks_bundle/dbg0'.
    - 'Fab/callbacks' now accepts a bundle name string (e.g. 'dbg0') in addition
      to direct hashrefs; resolved and propagated during initialization and scoping.
    - Eliminated ad-hoc fallback guessing chains (//) across callback retrieval;
      operational callbacks now resolve uniformly via cfg__get_prefixed_scan().
    - Added support for scoped callback bundle switches via #start_group[callbacks=...]
      and promise-local overrides via #emb[callbacks=...].

    [ Embeds, Parameter Passing & Lenses ]
    - Modernized #emb directive grammar to #emb[<opts>] <recipe> [<args...>].
      Supported options in [...] include aim=..., in=..., with_blinder=...,
      callbacks=..., and resolve_args=....
    - Primitive out__embed() now takes ($recipe_basename, $recipe_ns, \@args, \%opts).
    - Parameterized recipes: section arguments passed to a recipe are bound to
      $ARGV0, $ARGV1, etc. in the recipe body via an internal call frame stack.
    - Implemented lens affection massaging with deterministic static joining
      (_fmt_lens_join) formatting candidate lenses as (A)/B and matching against
      registered transitions in 'Fab/lens_affects'.
    - Embed resolution now traverses the namespace DAG from the massaged virtual
      root while respecting blinders and dynamic argument bindings.

    [ Input & Inclusion ]
    - Extended #include and include__text() to support container targets:
      'section' and 'configkey'.
    - Enforced strict arity validation across all inclusion modes:
      * 'filename' and 'string' strictly require exactly 1 target argument.
      * 'section' and 'configkey' strictly require 2 arguments: position 2 is
        the joiner list key, and position 3 is the target container.
      Arity mismatches now immediately halt with E_SYNTAX_ERROR (directives)
      or E_TYPE_MISMATCH (Perl API).
    - Section and configkey inclusions reuse the cyclic delimiter engine
      (out__get_joined / cfg__get_joined).

    [ Snapshot & Undo Engine ]
    - Added a compatibility hook for FreezeThaw::copyContents treating compiled
      CODE references as atomic/immutable values, preventing dclone() crashes
      when configuration contains duplicated or shared code references across
      snapshots and groups.

    [ Documentation & Tests ]
    - Updated POD to reflect modern #emb, #include, lens, and callback semantics
      while preserving design rationale and marking planned subsystems as {???}.
    - Modernized test suite (t/01 through t/12) to exercise strict arity,
      parameterized recipes, lens affections, and container inclusion.

0.0601	Update to requiring 1.00 of FreezeThaw — instead of patching!

0.07 - 2026-10-23
* Recursion & Cycle Detection. Parameterized #emb resolution in assemble()
  now differentiates invocations by their active argument signatures rather
  than unconditionally blocking repeated "$ns:$basename" identifiers along
  the active branch. Added the 'Fab/max_recursion_depth' configuration limit
  (default 1000) to trap runaway cycles while permitting deep recursive recipe
  decomposition.
* Configuration & Typing. Corrected the meta-configuration classification of
  'Fab/list_keys' in new() to be registered under 'Fab/hash_keys' rather than
  listing itself as a list key, preventing cfg__set() from clobbering the
  internal hash into an array reference and causing dereference crashes in
  _get_key_type().
* Inclusion & Options Forwarding. Normalized include__text() across all modes
  ('filename', 'string', 'section', 'configkey') to peel off and accept an
  optional trailing options hashref without triggering E_TYPE_MISMATCH arity
  errors. Updated the default directive parser to pass bracketed directive
  options (#include[opts] ...) through to include__text().
* Test Suite. Added t/50_peano.t to stress-test deep recursive stack frames,
  lexical call-frame isolation, and nested promise resolution by modeling pure
  unary Peano arithmetic (addition, multiplication, non-negative subtraction,
  and integer division with remainder) strictly on top of add1/pred primitives.

  t/50_peano.t		Peano arithmetic (honestly implemented in terms of incr, decr and is0)
  t/51_rpn.t		RPN calculator for embedded expressions
  t/52_infix.t		Infix notation calculator
  t/53_at-end-paragraph_vars.t	Same, with ${var} accessing the value of the variable at the end of the current paragraph

0.08 - 2026-10-??
* 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