سِجِلّ التغييرات
سِجِلّ تغييرات Apothem — ملاحظات إطلاق منسَّقة، ثم فئات Keep-a-Changelog للإصدارات اللاحقة.
ملاحظات الإصدار أدناه تُحقَن من ملف CHANGELOG.md الجذر وقت البناء
عبر node site/scripts/update-reference-inventory.mjs؛ والملف الجذر هو
المصدر الوحيد للحقيقة.
Changelog — Apothem
All notable changes to this project are documented in this file.
This changelog follows Keep a Changelog and the project adheres to Semantic Versioning.
Unreleased
[1.1.0] - 2026-08-16
Added
- Per-folder README file coverage is now gated. A folder's README is its
operating contract, so its file table is load-bearing: a reader who cannot
find a module there concludes it does not exist. Nothing held that table
against the folder's actual contents, and the drift is invisible from both
sides — you do not notice a missing row while reading, nor the README while
adding a file.
scripts/dev/check_readme_file_coverage.pyreports every shipped file its folder's README never names, and runs--strictin CI across all 31 folders.
Fixed
statusandverifyno longer swallow a profile that fails to load.statushardcoded an empty warnings array and printed nothing in plain mode; with nothing installed there was nounknowndrift cell either, so the failure left no trace at all.verify --harness alldiscarded the failure to read its exclusions, so excluded harnesses rejoined the sweep and the run died later on a missing project path that named them — with no sign of the real cause. Both now surface a structured advisory naming the diagnostic code and the fix.- The PowerShell interpreter locator no longer throws where its contract
promises
$null.find-pwsh.ps1built its Windows install-root fallbacks with an unguardedJoin-Path $env:ProgramFiles, which is unset under PowerShell on Linux and macOS. The list was built eagerly, so the throw pre-empted even the PATH probe that would have succeeded. - A duplicate
run:key made the CI workflow unparseable. Adding the README coverage gate consumed theInstall release toolchainstep header and left itsrun:line attached to the new step. GitHub rejects a workflow file with a duplicate mapping key outright, so runs ended immediately with no jobs and no logs, and the release build lost its toolchain install. migrate-workspacehonored a custom directory name for its target but not its discovery, so a non-default workspace name was written correctly and then never found again.- Documentation corrections across the conformity gate's hook scope, the design tokens' consumers, the OpenCode example's provenance, two harness convention pins, and four architecture pages that were unreachable from ten locale indexes.
Changed
- Kimi Code's uninstall routes through the shared project-scope factory. It was the one project-scope adapter still deriving its project root by walking up from the output path — the hardcoded ascent the factory exists to remove.
LearningStore._appendis nowappend_signal. It was reached across a module boundary byworkspace_migrationand four test modules while named private; the rename matches how it is actually used, and its docstring now states what it deliberately does not do.
1.0.2 - 2026-08-14
Fixed
- The
Stophook no longer re-asserts the session-end protocol on every turn.Stopfires at the end of every assistant turn, not only at the end of a session, and the hook emittedhooks/messages/stop.mdverbatim each time. Because that body reads as a fresh work order rather than a status check, every response triggered another firing and nothing the agent did changed what the hook asserted — the loop had no fixed point, and an operator could only escape it by restarting the harness, since hook configuration and message bodies are both snapshotted at session start. A new dispatch-routed handler,hooks/session_end_gate.py, supplies the missing termination condition: the protocol is emitted at most once per session, and only once the session has accumulated enough turn-ends to have state worth externalizing. The message file still owns the protocol text — the gate decides only when it is emitted — so its path and its cross-references fromrules/context-management.mdandrules/auto-memory.mdare unchanged. Two environment variables tune it:APOTHEM_SESSION_END_MIN_STOPS(default3) sets the firing floor, andAPOTHEM_SESSION_END_ENABLED=0silences the protocol entirely without editing installed plugin files. - The detection pseudocode in the canonical option-shapes rule is fenced as
text rather than Python. The block uses the hyphenated schema field names the
same document defines in its field table, so formatting it as Python rewrote
read(probe-record-path)into a subtraction expression and changed what the documentation said. Correcting the fence language leaves the pseudocode byte-identical and restores the format gate to green.
1.0.1 - 2026-07-07
Apothem is a host-agnostic AI-harness configuration manager: one governed shared profile materializes into the native configuration of seventeen assistant harnesses behind a conformity governance gate and signed, reproducible releases.
Added
- Shared-profile model. One governed profile at
~/.config/apothem/profile.yamlis the single source for the synced unit — rules, slash-commands, skills, hooks, output-styles, settings, schemas, docs, and MCP servers — plus the wrapped-workflow orchestrators that drive whole missions end to end (/plan,/research,/audit, and the/fortressclosed-loop production-hardening pipeline). - Seventeen harness adapters. Antigravity, Claude Code, CodeBuddy, Codex, Cursor, Gemini CLI, GitHub Copilot, Hermes, Kimi Code, Kiro, Open-Claw, OpenCode, Qwen Code, Trae, Windsurf, Zed, and GLM (Z.ai) each install, verify, update, and uninstall through a shared, reversible adapter contract that emits the tool's native file layout. Installs back up existing targets before replacement; uninstalls reverse cleanly with zero orphans.
- CLI.
quickstart,install,uninstall,update,verify,status,diff,rollback,migrate-workspace,harnesses,profile,doctor, andcompletion, with dry-run reporting, drift detection, and structured JSON output (--format json). The engine is self-contained — the source tree carries its vendored dependencies and runs from a checkout aspython -m apothemon system Python 3.10+. - Conformity governance gate. A pre-emission validator suite checks the synced unit — authorship headers, frontmatter contracts, naming, determinism, cross-references, and harness capability coverage, including a cross-file binding-reciprocity validator that keeps every rule cross-binding closed at its cited peer — before any surface is materialized.
- Install paths. The Claude Code plugin
(
/plugin marketplace add ahmed-g-gad/apothem), a Gemini CLI extension, a Qwen Code extension, a Codex plugin, a VS Code-family extension on the Visual Studio Marketplace, the npm shim (npx @ahmed-g-gad/apothem <command>), and the one-shot POSIX and PowerShell installers (install.sh/install.ps1) with matching update and uninstall scripts.
Changed
- Unified install layout. Materialized machinery (hooks, the conformity
gate, schemas, templates) and non-native cohorts (rules, skills, agents)
install under a single Apothem-owned
.apothem/support/tree inside each harness's configuration root, so each profile carries one Apothem-owned dotted directory rather than two similarly-named siblings. - Leaner always-on rules tier. The always-loaded behavioral rules were consolidated to twenty-eight, with situational depth moved into demand-loaded companion rules, so a session — or a fleet of sub-agents — ingests fewer tokens up front while every discipline still fires where it applies.
Security
- Every release attaches an sdist, a wheel, SHA-256 checksums, Sigstore cosign signatures, SLSA build provenance, and a CycloneDX SBOM as verification evidence; the npm package publishes with Sigstore build provenance signed from the GitHub Actions OIDC identity, and a conformity validator holds every release workflow to a provenance-signed, pinned publish path.
- The pipeline gates every change on lint, tests, type checks, a documentation
build, CodeQL, OpenSSF Scorecard, dependency review, a scheduled OSV
vulnerability scan, and supply-chain checks before publication. The one-shot
installers pin their
click/richprerequisites to the engine's declared constraints and document an inspect-first alternative to the pipe-to-shell one-liner.