Files
ik-codex/CHANGELOG.md
indifferentketchup 081d40c208 docs: document Redactor utility in CLAUDE.md, README, CHANGELOG
CLAUDE.md: added RedactorInterface bullet to the architecture list
(after Custom Analyser subclasses, before Detectors); added
ProjectZomboidRedactor entry under ProjectZomboid specifics; added
src/Util/ to the game-subtrees layout code block with a prose note
marking it as the sixth component directory introduced post-v0.1.0;
added Pitfall 5 on mandatory pass order.

README.md: new "Redaction" subsection between Quick start and
Architecture — PHP snippet, replacement descriptions, three toggle
methods, three documented v1 limitations.

CHANGELOG.md: added [Unreleased] section (Added + Changed) above
[0.1.0]. Removed the Redactor bullet from [0.1.0]'s Deferred list
entirely — the historical record stays accurate (v0.1.0 shipped
without it) and [Unreleased] now documents its arrival; a stub mention
in Deferred would be redundant.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 15:08:49 +00:00

6.7 KiB
Raw Blame History

Changelog

All notable changes to indifferentketchup/codex are documented here.

The format follows Keep a Changelog and this project adheres to Semantic Versioning.

[Unreleased]

Added

  • RedactorInterface (src/Util/RedactorInterface.php) and ProjectZomboidRedactor (src/Util/ProjectZomboid/ProjectZomboidRedactor.php) — render-time PII filter that scrubs Steam IDs, player names, and world coordinates from Project Zomboid log content. Three independent toggles default to on. Designed as a string-in/string-out utility so consumers can apply it at any rendering or export step. Documented v1 limitations: in PvP combat lines, only the attacker's name and coords are redacted; victim's name and coords (after hit) are deferred to v2. In admin lines, teleported X to <coords> coordinates are not redacted in v1.

Changed

  • New top-level src/Util/ directory introduced. The Redactor is its first occupant; future utilities (e.g. tokenising redactor variants) land here.

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 / Insight pipeline forked from upstream aternos/codex and renamed end-to-end to IndifferentKetchup\Codex\* in 66a2fcc. Zero Aternos\Codex\* namespace references remain in src/ or test/.
  • FilenameDetector at IndifferentKetchup\Codex\Detective\FilenameDetector — path-based detector that uses the new LogFileInterface::getPath() accessor to dispatch on a filename hint. Falls back to false for 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-line ProjectZomboidServerLog for DebugLog-server.txt, an abstract ProjectZomboidEventLog base for the ten single-line logs, and concrete subclasses for admin.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>Pattern carries a LINE regex used by PatternParser, plus named-group extractor regexes (FIELDS, COMBAT, MOD_LOAD, etc.) used by analysers.
  • ProjectZomboidDetective at IndifferentKetchup\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 attached ModMissingSolution), 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 Analyser subclasses in the tree, addressing logic that vanilla PatternAnalyser cannot express: ConnectionFailureAnalyser (event pairing across the file), ItemDuplicationAnalyser (sliding-window heuristic with THRESHOLD_COUNT=5, THRESHOLD_WINDOW_SECONDS=10), SkillProgressionAnomalyAnalyser (consecutive-snapshot delta with THRESHOLD_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 IDs 7656119800000000176561198000000004, names Player1 / 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.md with framework architecture, pitfalls, and workflow conventions; README.md with 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 codex Redactor utility, all under docs/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 flat IndifferentKetchup\Codex\Games\<Game>\* tree) was originally proposed and was not selected.
  • LICENSE retains the original Copyright (c) 2019-2026 Aternos GmbH line per MIT requirements; the LICENSE file is byte-for-byte unchanged from the upstream import.
  • composer.json rewritten in aae016d: package name indifferentketchup/codex, MIT license, generic-framework description, single author entry, PSR-4 autoload roots set to IndifferentKetchup\Codex\ and the test-fixture / test-suite namespaces, PHP >=8.4 require constraint, PHPUnit ^12 dev dependency.
  • tests.yaml uses the modern $GITHUB_OUTPUT workflow command instead of the deprecated ::set-output (commit 60f12bc). CI matrix runs PHP 8.4 and 8.5.
  • .gitignore excludes Logs.zip (real production log fixtures) and .scratch/ (extracted reference logs), plus .claude/ and .claude.local.md for personal Claude Code artefacts.

Deferred

  • Other game implementationsMinecraft, Hytale, and SevenDaysToDie are detective-stub-only. Each has a TODO <Game>Detective extending base Detective; their per-component subdirectories under Analyser, Log, Parser, and Pattern contain only .gitkeep placeholders. Real implementations land if and when fixtures and demand exist.
  • Packagist publication — v0.1.0 is consumable via Composer's vcs repository entry pointing at the Gitea remote. Pushing to Packagist is a separate decision and is not in scope for this release.