← Files AkinatorARCHIVED FILE
docs/deviations.md
7.56 KB · Oct 3, 2026 · 06:33 UTC
# Deviations from the build brief
The build brief (Prompt Pack v1.0) said: where it conflicts with the platform's
actual contract, the platform wins and the deviation is stated explicitly - never
applied silently. This is that statement.
Every deviation below is either an owner instruction that superseded the brief,
or a place where the real platform contract differed from what the brief
described.
## 1. One command instead of six
- **Brief, Part 9:** six commands - `/akinator:onboard`, `:audit`, `:status`,
`:sync`, `:question`, `:decide`.
- **Shipped:** one command, `/akinator`, dispatching all six modes plus
free-text work.
- **Why:** the owner instructed it directly during the build: *"I don't want
variety in plugin commands. I only want one command do everything, all skills
everything in the plugin."*
- **Amended 2026-08-26.** The owner then asked for the root command to "run
literally everything", so `/akinator` no longer scales the loop to the work -
it loads `akinator-everything` and runs the complete pass by default. Mode
words narrow the target, never the depth. The scaled behavior remains in the
auto-triggered `akinator` skill, which is the right default when nobody typed
a command at all.
- **Superseded 2026-09-18 (1.2.0).** The above is history. Akinator is now one
skill and one command on every platform - `/akinator:everything` in Claude
Code (the skill is the command; there is no command file), `$akinator` in
Codex, `/akinator` in Cursor - with the former skills kept as station
references inside it, and no mode words. See
`docs/adr/0009-one-skill-one-command-one-installer.md`.
- **Recorded in:** `docs/adr/0005-single-command-surface.md`,
`memory/2026-08-26-single-command-preference.md`.
## 2. The Codex pack is real Codex skills, not "prompt files"
- **Brief, Part 3.2:** "the skills as Codex-consumable prompt files".
- **Shipped:** `.agents/skills/<name>/SKILL.md` - the actual Codex skills
contract, which turned out to be the same shape as Claude's (`SKILL.md` with
`name` and `description` frontmatter).
- **Why:** the brief predated verification. Codex has a first-class skills
system reading `.agents/skills/`; shipping loose prompt files would have been
strictly worse - not auto-selected, not invocable with `$name`, not discovered.
- **Consequence:** generation is a banner-only transformation rather than a
format conversion, which is why the two platforms cannot diverge.
- **Recorded in:** `docs/adr/0002-codex-pack-generated-from-claude-skills.md`,
`docs/compatibility.md`.
## 3. No Codex hook surface
- **Brief, Part 10:** a SessionStart hook injecting the contract.
- **Shipped:** the hook exists for Claude Code only.
- **Why:** Codex plugin manifest validation **rejects** unsupported fields such
as `hooks`. There is no equivalent surface to ship it on.
- **How the contract still reaches Codex:** the generated `AGENTS.md` carries
the same creed, loop and non-negotiables, and Codex reads it at session start
by its own convention. `tests/test_codex_pack.py::test_agents_md_carries_the_non_negotiables`
asserts the content is actually there rather than assumed.
- **Recorded in:** `docs/compatibility.md`.
## 4. Brand assets ~~are generated, not drawn~~ ~~No image assets in the Codex manifest~~
**Corrected 2026-08-26.** The original entry claimed `composerIcon` and `logo`
were optional and omitted them. That was **wrong**: Codex validation requires
both, and rejects the plugin without them. The entry is kept rather than deleted
because the correction is the useful part - see
`memory/2026-08-26-codex-plugin-validation-surprises.md`.
- **Shipped:** `assets/akinator-icon.png` and `assets/akinator-logo.png`, both
declared in `.codex-plugin/plugin.json`.
- **Reversed 2026-09-18.** The owner committed designed artwork (1254x1254) in
place of the generated mark - the exact exit this entry named in advance. The
generator was retired and `test_assets_are_generated_not_committed_by_hand`
dropped, as the cost line below said to. The squareness test stays; that one is
the Codex contract. Kept below as the record of what was shipped before.
- **The original deviation:** the assets were **generated from code**
(a script since retired) rather than authored in a design tool. The mark
is drawn from a signed distance field and the PNG encoded with the standard
library - no dependencies, no binary blob without provenance.
- **Why:** a committed binary nobody can regenerate is a fact with no history.
Generating it means the mark can be changed, reviewed as a diff, re-rendered at
any size, and drift-checked like every other generated artifact here.
- **Cost:** it is a geometric mark, not the work of a designer. If Akinator ever
wants a crafted identity, replace the generator's output with real assets and
drop `test_assets_are_generated_not_committed_by_hand`.
- **Still omitted, deliberately:** `logoDark`, `privacyPolicyURL` and
`termsOfServiceURL` - all genuinely optional, and the latter two would point at
documents that do not exist.
## 5. Templates directory holds 10 templates in 10 files, with a shared examples set
- **Brief, Appendix:** ten templates, "each with a filled example".
- **Shipped:** ten templates in `templates/`, and ten filled examples in
`templates/examples/`, all written against **one** fictional product (Nimbus).
- **Why:** the brief did not specify whether examples should be independent. One
coherent product makes the examples cross-reference each other the way real
artifacts do - the rule cites the ADR, the business doc names the code the rule
protects, the runbook fires from the skill. Ten disconnected samples would not
have shown that, and the cross-referencing is a large part of what the
taxonomy is for.
- **Note:** item 9 of the Appendix ("Router templates - thin CLAUDE.md /
CODEX.md / AGENTS.md index skeletons") is one file holding three skeletons, as
the brief describes it.
## 6. Fenced code blocks are exempt from truth checking
- **Brief, Part 14.1:** "No doc describes deleted behavior (sampled: docs' named
files/symbols exist)."
- **Shipped:** the coverage checker strips fenced code blocks before extracting
links and path mentions.
- **Why:** without the exemption, every illustrative example in a skill produces
a false HIGH finding - and a checker with false findings trains people to
ignore it, which is worse than not having it. The first run against Akinator's
own skills produced five such findings, all illustrations.
- **The rule it creates:** an illustrative path must live inside a fence; prose
outside a fence is treated as a claim and is checked.
- **Recorded in:** `memory/2026-08-26-fenced-examples-avoid-false-findings.md`.
## 7. Gate receipts are specified, not shipped
- **Brief, Part 12.2:** "Implement a tree-bound gate receipt".
- **Shipped:** the mechanism is specified in
`rules/06-gate-once-scoped-at-the-end.md` and
`skills/everything/references/akinator-gate-economy.md`; no reference implementation ships.
- **Why:** hook stacks differ too much between repositories for one
implementation to be correct, and a wrong one would be trusted. This is
recorded as debt with a payoff condition rather than left implicit.
- **To close:** build the first one in a real target repository, then extract it
into `templates/`.
- **Recorded in:** `docs/adr/0004-gate-receipts-over-hook-bypass.md`, under Debt
taken on.
## Review when
- The brief is revised.
- A platform contract changes such that a deviation is no longer necessary -
particularly items 3 and 4, which exist only because of current Codex
validation behavior.
- Last verified: 2026-08-26.
SHA-256: fe1fa21fea071081e519b418633c010aa34ce84c641bd76a6138830b6ba41972