voku/agent-learning
Reviewable finding, proposal, redaction, and decision-history tooling for coding-agent learning loops.
0.13.3
24K downloads/mo
#4170 most downloaded on Packagist
voku/agent-learning
What this package is like to depend on
Last release 3 days ago
20 Aug 2026
Ships on a steady schedule
a new release about every 1 weeks
Nearly every release is documented
notes for 30 of 30 stable releases
Nothing withdrawn
no release was ever pulled
2 months old
30 releases · first in 2026
29 releases in the last 12 months
see the full history below
Release timeline
29 releases · Jun 2026 to Aug 2026Releases
latest 30-
0.13.320 Aug 2026Release notes
Open source →Fixed
- Make Constraint generation-package export adoption-aware. When the configured target rule and every registration file already exist, export now records
mode: adopt_existing, keeps the validation commands and lineage evidence, omits synthetic PHP fixture expectations, and emits an adoption prompt instead of instructing the caller to generate duplicate enforcement. - Keep incomplete enforcement in
mode: generate: a missing target rule or any missing registration file preserves the existing generation package and four fixture expectations. - Align the packaged hard-constraint author skill with the same generate-versus-adopt boundary while preserving explicit human activation authority.
Validation
- PR #36 passed
composer cion PHP 8.3 and 8.4 on the exact final head. Focused regressions cover existing enforcement adoption, missing-target fallback, and missing-registration fallback; CodeRabbit's only review finding requested the missing-registration regression and was addressed before merge.
- Make Constraint generation-package export adoption-aware. When the configured target rule and every registration file already exist, export now records
-
0.13.220 Aug 2026Release notes
Open source →Fixed
- Match a PHPStan constraint's
target_rule_pathper path segment, case-insensitively and with backslashes normalised, instead of requiring the literal substring/PHPStan/. The previous check compared a filesystem path against a namespace-shaped fragment and rejected two legitimate layouts: a lowercase rule directory such asphpstan/Rules/, and any path whose first segment is the rule directory, which has no leading slash. Paths that merely contain the word, such asrules/phpstanish/, are still rejected. - Name
constraintas a durable target in the consolidation prompt, which previously offered only skill and learning-note outcomes while the result schema, promotion validator, generation exporter, activator andconstraint-*commands all supported constraints. The prompt now requires deterministic enforceability, asks for the cheapest reliable owner, and states that proposing a constraint neither approves nor activates anything.
Validation
- PR #32 passed CI on its exact head before merge, covering both regressions plus the package's own static analysis at level 8.
- Match a PHPStan constraint's
-
0.13.118 Aug 2026Release notes
Open source →Added
- Add
FindingCreator::createValidated()as the typed owner-level operation for creating one schema-valid validated Finding, including optional ID allocation, target-directory creation, duplicate protection, validation-before-publication, and atomic publication. - Add standalone
finding-createsupport over the same owner behavior for human and script callers.
Documentation
- Document
FindingCreatoras the PHP lifecycle-host boundary so orchestrators do not needfinding-idplus hand-written JSON or knowledge of thefindings/validatedstorage layout. - Keep the judgment boundary explicit: callers provide evidence-backed content and decide whether a Finding is warranted; Learning owns record validity, not the conclusion itself.
Validation
- PR #28 passed CI on its exact head before merge for the owner-level Finding creation path.
- PR #29 passed CI run #240 for the PHP embedding and consumer-skill documentation.
- Add
-
0.13.015 Aug 2026Release notes
Open source →Added
- Findings can optionally identify an external Composer package with
target_packageand the tested package identity withtested_ref, allowing host repositories to keep dogfood friction in the normal validated Finding lifecycle instead of a parallel feedback document. FindingExporteremits deterministic, read-only JSON for one exact target package. It preserves the raw Finding record and projects current source Run IDs through the existingRunLearningDecision.finding_idsrelation rather than copyingrun_idonto Findings.
Validation
- Existing Findings without an external target remain valid unchanged.
- PHP 8.3 and 8.4 CI is green, including PHPUnit and PHPStan level 8 over
srcandtests.
- Findings can optionally identify an external Composer package with
-
0.12.015 Aug 2026Release notes
Open source →Changed
- Breaking: a governed Run Learning decision may bind to the exact Contract revision, implementation snapshot, validation evidence digest, and review evidence digest it describes. A later complete evidence boundary for the same Run can replace the stale close-out instead of leaving old Learning authoritative forever.
- The four evidence-binding fields are all-or-none and remain opaque to
agent-learning; repository snapshot semantics stay owned by the workflow orchestrator.
-
0.11.114 Aug 2026Release notes
Open source →Changed
dreamtext output now prints selected-versus-judged guidance outcome completeness and warns with the exact selections still missing a judgement. Placeholderunknownrows therefore cannot make a human-facing report look complete merely because every selected item has a draft row.
Validation
- PHP 8.3/8.4/8.5 CI is green on the merged change, including the deterministic Dream report regression for one judged selection out of two selected items.
-
0.11.014 Aug 2026Release notes
Open source →Added
RecordIdGeneratorandagent-learning finding-id: record IDs are now allocated rather than guessed. Findings never had an allocator at all, andProposalIdGeneratorderived the next number by scanning the local directory for the highest one - unique only for a writer who can see every other writer. In a system built for several agents on several branches, two branches each saw.004, each allocated.005, and each passed its own validation because neither could load the other's file. The duplicate only appeared at the merge, where renumbering is most expensive.
Changed
- Breaking:
ProposalIdGeneratoris replaced byRecordIdGenerator. Allocated IDs now carry a random suffix (proposal.2026-08-14.a3f2c1) instead of a per-day sequence. The date prefix is unchanged, so a record set still reads as a timeline. - Finding and proposal ID validation accepts both the legacy sequential suffix and the new random one. Existing IDs are not migrated: they are published in changelogs, memory rows and proposal citations, and rewriting them would break every reference to buy nothing.
Fixed
GuidanceCandidateProposalWriternow refuses to write over an existing candidate. The free filename used to be guaranteed by the sequential allocator's construction; an allocated suffix does not provide it, so the guarantee is asserted rather than assumed.
Validation
- 239 tests and PHPStan level 8, plus the change applied against agent-loop's
live store: 27 findings and 14 proposals carrying legacy sequential IDs all
still validate, and
learn backlogstays clear. - The collision test injects its entropy source instead of sampling real
randomness. Drawing a thousand suffixes and demanding no repeat carries a
2.94% failure probability per run - roughly one CI run in thirty-four - and
measures
random_bytesrather than this package.
-
0.10.012 Aug 2026Release notes
Open source →Added
RunLearningDecision,RunLearningDecisionStatusandRunLearningDecisionStore: agent-learning now owns the durable Learning close-out for a governed Run, keyed byrun_id. Previously this lived inagent-session, where pruning working memory destroyed the record that explained why a Run had been allowed to close. A decision recorded here outlives the Session it was reached in.
Changed
- Breaking: the canonical learning root is
.agent-loop/learning, and historical discovery of older locations is removed. A repository that kept learning state elsewhere must migrate it or configure the root explicitly; nothing is copied, symlinked or dual-read. SeeUPGRADING.md.
-
0.9.009 Aug 2026Release notes
Open source →Changed
- Breaking:
APPLIEDMemory/Skill guidance must now prove that the reviewed mutation physically exists in a concrete canonical target under the configured project root.applied_validationrequirestarget_source_refand a SHA-256target_content_hash; repository validation checks the real file and the action postcondition before accepting the applied state. ADDrequires the new wording to be present,REPLACErequires the new wording to be present and the old wording absent, andDELETErequires the old wording to be absent. A semantic proposal target alone is no longer sufficient proof that application happened.- Application proof and authority handoff remain separate. A physically changed Skill or Memory file is evidence that the mutation landed; it does not by itself prove a downstream recall consumer selects that canonical source.
Fixed
ProposalTransitionManager::apply()now fails repository re-validation and rolls back toapprovedwhen Memory/Skill application evidence is missing, points outside the configured project root, references a missing file, carries the wrong content hash, or does not satisfy the proposed mutation.- Successful application history is not appended when the physical target proof fails.
Documentation
- Added
docs/applied-guidance-proof.mddescribing the physical-proof contract, the distinction between semantic target identity and repository source evidence, and why canonical-source activation/retirement remain separate.
- Breaking:
-
0.8.1203 Aug 2026Release notes
Open source →Changed
- Replaced host-project-specific release notes with repository-neutral wording.
- Migrated PHPUnit data providers to attributes, removing PHPUnit 12 deprecation warnings from the release suite.
-
0.8.1102 Aug 2026Release notes
Open source →Added
- Add explicit
history-rebuildandhistory-statuscommands. They produce deterministicactive-guidance.snapshot.json,chronicle.jsonl, and a source-digest manifest from immutable learning evidence, and fail clearly when a compact projection is missing, corrupted, or stale. - Include compact-history inventory metrics in the schema-versioned Dream report: active/archived records, files and bytes read, projection size, and compression ratio. Runtime remains opt-in so standard reports stay byte-stable.
Fixed
- Calculate outcome completeness from unique selected
(compilation_id, guidance_id)identities, report no rate for an empty selection history, count producer decision overlap before deduplication, and use the reviewable decision population for the stale-candidate rate.
- Add explicit
-
0.8.1031 Jul 2026Release notes
Open source →Added
- Extend Agent Dreaming replacement detection with explicit newer-finding lineage, harmful-outcome corrected successors, and scope narrowing; extend conflict detection with contradicted guidance lineage and exact cross-tier duplicates.
- Validate the optional explicit lineage fields used by those policies and add outcome-completeness and stale-candidate rates to the deterministic report.
Changed
- Document the DreamRunResult contract and the explicit human review/forgetting flow without creating another documentation tree.
All notable changes to
voku/agent-learningwill be documented in this file.The format follows Keep a Changelog, and this project uses semantic versioning where practical.
-
0.8.931 Jul 2026Release notes
Open source →Fixed
- Include the Dreaming value objects, evaluator, evidence-quality auditor, and
replacement/conflict policies in the package archive. Version 0.8.8 wired
the CLI to those classes but omitted the newly added source files, causing
agent-loop learn dreamto fail at runtime with a missing-class error.
- Include the Dreaming value objects, evaluator, evidence-quality auditor, and
replacement/conflict policies in the package archive. Version 0.8.8 wired
the CLI to those classes but omitted the newly added source files, causing
-
0.8.831 Jul 2026Release notes
Open source →Added
dream: a deterministic, human-reviewed guidance-maintenance command. It rebuilds its result from immutable recall-selection and guidance-outcome histories; audits missing versus unknown outcomes, unresolved file evidence, and aged findings; reports compact machine-readable or text output; and writes no durable guidance unless--write-candidatesis explicitly passed. Reports deliberately omit generated timestamps so equal inputs produce byte-stable output.- Conservative
REPLACEMENT_CANDIDATEproduction for exact, explicit applied guidance successors, plus report-onlyCONFLICTrecords. A conflict needs explicitconflicts_withlineage; unrelated wording under one pattern key is not guessed to be contradictory. - Stable evolution decision keys. Candidate, rejected, and acknowledged review records now suppress only an unchanged decision key, allowing materially new evidence to create a new review candidate without replaying a rejected one.
-
0.8.728 Jul 2026Release notes
Open source →Fixed
guidance-evaluate --write-candidatesregenerated a proposal a reviewer had already declined.GuidanceCandidateProposalWriter::findExistingCandidate()only scannedproposals/candidate/, so once a candidate was rejected (and therefore moved toproposals/rejected/) the next run no longer saw it and wrote an identical decision under a fresh proposal ID. Rejecting five auto-generated candidates and re-running the command immediately recreated all five. The lookup now also scansproposals/rejected/andproposals/acknowledged/, so a terminal human decision suppresses regeneration of the same guidance_id + decision_type + source_tier + target_tier combination.approved/appliedare deliberately not included: those describe a change that landed, not a decision to stop proposing.
-
0.8.628 Jul 2026Release notes
Open source →Added
ConstraintEngine::PHPCS(phpcs). Repositories that enforce constraints with PHP_CodeSniffer sniffs previously had no honest way to express that: the enum offered onlyphpstan,php_cs_fixer,test, andci, andphp_cs_fixeris a different tool (php-cs-fixer) with a different rule location and command, so reusing it would have mislabeled the constraint. Discovered downstream in a downstream repository, where a*_UnitCest.phpconstraint had to be a phpcs sniff becausephpstan.neonexcludes*Cest.phpfrom analysis entirely, making an equivalent PHPStan rule unable to ever fire.ConstraintPromotionValidatornow applies the matching symmetry checks for the new engine: aphpcsconstraint requires a phpcs/codesniffer validation command and atarget_rule_pathpointing at a/Sniffs/location.
-
0.8.5no dateRelease notes
Open source →Fixed
SkillStalenessPolicy,MemoryToSkillPromotionPolicy, andSkillToConstraintPromotionPolicydid not propagate an approved proposal'sscope_justificationinto the generated candidate'sproposalExtras, unlikeMemoryStalenessPolicy(fixed in 0.8.4/d436428 for the memory tier only). Aguidance-evaluate --write-candidatesrun for a skill-tier STALE_CANDIDATE or a memory-to-skill / skill-to-constraint PROMOTION_CANDIDATE whose source proposal's scope was legitimately broader than any single cited finding (and had ascope_justificationexplaining why) would hitProposalValidator's "proposal scope is broader than source finding evidence without justification" check and abort the entirewrite-candidatesbatch, including every other pending candidate. All three policies now buildproposalExtras['scope_justification']from the source proposal the same wayMemoryStalenessPolicydoes.
-
0.8.415 Jul 2026Release notes
Open source →Added
guidance-evaluatenow warns whenhistory/outcomes.jsonlcontains records in the older "outcome." session-summary shape (helpful/irrelevant/harmful as proposal-ID arrays, predating the per-guidance-item "guidance-outcome." shape).OutcomeRepository::loadAll()already validated both shapes without error, butGuidanceOutcomeEventRepository::load()-- and therefore everyGuidanceUsageProjectorstatistic and promotion/staleness decision -- has always silently skipped anything that is notguidance-outcome.*. A guidance item whose only recorded usage was in the older shape was indistinguishable from one that was never used at all, with no signal that older data was excluded. NewGuidanceOutcomeEventRepository::countLegacyRecords()makes that count explicit;guidance-evaluatenow prints it before its usual summary/decision output when the count is non-zero. This does not migrate old records into the new shape (that would require fabricating matching recall-selection linkage that never existed for them) -- it only makes the existing exclusion visible instead of silent.
-
0.8.115 Jul 2026Release notes
Open source →Fixed
- Preserve an approved memory proposal's non-empty
scope_justificationwhenguidance-evaluate --write-candidatescreates a stale-review candidate. This keeps a valid broader scope reviewable instead of failing candidate validation after the justification was dropped during projection.
- Preserve an approved memory proposal's non-empty
-
0.8.006 Jul 2026Release notes
Open source →Added
- add docs about https://github.com/ctxrs/ctx and how to use it for findings existing learnings from your coding agents
- New
backlogCLI command that lists validated findings not yet consolidated into a proposal and exits non-zero while any remain. This is a deterministic gate for the recurring "only the recent findings were processed" failure: a learning-loop pass can no longer be reported as done while a backlog of unconsolidated findings exists.--allow-nonemptymakes the listing informational (exit 0) for reporting without gating. Backed byBacklogCommandTest.
-
0.7.023 Jun 2026Release notes
Open source →Added
- Added a
retiredProposalStatus, reachable only fromappliedvia the newProposalTransitionManager::retire()/proposal-retireCLI command. Once a proposal's durable change is fully captured in its target skill/doc/memory home, retiring it moves the file toproposals/retired/and appends an immutable record to the newhistory/retired-proposals.jsonl(validated byDecisionHistoryValidator). Consuming projects do not need any change invoku/agent-recall-compiler: itsRecallRepository::loadActiveGuidance()already only scansproposals/approved/andproposals/applied/, so a retired proposal is simply never read into the active recall guidance pool again, instead of accumulating there forever. ProposalValidator's source-finding check now also accepts findings withFindingStatus::ARCHIVED(previously onlyVALIDATED/CONSOLIDATED), andProposalTransitionManager::approve()'s inline check was widened to match, so a finding can be archived after its proposal already cited it as evidence without breaking that proposal's validation on a latervalidate/approve/retirerun.
- Added a
-
0.6.120 Jun 2026Release notes
Open source →Fixed
Cli::parseOptions()usedforeach ($tokens as $index => $token)with a manual$index++to skip a consumed option value.foreachignores manual mutation of the loop variable, so the consumed value was re-read on the next iteration and pushed onto$argumentsas a bogus leading positional argument. Any command that reads its primary ID from$arguments[0](proposal-approve,proposal-reject,proposal-mark-applied,finding-transition, andconstraint-export/constraint-activate/constraint-loopwhen given a bare ID) silently operated on the wrong record whenever at least one--option valuepair preceded it. Switched to an explicit indexedforloop (matching the already-correct pattern in the siblingvoku/agent-recall-compilerpackage) and added a regression test that exercisesproposal-approvethroughCli::run()with space-separated options.
-
0.6.019 Jun 2026Release notes
Open source →Added
- Add validating recall history in learning root checks
Refactored
- Consolidate learning root resolution
-
0.5.018 Jun 2026Release notes
Open source →Added
- Add strict recall-selection and per-guidance outcome event models, parsers, and JSONL repositories.
- Add deterministic
GuidanceUsageProjectorsummaries for eligibility, selection, application, explicit outcomes, distinct tasks, timestamps, and evidence event IDs. - Add typed evolution decisions for promotion, staleness, replacement, conflict, and no-action review results.
- Add separate conservative policies for finding-to-memory, memory-to-skill, skill-to-constraint, memory staleness, skill staleness, and constraint review.
- Add
guidance-evaluateCLI to validate event histories, print deterministic usage summaries and decisions, and optionally write reviewable candidate proposals. - Add idempotent candidate proposal writing with preserved event provenance under
evolution_decision. - Add guidance-evaluation schema documentation and a complete fixture showing findings to memory to recalled outcomes to skill-promotion candidate.
- Add regression coverage for deterministic projection, malformed and duplicate events, selected/applied/helpful separation, promotion gates, harmful blockers, stale review behavior, constraint inactivity, candidate provenance, and idempotent writes.
Changed
- Allow
OutcomeRepositoryvalidation to read newguidance-outcome.*event rows alongside legacy aggregate outcome records. - Update README and bundled skills to document immutable event projection, candidate-only writes, and the human approval gate.
-
0.4.018 Jun 2026Release notes
Open source →Added
- Add typed learning triage with
LearningClassificationvalues forCREATE_SKILL,UPDATE_SKILL,ADD_LEARNING_NOTE, andIGNORE. - Add
ValidationCasesupport so findings, consolidation results, and proposals can carry concretegiven/when/thenbehavior checks. - Add optional
classification,pattern_key, andvalidation_casefields to findings. - Add optional
learning_decision,pattern_key,validation_case, andoverlap_checkfields to consolidation results and proposals.
Changed
- Update consolidation prompts to default useful raw lessons to
ADD_LEARNING_NOTE, preferUPDATE_SKILLover duplicate skill creation, and reject praise, self-justification, or generic advice. - Require
CREATE_SKILLproposals to prove existing skill overlap was inspected and that maximum overlap is not above 50%. - Preserve learning triage metadata when importing consolidation results into candidate proposals.
- Add typed learning triage with
-
0.3.015 Jun 2026Release notes
Open source →Added
- Add
constraint-activateto write active constraint manifests from approved or applied constraint proposals. - Add
constraint-loopto export, apply, and activate generated constraints with one explicit tooling command. - Add learning-root
config.jsonpath settings forproject_root,constraint_generation_dir, andactive_constraints_dir.
Changed
- Resolve constraint example, generation-package, and active-manifest paths from CLI options, learning-root configuration, or legacy project-root inference.
- Add
-
0.2.013 Jun 2026Release notes
Open source →Added
- Add typed constraint promotion models (
ConstraintSpecification,ConstraintEngine,Detectability,FalsePositiveRisk) for hard-constraint candidates. - Add promotion-gate validation for confirmed findings, scope, boundaries, detectability, validation commands, false-positive risk, and engine-compatible target paths.
- Add
constraint-exportto write generation packages containing specifications, source findings/proposals, examples, validation plans, and generation prompts. - Add generated-rule outcome result types such as
violation_detected,false_positive,rule_suppressed, andrule_disabled.
Changed
- Require generated files, registration file, commit, tests, validation result, and content hashes when applying constraint proposals.
- Add typed constraint promotion models (
-
0.1.012 Jun 2026Release notes
Open source →Added
- Add Active Guidance modeling and repository to parse/load active guidance files.
- Add Rejection filtering via a repository and selector to skip proposing previously rejected items.
- Add structured JSON-based consolidation input prompt formatting inside fenced JSON blocks for secure LLM parsing.
- Add consolidation result parsing and schema validation supporting concrete result types (
ADD,DELETE,REPLACE,REJECT,NO_DURABLE_LEARNING). - Add proposal importer to atomically write candidate proposals.
- Add transition managers for atomic finding and proposal lifecycle operations (approvals, rejections, application states) with rollback support.
- Add outcome logging and repository to track applied proposal outcomes.
- Integrated all new operations into the CLI tool (
proposal-import,finding-transition,proposal-approve,proposal-reject,proposal-mark-applied).
-
0.0.211 Jun 2026Release notes
Open source →Added
- Add deterministic multi-selector consolidation preparation with repeatable
--finding,--task,--ticket, and--scopeselectors plus--sinceand--untildate filters. - Print selected findings before writing consolidation input.
- Append
templates/consolidation-prompt.mdfrom the learning root duringprepare. - Add proposal lifecycle directory validation through
ProposalLifecycle. - Add
FindingSelectionfor explicit consolidation input selection.
Changed
- Replace the project-specific default task ID pattern with a generic default that accepts IDs like
PROJECT-123,GH-123, andTODO@path. - Rename
DecisionRecordertoDecisionHistoryValidatorbecause the class validates history and does not record decisions yet. - Document the difference between proposal actions and proposal lifecycle status.
- Remove host-project-specific examples and local filesystem links from package documentation and fixtures.
Fixed
- Reject invalid finding status and
validation_statuscombinations. - Reject invalid proposal action and status combinations, such as
REJECTwithapproved. - Reject proposal files whose embedded status does not match their
proposals/<status>/directory. - Validate
approved_attimestamps on proposals when approval metadata is present.
- Add deterministic multi-selector consolidation preparation with repeatable
-
0.0.109 Jun 2026Release notes
Open source →Added
- Initial CLI for validating findings, proposals, and decision history.
- Initial consolidation prompt generation for one task selector.
- Finding, proposal, evidence, JSONL, redaction, and path validation primitives.