Changelog
View SourceAll notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.4.1 - 2026-01-09
Added
- Add
juxtfunction combinator for multi-criteria operations - Add variadic function support with rest parameters
[a & rest] - Add
max-keyandmin-keyfor variadic comparisons - Add IEEE 754 special values:
##Inf,##-Inf,##NaN - Add
float_precisionoption to SubAgent (default: 2 decimal places) - Add
context_descriptionsfor automatic data inventory in prompts - Extend
reduceto work on maps, sets, and strings - Add variadic
updateandupdate-in(match Clojure semantics) - Add
java.time.LocalDate/parsefor date handling
Fixed
- Preserve memory state on parse/analysis errors (multi-turn recovery)
- Handle
return/failcorrectly in threading macros (->,->>) - Make
return/failterminate execution immediately - Restore caller environment after closure execution
- Improve error messages with actionable suggestions
0.4.0 - 2026-01-06
Added
- Add SubAgent API for high-level agent definition with type-safe signatures, auto-chaining, and resource limits
- Add Tracer system for immutable recording and visualization of agent execution
- Implement loop and recur support for iterative computation in PTC-Lisp
- Add character literals and string-as-sequence support for more flexible data handling
- Add
pcallsfor parallel execution of heterogeneous thunks - Add
pmapfor parallel map evaluation - Support vector paths in collection extraction functions for nested data access
- Add Clojure namespace normalization to improve LLM resilience
Fixed
- Correct argument order for sort-by function to match Clojure semantics
- Fix update-vals argument order to match Clojure 1.11
- Update supported functions list (add frequencies, add float and for)
- Improve multi-turn agent guidance and system prompts
- Add specific error messages for predicate functions
- Fix Clojure compatibility for destructuring, count, and empty?
0.3.4 - 2025-12-25
Added
- Add seqable map support to filter, remove, and sort-by operations
- Add entries and identity functions to PTC-Lisp
- Add sandbox support to PtcRunner.Lisp for resource limits
Fixed
- Replace length() comparisons with Enum.empty? alternative
- Update error handling to use error tuples instead of raised exceptions
0.3.3 - 2025-12-22
Added
- Add
updateandupdate-inmap bindings for transforming values with functions - Add function-based key support to
*-byoperations for custom sorting and grouping - Add spec validation system for PTC-Lisp with multi-line examples and section reporting
- Improve JSON DSL prompts for better LLM accuracy
Fixed
- Fix JSON agent to retry on empty LLM responses
- Improve deterministic ordering in keys/vals output
- Align
assoc-inandupdate-inwith Clojure semantics for intermediate path creation - Correct
update/3semantics to pass nil to function for missing keys - Fix zip and into operations to return vectors instead of tuples
- Handle empty and nil LLM responses gracefully in agent loop
0.3.2 - 2025-12-20
Added
- Add format_error/1 for human-readable error messages
Fixed
- Include ptc-lisp-llm-guide.md in hex package
0.3.1 - 2025-12-13
Added
- Improve PTC-JSON system prompt for better LLM accuracy
- Add object operation to construct maps with evaluated values (#253) (#254) (#254)
- Enhance Clojure validation to execute and compare results
- Add auto-generated report filenames and reports directory
- Add cross-dataset join test case and clean up old reports
- Add --show-prompt option to display system prompts
- Add arithmetic operations (add, sub, mul, div, round, pct) #255
- Add membership operations (in, filter_in) (#257) (#259) (#259)
- Add implicit object literals for memory storage (#256) (#261) (#261)
Fixed
- Handle Map values in constraint errors and fix GenServer timeout
- Correct round operation documentation for precision constraints
- Improve LLM prompt with arithmetic ops and better examples
- Evaluate filter_in value when it's a DSL expression
- Add sort_by order:desc to LLM prompt
0.3.0 - 2025-12-11
Added
- Add PTC-Lisp LLM generation benchmark (Phase 1)
- Improve generation and judge prompts for PTC-Lisp benchmark
- Improve benchmark with edge cases, better judge, and dry run output
- Add autonomous issue creation and GitHub Project integration to PM workflow
- Enhance PM workflow with tech debt priority and efficiency fixes
- Auto-trigger implementation on ready-for-implementation label
- Auto-trigger code review for PRs from claude/* branches
- Install git pre-commit hook in Claude workflow
- Create PtcRunner.Json public API and deprecate PtcRunner (#103) (#103)
- Allow full Bash access in claude.yml workflow
- Implement PTC-Lisp parser infrastructure (Phase 1) - Closes #106 (#107) (#107)
- Implement PTC-Lisp analyzer infrastructure (Phase 2) - Closes #108 (#109) (#109)
- Implement PTC-Lisp eval infrastructure (Phase 1) - Closes #111 (#112) (#112)
- Implement PtcRunner.Lisp entry point with memory contract - Closes #115 (#116) (#116)
- Add hourly schedule trigger to PM workflow
- Add pre-computed phase status to PM workflow prompt
- Implement LispGenerators module with StreamData generators (#130) (#132) (#132)
- Add property tests for evaluation safety and determinism (#133) (#134) (#134)
- Add domain property tests for arithmetic, collections, types, and logic (#135) (#136) (#136)
- Support flexible key access in where clause field accessors (#137) (#138) (#138)
- Add Lisp.Schema module and extend Runtime with flexible key access (#139) (#139)
- Add truncation hints to guide LLM query refinement
- Add PTC-Lisp CLI and enhance demo infrastructure
- Refactor PM workflow to use Epic Issue pattern
- Add LispTestRunner and improve multi-turn support
- Add file size analysis to PR review workflow
- Add #{...} set literal syntax support (Phase 1 of #164) (#166) (#166)
- Add {:set, [t()]} to AST type specifications (#167) (#168) (#168)
- Add set analysis support (Phase 3 of #164) (#170) (#170)
- Add set evaluation support (Phase 4 of #164) (#172) (#172)
- Add .env support and model selection for e2e tests
- Add flex_fetch/2 and flex_get_in/2 to Runtime module (#188) (#188)
- Add update-vals for map value transformation
- Create TestRunner.Base with shared constraint/formatting functions (#197) (#197)
- Create TestRunner.Report with markdown generation (#199) (#199)
- Create TestRunner.TestCase with shared test definitions (#201) (#201)
- Create CLIBase with shared CLI utilities (#203) (#203)
- Set up demo test infrastructure (MockAgent, test config) - Closes #205 (#206) (#206)
- Create JsonTestRunner with shared modules support
- Create JsonCLI module with test mode support (#217) (#217)
- Add memory support to JSON Agent (#220) (#221) (#221)
- Add agent injection to test runners for MockAgent testing (#222) (#223) (#223)
- Add ModelRegistry and unify test cases (#227) (#227)
- Add --runs=N option for running tests multiple times
- Add keyword/string type coercion to where clause comparisons (#232) (#233) (#233)
- Align JSON DSL memory model with Lisp (#234)
- Add take, drop, and distinct operations to JSON DSL (#236) (#243) (#243)
- Add enhanced stats to demo test runner report (#246) (#249) (#249)
Fixed
- Move PM prompt to command file to fix expression length limit
- Use Bash(gh:*) pattern for PM workflow
- Trigger PM workflow on claude-approved label too
- Re-trigger code review on sync for claude/* branches
- Use --force in precommit to catch stale .beam files
- Add spec document verification to code review prompt
- Include PR comments and review comments in claude.yml
- Add mkdir permission to claude.yml workflow
- Add explicit Claude CLI install to workaround action bug
- Add safety net to push unpushed commits in PR fix workflow
- Mark PTC-Lisp implementation checklist items as complete (#123) (#123)
- Update README with PTC-Lisp announcement and API migration guidance
- Complete API migration in Integration with LLMs section
- Implement compile-time extraction for PTC-Lisp schema prompt (#144) (#144)
- Configure StreamData to run 300 iterations in CI (#146) (#146)
- Make issue review always update the issue body
- Add sequential destructuring pattern type to CoreAST (#149) (#149)
- Extend analyze_pattern for vector destructuring patterns
- Complete PR #151 - Add fn parameter destructuring documentation and tests
- Complete PR #151 - Remove stale documentation and add insufficient elements test
- Complete PR #151 - Remove stale documentation and add insufficient elements test
- Add E2E test for group-by with destructuring (#153) (#153)
- Add analyzer unit tests for fn parameter destructuring patterns (#155) (#155)
- Add evaluator unit tests for fn parameter destructuring patterns (#157) (#157)
- Update LLM guide map example to use fn destructuring syntax (#159) (#159)
- Enable sort-by with comparator and builtin HOF arguments (#160) (#160)
- Extend multi-arity support to get and get-in (#163) (#163)
- Unify concurrency groups for Claude issue workflows
- Add MapSet-safe collection operations and set runtime support (#175) (#175)
- Add set literal formatting support to formatter (Phase 6 of #164) (#178) (#178)
- Add test coverage for remove, mapv, empty?, and count on sets (#181) (#181)
- Split eval_test.exs into multiple focused test files (#182) (#182)
- Extract shared dummy_tool test helper (#183) (#184) (#184)
- Support string key parameters in Lisp runtime functions (#185) (#185)
- Standardize OpenAI model to gpt-5.1-codex-mini
- Rename duplicate module name in integration_test.exs
- Wire all call sites to use flex_fetch/flex_get_in for string/atom key interop
- Add integration tests and update docs for flexible key access (Phase 3)
- Update docs for flexible key access implementation
- Add @doc annotation to flex_get for API consistency
- Update ptc-lisp-overview.md to reflect completed flex key access (#192) (#192)
- Update format_error references to PtcRunner.Json.format_error
- Update CHANGELOG format_error reference
- Change update-vals argument order to match Clojure 1.11
- Remove duplicate incorrect update-vals signature from LLM guide
- Handle FunctionClauseError in builtins with descriptive type errors
- Handle FunctionClauseError in multi-arity functions and complete type error messages
- Delete old TestRunner module and update README references (#219) (#219)
- Require closing keyword in PR body for auto-close
- Add --report option to Lisp CLI Options table
- Update demo CLI to use ModelRegistry.resolve pattern (#229) (#229)
- Update guide.md to reflect new JSON DSL API signature
- Update guide.md and demo to use new 4-tuple return format
- Handle invalid map destructuring syntax gracefully in analyzer
- Improve error message for update-vals with swapped arguments
- Update JSON agent to use new memory model API (#235) (#241) (#241)
- Filter nil opts in CLI to allow Keyword.get defaults
- Split transformation_test.exs into access_test.exs and collection_test.exs (#244) (#247) (#247)
- Align PTC-Lisp semantics with Clojure specification (#245) (#248) (#248)
- Resolve remaining Clojure conformance test failures (#250) (#250)
0.2.0 - 2025-12-05
Added
- Add introspection operations (keys, typeof) to DSL (#92) (#92)
- Improve DSL consistency for better LLM program generation (#94) (#94)
- Add explore mode for schema discovery (#97) (#97)
- Enable async execution for test modules (#98) (#98)
[0.1.0] - 2025-12-03
Added
- Add CI check to verify STATUS.md is updated in PRs
- Implement Phase 1 core interpreter with JSON parsing and sandbox execution (#10) (#10)
- Add pre-implementation check for blockers in PM workflow
- Implement get operation for nested path access (fixes #17) (#18) (#18)
- Implement comparison operations (neq, gt, gte, lt, lte) (#22) (#22)
- Implement collection operations (first, last, nth, reject) (#26) (#27) (#27)
- Implement contains, avg, min, max operations (#28)
- Implement let variable bindings for Phase 3 (#30) (#31) (#31)
- Implement if conditional operation for Phase 3 (#32) (#33) (#33)
- Implement boolean logic operations (and, or, not) for Phase 3 (#34) (#35) (#35)
- Implement combine operations (merge, concat, zip) for Phase 3 (#37) (#37)
- Implement call operation for tool invocation (#41) (#41)
- Add Jaro-Winkler typo suggestions for unknown operations (#44) (#44)
- Add ExDoc and Hex package metadata (#45) (#46) (#46)
- Implement declarative schema module for DSL operations (#52) (#52)
- [Phase 5] JSON Schema Generation (#50) (#55) (#55)
- [Phase 5] E2E LLM Testing Infrastructure (#51) (#57) (#57)
- Adopt program wrapper as canonical PTC format - Update to_json_schema/0 (#63) (#63)
- Adopt program wrapper as canonical PTC format in parser (#58) (#64) (#64)
- Add structured output support with generate_program_structured! for E2E tests (#65) (#67) (#67)
- Validate tool function arities at registration time (#42) (#68) (#68)
- Add interactive demo CLI for PTC with ReqLLM integration (#75) (#75)
- Add to_prompt/0 for token-efficient LLM text mode (#80) (#80)
- Add security gates and hardening to Claude workflows
Fixed
- Add safety improvements to GitHub workflows
- PM workflow commits STATUS.md directly to main
- Avoid parallel PRs by including STATUS.md in implementation PR
- Simplify STATUS.md update rules to prevent merge conflicts
- Improve PM workflow action handling
- Trigger PM workflow when issue becomes ready-for-implementation
- Ensure git push happens immediately after commit in Claude workflow
- Use PAT in issue-review workflow to trigger PM workflow
- Optimize min_list and max_list performance and update avg docs
- Correct documentation for sum vs avg behavior with non-numeric values
- Use anyOf for nested expressions in LLM schema (#71) (#71)
- Improve LLM schema descriptions and use Haiku 4.5 (#73) (#73)
- Store last_result in Agent state to avoid regenerating random data (#79) (#79)
- Add test_coverage configuration to exclude test support modules (#89) (#89)