# Ship History Archive — 2026

Archived from `current_state.md ## Ship History` to stay within the 10-entry cap. Entries are rotated out verbatim (per ship.md §205 — never edited), newest-archived first.

### Ship-chore-backlog-tracker-sync-2026-06-10
- **Branch `chore/backlog-tracker-sync`** (quick-win, ledger hygiene) — Strict self-assessment follow-up: verified the suspected backlog↔tracker drift against actual issue-closure rationales before acting (5 of 6 "drifted" rows were FALSE ALARMS — issues #142/#144/#148/#149/#150 were closed-premature with "row remains as future direction" by design; legend note added so the convention is visible). Real fixes:
  - Row #48 → Cancelled/archived (issue #154 closed as already-implemented 2026-06-02; row desynced since).
  - Row #70 added for open issue #193 (JSON Drift Log export) — tracker→backlog gap.
  - **Ship History cap enforced**: 37 entries had accumulated in SSoT against ship.md's 10-entry rotation rule (unenforced drift, incl. 4 entries added earlier today); 28 rotated verbatim to `archive/ship-history-2026.md` (newest-archived first; relative-link scan clean). SSoT shrinks ~190 lines — every bootstrap reads this file, so the compaction directly serves the instruction-load budget.
- Tests: validators fail=0 both platforms.

### Ship-feat-deletion-first-add-gate-2026-06-10
- **Branch `feat/deletion-first-add-gate`** (feature, spec `docs/specs/deletion-first-add-gate.md`, backlog #65 / issue #166) — Made the DELETE-bias discipline structural at rule-authoring time, under two binding owner constraints verified by the review's bloat self-audit: **zero always-loaded context growth (net −5 lines)** and zero new hard gates.
  - **§13 Governance Change Norms** (engineering_guardrails.md, CONDITIONAL read only): Deletion-First Norm — changes to the 3 always-loaded surfaces (AGENTS.md, .agent/rules/*, shared-contracts.md) must cite a deletion or record a 1-line net-add justification; ADD-Gate — a new imperative rule/gate anywhere in .agent/** declares its signal tier, strongest feasible: T1 machine-enforced · T2 eval-backed (#45 coverage-tracked; governance files only) · T3 named human observer + rationale. External citations are metadata, never a tier; no feasible tier → don't add. Existing rules grandfathered.
  - **Reachability over theatre**: roundtable found the quick-win Token-Leak Block made a guardrails-hosted norm structurally unreadable on the most common governance-edit flow — fixed with a 2-line bootstrap hook + narrow heading-scoped §13 exemption. All 3 load paths (Full conditional / quick-win / review bullet) verified.
  - **Dogfood**: the PR itself cites 2 deletions (§5.3 duplicate scope bullet; stale Token-budget header block — both grep-verified consumer-free); the spec self-applies `signal_tier: 2`; +1 adversarial eval case protects §13 (live-scored both directions); a phantom MUST-bearing inventory anchor introduced by the trigger line's wording was caught and fixed mid-implement.
  - **Design discipline**: 3 tiers not 4 (external-standard tier failed the [enforcement] lesson's own test → demoted to metadata); Strand D respected — no naive directive-count gate, planned counter tool deleted from the design pre-birth; spec-app-feature template untouched (would export irrelevant instruction load downstream).
  - **Machine teeth**: validate.sh + validate.ps1 (parity) advisory WARN for governance-rule specs missing `signal_tier:` frontmatter (substring detector, created≥2026-06-10 grandfather, `signal_tier: none` escape); tests/guard/test_signal_tier_check.py fixture parity tests. Honest boundary stated in spec: field presence is machine-checked; tier truth is reviewer-checked; T2 truth tracked by the #45 coverage WARN.
  - **Evidence**: pytest tests/ci+guard+.agentcortex/tests **456 passed**; both validators pass=100 fail=0 post index entry; review R1 PASS (9/9 ACs, 1 LOW advisory = documented paraphrase-brittleness boundary). Commit `ccb0294`. Rollback = revert PR.
- Tests: 456 passed; validators fail=0.

### Ship-ci-issue-163-remainder-2026-06-10
- **Branch `ci/issue-163-remainder`** (quick-win, CI hardening, backlog #57 / issue #163 remainder — core slice was PR #177) — Closed out #163 with each deferred item's premise verified first (evidence-before-adding):
  - **Legacy suite CI-gated**: `.agentcortex/tests/` (177 tests, previously not CI-gated at all) added to the Linux structural job + a NEW `test-windows` pytest job (windows-latest, pinned reqs, pip cache) — local Windows run 177 passed in 304s disproved the "unproven on Windows" deferral concern; the PR's own CI is the cross-platform proof.
  - **UTF-8 sweep + critical files**: new `utf8-and-critical-files` job — all tracked `.md/.sh/.yml/.yaml` must decode as UTF-8 (recurring cp1252/encoding failure class; validator encoding canaries exist for the same reason) + presence pre-check for 7 governance-critical files. Local sim: 225 files clean.
  - **verify_agent_evidence-on-PR DROPPED as vacuous**: the tool inspects only `.agentcortex/context/review/` mirrors — a mechanism this repo deliberately removed 2026-05-22 (no producer). Probed two real merge ranges: both → "No changed reviewable Work Logs found", exit 0. Wiring it = always-skip theatre (Lesson [enforcement]); rationale recorded on the issue.
  - **Evidence**: +3 regression guards (`test_ci_hardening.py`, 7 total); UTF-8 sweep + critical-file sim pass locally; PR CI green incl. the new Windows job. Rollback = revert PR.
- Tests: regression guards 7 passed; PR CI green.

### Ship-feat-governance-eval-harness-2026-06-10
- **Branch `feat/governance-eval-harness`** (feature, spec `docs/specs/governance-eval-harness.md`, backlog #45 / issue #151) — Operationalized the [enforcement][HIGH] Global Lesson: a data-only behavioral eval harness measuring whether agents actually obey governance under adversarial pressure, plus a DELETE-bias diff workflow proving a rule is load-bearing before deletion.
  - **Eval spec**: `.agentcortex/eval/governance.yaml` — 14 adversarial seed cases (gate-bypass, no-evidence ship, prompt-injection-in-tool-output, classification downgrade, chat-language drift, SSoT write isolation, sentinel omission, lock takeover, unauthorized refactor, frozen-spec edit, scope creep, secret exposure +2); every `protects` tag resolves 1:1 against the live MUST-rule inventory. Data-only — never loaded at runtime (zero token cost).
  - **Runner**: `run_governance_eval.py` (stdlib-only, reuses `_yaml_loader` so the no-PyYAML subset-parser path scores identically — field-level parity verified) — `--transcripts`/`--case`/`--agent-cmd {prompt}`+`--timeout`; deterministic `--format json` (byte-identical across runs, diffable without jq); `--coverage` extracts the MUST-bearing section inventory from AGENTS.md + engineering/security guardrails at runtime (51 anchors; no hand-maintained registry to drift). Injection-safe: shlex-split template THEN substitute prompt into argv, shell=False (5 attack vectors verified inert).
  - **DELETE-bias workflow**: `run_delete_bias_diff.sh` (baseline → mutate rule → re-run → diff by case id; zero flips = vacuous-rule verdict) + `docs/guides/delete-bias-workflow.md` runbook with the honest boundary (measured-when-run, not always-on enforcement).
  - **Standing consumer**: validate.sh + validate.ps1 capability-by-presence advisory — currently `governance eval coverage: 44 MUST-rule section(s) with zero guarding cases` (honest: 44/51 rules unguarded; growing the case set is the follow-up, and backlog #65 depends on this harness).
  - **Review (2 rounds + hardening)**: R1 NOT READY — HIGH-1 wrapper word-split silently broke documented multi-word `--agent-cmd` (fixed: bash array); MED-1 validate.sh dead json block/double subprocess (fixed); MED-2 malformed-YAML guarantee was PyYAML-only (fixed: structural validation at load — clear error on the lenient subset path too). R2 PASS; LOW NEW-1 (scoring-field shapes could traceback or silently char-iterate) fixed beyond verdict.
  - **Evidence**: pytest tests/ci+guard **272 passed** (241 post-#17 baseline + 31 new); deploy referenced-tools test green (`run_governance_eval.py` whitelisted); validators parity. Commits `add417a` → `c60c4f4` → `d884cc6`. Rollback = revert PR.
- Tests: 272 passed; validators fail=0.

### Ship-feat-worklog-lock-blocking-2026-06-10
- **Branch `feat/worklog-lock-blocking`** (feature, spec `docs/specs/worklog-lock-blocking.md`, backlog #17 / issue #147) — Work Log lock graduated advisory → blocking: single-writer per branch with an honest enforcement boundary (teeth = tool exit codes + validator WARNs + 23 guard tests; workflow text consumes verdicts — an agent ignoring exit 2 can still write, recorded as explicit non-goal pending guard-level write verification).
  - **Tool** (`recover_worklog_lock.py`): atomic acquire — `O_CREAT|O_EXCL` create; unlink+`O_EXCL` recovery (serializes racing recoverers — `os.replace` would let both believe they won); tmp+`os.replace` only for same-session refresh; new `release` (idempotent, owner+session-verified) and `ensure --takeover` (requires `--worklog`, audited Drift line); bounded retry on transient Windows IO errors with exit 3 kept distinct from held-lock exit 2.
  - **Config/workflows**: `worklog_lock.mode: blocking` (default) | `advisory` — consumed at the workflow layer, tool mode-independent; new `shared-contracts.md §Phase-Entry Lock` (every non-tiny-fix phase entry runs `ensure`; exit 2 under blocking = Gate FAIL with wait/takeover/switch-branch options); bootstrap §2a mode-aware with the §1 Step 2 concurrent-session prompt unified onto the lock verdict; /ship + /handoff release at phase exit (failure → WARN, staleness self-heals); Python-unavailable hosts degrade to the manual advisory checklist (stated honestly, no fake MUST).
  - **Validators**: validate.sh + validate.ps1 WARN on non-stale lock owner/phase mismatch vs Work Log header (parity fixture-verified; the new check live-caught this very branch's stale-phase lock during development).
  - **Security (review-driven, 3 rounds)**: R1 HIGH — Drift Log newline injection: crafted lock `owner`/`session` could forge `## Gate Evidence` headers + fake ship receipts in another session's Work Log via takeover/recovery drift lines. R2 proved the CR/LF-only fix bypassable end-to-end via U+2028/U+2029/U+0085 (validators parse with Python `splitlines()`). Final sanitizer mirrors `str.splitlines()` (superset of both validators' split sets); R3 re-reproduction inert; mutation check confirms the regression tests are load-bearing.
  - **Evidence**: pytest tests/ci+guard **241 passed** (218 baseline + 23 new); validate.sh & validate.ps1 parity (sole pre-ship FAIL was this spec's own missing index entry, resolved here); live dogfood — this ship's lock was released at handoff and re-acquired for ship via the new verbs. Commits `f906ffa` → `7cda57c` → `0f6047c`. Rollback = revert PR.
- Tests: 241 passed; validators fail=0.

### Ship-fix-ssot-drift-adr-index-backlog-count-2026-06-09
- **Branch `fix/ssot-drift-adr-index-backlog-count`** (quick-win, governance/SSoT) — Broader SSoT/doc-drift audit requested by user; verified every `current_state.md` claim against the source-of-truth files and fixed 3 confirmed drifts. Read-only diagnosis first (classification deferred), then governed quick-win remediation.
  - **Drift 1 (ADR Index status)**: ADR-004 / ADR-005 were labelled `proposed 2026-06-03` in the SSoT ADR Index, but both ADR files carry `status: accepted` and their implementing spec `downstream-fork-accommodation.md` is `[Shipped 2026-06-03]` (PR #175). Root cause = the `/ship` that landed that feature flipped the Spec Index to `[Shipped]` but missed the ADR Index `proposed→accepted` flip. → both corrected to `accepted`.
  - **Drift 2 (backlog count)**: Active Backlog said `(40 items)` — stale. `40` was accurate pre-2026-06-02; the archive split (backlog #8) moved 33 rows to cold storage but the SSoT count was never updated. This PR also archived the 2 remaining Shipped rows (#50, #56) to `_product-backlog-archive.md`, so the active backlog is now 21 all-Pending rows. → `21 active items`.
  - **Drift 3 (Spec Index intent, non-drift clarified)**: 3 specs in `docs/specs/` (`tiered-doc-lifecycle`, `skill-research-integration`, `_research-rpi-qrspi-corroboration`) are absent from the Spec Index. Determined **by design** — the index lists shipped graduations only (every entry is `[Shipped]`); draft/research specs are tracked in the backlog `Spec File` column (confirmed by backlog #11 "Shipped specs accumulation — status-driven filtering"). The convention was undocumented, so it read as drift. → added a one-line header note; no index rows added/removed.
  - **Verified consistent (no change)**: version banners 1.4.1, all 5 ADR files present, 9 indexed specs all `status: shipped`, References section files all exist, Seq 43 ↔ last merged PR #206.
  - **Honest scope**: SSoT metadata correction + backlog hygiene; no semantic rule/behavior change. Also refreshed `Last Verified`→2026-06-09; archived backlog #50/#56. **Extension fix** (post-ship multi-angle review): both validators + `ship.md` expect the Active Backlog path backtick-quoted, but the SSoT used a bare path so the path-consistency check was vacuously passing — backtick-quoting re-activated the dormant guard (no new validator added). A post-review trim removed over-annotation from the Drift 2/3 edits.
  - **Evidence**: all drifts grep-verified against ADR frontmatter + backlog row counts; SSoT writes via `guard_context_write.py` (optimistic-lock replace, expected-sha verified); final `bash validate.sh` → pass=101 warn=7 fail=0 skip=2 (v1.4.1 baseline; audit-chain + append-only witness + ADR/Spec Index completeness all PASS). Commits `f3ac21c` (drift fixes) → `2e6b80b` (archival + count sync), 5 total; PR #208 CI green.
- Tests: validate.sh fail=0.

### Ship-fix-chat-language-policy-salience-2026-06-08
- **Branch `fix/chat-language-policy-salience`** (quick-win, governance docs) — Fixed chat-language drift: agents replied in English to Traditional-Chinese input (worst on Claude) and occasionally emitted Korean/Japanese. Diagnosed via 4 sub-agent expert passes + direct grep; corrected the initial CJK-leak framing once the user clarified the dominant symptom is zh-input→English-output.
  - **Root cause** = output-layer **enforcement asymmetry**: the English `⚡ ACX` sentinel + gate blocks + phase templates are reinforced **every turn** with MUST, while the language rule was a single un-reinforced, two-language declarative example (`AGENTS.md:7`); `.agent/` phase/guardrail corpus had ZERO chat-language references. Compounded by ~99% English context dilution, a missing artifact-vs-chat carve-out (`CONTRIBUTING.md`/`AGENT_PHILOSOPHY.md` "English is canonical" bleeding into chat), and an Antigravity-only `.antigravity/rules.md:6` "default Traditional Chinese" rule contradicting AGENTS.md.
  - **Fix (owner-selected 1+2+4)**: (1) `AGENTS.md §Chat Language Policy` rewritten — universal-language (arrows = examples not allowlist), explicit anti-drift incl. never collapsing any non-English input into English (TC ≠ Simplified/JP/KR/English — generalized after a Latin-script cold-read test confirmed English/French/German/Spanish route correctly but the anti-drift *verb* had named only CJK), live-chat-vs-artifact carve-out, deterministic English fallback. (2) `AGENTS.md §Runtime v1 rule 11` sentinel clause: body before `⚡ ACX` MUST be in user's language → rides the only every-turn-reinforced rule for equal salience. (3) `.antigravity/rules.md:6` hardcoded zh-TW default → inherit-pointer (kills contradiction, restores 4-platform parity). Regenerated `trigger-compact-index.json` (AGENTS.md is a `detail_ref`).
  - **Honest scope**: steering/salience fix, NOT a gated safety property — no validator added (chat language is not machine-checkable; user is the immediate external observer per Lesson [enforcement]). Reduces drift probability; does not guarantee zero. Cross-checked against Lesson [enforcement][HIGH] + [governance-proposal] at plan time (Work Log Known Risk). Adversarial cold-read test (3 sub-agents) = SHIP; applied one tweak (dropped staleness-prone file-name parenthetical); 1 tester false-alarmed off stale §5 text (Lesson [audit-verification]).
  - **Evidence**: `validate.sh` pass=101 warn=7 fail=0 (warn=7 all pre-existing on unrelated logs, matches v1.4.0 baseline). Diff = 3 files + compact-index. Implementation commit `f99d711`.
  - **Bundled in PR #206** (user-requested): (a) **CI un-block** — fixed a pre-existing TIME-BOMB in `tests/guard/test_worklog_lock_recovery.py::test_active_lock_preserved_by_api_and_cli` (frozen-`NOW` lock timestamp vs the CLI subprocess's real-clock staleness check → flips active→recovered ~60 min past the hardcoded time; verified failing on pristine origin/main, unrelated to the language change). Now anchors the lock to real current time. (b) **v1.4.1 patch release** — version banners bumped (README EN+zh badge/title, CITATION.cff, deploy.sh ACX_VERSION, Model Guide EN+zh, Testing Protocol EN+zh, antigravity-v5-runtime) + CHANGELOG `[1.4.1]` entry. Full `pytest tests/ci tests/guard` = 218 passed; `validate.sh` fail=0. A separate task tracks the deeper lock-recovery design question (should a provably-live pid trump time-staleness).

### Ship-docs-architecture-ondemand-clarify-2026-06-08
- **Branch `docs/architecture-ondemand-clarify`** (quick-win, governance docs) — Follow-up to the v1.4.0 downstream simulation (spawned chip): a sim pass flagged `docs/architecture/<domain>.md` (referenced by `engineering_guardrails.md §4.2`) as dangling on fresh deploys. Investigation proved it a **false alarm** — `docs/architecture/` is intentionally capability-by-presence (created on demand by `/app-init`; `bootstrap.md` keys its "skip Domain Doc steps, zero extra reads" optimization on the dir being ABSENT; all consumers guard existence). Scaffolding it empty (the naive fix) would silently disable that optimization downstream, so option 1 was rejected.
  - **Minimal fix**: `engineering_guardrails.md §4.2` got an inline "(when present; created on demand by `/app-init`)" qualifier — the one reference lacking it; no semantic rule change. Added `tests/ci/test_deploy_tiering.py::test_deploy_does_not_scaffold_docs_architecture` locking in the no-scaffold design (deploy creates docs/adr + docs/specs but NOT docs/architecture).
  - **Evidence**: `pytest -k "docs_architecture or referenced_tools"` 2 passed; `validate.sh` pass=101 fail=0. No deploy behavior change. Implementation commit `2d415b0`. PR #204.

### Ship-fix-deploy-missing-runtime-tools-2026-06-08
- **Branch `fix/deploy-missing-runtime-tools`** (quick-win, deploy regression) — Found via multi-angle **downstream-simulation testing** of the v1.4.0 release: `deploy.sh`'s hand-maintained runtime-tools whitelist omitted two tools that DEPLOYED governance docs instruct downstream agents to run — `recover_worklog_lock.py` (bootstrap.md "Preferred command") and `lint_spec_drift.py` (review.md advisory linter). Downstream they failed with `python ...: No such file`. Drift entered when #156 + #188 added the tools/workflows but not the whitelist.
  - **Fix**: added both tools to both whitelists in `deploy.sh` (`_runtime_tools` update path + `runtime_tools` fresh-deploy array). Deps OK (`recover_worklog_lock` → already-deployed `guard_context_write`; `lint_spec_drift` stdlib-only).
  - **Regression guard**: new `tests/ci/test_deploy_tiering.py::test_deployed_governance_referenced_tools_are_deployed` deploys to temp, scans deployed governance docs for `.agentcortex/tools/*.py` refs, asserts each is shipped — catches any future tool/whitelist drift.
  - **Evidence**: post-fix re-sim deployed tools 10→12, previously-failing bootstrap command now `{"status":"created","exit_code":0}`, referenced-vs-deployed drift empty; `pytest tests/ci/test_deploy_tiering.py` 13 passed; `validate.sh` pass=101 fail=0. Implementation commit `8a79fb1`. PR #203.

### Ship-chore-v1.4.0-release-2026-06-08
- **Branch `chore/v1.4.0-release`** (quick-win, docs/release) — Cut release v1.4.0: bumped version banners, fixed the broken top README badge, and modernized the hero diagram. Captures post-v1.3.0-tag work (spec drift linter #156, multi-agent review guidance #162, pre-commit local validation hook #192, work-log lock auto-recovery #188, deploy core-overwrite backup #173, POSIX/PowerShell validator portability #190).
  - **Banners**: v1.3.0 → v1.4.0 across `README.md` (badge), `docs/README_zh-TW.md`, `CITATION.cff` (+ date-released 2026-06-08), Model Selection Guide (EN+zh), Testing Protocol (EN+zh), `deploy.sh` (`ACX_VERSION`), and `antigravity-v5-runtime.md`. Measurement-tied `LIFECYCLE_BENCHMARK` banners (2026-05-31 snapshot) intentionally left unchanged, per the v1.3.0 precedent.
  - **Broken badge fix**: the top shields.io version badge had an unencoded space in `Agentic OS` (`/badge/Agentic OS-...`) that returned HTTP 000 on GitHub's camo proxy; encoded to `Agentic%20OS`. Verified `200 image/svg+xml` post-fix.
  - **Hero diagram**: converted the ASCII "The Solution" box-art to a mermaid flowchart with explicit `Gate FAIL → STOP` / `Evidence FAIL → STOP` branches, reusing the existing phase-flow color palette. No decorative slop added (honors the v1.3.0 de-slop).
  - **Evidence**: `bash validate.sh` → pass=101 warn=7 fail=0 skip=2 (all 7 WARN pre-existing on unrelated work logs). Validator encoding-canary phrases (`governance-first layer for AI coding agents` / `用工作流程、交付閘門與工程護欄`) untouched → no canary repoint needed. Implementation commit `f1bbfae`.

### Ship-codex-multi-agent-review-guidelines-2026-06-04
- **Branch `codex/multi-agent-review-guidelines`** (feature, spec `docs/specs/multi-agent-review-guidelines.md`, backlog #56 / issue #162) — Added a concise cross-tool contributor/review layer so Codex, Claude, Gemini, and GitHub Copilot can participate without duplicating the full governance corpus into each adapter.
  - **Shared review entry**: `AGENTS.md ## Review guidelines` now gives Codex and other agents a short review priority list focused on correctness, security, evidence, scope, and governance drift.
  - **Adapters**: `GEMINI.md`, `.github/copilot-instructions.md`, and `.github/instructions/governance-review.instructions.md` point back to shared governance while keeping tool-specific context short.
  - **Human guide**: `docs/ai-contributors.md` documents PR/local interaction patterns for `@codex review`, `@claude`, `@copilot`, and Gemini CLI.
  - **Evidence**: new guard tests 5 passed; final `pytest tests/ci tests/guard` 185 passed after ship metadata; validate.ps1 and Git Bash validate.sh both fail=0; implementation commit `fe0f306`.

### Ship-codex-issue-156-spec-drift-linter-2026-06-04
- **Branch `codex/issue-156-spec-drift-linter`** (feature, spec `docs/specs/spec-drift-linter.md`, issue #156) — Added an advisory spec-vs-diff linter for `/review` so reviewers can spot changed files not mentioned by AC path references and AC-referenced paths not touched by the branch, without changing review verdict rules.
  - **Tooling**: `.agentcortex/tools/lint_spec_drift.py` resolves specs from `--spec` or Work Log `--worklog`, extracts path-like references from `## Acceptance Criteria`, compares against `git diff --name-only`, includes untracked files for local review, prints concise advisory warnings, and exits 0 for drift warnings.
  - **Safety**: git revisions passed to `--base` / `--head` reject option-like values; subprocess calls use fixed argv lists; no dependencies added.
  - **Workflow**: `.agent/workflows/review.md` now instructs reviewers to run the linter before Burden of Proof and explicitly labels it advisory/non-blocking.
  - **Evidence**: focused linter tests 8 passed; `pytest tests/ci tests/guard` 188 passed; validate.ps1 and Git Bash validate.sh both fail=0 after sync with `origin/main`. Implementation commit `c76812d`.

### Ship-arch-downstream-fork-accommodation-2026-06-03
- **Branch `arch/downstream-fork-accommodation`** (architecture-change, ADR-004 + ADR-005, spec `docs/specs/downstream-fork-accommodation.md`) — Strengthened downstream fork/clone compatibility so downstream users keep their own skills + governance across upgrades without editing framework files in place. Decided via 3-round multi-expert analysis (20+ agents, 48-scenario catalog, external prior-art on Copier/Cookiecutter/git-subtree/Nix/Kustomize).
  - **A — Override layer activated** (ADR-004): the already-shipped-but-inert `AGENTS.override.md` layer is now runtime-wired via `bootstrap.md §1a` (lazy/present-only, mirrors user-preferences.yaml); `doc-governance.md` soft-launch→active + Implementation Contract; AGENTS.md pointer. Carve-out (no gate relaxation) is warn-only; enforcement of the load step is structural (validate.sh/ps1 assert bootstrap ships §1a), per-agent compliance honor-system (no fake MUST).
  - **B — Deploy skill-sidecar tiering** (ADR-005): `deploy.sh get_tier` reclassifies `.agent/skills/**` + `.agents/skills/**` to scaffold → user-edited skills preserved via `.acx-incoming` (closes R1 silent-overwrite); rules/workflows/validate/deploy/platform/tools/metadata stay force-update (no governance drift). Narrowed from the user's literal "all core" on the invisible-drift safety argument (user-confirmed).
  - **C — README fork stance**: README.md + docs/README_zh-TW.md gained an "Additive Fork / 客製化而不衝突" section (override layer + custom-* skills + "never edit framework files in place").
  - **D — `custom-*` namespace**: routing.md §3a publishes the 14 framework skill names + reserves the `custom-*` downstream prefix; regression-guarded by a test asserting the framework ships no `custom-*` skill.
  - **Evidence**: full ci+guard suite **152 passed / 0 fail** (incl. behavioral deploy test: edited framework skill→sidecar, edited core rule→force-update no sidecar, custom-* untouched). `validate.sh` **pass=101 fail=0** after regenerating `trigger-compact-index.json` (commit edef328): AGENTS.md is a `detail_ref` in trigger-registry, so the override-pointer edit shifted its CR-normalized content_hash (`phase-entry-skill-loading` d4576539→76468978) and made the committed compact index genuinely stale on CI — a real staleness initially MASKED locally by the Windows CRLF-on-disk artifact (an earlier evidence note wrongly attributed it to CRLF only; corrected here). **All PR #175 CI checks green** (Framework Validation Linux + Windows + Python 3.9, SAST, secrets, shellcheck, smoke). `/review`: 20-agent adversarial pass, 18 findings → 15 false-alarms killed by claim-verification, 3 LOW fixed (validate.ps1 message §1a parity, custom-* regression test, README heading parity). No CRITICAL/HIGH/MEDIUM.
  - **Follow-up (spawned, separate)**: validate.ps1 INDEX.jsonl witness parity — investigated; CRLF hypothesis disproven (lines byte-identical PS5.1+pwsh7); real cause environmental (mutating `git fetch` + local-ahead-of-remote), no patch applied (evidence-before-adding); read-only-witness hardening left as a separate task.
  - **Rollback** = revert PR. Codex final double-check pending.

### Ship-chore-backlog-issue-sync-roadmap-2026-06-02
- **PR #165** (quick-win, doc-only) — Backlog ↔ issue-tracker sync + a verified ~1–2 month optimization roadmap mined from a more mature internal reference implementation, re-expressed entirely in our own terms (no upstream names/paths/IDs in any public artifact).
  - `docs/specs/_product-backlog.md`: added a **GH Issue** column linking active rows to the tracker; added curated roadmap rows (#45/#48/#50/#51/#56/#57/#58/#65–#68) with a legend distinguishing backlog-# from GH-#.
  - `docs/OPTIMIZATION_ROADMAP.md`: new *why / sequencing* layer (4 tracks; candidate lists marked illustrative-not-endorsed).
  - **Issue curation** (tracker): across the wave filed 25 issues, then curated to ~17 active roadmap issues via **multi-pass verification against actual code paths**; dropped premature / already-handled / deliberately-removed items (DELETE-bias). Tier 1+2 = reopened #151/#141/#143/#162/#156/#154 + new #166–#169.
  - **Verification caught false signals** (recorded as method-win): `state_machine.md` already had scope-creep reverse transitions + hard-block thresholds; skill-cache freshness was a *deliberately-removed* signal (re-add rejected); ≈no real cross-file directive duplication; gate-receipt-JSONL justification didn't hold; a "tracked stale lock" was never actually committed.
  - **Evidence**: `validate.sh` pass=86 warn=7 fail=0; PR CI 11/11 green; zero mother-project leakage in shipped docs (grep-verified); no runtime/behavior change. Rollback = revert PR #165.

### Ship-fix-backlog-kind-diversity-parity-2026-06-01
- **Branch `fix/backlog-kind-diversity-parity`** (quick-win, module `.agentcortex/bin/validate.sh`) — Fixed column extraction indices ($4 for Kind, $5 for Labels) in validate.sh and removed grep -v em-dash pre-filter to align with validate.ps1 and prevent false-positives.
  - Parity check passes locally: validate.sh and validate.ps1 report same 103 PASS / 6 WARN / 0 FAIL.
  - All 144 unit tests pass successfully.
  - Verified downstream deployment and bootstrap integrity in temp_downstream project.

### Ship-docs-benchmark-self-regen-2026-05-31
- **PRs #128 (EN) + #129 (zh-TW)** (quick-win, doc-only) — Made `docs/LIFECYCLE_BENCHMARK.md` (+zh-TW) self-regenerating and fixed two stale-data defects flagged in review ("有些測量跟紀錄是不是要用新版的數據").
  - **Deleted-skill refs removed**: the 6 hand-coded scenario tables cited 5 skills deleted in `f3d97fc` (writing-plans, executing-plans, finishing-a-development-branch, requesting/receiving-code-review). Replaced with qualitative Scenario Profiles using only the current 14-skill set.
  - **Stale 2026-04-12 numbers replaced** with one tool-generated, dated **Token Consumption Snapshot** (2026-05-31) + a "regenerate anytime" note so it cannot silently drift again: current 335,728 / optimized 205,608 / saved 130,120 (38.8%), verified live against `analyze_token_lifecycle.py`. Onboarding "~17K"→"~27K".
  - **Wrap-up review fixes (this entry)**: corrected architecture savings 46.0%→46.6% (38,535/82,665) in both files; resolved committed git conflict markers in this SSoT left by the #121/#122 squash-merge collision (both ship entries preserved below). EN/zh parity verified; validate fail=0; main CI green.

### Ship-feat-handoff-trigger-occupancy-2026-05-31
- **Branch `feat/handoff-trigger-occupancy`** (feature, spec `docs/specs/handoff-trigger-policy.md`, ADR-001 domain) — Handoff-timing trigger overhauled from **turn-count** to **context-occupancy + phase-boundary** (advisory), converging four scattered/contradictory turn constants into one SSoT and making the model cross-platform-consistent for 2026.
  - **SSoT**: `AGENTS.md §Context Pruning` — occupancy + phase-boundary primary; turn-count (~8+) demoted to a labelled coarse fallback; rationale = premature handoff resets the warm prompt cache (all majors cache prefix ~0.1× + auto-compact at high fill). Stays **advisory** (grep-confirmed no validator enforces it; no fake MUST added, per Lesson [enforcement]).
  - **Reconciled**: `NONLINEAR_SCENARIOS.md` Rule 6 (8/12/15 ladder → labelled fallback) + Rule 1 clarified (Work-Log checkpoint ≠ handoff); `token-governance.md` §1 turn-budget reframed soft, §6 stale "becomes available" fixed, new **§6.1 cross-platform table** (Claude 5-min-TTL/1M; Codex auto-cache + ~95% compaction/24h GPT-5.1; Gemini implicit-cache/1M–2M). Bilingual zh-TW mirrors. 1-line handoff-timing pointers added to CLAUDE/CODEX (+zh) platform guides + antigravity-v5-runtime.
  - **Cross-platform facts source-verified 2026-05-31** (Anthropic / OpenAI / Google docs). Self-audit retracted two hallucinated claims after full-repo grep (Lesson [audit-verification]).
  - **Evidence**: my doc-only diff adds zero NEW failures (`git diff 070e210 HEAD` touches no metadata/skill files — proven). The spec-index FAIL my new spec introduced is resolved by this index entry. `validate.sh` deterministically reports `fail=2` locally on Windows (`metadata deep validation` + `compact index freshness`, confirmed 5/5 isolated runs + direct tool 3/3) — these are a **pre-existing CRLF artifact** (compact-index content_hash is computed over CRLF-checkout SKILL.md ≠ committed LF hash → stale locally, fresh on CI; Lesson [cross-platform-eol]). **CI on main @070e210 = "Validate Framework Integrity: success"**, so CI (Linux/LF) is unaffected. Rollback = revert branch.
  - **Correction (Lesson [audit-verification])**: two earlier evidence claims were wrong and are superseded by this line — (a) "4 pre-existing FAILs incl. fix-win worklog compaction/illegal-progression" overcounted (those do not currently fire; it is 2); (b) commit 41b02ee's "Windows flakiness / transient PermissionError, true state fail=0" was wrong — the staleness is deterministic, not flaky. The accurate finding is the CRLF-artifact above.
  - **Real follow-up (NOT this PR)**: regenerate `trigger-compact-index.json` with CRLF-safe (LF-normalized) hashing so local Windows verdicts match CI — spawned as a separate task. Also archive the leftover untracked `fix-win-cmd-dispatch-readme-counts.md` worklog (PR #120) for hygiene.

### Ship-chore-governance-doc-consistency-2026-05-31
- **Branch `chore/governance-doc-consistency`** (quick-win, doc-only) — Follow-up consistency cleanup of 4 verified defect-class instances surfaced during the handoff-trigger work (scattered constants / stale facts / cross-platform drift). Advisory docs only; no enforced rule changed; `validate.sh` fail=0.
  - **tiny-fix threshold unified**: `< 5 lines` → canonical `< 3 files, no semantic change` in `antigravity-v5-runtime.md §6` + `context-budget.md` (SSoT = AGENTS.md / engineering_guardrails §10.1,§10.3).
  - **Sentinel unified**: `antigravity-v5-runtime.md §8` stale `[ACX-READ-OK]` / "first line of AGENTS.md" → canonical `⚡ ACX` (AGENTS.md rule 11). *(Correction: an earlier draft claimed a "§6 corruption / stray 303: removal" — fabricated, no such corruption existed. The §8 edit also failed silently 3× before landing; earlier SHA citations for it were hallucinated and have been removed — trust `git log` on the branch, not prose.)*
  - **Model strings genericized**: `AGENT_MODEL_GUIDE.md` (+zh) + bug-report template — exact minor versions → drift-proof tier descriptors. ADR-00X intentionally NOT edited (accepted = historical record).
  - **Pitfalls guide aligned**: `ai-development-pitfalls.md` 60%/30-45min reframed as proxies for the occupancy SSoT; `/clear`,`/compact` de-Claude-ified; AGENTS.md-first; softened a hard-coded token price.
  - **NOTE (SSoT merge race)**: PR #121 (handoff-trigger) also bumps Seq→26 + adds a ship entry; whichever merges second rebases this section (trivial additive merge).

### Ship-fix-win-cmd-dispatch-readme-counts-2026-05-31
- **Commit `554377e`** (squash, PR #120, quick-win) - Fixed a dead Windows `.cmd` install/update path + corrected stale README skill/workflow counts.
  - **Install bug**: `installers/deploy_brain.cmd` dispatched to canonical `.agentcortex/bin/deploy.*` whenever present (always, post-install), bypassing the wrapper's NVM-style install-vs-update routing. `deploy_brain.cmd .` from an installed root -> canonical `deploy.sh .` with REPO_ROOT==TARGET -> self-deploy guard error. Fix: cmd now ALWAYS delegates to the sibling wrapper (deploy_brain.ps1 preferred -> deploy_brain.sh), never canonical; added cmd->PS1 typed-arg mapping. Caught + fixed a `%0`/`shift` clobber the expert design missed (capture `%~dp0` into `SCRIPT_DIR` before shift). Rewrote ASCII+CRLF per `.gitattributes`.
  - **Docs**: README "17 Professional Skills" -> 14 (removed 5 phantom rows that are workflows, added real karpathy-principles + production-readiness with verified metadata); workflow count 35->33; added Windows `--dry-run` parity line. zh-TW: 17->14 + removed inaccurate versioned model string.
  - Verified offline via real `cmd.exe`: first-install dry-run (exit 0) + update-from-installed-root (Cloning -> .agentcortex-src -> "182 updated", exit 0, no self-deploy error). validate.sh & validate.ps1 fail=0 both.
  - Note: `deploy_brain.cmd` is wrapper-tier -> deployed as an update it sidecars (.acx-incoming) over locally-modified downstream copies; downstream must merge to receive the fix.
  - Closes issue #32 (skill-subdir deploy - verified already fixed by c7d9ade; nested agents/openai.yaml all deploy).
  - Multi-round adversarial review (3-lens workflow) caught 5 follow-ups, each empirically re-tested: README Windows preview `--dry-run`->`-DryRun` (PS1 `[switch]$DryRun` binding; the original line did a real deploy, not a preview); removed dead `--no-python`/`-NoPython` from cmd+ps1 (validate-only flag, never forwarded); `--source` empty-value fail-fast guard; and re-pointed the validate `deploy_brain.cmd` gate from the now-inverted canonical reference to the sibling-wrapper delegation.

### Ship-fix-validator-parity-and-audit-closure-2026-05-29
- **Commit `55ed8ea`** (quick-win, backlog #44 Shipped / #43 Cancelled) — Closed the final two 2026-05-29 self-audit items after INDEPENDENT verification.
  - **D (#44, real)**: backfilled the gate-receipt-schema check (Verdict/Classification validation on `- Gate:` receipts, active + archived) into `validate.ps1` — it existed only in `validate.sh`. Verdicts now match across platforms (active PASS, archived WARN:1 on the immutable ship-history archive). The parity sub-agent's other 3 claims (sentinel emoji, spec-template, Project Name, spec-status frontmatter) were FALSE — `validate.ps1` already had parity.
  - **C3 (#43, false alarm → Cancelled)**: the claimed replace/append disjoint-lock lost-update does NOT exist — `cmd_write` wraps both modes in `file_lock(lock_path_for_target)` and the only callers of `atomic_write`/`append_write` are inside that locked block. Added defensive docstrings closing the latent direct-call footgun.
  - Meta: 2 of the 3 deep audit findings (C3 entirely, 3/4 of D) were same-vendor sub-agent false alarms — caught only by reading the actual code path. Recorded as a Global Lesson.
- Verified: `validate.sh` & `validate.ps1` both fail=0 with identical schema verdicts; guard tests 94 passed.

### Ship-feat-audit-chain-tamper-evidence-2026-05-29
- **Commits `d4240f8` + `9c03588`** (feature, backlog #42) — Hardened ADR-003 hash-chained audit log against two verified tamper paths (2026-05-29 self-audit C1+C2). ADR-003 amended proposed→accepted with an honest tamper-evidence boundary.
  - **C1 (tail-truncation)**: the back-linked chain has no head/length anchor, so deleting the most recent entry still validated (reproduced). Added a git append-only **witness** to `validate.sh` + `validate.ps1`: the INDEX.jsonl committed at `merge-base origin/main HEAD` must be a line-prefix of the working copy (CR- + blank-normalized for Windows/parity; WARN-degrades offline; FAIL on truncation/edit of a published entry).
  - **C2 (migrate laundering)**: `append_chain_entry.migrate` re-blessed any mismatch; now fills only genuinely-missing prev_sha and **fails closed** (exit 2, no writes) on an existing-but-mismatched prev_sha — matching ADR-003's documented intent.
  - Design (Work Log D-1/D-2): rejected a forgeable in-repo anchor as false-confidence theatre per the [enforcement][HIGH] Global Lesson; git origin/main is the external append-only witness. Tamper-EVIDENCE not prevention, stated honestly in the ADR.
  - Tests: `tests/guard/test_audit_chain.py` +3 (C2 AC-1/2/3); `tests/ci/test_audit_witness.py` NEW (witness structural + cross-platform parity, AC-4/5/6). 126 passed. Witness sims (both validators): real→PASS, truncate-below-baseline→FAIL, edit-published→FAIL, blank-line→PASS.
  - CRLF bug found & fixed during impl (working copy CRLF vs `git show` LF false-FAILed every line → `tr -d '
'`).
- **Follow-ups still queued** (same audit): #43 guard replace/append lock unification (C3); #44 validate.sh↔validate.ps1 parity backfill (D).
- Stacked on PR #116 (A+B test/CI fix).

### Ship-fix-guard-test-ci-coverage-2026-05-29
- **Commit `8001ef5`** (quick-win) — Framework self-test integrity: restored `tests/guard/` collection + gated it in CI (audit items A+B, 2026-05-29 self-audit).
  - Root cause A: `tests/guard/test_sentinel_hook.py` + `test_precompact_hook.py` `exec_module()` the hook sources `.claude/hooks/check-sentinel.py` / `check-precompact.py`, intentionally removed in `aec35d6` (zero-python-downstream design, documented in `.claude/settings.json`). Missing files raised `FileNotFoundError` at pytest **collection** → aborted the ENTIRE `tests/guard/` collection → all 82 valid governance-tool tests silently never ran.
  - Root cause B: CI (`.github/workflows/validate.yml`) ran only `pytest tests/ci/`, never `tests/guard/` — so the 82 tests (guard_context_write, audit-chain, lint, lifecycle, adr-coverage) were ungated regardless.
  - Fix: deleted the 2 orphaned test files (355 lines; feature deliberately removed) + extended `test-ci-structural` job to `pytest tests/ci/ tests/guard/ -v`.
  - Evidence: pre-fix `pytest tests/guard/` = 2 collection errors / 0 run; post-fix `pytest tests/ci/ tests/guard/` = 114 passed, 0 errors.
- **Follow-ups queued (same self-audit, NOT shipped here)**: C1 audit-chain tail-truncation undetectable (reproduced — `check_chain` has no head/length anchor); C2 `migrate` re-blesses forged history; C3 guard replace/append take disjoint locks → lost-update risk on `current_state.md`; D validate.sh↔validate.ps1 parity gaps (unverified). See backlog #41–#44.

### Ship-brain-quality-sprint-2026-05-26
- **PR #112** (squash `f3b3b81`) — Brain quality batch: set -e hardening, Anti-Rationalization §4.5, AGENTS.md -43% tokens.
  - `validate.sh`: added `-e` flag (`set -euo pipefail`); hardened `run_python_check` for set-e abort; added `|| true` guards to all grep/wc/du/cat pipeline assignments.
  - `engineering_guardrails.md §4.5`: Anti-Rationalization Rule — structural tripwire requiring evidence citation written to Work Log before verdict appears in same response (backlog #15).
  - `AGENTS.md`: 191→98 lines (-43% tokens, backlog #38) — extracted 3 Shared Phase Contracts sub-sections to `.agent/workflows/shared-contracts.md`; Skill Safety items 5-9 clarified.
  - `.agent/workflows/shared-contracts.md`: NEW file; contains Phase-Entry Skill Loading, 5-Gate Verification Before Completion, Phase Output Compression.
  - 10 workflow files bulk-updated: anchors from `AGENTS.md §...` → `shared-contracts.md §...`.
  - `trigger-registry.yaml`, skill stubs (2 files): runtime_anchor updated from AGENTS.md to shared-contracts.md.
  - Tests: CI 11/11 green. validate.sh PASS.
- **PR #113** (squash `9868896`) — Expert review follow-up: validate.sh safety, shared-contracts unconditional, §4.5 tripwire.
  - `validate.sh`: hardened wc/du/cat assignments; `current_state.md` read guarded with `|| { record_result WARN ... }`.
  - `AGENTS.md §Shared Phase Contracts`: strengthened to unconditional load directive (Gate FAIL if skipped); added Read-Once exemption for shared-contracts.md.
  - `engineering_guardrails.md §4.5`: structural tripwire version (write-before-verdict); cross-reference added to `review.md`.
  - `guard_context_write.py`: B2 dangling anchors — regenerated trigger-compact-index.json.
  - Tests: CI 11/11 green.
- **PR #114** (squash `334907c`) — Consensus batch: #43 fix, --list-checks, B19 atomic writes, gate receipt schema.
  - `validate.sh`: FAIL if deprecated workflow files present (new-feature/medium-feature/small-fix); `--list-checks`/`-l` flag; gate receipt schema WARN checks for active+archived work logs.
  - `validate.ps1`: mirrored deprecated-files FAIL check; removed same 3 files from `$requiredFiles`.
  - `guard_context_write.py`: rename-CAS atomic write (`os.replace(tmp, target)`); `cleanup_stale_tmps()` at startup (backlog #19).
  - `.agent/workflows/new-feature.md`, `medium-feature.md`, `small-fix.md`: deleted (closes #43).
  - `_product-backlog.md`: B19 → Shipped 2026-05-26.
  - Tests: CI 11/11 green (including Framework Validation Windows).
- Backlog closed: #15 (Anti-Rationalization), #19 (SSoT atomic writes), #38 (AGENTS.md token-budget pass), #43 (deprecated workflow files).

### Ship-fix-downstream-path-consistency-2026-05-22
- **PR #106** (squash `40d3462`) — Cross-session doc write/read path alignment for zero-Python downstream (quick-win).
  - Archive paths: `/ship` final-archives to dated root `archive/<worklog-key>-<YYYYMMDD>.md` (collision-safe on reused branches like a downstream working only on `main`); `handoff §6` clarified as compaction overflow (`archive/work/`); `bootstrap` recovery breadcrumb resolves the root of `archive/` + resumes multi-person `<owner>-` logs; `deploy.sh` scaffolds `archive/work`.
  - Skill anchor: `systematic-debugging` `runtime_anchor` realigned to `implement.md#Skill Execution Overrides` across stub + `trigger-registry.yaml` + `openai.yaml` mirror.
  - Review mirror: removed dead producer instruction + downstream scaffolding (no downstream consumer; dropped phantom `agentcortex-verify.yml` reference). Upstream-only verify tool + 14 tests left intact.
- Tests: validate 93/6/0; `verify_agent_evidence` 14/14; `deploy.sh bash -n` OK. CI 11/11 green.

### Ship-claude-blissful-jemison-27dfb2-2026-05-18
- **PR #104** — Multi-round adversarial governance audit: validator gate-injection hardening + downstream UX gaps (feature).
  - `validate.sh`/`validate.ps1`: T175–T247 (22 gate-injection scenarios closed) — code-fence bypass, HTML-comment bypass, indented-receipt masking, unclosed-fence masking, multi-section masking, self-reclassification reset abuse (H4), receipts-in-fence diagnostic (T247).
  - `test.md` no-test-runner fallback path hardened: hotfix moved to sign-off-required group (§12.2); Gate 2 exception scoped to quick-win/tiny-fix; fallback step 5 tier-scoped receipt; step 6 scoped to quick-win/tiny-fix only (terminal for feature/hotfix); Drift Log write added to quick-win/tiny-fix trigger; Step 4b Gate-2 exception now satisfiable from both paths.
  - `bootstrap.md §3.7`: feature full-chain removed from `Next:` field (8-line budget breach); chain recorded in Work Log Task Description only.
  - `.codex/INSTALL.md`: bash required on ALL platforms; Windows Git Bash prerequisite explicit; PS1 -ExecutionPolicy Bypass.
  - `validate.sh`/`validate.ps1` M8: archive relative-link depth check; `ship.md §2`: depth-hazard warning.
  - M8 counter overflow fix: switched from `sys.exit(count)` to stdout count read (avoids mod-256 wrap on >255 broken links).
  - 7 Opus adversarial review rounds (rounds 1–7); validate.sh M8 parity-harden (try/except + numeric guard); CHANGELOG completeness; wording fixes.
- Tests: validate 80/4/0. PR: https://github.com/KbWen/agentic-os/pull/104

### Ship-claude-peaceful-aryabhata-fe5644-2026-05-12-pass3
- **PR #103** (squash `e732349`) — README/cross-doc broken-link fix, expert-reviewed (Plan subagent). The framework README is dual-purpose (GitHub face + downstream reference); a multi-angle audit found 6 broken `.md` links (33% of internal links) in the deployed README. Per-link triage:
  - Framework-internal (CONTRIBUTING, LIFECYCLE_BENCHMARK) → absolute GitHub URLs.
  - AGENT_MODEL_GUIDE: already deployed but README path wrong → absolute URL.
  - token-optimization-quickstart: genuinely downstream-needed actionable guide → **added to deploy whitelist** + absolute URL in README. File now ships to `.agentcortex/docs/guides/`.
  - Plus: fixed internal cross-refs inside `token-optimization-quickstart.md` (+ zh-TW) and `NONLINEAR_SCENARIOS.md` (+ zh-TW) that had the same source-vs-deployed mismatch.
- Verified post-merge: fresh downstream deploy → 0 broken relative `.md` links in deployed README (was 6); +2 files deployed (183 total, was 181). validate.sh 77/0/0/2.
- Audit residual: zero known broken-link or path-mismatch issues remaining in deployed scope.

### Ship-claude-peaceful-aryabhata-fe5644-2026-05-12-pass2
- Multi-angle downstream-UX audit pass after #99/#100. 11 scenarios tested across fresh install, update install, legacy v5→v6 upgrade, user-modified scaffold, post-install validators, /app-init flow, workflow cross-refs, Python tool functional, dry-run, first-run UX, and broken-link audit. Three findings surfaced and shipped:
  - **PR #101** (squash `469a2a5`, scaffold-preservation fix in `deploy.sh`) — legacy v5→v6 upgrade silently destroyed user's `.agentcortex/context/current_state.md` content. The migrated file landed at a path the manifest didn't track, hitting a "treat as new" branch that overwrote without sidecar. Fix: in the no-manifest-entry scaffold branch, compare dst hash to src and write `.acx-incoming` sidecar on mismatch (mirroring the existing `!$is_update` branch).
  - **PR #102** (squash `71f7a07`, version + skill-count alignment) — `deploy.sh ACX_VERSION` was 4 patch releases behind (`1.0.0` vs CHANGELOG `1.1.2`); 8 downstream-deployed docs (README badge, AGENT_MODEL_GUIDE, TESTING_PROTOCOL, antigravity-v5-runtime, migration EN+zh-TW, zh-TW README) said `v1.1`; README claimed `17 professional skills` (actual `14` post-f3d97fc consolidation). All bumped to `v1.1.2` / `14`.
- Tests: validate 77 PASS / 0 WARN / 0 FAIL / 2 SKIP (full python). Legacy-upgrade simulation: user content preserved at migrated path; framework template lands at `.acx-incoming`. All 11 audit scenarios pass.
- Remaining flagged (NOT yet shipped, recommended as separate follow-ups):
  - `.agentcortex/docs/README.md` (deployed framework README) has 6 broken internal `.md` links downstream — references to `docs/AGENT_MODEL_GUIDE.md`, `docs/LIFECYCLE_BENCHMARK.md` (+ zh-TW), `docs/guides/token-optimization-quickstart.md` (+ zh-TW), `CONTRIBUTING.md`. Class A (deployed at different path) + Class B (not deployed). Needs link rewrite or deploy-time URL substitution. Medium severity — README is key onboarding doc.

### Ship-claude-peaceful-aryabhata-fe5644-2026-05-12
- Two quick-win PRs merged: downstream guidance correctness pass + companion installer bug fix.
  - **PR #99** (squash `5c282c2`, 2026-05-12T04:19:39Z) — strip phantom `.agentcortex/specs|adr/` "framework template fixtures" claim from Write Path Guard and SSoT template; drop attributions to framework-internal ADR-001/002/003 and Global Lessons L4/L5 from workflows, rules, AGENTS.md, .agent/config.yaml, .agentcortex/tools/*.py docstrings, and validate.{sh,ps1} section header comments; `/app-init` now creates `ADR-001-project-architecture.md` (was hardcoded to `ADR-002`); regenerated `trigger-compact-index.json` for the one content_hash that shifted.
  - **PR #100** (squash `8db2900`, 2026-05-12T04:24:??Z) — `deploy.sh` orphan-ADR recovery: replace prefix-based `ADR-001-*` skip with the same `_framework_adrs` known-filename match already used for `_framework_specs`. Bug surfaced because #99's `/app-init` change made the prefix-match wrongly classify the downstream's own ADR-001 as framework-owned. Verified via 4-scenario sim (framework legacy ADR kept, project ADR-001/002/007 migrated).
- Tests: `validate.sh` 77 PASS / 0 WARN / 0 FAIL / 2 SKIP (full Python); fresh-install downstream sim 72/2/0/3 (full) and 67/2/0/8 (`--no-python`).
- CI: all 11 checks green on both merge commits.
- Audit residual: zero remaining ADR-00X / Lesson L4-L5 references in `.agent/**/*.md`, `AGENTS.md`, `.agent/config.yaml`, `.agentcortex/tools/*.py`, `.agentcortex/bin/validate.{sh,ps1}` (only legitimate match left is `app-init.md` instructing creation of `ADR-001-project-architecture.md`).

### Ship-claude-relaxed-pare-db9f89-2026-05-11-merged
- PR #94 merged to main: squash commit `2467f9ab` (2026-05-11T15:52:08Z).
  - Post-ship CI fixes: `--metrics=off` removed (Semgrep 1.123.0 incompatibility with `--config auto`); semgrep job Python 3.11 (`pkg_resources` missing on 3.12 runner).
  - AC-11 added: `.semgrepignore` existence + exclusions structurally tested; test count 31→32.
  - All 11 CI checks green on merge commit.

### Ship-claude-relaxed-pare-db9f89-2026-05-11-r8
- Feature shipped (continuation r5–r8): CI security scanning governance hardening.
  - TruffleHog SHA-pinned: `47e7b7cd74f578e1e3145d48f669f22fd1330ca6` (was semver `@v3.94.3`)
  - Added `.github/dependabot.yml` (github-actions weekly auto-bump)
  - 31 structural tests (was 26): added `--strict`, `write-all` perms, `test-ci-structural`, SHA regex, bash array, `::warning::` annotation
  - Spec amendments (frozen→shipped): AC-5 SHA req for 3rd-party, AC-8 SKIP 3-state, File Relationship, Accepted Risks, Semgrep factual correction
  - `docs/specs/ci-security-scanning.md`: status → shipped
- Tests: 31 PASS / 0 FAIL + validate 83/0/0/2.
- Commits: `f68a408`→`2ee0fd4`; PR: https://github.com/KbWen/agentic-os/pull/94

### Ship-claude-relaxed-pare-db9f89-2026-05-11
- Feature shipped: CI security scanning pipeline — Semgrep SAST + TruffleHog secret detection + pip-audit dependency audit (feature, backlog #20).
  - `.github/workflows/security.yml`: three parallel jobs, all tools pinned (`semgrep==1.123.0`, `trufflehog@v3.94.3`, `pip-audit==2.10.0`); `contents: read` permissions; no `continue-on-error`; `--config auto` (language-agnostic); dependency-audit `hashFiles` guard.
  - Critical correctness fix in /review: pip-audit `-r $f` per requirements file (without it, audits CI env not project deps).
  - `docs/specs/ci-security-scanning.md`: frozen spec, 10 ACs.
  - `tests/ci/test_security_workflow.py`: 26 structural tests, 4/4 adversarial mutations caught, PyYAML YAML-1.1 `on`-boolean handled.
  - `validate.sh` + `validate.ps1` + `.github/workflows/validate.yml`: security workflow presence check + pytest CI job added.
  - `deploy.sh`: 3 missing runtime tools added to whitelist (`check_adr_coverage.py`, `append_chain_entry.py`, `append_lesson.py`); WARN message genericized.
- Tests: 26 PASS / 0 FAIL (test_security_workflow.py) + validate 83 PASS / 0 WARN / 0 FAIL / 2 SKIP.
- Downstream smoke test: 181 files deployed; 72 PASS / 3 WARN / 0 FAIL / 3 SKIP.
- Commits: `da553fd`→`d9807c0`; PR: https://github.com/KbWen/agentic-os/pull/94

### Ship-claude-reverent-matsumoto-30a74e-2026-05-07
- Feature shipped: Onboarding entry-point unification — three-path branching (greenfield raw idea / brownfield adoption / single concrete task) consistently signaled across `.codex/INSTALL.md`, `README.md`, `docs/README_zh-TW.md` (quick-win, doc-only).
  - Closes the gap where `.codex/INSTALL.md` §3 told downstream LLMs to run `/bootstrap` first regardless of starting point, contradicting the routing-index Ambiguity Rule §1 (multi-feature input → `/spec-intake`).
  - 8 sibling docs audited (PROJECT_EXAMPLES × 2, CODEX_PLATFORM_GUIDE × 2, CLAUDE_PLATFORM_GUIDE, NONLINEAR_SCENARIOS × 2, superpowers-playbook) — all confirmed task-context language, no edit needed.
  - zh-TW §3–§6 renumbered to close the §4 hole created when "從零開始" + "帶入素材" were merged into §3.
- Tests: validate 66 PASS / 0 WARN / 0 FAIL / 10 SKIP.
- Commits: `867e37c`; merged via `cf9b622` (PR #92).

*(Older entries archived to `.agentcortex/context/archive/ship-history-2026.md`)*

### Ship-fix-tiny-fix-exclusion-adapter-parity-2026-06-05
- **Branch `fix/tiny-fix-exclusion-adapter-parity`** (quick-win) — Closed a parity gap that let platform adapter entry files (`CLAUDE.md`, `GEMINI.md`) take the silent tiny-fix path despite carrying governance dispatch — the root cause of PR #195 shipping a semantic governance edit with no Work Log or gate evidence.
  - **Exclusion list**: added `CLAUDE.md`/`GEMINI.md` to all four mirrored tiny-fix exclusion sites — `engineering_guardrails.md §10.3`, `AGENTS.md` Runtime v1 rule 2, `routing.md §4`, `bootstrap.md §0`.
  - **Drift guard**: `tests/guard/test_classification_escalation.py` adds the two adapter tokens to `GOVERNANCE_EXCLUSION_TOKENS` and two new tests, so all 4 mirror sites (not just §10.3 + AGENTS.md) are now drift-guarded against the full token set.
  - **Scope decision**: adapters only; rejected an `*.override.md` glob as speculative (override loader reads only `AGENTS.override.md`; ADR-004 overrides cannot relax gates). Plan-consulted.
  - **Evidence**: escalation test 10/10, guard suite 132/132; `validate.ps1` + `validate.sh` both `pass=98 warn=9 fail=0`; regenerated `trigger-compact-index.json` (AGENTS.md is a registry `detail_ref`). Implementation commit `160566b`.
  - **Rollback** = revert PR.

### Ship-fix-issue-190-sed-grep-posix-portability-2026-06-06
- **PR #197** (quick-win, issue #190) — `validate.sh` used GNU-only `\s` in 6 shell-context regexes (`grep -E`/`sed -E`); BSD grep/sed (macOS default) treat `\s` as a literal `s`, breaking whitespace handling in `primary_domain`/`status`/`domain` frontmatter checks, the Reclassif drift guard, two archived-worklog Classification `sed` extractions, and the backlog Kind-diversity filter. Replaced with POSIX `[[:space:]]` (valid in ERE on both GNU and BSD).
  - Python-`re` `\s` left untouched (cross-platform); `validate.ps1` (.NET regex) and `deploy.sh` unaffected (verified 0 `\s`/`\w`).
  - **Evidence**: GNU grep 3.0 / sed 4.9 byte-identical output before/after (no CI regression); `validate.sh` integrity check passed; `pytest tests/ci tests/guard` 198 passed; PR CI 11/11 green. Rollback = revert PR.
  - **Triage by-product**: same 2026-06-05 batch issues #186 (BOM)/#187 (override merge)/#191 (subdir path) verified false-premise with empirical evidence and **closed**; feature #154 closed as already-implemented by `trigger-registry.yaml`+`trigger-compact-index.json`+`validate_trigger_metadata.py`; #189 closed (slash-commands are agent-dispatched, not shell binaries); #169 kept, recommended narrowing.

### Ship-fix-issue-173-core-overwrite-backup-2026-06-06
- **PR #198** (quick-win, issue #173) — On the deploy UPDATE path a downstream-locally-modified **core** file was silently overwritten (no warning/backup, hidden in "N updated"), unlike scaffold-tier `.acx-incoming` sidecaring. Reproduced. Fix preserves the **ADR-005 force-update invariant** (new framework version still lands) but backs up the user's prior version to `.acx-local` + prints `[OVERWRITE]` + summary/footer notice.
  - **Root-cause defect found while testing**: `compute_sha256` used `sha256sum "$file"`; GNU sha256sum / BSD shasum escape backslash filenames with a leading `\` line-prefix, so a Windows/Git-Bash `C:\` TARGET made every `dst` hash `\<hash>` while repo-side `src` hashed clean → unmodified core AND scaffold files mis-flagged as modified (124 spurious → 0 after fix). Stripped leading `\`. Manual `/tmp` (forward-slash) testing did NOT reproduce — only `C:\` paths (as `deploy.ps1`/CI pass). See [[reference_sha256sum_backslash_escaping]].
  - **Adversarial review (subagent, code-verified) caught a real HIGH defect**: backup `cp ${CP_FLAG}` could be silently skipped under user-set `CP_FLAG=-n`/`-i` (stale `.acx-local` never auto-cleaned) → reintroduced the silent data loss. Fixed with `rm -f` before backup; added `*.acx-local` to managed `.gitignore`; added a `CP_FLAG=-n` regression test.
  - **Scope correction**: `deploy.ps1` is a thin bash launcher → single logic file (issue's "both deploy.sh + deploy.ps1" was a misread).
  - **Evidence**: behavioral repro (backup holds edit, force-updated live, scaffold preserved, idempotent, 0 false-positives over 180+ files); `pytest tests/ci tests/guard` **201 passed**; `validate.sh` passed; PR CI 11/11 green. Rollback = revert PR.
### Ship-codex-issue-192-pre-commit-hook-2026-06-08
- **Branch `codex/issue-192-pre-commit-hook`** (feature, issue #192) — Added an opt-in `.githooks/pre-commit.guard-ssot.sample` local validation hook that runs Agentic OS validators from the Git root, prefers `validate.ps1` on Windows Git Bash when PowerShell is available, and falls back to `validate.sh`; guarded SSoT receipt warnings remain advisory-only.
  - **Docs/tests**: README now documents `git config core.hooksPath .githooks` setup; `tests/ci/test_pre_commit_hook.py` covers failure blocking, success pass, subdirectory execution, missing-validator failure, Windows validator selection wiring, advisory guard warning, and setup docs.
  - **Evidence**: focused hook suite 7 passed; hook `bash -n` passed; `git diff --check` passed; final validators run after SSoT update. Rollback = revert PR.
### Ship-codex-issue-188-lock-auto-recovery-2026-06-08
- **Branch `codex/issue-188-lock-auto-recovery`** (feature, issue #188) — Added bootstrap-time recovery for stale, dead-PID, and corrupted advisory Work Log locks while preserving active-lock warnings for other live sessions.
  - **Tooling**: `.agentcortex/tools/recover_worklog_lock.py` classifies locks as missing/active/recoverable, writes current owner/session/branch/phase payloads, records recovery in Work Log Drift Log, and returns exit code 2 for active locks owned by another live session.
  - **Workflow/tests**: `.agent/workflows/bootstrap.md §2a` now points agents to the helper with Python-unavailable fallback; `tests/guard/test_worklog_lock_recovery.py` covers missing, stale-time, dead-PID, corrupt JSON, active preservation, and bootstrap wiring.
  - **Evidence**: focused lock suite 6 passed; adjacent guard suite 30 passed; `py_compile` passed; final validator run after SSoT/archive update. Rollback = revert PR.
### Ship-codex-hotfix-worklog-lock-cli-pid-2026-06-08
- **Branch `codex/hotfix-worklog-lock-cli-pid`** (hotfix) — Restored advisory Work Log active-lock protection for bootstrap's CLI helper by preventing short-lived helper PIDs from being written as lock owner PIDs.
  - **Root cause**: `recover_worklog_lock.py ensure` wrote its own process PID; after the CLI exited, the next CLI treated a fresh non-stale lock as `dead-pid` and overwrote it.
  - **Fix**: CLI omits `pid` by default; explicit owner PID now requires `--pid <owner-pid>`; API default `include_pid=False`; bootstrap documents the long-lived-owner PID requirement.
  - **Evidence**: regression MRE failed before fix, focused lock suite 8 passed, adjacent guard suite 32 passed, guard suite 140 passed, PowerShell and Git Bash validators both fail=0. Rollback = revert PR.

### Ship-feat-epic-spec-hierarchy-governance-2026-05-06
- Feature shipped: Label-based cluster grouping system for `_product-backlog.md` — resolves downstream backlog fragmentation.
- Edits:
  - `.agent/workflows/spec-intake.md` — §2b single-feature label & cluster check; §2a Feature Inventory 7-col (Kind/Labels/Priority replace Finding); §8c Reprioritize with P0 push-back; merge-guard backfill on all 3 new cols
  - `.agent/workflows/bootstrap.md` — §5 Active Backlog: Kind/Priority assignment + cluster check with suppression
  - `.agent/workflows/review.md` — Backlog Finding Registration section (review-finding auto-log)
  - `.agent/workflows/hotfix.md` — §5 Evidence: hotfix-spawn systemic issue auto-log
  - `.agent/workflows/routing.md` — Reprioritize trigger phrases + P-tier tiebreaker
  - `.agent/config.yaml` — `cluster:` section (threshold/label-cap/p0-pct/marker-cap/suppression-TTL)
  - `.agentcortex/bin/validate.sh` — backlog schema check + L-1 P0 ratio + L-2 label count + L-3 Kind diversity + L-4 declined markers
  - `.githooks/pre-commit.guard-ssot.sample` — new advisory git hook sample
  - `docs/specs/_product-backlog.md` — Kind/Labels/Priority columns backfilled (merge-guard)
- Tests: validate 81 PASS / 0 WARN / 0 FAIL (sha: 2760428).
- PR: https://github.com/KbWen/agentic-os/pull/89 (feat/epic-spec-hierarchy-governance → main)
- Backlog rows shipped: label-cluster system (framework-level; no row numbers — this is the system that manages rows).

### Ship-feat-optimization-batch2-2026-05-04
- Feature shipped: 4 follow-up quick-wins on `feat/optimization-hooks-2026-05-04` branch (PR #87 same-PR addition).
- Edits:
  - `.agentcortex/bin/validate.{sh,ps1}` — graduated active-work-log threshold: WARN at >8, FAIL at >12 (was WARN-only); plus `ARCHIVE_SIZE_WARN_KB` (default 10 MB) WARN check on `.agentcortex/context/archive/`.
  - `.agentcortex/templates/worklog.md` — optional `Files Read: N` field in `## Session Info` for token-budget instrumentation; `## Evidence` section now references `engineering_guardrails.md §5.2b Evidence Truncation Rule` (3-line success / 10-line failure caps).
- Tests: validate 73 PASS / 7 WARN / 0 FAIL (archive 74 KB, 8/8 active logs).
- Backlog rows shipped: #10, #12, #23, #28. Pending count 20 → 16.
- Commits: `c0f63c3`; merged via `30e6fcc` (PR #87).

### Ship-feat-optimization-hooks-2026-05-04
- Feature shipped: Closing the Claude-platform half of backlog #30 — PreCompact hook + framework receipt integration. Stop hook (`check-sentinel.py`) was previously shipped under CC-2/L4 but its violations.jsonl was never read by validate; this ship closes that loop. PreToolUse + UserPromptSubmit deferred (risk > ROI per design review).
- Edits:
  - `.claude/hooks/check-precompact.py` — new PreCompact hook; refuses compaction when active Work Log `## Phase Summary` is empty or stale relative to `Current Phase`. WARN by default, blocks (exit 2) when `AGENTIC_OS_PRECOMPACT_BLOCK=1`. Violation receipts at `.agentcortex/context/precompact-violations.jsonl`.
  - `.claude/settings.json` — wired PreCompact hook alongside existing Stop hook.
  - `tests/guard/test_precompact_hook.py` — 13 unit tests covering header parsing (list + table form), Phase Summary extraction, evaluate logic, end-to-end with temp Work Logs, and block-mode exit code.
  - `.agentcortex/bin/validate.{sh,ps1}` — read both `sentinel-violations.jsonl` and `precompact-violations.jsonl`; emit WARN with count when non-zero, PASS when zero. Capability-by-presence (absent file = PASS).
  - `.gitignore` — added `precompact-violations.jsonl` (alongside existing sentinel entry).
- Tests: Pass — `python -m unittest tests.guard.test_sentinel_hook tests.guard.test_precompact_hook` → 27/27 in 0.1s. validate: 72 PASS / 7 WARN / 0 FAIL (new WARN: 3 historical sentinel violations now surfaced — these were silently accumulating in the receipt file before this ship).
- Commits: `0ca5788`; merged via `30e6fcc` (PR #87).
- Scope cuts: PreToolUse phase-discipline hook and UserPromptSubmit warn hook were evaluated and deferred — false-positive risk on legitimate edits/chat outweighs the catch rate. Document in Drift Log of work log.

### Ship-feat-optimization-round-2026-05-04
- Feature shipped: Quick-win batch from optimization-round-2026-05-04 — backlog rows #31, #32, #34, #35, #36, #37, #39, #40 (8 governance enhancements). Zero behavioral change to runtime; pure rule additions across 5 workflows + AGENTS.md + validate (sh/ps1).
- Edits:
  - `.agent/workflows/review.md` — Adversarial Reviewer Freshness Invariant H2 (codifies HIGH lesson 4faa557a) + Cloud Adversarial Review (`/ultrareview`) callout
  - `.agent/workflows/plan.md` — `[P]` parallel-task marker rule + template line (spec-kit pattern)
  - `.agent/workflows/spec-intake.md` — §4.5 Clarification Pass (≤3 questions, optional, single-round)
  - `.agent/workflows/app-init.md` — §10 Onboard Mode (read-only stdout, no doc writes; absorbs `/recap` pointer for active sessions)
  - `.agent/workflows/hotfix.md` — §6 Cloud PR Auto-Fix (`/autofix-pr`) callout
  - `AGENTS.md` — `## Override Layer (AGENTS.override.md)` precedence chain (mirrors Codex pattern)
  - `.agentcortex/bin/validate.{sh,ps1}` — Work Log Phase Summary sentinel marker (⚡ ACX) WARN check
- Tests: Pass — validate 71 PASS / 6 WARN / 0 FAIL (the new sentinel WARN counts 6 legacy logs without ⚡ ACX, by design WARN-only).
- Commits: `7b7071b`; merged via `30e6fcc` (PR #87).
- Source: external research round (Claude Code w14-w17, OpenAI Codex 2026 AGENTS.md docs, github/spec-kit, dsifry/metaswarm, sshh).
- Deferred: #30 (Claude hooks enforcement layer — feature), #33 (plugin packaging — feature), #38 (AGENTS.md token-budget pass — risky restructure).

### Ship-feat-acx-phase-shims-2026-05-04
- Feature shipped: acx-* phase shims for Claude Code native skill injection — 5 shims (.claude/agents/acx-{implementer,reviewer,tester,handoff,shipper}.md), validate.sh+ps1 shim skill-existence check, review.md acx-* enforcement check.
- Tests: Pass — validate 63 PASS / 0 FAIL; simulation confirmed native skill injection active at subagent startup.
- Commits: `94ab322`

### Ship-architecture-change-adr-002-lock-unification-2026-04-25
- Feature shipped: ADR-002 Guarded Governance Writes — D2.1 lock generalization (policy-driven scope, append mode, per-target receipts, configurable TTL, PID-liveness, lock_group stub for ADR-003); D2.2 CI lint `tools/lint_governed_writes.py` enforces guard usage on protected paths; D2.3 lifecycle frontmatter checker for governance docs (audit/, guides/governance-*, adr/, architecture L1).
- Tests: Pass — 56/56 in 0.4s + 8 Beast Mode adversarial scenarios green; live lint scan 0 FAIL / 67 WARN; live lifecycle scan 2 PASS / 3 WARN (grandfathered) / 0 FAIL.
- Commits: `65c5890` (ADR/spec), `20f2c21` (D2.1), `618ea61` (D2.2), `8eaf284` (D2.3) + ship commit.
- Spec drift: AC-24/AC-25 (ownership matrix doc + AGENTS.md pointer) deferred per Pragmatist roundtable + user direction; Architect content preserved in audit §0.4 + Work Log archive.

---

## Version History (archived)

- **v1.1.2** (2026-04-17): Polish batch 2 — Python advisory in deploy.sh (1.1), guardrails Loaded-Sections Receipt (3.2), bootstrap Reading Mode Table + §0 decision table (3.3 + 2.1), Confidence Gate harmonized with structured receipts + step-level in /implement (2.3), Read-Once Drift Log audit receipt in AGENTS.md (4.3). Commit `4976a92`. Closes remaining 6 of 12 post-v1.1.0 audit findings.
- **v1.1.1-batch1** (2026-04-17): Polish pass — installer UX (Git-bash detection, clone progress), governance wiring (Confidence Gate receipt in /plan + /ship, No-Bypass scope clarified in AGENTS.md), token discipline (CLAUDE.md 51→27 lines), skill index signpointed in routing.md §3. Commit `95ceafb`. Addresses 6 of 12 audit findings; remaining 6 deferred to batch 2 on same branch.
- **v1.1.0** (2026-04-16): Token optimization & governance hardening. SKILL.md heading-scope (#57), phase output compression (#54), expert review quick-wins (#56), deploy fixes (#52, #53, #55).

### Ship-claude-modest-antonelli-da2aec-2026-05-07
- Feature shipped: Zero-Python downstream + AGENTS.md trim + deploy-gap fix + skill cleanup (PR #91, quick-win, 4 commits).
  - aec35d6: delete `.claude/hooks/check-{sentinel,precompact}.py`, strip hook wiring from `.claude/settings.json`, replace runtime hook intent with bash/PowerShell-native Work Log Phase Summary audit in `validate.{sh,ps1}`. AGENTS.md 229 → 181 lines (-993 tokens). Deploy `.claude/agents/acx-*.md` (5 shims) + `.claude/settings.json` as scaffold tier in `deploy.sh`.
  - d3d6e67: repair 3 cross-file anchor refs broken by AGENTS.md heading rename (`.agent/config.yaml`, `engineering_guardrails.md` §11 redirect, add `### Skill Activation Triggers` heading).
  - 9c23982: post-review cleanup — move `### Skill Activation Triggers` out of indented numbered list to top-level placement; fix pre-existing `validate.sh:1329` bash quirk; remove `.claude/hooks/__pycache__/` residue.
  - f3d97fc: delete 5 redundant process skills; inline content into implement.md/plan.md/handoff.md/review.md/ship.md. Skills 19 → 14.
- Tests: validate 74/0/0/2 + CI 7/7 green. PR: https://github.com/KbWen/agentic-os/pull/91
