Keep-a-Changelog format, dated 2026-05-01, sections Added / Changed /
Deferred. Captures the framework rename to IndifferentKetchup\Codex\*
(Aternos namespace fully removed in 66a2fcc, MIT LICENSE preserves
original copyright), the components-outer-with-game-suffix layout
(option 1 from the Phase A Q3 decision, not option 3), the package
name indifferentketchup/codex, and the eight analysers shipped across
Phase B.1 / B.2 / B.3. Redactor utility, non-PZ games, and Packagist
publication land in Deferred.
6.3 KiB
6.3 KiB
Changelog
All notable changes to indifferentketchup/codex are documented here.
The format follows Keep a Changelog and this project adheres to Semantic Versioning.
0.1.0 — 2026-05-01
First public release. Codex is a generic PHP log parsing and analysis framework with full Project Zomboid server-log support across eight analysers. The Composer package name is indifferentketchup/codex (the repository directory and Gitea slug are ik-codex; the package name is not).
Added
- Framework foundation — generic
Log/Entry/Line/Parser/Analyser/Detective/Insightpipeline forked from upstreamaternos/codexand renamed end-to-end toIndifferentKetchup\Codex\*in66a2fcc. ZeroAternos\Codex\*namespace references remain insrc/ortest/. FilenameDetectoratIndifferentKetchup\Codex\Detective\FilenameDetector— path-based detector that uses the newLogFileInterface::getPath()accessor to dispatch on a filename hint. Falls back tofalsefor path-less log files (StringLogFile,StreamLogFile).- Project Zomboid log subclasses (11) under
IndifferentKetchup\Codex\Log\ProjectZomboid\*covering every PZ server-log file type: a multi-lineProjectZomboidServerLogforDebugLog-server.txt, an abstractProjectZomboidEventLogbase for the ten single-line logs, and concrete subclasses foradmin.txt,BurdJournals.txt,chat.txt,ClientActionLog.txt,cmd.txt,item.txt,map.txt,PerkLog.txt,pvp.txt,user.txt. - Pattern classes (11) under
IndifferentKetchup\Codex\Pattern\ProjectZomboid\*holding regex string constants. Each<Type>Patterncarries aLINEregex used byPatternParser, plus named-group extractor regexes (FIELDS,COMBAT,MOD_LOAD, etc.) used by analysers. ProjectZomboidDetectiveatIndifferentKetchup\Codex\Detective\ProjectZomboid\ProjectZomboidDetective— pre-registers all 11 log subclasses in its constructor with paired filename-hint plus content-signature detectors.- Phase B.1 ServerLog analysers (3):
EngineVersionAnalyser(extracts engine version, build hash, and build date from the server banner),ModLoadAnalyser(mod load order plus missing-mod problems with attachedModMissingSolution),ServerExceptionAnalyser(Java exception type and stack-trace body, coalesced by exception type). - Phase B.2 PvP and Admin analysers (2):
PvpDamageAnalyser(filters zombie hits and zero-damage rows at the regex itself),AdminAuditAnalyser(verb-pattern dispatch across six admin actions: added item, added xp, granted access, changed option, reloaded options, teleported). - Phase B.3 deferred analysers (3) — first custom
Analysersubclasses in the tree, addressing logic that vanillaPatternAnalysercannot express:ConnectionFailureAnalyser(event pairing across the file),ItemDuplicationAnalyser(sliding-window heuristic withTHRESHOLD_COUNT=5,THRESHOLD_WINDOW_SECONDS=10),SkillProgressionAnomalyAnalyser(consecutive-snapshot delta withTHRESHOLD_DELTA=3). All three threshold constants ship with rationale docblocks and are tunable via subclass override. - Synthetic test fixtures under
test/src/Games/ProjectZomboid/fixtures/, hand-crafted from observed PZ log shapes with placeholder identifiers per the project's privacy rules: Steam IDs76561198000000001–76561198000000004, namesPlayer1/Player2/AdminUser/PlayerSuspect, generic coords. No real-log content reaches the index. - End-to-end tests validating each Log subclass's parser, each analyser's insight emission, and the Detective's dispatch behaviour against the synthetic fixtures. Final count: 195 tests, 412 assertions.
- Project documentation:
CLAUDE.mdwith framework architecture, pitfalls, and workflow conventions;README.mdwith worked Project Zomboid example and per-game support table; design specs and as-built plans for Phase B.1 / B.2 / B.3 plus a deferred-status spec for the codexRedactorutility, all underdocs/superpowers/.
Changed
- Layout: components-outer with game suffix. Every game's code lives at
IndifferentKetchup\Codex\<Component>\<Game>\*for the existing components (Analyser,Analysis,Detective,Log,Parser,Pattern). This is option 1 from the Phase A Step 2 layout decision; option 3 (a flatIndifferentKetchup\Codex\Games\<Game>\*tree) was originally proposed and was not selected. LICENSEretains the originalCopyright (c) 2019-2026 Aternos GmbHline per MIT requirements; the LICENSE file is byte-for-byte unchanged from the upstream import.composer.jsonrewritten inaae016d: package nameindifferentketchup/codex, MIT license, generic-framework description, single author entry, PSR-4 autoload roots set toIndifferentKetchup\Codex\and the test-fixture / test-suite namespaces, PHP>=8.4require constraint, PHPUnit^12dev dependency.tests.yamluses the modern$GITHUB_OUTPUTworkflow command instead of the deprecated::set-output(commit60f12bc). CI matrix runs PHP 8.4 and 8.5..gitignoreexcludesLogs.zip(real production log fixtures) and.scratch/(extracted reference logs), plus.claude/and.claude.local.mdfor personal Claude Code artefacts.
Deferred
- Codex
Redactorutility — design captured indocs/superpowers/specs/2026-04-30-redactor-design.md. Not implemented in v0.1.0. iblogs (the downstream consumer) handles upload-time PII filtering for this release; codex itself ships no PII helper. The deferred spec exists so iblogs's privacy story has a referenced design to point at and so a future implementation pass has a clear contract to start from. - Other game implementations —
Minecraft,Hytale, andSevenDaysToDieare detective-stub-only. Each has a TODO<Game>Detectiveextending baseDetective; their per-component subdirectories underAnalyser,Log,Parser, andPatterncontain only.gitkeepplaceholders. Real implementations land if and when fixtures and demand exist. - Packagist publication — v0.1.0 is consumable via Composer's
vcsrepository entry pointing at the Gitea remote. Pushing to Packagist is a separate decision and is not in scope for this release.