session-orchestrator 4.0.0 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +3 -2
  4. package/.codex-plugin/skills/architecture/SKILL.md +20 -0
  5. package/.codex-plugin/skills/autopilot/SKILL.md +21 -0
  6. package/.codex-plugin/skills/autopilot/agents/openai.yaml +5 -0
  7. package/.codex-plugin/skills/bootstrap/SKILL.md +22 -0
  8. package/.codex-plugin/skills/bootstrap/agents/openai.yaml +5 -0
  9. package/.codex-plugin/skills/brainstorm/SKILL.md +22 -0
  10. package/.codex-plugin/skills/brainstorm/agents/openai.yaml +5 -0
  11. package/.codex-plugin/skills/claude-md-drift-check/SKILL.md +17 -0
  12. package/.codex-plugin/skills/close/SKILL.md +21 -0
  13. package/.codex-plugin/skills/close/agents/openai.yaml +5 -0
  14. package/.codex-plugin/skills/convergence-monitoring/SKILL.md +24 -0
  15. package/.codex-plugin/skills/debug/SKILL.md +21 -0
  16. package/.codex-plugin/skills/debug/agents/openai.yaml +5 -0
  17. package/.codex-plugin/skills/discovery/SKILL.md +21 -0
  18. package/.codex-plugin/skills/discovery/agents/openai.yaml +5 -0
  19. package/.codex-plugin/skills/dispatcher/SKILL.md +21 -0
  20. package/.codex-plugin/skills/dispatcher/agents/openai.yaml +5 -0
  21. package/.codex-plugin/skills/docs-orchestrator/SKILL.md +20 -0
  22. package/.codex-plugin/skills/ecosystem-health/SKILL.md +22 -0
  23. package/.codex-plugin/skills/eli5/SKILL.md +21 -0
  24. package/.codex-plugin/skills/eli5/agents/openai.yaml +5 -0
  25. package/.codex-plugin/skills/eval/SKILL.md +21 -0
  26. package/.codex-plugin/skills/eval/agents/openai.yaml +5 -0
  27. package/.codex-plugin/skills/evolve/SKILL.md +21 -0
  28. package/.codex-plugin/skills/evolve/agents/openai.yaml +5 -0
  29. package/.codex-plugin/skills/frontmatter-guard/SKILL.md +17 -0
  30. package/.codex-plugin/skills/gitlab-ops/SKILL.md +22 -0
  31. package/.codex-plugin/skills/gitlab-portfolio/SKILL.md +17 -0
  32. package/.codex-plugin/skills/go/SKILL.md +22 -0
  33. package/.codex-plugin/skills/go/agents/openai.yaml +5 -0
  34. package/.codex-plugin/skills/grill/SKILL.md +21 -0
  35. package/.codex-plugin/skills/grill/agents/openai.yaml +5 -0
  36. package/.codex-plugin/skills/harness-audit/SKILL.md +19 -0
  37. package/.codex-plugin/skills/harness-audit/agents/openai.yaml +5 -0
  38. package/.codex-plugin/skills/hook-development/SKILL.md +17 -0
  39. package/.codex-plugin/skills/mcp-builder/SKILL.md +17 -0
  40. package/.codex-plugin/skills/memory-cleanup/SKILL.md +21 -0
  41. package/.codex-plugin/skills/memory-cleanup/agents/openai.yaml +5 -0
  42. package/.codex-plugin/skills/mode-selector/SKILL.md +19 -0
  43. package/.codex-plugin/skills/npm-publish/SKILL.md +18 -0
  44. package/.codex-plugin/skills/peekaboo-driver/SKILL.md +20 -0
  45. package/.codex-plugin/skills/persona-panel/SKILL.md +22 -0
  46. package/.codex-plugin/skills/persona-panel/agents/openai.yaml +5 -0
  47. package/.codex-plugin/skills/plan/SKILL.md +22 -0
  48. package/.codex-plugin/skills/plan/agents/openai.yaml +5 -0
  49. package/.codex-plugin/skills/playwright-driver/SKILL.md +22 -0
  50. package/.codex-plugin/skills/portfolio/SKILL.md +21 -0
  51. package/.codex-plugin/skills/portfolio/agents/openai.yaml +5 -0
  52. package/.codex-plugin/skills/quality-gates/SKILL.md +22 -0
  53. package/.codex-plugin/skills/reconcile/SKILL.md +21 -0
  54. package/.codex-plugin/skills/reconcile/agents/openai.yaml +5 -0
  55. package/.codex-plugin/skills/release/SKILL.md +22 -0
  56. package/.codex-plugin/skills/release/agents/openai.yaml +5 -0
  57. package/.codex-plugin/skills/remote-offload/SKILL.md +22 -0
  58. package/.codex-plugin/skills/repo-audit/SKILL.md +19 -0
  59. package/.codex-plugin/skills/repo-audit/agents/openai.yaml +5 -0
  60. package/.codex-plugin/skills/session/SKILL.md +21 -0
  61. package/.codex-plugin/skills/session/agents/openai.yaml +5 -0
  62. package/.codex-plugin/skills/session-end/SKILL.md +22 -0
  63. package/.codex-plugin/skills/session-plan/SKILL.md +22 -0
  64. package/.codex-plugin/skills/session-start/SKILL.md +22 -0
  65. package/.codex-plugin/skills/spinout/SKILL.md +21 -0
  66. package/.codex-plugin/skills/spinout/agents/openai.yaml +5 -0
  67. package/.codex-plugin/skills/sunset-review/SKILL.md +21 -0
  68. package/.codex-plugin/skills/sunset-review/agents/openai.yaml +5 -0
  69. package/.codex-plugin/skills/templates-ack/SKILL.md +21 -0
  70. package/.codex-plugin/skills/templates-ack/agents/openai.yaml +5 -0
  71. package/.codex-plugin/skills/test/SKILL.md +21 -0
  72. package/.codex-plugin/skills/test/agents/openai.yaml +5 -0
  73. package/.codex-plugin/skills/test-runner/SKILL.md +22 -0
  74. package/.codex-plugin/skills/tmux-layout/SKILL.md +23 -0
  75. package/.codex-plugin/skills/using-orchestrator/SKILL.md +19 -0
  76. package/.codex-plugin/skills/vault-mirror/SKILL.md +17 -0
  77. package/.codex-plugin/skills/vault-sync/SKILL.md +17 -0
  78. package/.codex-plugin/skills/wave-executor/SKILL.md +22 -0
  79. package/.codex-plugin/skills/write-executable-plan/SKILL.md +24 -0
  80. package/{plugin.json → .cursor-plugin/plugin.json} +5 -2
  81. package/CHANGELOG.md +190 -1
  82. package/README.md +26 -18
  83. package/docs/codex-setup.md +43 -9
  84. package/docs/components.md +3 -2
  85. package/docs/instruction-delivery.md +12 -5
  86. package/docs/migration-v4.md +33 -9
  87. package/hooks/_lib/hook-import-set.json +4 -3
  88. package/hooks/hooks-codex.json +1 -1
  89. package/hooks/hooks.json +1 -1
  90. package/hooks/on-stop.mjs +25 -4
  91. package/package.json +2 -2
  92. package/scripts/generate-codex-skills.mjs +246 -0
  93. package/scripts/generate-hook-import-set.mjs +51 -8
  94. package/scripts/lib/codex/plugin-contract.mjs +6 -0
  95. package/scripts/lib/config/host-paths.mjs +20 -4
  96. package/scripts/lib/gates/gate-full.mjs +7 -3
  97. package/scripts/lib/owner-config-banner.mjs +7 -9
  98. package/scripts/lib/owner-yaml.mjs +8 -1
  99. package/scripts/lib/plugin-update-banner.mjs +10 -2
  100. package/scripts/lib/reconcile/engine.mjs +38 -7
  101. package/scripts/lib/session-schema/constants.mjs +38 -11
  102. package/scripts/lib/session-start-probes.mjs +12 -0
  103. package/scripts/lib/telemetry/schema.mjs +39 -18
  104. package/scripts/lib/telemetry-flush-health-banner.mjs +211 -0
  105. package/scripts/lib/validate/check-codex-skills.mjs +191 -0
  106. package/scripts/lib/validate/check-owner-leakage.mjs +91 -55
  107. package/scripts/lib/validate/check-skill-links.mjs +37 -7
  108. package/scripts/lib/validate/check-test-git-config-target.mjs +192 -12
  109. package/scripts/lib/validate/check-unwired-features.mjs +163 -13
  110. package/scripts/lib/validate/confidential-names.mjs +95 -30
  111. package/scripts/lib/validate/repo-files.mjs +48 -14
  112. package/scripts/release.mjs +109 -18
  113. package/scripts/site-numbers.mjs +344 -8
  114. package/scripts/validate-plugin.mjs +3 -0
  115. package/skills/session-start/SKILL.md +2 -2
  116. package/skills/session-start/references/phase-4-ssot-environment-check.md +5 -0
  117. package/skills/vault-sync/SKILL.md +10 -0
@@ -0,0 +1,22 @@
1
+ ---
2
+ name: test-runner
3
+ description: 'Use this skill when orchestrating agentic end-to-end tests. Resolves target + profile, dispatches the right driver(s) (playwright for web today, peekaboo for macOS (issue #381)), invokes the ux-evaluator agent (opus, read-only) against driver artifacts, reconciles findings with the open issue tracker via scripts/lib/test-runner/issue-reconcile.mjs, and writes report.md + JSONL roll-up. Wraps upstream tools (no forks). Hard-gates Playwright MCP for browser drive (4× token cost vs CLI per Microsoft''s own benchmark).'
4
+ metadata:
5
+ user-invocable: 'false'
6
+ tags: test, orchestrator, e2e, ux
7
+ model: sonnet
8
+ model-preference: sonnet
9
+ model-preference-codex: gpt-5.4
10
+ model-preference-cursor: claude-sonnet-4-6
11
+ ---
12
+
13
+ <!-- Generated by scripts/generate-codex-skills.mjs; do not edit. -->
14
+
15
+ # test-runner
16
+
17
+ Read [`skills/test-runner/SKILL.md`](../../../skills/test-runner/SKILL.md) in full before taking any action, then follow its complete workflow.
18
+ The linked document is authoritative, including its prechecks, argument rules, and stop conditions.
19
+
20
+ Resolve this link relative to this SKILL.md, not the project working directory. The plugin root is three directories above this file. Resolve package paths such as `skills/` and `scripts/` from that root; resolve relative links inside the canonical document from its own directory. Keep the user’s project as the target of project operations.
21
+
22
+ Regenerate with `node scripts/generate-codex-skills.mjs`.
@@ -0,0 +1,23 @@
1
+ ---
2
+ name: tmux-layout
3
+ description: 'Use this skill when the operator wants a prepared tmux visualization layout for the session''s side-channels (STATE.md tail, CI-watch, events.jsonl tail). Renders a 4-pane default layout or debug layout. Read-only side-channel observability — the coordinator chat stays in the operator''s original terminal. Trigger phrases: "tmux layout", "split panes for ci watch", "visualize session side-channels", "show me state-md tail and ci".'
4
+ metadata:
5
+ model: inherit
6
+ color: cyan
7
+ allowed-tools:
8
+ - Read
9
+ - Bash
10
+ - Grep
11
+ - Glob
12
+ ---
13
+
14
+ <!-- Generated by scripts/generate-codex-skills.mjs; do not edit. -->
15
+
16
+ # tmux-layout
17
+
18
+ Read [`skills/tmux-layout/SKILL.md`](../../../skills/tmux-layout/SKILL.md) in full before taking any action, then follow its complete workflow.
19
+ The linked document is authoritative, including its prechecks, argument rules, and stop conditions.
20
+
21
+ Resolve this link relative to this SKILL.md, not the project working directory. The plugin root is three directories above this file. Resolve package paths such as `skills/` and `scripts/` from that root; resolve relative links inside the canonical document from its own directory. Keep the user’s project as the target of project operations.
22
+
23
+ Regenerate with `node scripts/generate-codex-skills.mjs`.
@@ -0,0 +1,19 @@
1
+ ---
2
+ name: using-orchestrator
3
+ description: 'Use this skill when dispatching implicit slash-command intent from the user''s first message. Inspects the user''s first message for implicit slash-command intent and dispatches to the highest-confidence matching entry-point skill via the Skill tool. Only active when `auto-skill-dispatch: true` in Session Config. Silent no-op otherwise.'
4
+ metadata:
5
+ user-invocable: 'false'
6
+ tags: dispatch, meta, routing, auto-skill
7
+ model: haiku
8
+ ---
9
+
10
+ <!-- Generated by scripts/generate-codex-skills.mjs; do not edit. -->
11
+
12
+ # using-orchestrator
13
+
14
+ Read [`skills/using-orchestrator/SKILL.md`](../../../skills/using-orchestrator/SKILL.md) in full before taking any action, then follow its complete workflow.
15
+ The linked document is authoritative, including its prechecks, argument rules, and stop conditions.
16
+
17
+ Resolve this link relative to this SKILL.md, not the project working directory. The plugin root is three directories above this file. Resolve package paths such as `skills/` and `scripts/` from that root; resolve relative links inside the canonical document from its own directory. Keep the user’s project as the target of project operations.
18
+
19
+ Regenerate with `node scripts/generate-codex-skills.mjs`.
@@ -0,0 +1,17 @@
1
+ ---
2
+ name: vault-mirror
3
+ description: 'Use when you need to populate the Meta-Vault with machine-generated notes derived from session-orchestrator JSONL records. Converts entries from `.orchestrator/metrics/sessions.jsonl` and `.orchestrator/metrics/learnings.jsonl` into vault-conformant Markdown under `50-sessions/` and `40-learnings/`. Called automatically at session-end Phase 3.7 and after evolve Phase 3.5 — only when `vault-integration.enabled=true` and `vault-integration.mode != "off"`. Idempotent: re-runs safely; skips hand-authored notes. Triggers: "mirror to vault", "sync session notes to vault", "write learning notes to vault", "vault-mirror failed at session close". <example>Context: session-end is finalizing, vault-integration.mode is "warn". user: "/close" assistant: "Running vault-mirror to write 50-sessions/session-2026-05-17.md from the closing session record — 1 created, 0 skipped."</example>'
4
+ metadata:
5
+ model: haiku
6
+ ---
7
+
8
+ <!-- Generated by scripts/generate-codex-skills.mjs; do not edit. -->
9
+
10
+ # vault-mirror
11
+
12
+ Read [`skills/vault-mirror/SKILL.md`](../../../skills/vault-mirror/SKILL.md) in full before taking any action, then follow its complete workflow.
13
+ The linked document is authoritative, including its prechecks, argument rules, and stop conditions.
14
+
15
+ Resolve this link relative to this SKILL.md, not the project working directory. The plugin root is three directories above this file. Resolve package paths such as `skills/` and `scripts/` from that root; resolve relative links inside the canonical document from its own directory. Keep the user’s project as the target of project operations.
16
+
17
+ Regenerate with `node scripts/generate-codex-skills.mjs`.
@@ -0,0 +1,17 @@
1
+ ---
2
+ name: vault-sync
3
+ description: 'Use when you need to validate the Meta-Vault''s Markdown frontmatter and wiki-link integrity before closing a session or after vault edits. Runs as a hard gate at session-end Phase 1 — blocks close if any `.md` file fails the Zod frontmatter schema or has dangling `[[wiki-links]]`. Supports three modes: `hard` (blocks on errors), `warn` (reports without blocking), `off` (skip). Reads `vault-sync.*` from Session Config; respects per-vault exclude globs from `CLAUDE.md`. Triggers: "vault validation failed at session close", "fix vault frontmatter errors", "check vault wiki-links", "why is session-end blocked by vault-sync". <example>Context: session-end Phase 1 quality gate, vault-sync.enabled=true, vault-sync.mode="hard". user: "/close" assistant: "vault-sync found 2 frontmatter errors in vault/40-learnings/ml-notes.md — missing required `id` field. Fixing before close."</example>'
4
+ metadata:
5
+ model: haiku
6
+ ---
7
+
8
+ <!-- Generated by scripts/generate-codex-skills.mjs; do not edit. -->
9
+
10
+ # vault-sync
11
+
12
+ Read [`skills/vault-sync/SKILL.md`](../../../skills/vault-sync/SKILL.md) in full before taking any action, then follow its complete workflow.
13
+ The linked document is authoritative, including its prechecks, argument rules, and stop conditions.
14
+
15
+ Resolve this link relative to this SKILL.md, not the project working directory. The plugin root is three directories above this file. Resolve package paths such as `skills/` and `scripts/` from that root; resolve relative links inside the canonical document from its own directory. Keep the user’s project as the target of project operations.
16
+
17
+ Regenerate with `node scripts/generate-codex-skills.mjs`.
@@ -0,0 +1,22 @@
1
+ ---
2
+ name: wave-executor
3
+ description: Use this skill when executing the agreed session plan in waves with role-based execution and parallel subagents. Handles inter-wave quality checks, plan adaptation, and progress tracking. Core orchestration engine for feature and deep sessions. Triggered by /go command.
4
+ metadata:
5
+ user-invocable: 'false'
6
+ tags: orchestration, execution, agents, waves
7
+ model: inherit
8
+ model-preference: opus
9
+ model-preference-codex: gpt-5.4-mini
10
+ model-preference-cursor: claude-sonnet-4-6
11
+ ---
12
+
13
+ <!-- Generated by scripts/generate-codex-skills.mjs; do not edit. -->
14
+
15
+ # wave-executor
16
+
17
+ Read [`skills/wave-executor/SKILL.md`](../../../skills/wave-executor/SKILL.md) in full before taking any action, then follow its complete workflow.
18
+ The linked document is authoritative, including its prechecks, argument rules, and stop conditions.
19
+
20
+ Resolve this link relative to this SKILL.md, not the project working directory. The plugin root is three directories above this file. Resolve package paths such as `skills/` and `scripts/` from that root; resolve relative links inside the canonical document from its own directory. Keep the user’s project as the target of project operations.
21
+
22
+ Regenerate with `node scripts/generate-codex-skills.mjs`.
@@ -0,0 +1,24 @@
1
+ ---
2
+ name: write-executable-plan
3
+ description: Use when you have a PRD or design spec and need a bite-sized, executable implementation plan that any agent can follow without re-deriving structure. Produces `docs/plans/YYYY-MM-DD-<feature>.md` with per-task Files block, complete code per step (no placeholders), and exact verification commands. Rejects "TBD", "TODO", "add error handling", "similar to Task N".
4
+ metadata:
5
+ model: inherit
6
+ color: green
7
+ allowed-tools:
8
+ - Read
9
+ - Grep
10
+ - Glob
11
+ - Bash
12
+ - Write
13
+ ---
14
+
15
+ <!-- Generated by scripts/generate-codex-skills.mjs; do not edit. -->
16
+
17
+ # write-executable-plan
18
+
19
+ Read [`skills/write-executable-plan/SKILL.md`](../../../skills/write-executable-plan/SKILL.md) in full before taking any action, then follow its complete workflow.
20
+ The linked document is authoritative, including its prechecks, argument rules, and stop conditions.
21
+
22
+ Resolve this link relative to this SKILL.md, not the project working directory. The plugin root is three directories above this file. Resolve package paths such as `skills/` and `scripts/` from that root; resolve relative links inside the canonical document from its own directory. Keep the user’s project as the target of project operations.
23
+
24
+ Regenerate with `node scripts/generate-codex-skills.mjs`.
@@ -1,7 +1,6 @@
1
1
  {
2
- "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
3
2
  "name": "session-orchestrator",
4
- "version": "4.0.0",
3
+ "version": "4.0.1",
5
4
  "description": "Loop engineering for AI coding agents — turn ad-hoc sessions into a repeatable research → plan → wave-execute → close loop with verification gates. Runs on Claude Code, Codex CLI, Cursor, and Pi.",
6
5
  "author": {
7
6
  "name": "Bernhard Goetzendorfer"
@@ -23,5 +22,9 @@
23
22
  "pi"
24
23
  ],
25
24
  "skills": "./skills/",
25
+ "rules": [],
26
+ "agents": [],
27
+ "commands": [],
28
+ "hooks": { "hooks": {} },
26
29
  "mcpServers": "./.mcp.json"
27
30
  }
package/CHANGELOG.md CHANGED
@@ -7,6 +7,194 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [4.0.1] - 2026-09-07
11
+
12
+ A PATCH release, two work streams. Codex CLI command entrypoints (closing Epic #1263 and
13
+ sub-issues #1264/#1265/#1266) make every `commands/*.md` and `skills/*/SKILL.md` entry
14
+ discoverable and selectable inside Codex. A 5-wave mechanical-fix session (7 Discovery + 12
15
+ Impl-Core + 5 Impl-Polish + a 4-reviewer/Codex-gpt-6-astra Quality panel with 5 fixers) closes
16
+ 16 follow-up issues surfaced by the `4.0.0` 360° audit. The site redesign already staged in
17
+ `[Unreleased]` (session-orchestrator.com relaunch, closing GitLab #1237 and #1080 points
18
+ 1/3/5/6/7) folds in unchanged below as `### Changed`.
19
+
20
+ ### Added
21
+
22
+ - **Codex command workflows are now discoverable and selectable skills — 51 unique generated
23
+ entries (25 command-backed, 26 skill-backed), closing an 8-command discovery gap (`close`,
24
+ `go`, `harness-audit`, `portfolio`, `release`, `session`, `templates-ack`, `test`) and
25
+ resolving 17 same-name command/skill overlaps in the command's favor (`cf0876c3`, Refs
26
+ #1263/#1264/#1265/#1266).** `scripts/generate-codex-skills.mjs` builds `.codex-plugin/skills/`
27
+ as the union of `commands/` and `skills/` names; each generated entry links via a
28
+ package-relative path to its canonical `commands/<name>.md` or `skills/<name>/SKILL.md`, so it
29
+ resolves from the installed bundle, not only the source checkout. Command adapters read the
30
+ full canonical command before resolving any internal skill call directly, avoiding recursive
31
+ dispatch back to the public entry. Trailing prompt text passes through as `$ARGUMENTS` — no
32
+ shell expansion, no global substitution.
33
+ - **`disable-model-invocation: true` now maps to `agents/openai.yaml`
34
+ `policy.allow_implicit_invocation: false`, so `go`, `close`, `bootstrap`, `brainstorm`, `plan`,
35
+ and `release` keep requiring explicit selection under Codex too (`cf0876c3`, Refs
36
+ #1263/#1264).** All other commands retain their source setting.
37
+ - **`scripts/lib/validate/check-codex-skills.mjs` independently re-derives the expected Codex
38
+ surface from the emitted artifacts, not from the generator's own expected text, and is wired
39
+ into `scripts/validate-plugin.mjs` (`cf0876c3`, Refs #1263/#1265).** It checks source-name
40
+ coverage, manifest registration, frontmatter/metadata types, invocation-policy booleans, and
41
+ canonical-link targets; its CLI also re-runs `generate-codex-skills.mjs --check`.
42
+ - **Native Codex `commands: []` now suppresses the installer's automatic `commands/` migration
43
+ (`ae16dfcb`, Refs #1263/#1265/#1266).** Without it, a real install on Codex 0.153.3 added nine
44
+ `source-command-*` aliases (including `source-command-close`) beside the generated entries,
45
+ with no invocation policy attached. `scripts/lib/codex/plugin-contract.mjs` now requires
46
+ `commands` to be an empty array when present.
47
+ - **The root `plugin.json` (added in 4.0.0) is replaced by `.cursor-plugin/plugin.json`,
48
+ Cursor's native manifest format (`cf0876c3`, Refs #1263/#1264).** Read-only `plugin/read`
49
+ probes on Codex CLI 0.153.3 and desktop 0.153.4 found the root Agent Plugins manifest
50
+ overrides Codex's own declared skill path (fixing it to `./skills`) and root version —
51
+ silently defeating the generated `.codex-plugin/skills/` surface even though every adapter
52
+ unit test passed. `package.json` `files[]` and `scripts/release.mjs`'s version-surface table
53
+ are updated accordingly (`.cursor-plugin/` added, root `plugin.json` removed).
54
+ - **Installed acceptance verified end to end (`3862505c`, `a244b870`, Refs #1263/#1266).**
55
+ Public `codex plugin add session-orchestrator@local --json` produced enabled version
56
+ `4.0.0+codex.20260907174300`; Codex desktop 0.153.4 returns exactly 51 unique enabled skills
57
+ via both `plugin/read` and `skills/list`, no migration aliases, and all six explicit-only
58
+ commands retain `allow_implicit_invocation: false`. Visible-picker selection is **not yet
59
+ confirmed** — Computer Use cannot drive the Codex desktop app — and remains open under #1266
60
+ (see Notes).
61
+ - **Documented the Codex command entrypoints across `README.md`, `docs/codex-setup.md`,
62
+ `docs/components.md`, `docs/migration-v4.md`, and `docs/instruction-delivery.md` (`cf0876c3`,
63
+ Refs #1263/#1266).**
64
+
65
+ ### Changed
66
+
67
+ - Public website redesigned (session-orchestrator.com): light-first design in the family look of the author's personal site (Bricolage Grotesque, Source Sans 3, IBM Plex Mono, all self-hosted; Archivo removed).
68
+ - Two reading layers on the landing page: a plain-words layer for non-developers above a developer layer with install commands, the wave schedule, and the measured-claims table.
69
+ - German landing page at `/de` with `hreflang` alternates (`en`, `de`, `x-default`), same section ids and census spans as the English page.
70
+ - three.js hero (vendored `three@0.185.1`, two files: `three.module.min.js` + `three.core.min.js`), loaded via a lazy dynamic import skipped under `prefers-reduced-motion`, which renders the static `hero-fallback.svg` instead.
71
+ - Six AI-generated illustrations (gpt-image-2), each captioned "AI-generated illustration (gpt-image-2)" in EN/DE.
72
+ - FAQ section with `FAQPage` JSON-LD on both the EN and DE landing pages.
73
+ - Author block linking to the personal site (root + `utm_source=session-orchestrator`), closing GitLab #1237.
74
+ - `scripts/site-numbers.mjs` gained `npm-downloads-30d` and `github-stars`: fetched only under `--write` (5 s timeout, snapshot kept on failure), answered from the `site/_census.json` snapshot under `--check`; `SO_SITE_NUMBERS_OFFLINE=1` skips both metrics. Marker-bounded census blocks (`<!-- census:start -->` / `<!-- census:end -->`) added to `site/llms.txt` and `site/llms-full.txt` (GitLab #1080, points 1/3/5/6/7).
75
+ - New tests: `tests/site/voice-gate.test.mjs` (em-dash, superlative, "we", emoji gate) and `tests/site/structure.test.mjs` (EN/DE parity, hreflang, asset presence, AI-illustration disclosure).
76
+ - `vercel.json` cache headers for `/assets`, `/img`, `/vendor`; ESLint now ignores `site/vendor/**` (vendored three.js) and declares browser globals for `site/assets/**`.
77
+
78
+ ### Fixed
79
+
80
+ - **`CHANGELOG.md`'s `[4.0.0]` entry and `docs/migration-v4.md` corrected two overclaims found
81
+ by post-tag review (`a4315993`).** `package.json` `files[]` admits the whole
82
+ `.orchestrator/policy/` directory, not a curated file list — the packlist test, not npm, is
83
+ what pins the shipped set to the tracked set. `pi-install.mjs --settings-only` actually
84
+ **rewrites** an existing Pi settings file (upsert), unlike `cursor-install.mjs`, which skips
85
+ existing destinations. Note for readers of the published `v4.0.0` tag: this correction lands
86
+ after that tag, so the tagged CHANGELOG text still carries the two overclaims — only `main`
87
+ and `4.0.1` have the corrected wording.
88
+ - **`tests/scripts/site-numbers.test.mjs` fixtures run offline
89
+ (`SO_SITE_NUMBERS_OFFLINE=1`) (`4ea84d3e`).** Without it, the census-block tests fetched live
90
+ npm download counts and went red whenever the live count moved past the fixture snapshot
91
+ (measured in CI 2026-09-07: 1237 vs. 1165).
92
+ - **`tests/lib/validate/check-auq-clarity.test.mjs` gets a 120 s hook timeout for its
93
+ `validate-plugin.mjs` spawn in `beforeAll` (`19b66e6e`).** GitLab pipelines 8790 and 8791
94
+ (2026-09-07) failed only here: the shared runner exceeded vitest's default 30 s `hookTimeout`
95
+ running the full validator (~12 s locally). Aligns with the sibling
96
+ `tests/scripts/validate-plugin.test.mjs`.
97
+
98
+ #### 4.0.1 — mechanical-fix session (16 follow-up issues from the 4.0.0 audit)
99
+
100
+ - **Reconcile-idempotency now has a contract and a regression test, not just a claim (#1242).**
101
+ Discovery found the acceptance criterion already held — tracked Provenance markers already
102
+ dedupe re-runs, a fresh-clone simulation regenerated 0 of 30 keys — so the delivered fix is a
103
+ contract doc (the scan is authoritative, the sidecar is a cache) plus a mutation-proven
104
+ fresh-clone consolidated-shape test, not new production code.
105
+ - **`check-unwired-features.mjs`'s Category S4 no longer conflates "genuinely unreachable" with
106
+ "reachable only via coordinator dispatch" (#1239).** Discovery measured 52 raw S4 findings, 46
107
+ of them (88.5%) false positives — modules invoked only through a coordinator `Task`/skill
108
+ dispatch, never a static import. S4 now splits into 5 truly-unreachable findings and 46
109
+ coordinator-invoked findings reported as advisory rather than blocking, with `skills/`
110
+ recognised as a first-class reachability edge source; a same-wave fix-pass tightened the
111
+ coordinator-invoked match to token boundaries (a Codex-repro case where a bare substring match
112
+ over-matched) and dropped the advisory line's WARN severity per `host-resources.md` HR-101.
113
+ The check's exit code is unchanged.
114
+ - **`inspectConfidentialNames()` is a new function; `loadConfidentialNames()` keeps its 4.0.0
115
+ `string[] | null` public contract (#1250).** This session's own Wave-2 refactor had changed
116
+ `loadConfidentialNames()`'s return shape to an object — a semver-breaking change the Wave-4
117
+ review panel and Codex gpt-6-astra both caught before the cut, not after. The fix reinstates
118
+ `loadConfidentialNames()` as a thin wrapper over the richer `inspectConfidentialNames()`. A new
119
+ `'all-dropped'` status (every entry in the confidential-names file invalid) now fails closed
120
+ instead of silently returning an empty list, and the loader's WARN on a missing/malformed file
121
+ is redacted to the file's basename — the same fix-pass had regressed the full path into
122
+ stderr, reopening the class of leak `check-owner-leakage.mjs` exists to prevent; found and
123
+ fixed inside this session's own review cycle, before release.
124
+ - **`loadHostPaths()` no longer loads `owner.yaml` twice (#1251).** Health-check state now
125
+ passes through from the caller's single load instead of triggering a second read.
126
+ - **Four small fixes under #1262: an env-configured standalone confidential-names copy now fails
127
+ closed instead of passing through silently (point 2); `docs/migration-v4.md` gained rollback
128
+ prose (point 3); `OPTIONAL_OBJECT_SECTIONS` is now an exported constant with a parity test,
129
+ replacing a duplicated mirror list (point 4); a stale comment on the full quality-gate path was
130
+ corrected (point 5).** Point 1 (a Codex-surface regeneration check) was dropped — Discovery
131
+ measured the existing set-equality pack test as the stronger pin, so no code change was needed.
132
+ - **`VALID_SESSION_PROFILES` moved to a single source of truth in
133
+ `scripts/lib/session-schema/constants.mjs`, with `SHARED_LIST_BOUNDS`/`INGEST_LIST_BOUNDS`
134
+ parity enforced (#1252).** A re-export shim stayed at the old location for compatibility,
135
+ pinned by an identity test.
136
+ - **Four git-fixture files and the two largest `rmSync` call sites now route through a shared
137
+ tmp-fixture helper instead of ad hoc cleanup; `listRepoFiles()` now swallows only
138
+ `ENOENT`/`ENOTDIR`, not every error (#1253).** This is a partial pass, not a sweep: 501 bare
139
+ **recursive** `rmSync` call sites remain unrouted (574 claimed → 524 measured → 501 after this
140
+ session) and are carried forward as #1268 with a Revisit-Trigger, not silently left
141
+ unmentioned.
142
+ - **`check-skill-links.mjs` now scans `docs/` (previously skill/command files only), takes a
143
+ `dirs` option, and right-anchors its GitLab `-/issues` carve-out (#1258).** The carve-out was
144
+ previously unanchored and could match a URL fragment elsewhere in a line. Two dangling
145
+ documentation links were repaired, both pointing at content that had moved to the vault
146
+ archive.
147
+ - **An unknown or valueless CLI flag on `generate-hook-import-set.mjs` now exits 2 with a usage
148
+ message instead of triggering the write (#1249).** `--out --check` no longer writes a file
149
+ literally named `--check` — the argv loop had read `--check` as `--out`'s value.
150
+ - **A platform allowlist check now uses `Object.hasOwn()` (#1256).** Discovery's companion claim
151
+ in the same issue — that a related export was dead code — was checked against real call sites
152
+ and refuted; that half closes as "working as designed".
153
+ - **Desktop notifications now carry a platform-aware label (#1254).** `detectPlatform()` drives
154
+ the OSC notify text so a Codex CLI session's notification reads differently from a Claude Code
155
+ session's.
156
+ - **A new session-start probe, `telemetry-flush-health`, surfaces telemetry-sender problems that
157
+ were previously silent (#1255).** It tail-reads the last `orchestrator.telemetry.flush` event:
158
+ a `sandbox:*` refusal reason now renders as a WARN banner instead of nothing, and an
159
+ unreadable ledger renders explicitly as `ledger-unreadable` rather than falling through to
160
+ silence. The reason string is bounded to 120 characters with control characters stripped.
161
+ - **The tests:src ratio census now resolves calls made through `fixtureGit`/`fixtureGitSpawn`
162
+ wrappers, including the `NO_BACKGROUND_WRITER` spread pattern, and strips comments before
163
+ reading a wrapped call's second positional argument (#1259).** Applicable call sites rose from
164
+ 17 to 200 (measured 2026-09-07 on the release tree with
165
+ `node scripts/lib/validate/check-test-git-config-target.mjs .`) — the tokenizer previously
166
+ couldn't see wrapper calls at all — and the reporting floor was raised from 20 to 100 to match.
167
+ - **Four tests now pin Node 24's `err.url` behaviour using a real spawned `node` child process,
168
+ not an in-process `vitest` failure (#1260).** An in-process `ERR_MODULE_NOT_FOUND` never
169
+ carries a `url` field, so the previous test could not observe the behaviour it claimed to pin.
170
+ The standalone single-file copy path is confirmed inert / fails closed for the same case.
171
+ - **A Discovery premise was refuted before any code changed (#1257).** `vault-sync`'s
172
+ sub-package dependency pins looked accidental; they are intentional, because CI already
173
+ installs the sub-package separately. Documented in `skills/vault-sync/SKILL.md` §
174
+ Dependencies instead of "fixed".
175
+ - **`release.mjs`'s drift sweep now judges version literals as whole tokens and skips comment
176
+ prose and lockfile dependency rows; its history allowlist admits nine files whose only literal
177
+ is prose history of the 4.0.0 major (`CLAUDE.md`, its generated twin `AGENTS.md`,
178
+ `CONTRIBUTING.md`, `NOTICE`, `.husky/pre-push`, `site/llms-full.txt`,
179
+ `skills/architecture/references/domain-model.md`, `skills/autopilot/SKILL.md`,
180
+ `templates/_shared/journey-manifest.md`).** Measured 2026-09-07 mid-release: `4.0.0` matched
181
+ inside `>=24.0.0` in package.json, 72 third-party rows in package-lock.json, and `// pre-4.0.0`
182
+ comments — none a version surface. The sweep's detail line now carries the total hit count
183
+ instead of truncating at five, which is how the last four files had stayed hidden.
184
+
185
+ ### Notes
186
+
187
+ - **4.0.1 is a PATCH: no public export changed shape.** `loadConfidentialNames()` keeps its
188
+ `string[] | null` contract; the new exports (`inspectConfidentialNames`, `SHARED_LIST_BOUNDS`,
189
+ `INGEST_LIST_BOUNDS`, `OPTIONAL_OBJECT_SECTIONS`, `stripComments`, `wrapperHasCwd`,
190
+ `checkTelemetryFlushHealth`, `renderBanner`, `TAIL_BYTES`, and `VALID_SESSION_PROFILES` in
191
+ `constants.mjs`) are additive. Reviewed by a 4-reviewer panel plus Codex gpt-6-astra on the
192
+ packed tarball; 2 P1 + 3 P2 Codex findings were fixed before the cut, not after.
193
+ - **Visible Codex picker confirmation (#1266) remains an operator step; not a release gate.**
194
+ - **The telemetry ingest server was redeployed for this release (#1261).** Operational step, not
195
+ a code change — rollback tag `telemetry-ingest:1.0.0-pre401` kept in place; health confirmed
196
+ post-restart.
197
+
10
198
  ## [4.0.0] - 2026-09-06
11
199
 
12
200
  > **A MAJOR, because public surfaces are REMOVED** (see *Removed (BREAKING)* below).
@@ -978,7 +1166,8 @@ manual cleanup steps: [`docs/migration-v4.md`](docs/migration-v4.md).
978
1166
  `npm pack --dry-run`, not a mock). The release leakage gate's `.orchestrator/`
979
1167
  exclusion is narrowed to carve THIS directory back IN (`scripts/release.mjs`
980
1168
  around line 319) — the operator's own `metrics/`, `debug/` artefacts and live
981
- `*.lock` files stay excluded; only the tracked policy floor ships. **The
1169
+ `*.lock` files stay excluded. `files[]` admits the directory, not a file list — what
1170
+ keeps the shipped set equal to the TRACKED policy set is the packlist test below, not npm. **The
982
1171
  Wave-4 review panel found this test asserted only a FLOOR (≥ 6 files) while
983
1172
  `package.json`'s `files[]` admits the WHOLE `.orchestrator/policy/` directory
984
1173
  and the carve-out above matched the path anywhere in the string, not just at
package/README.md CHANGED
@@ -1,13 +1,13 @@
1
1
  # Session Orchestrator
2
2
 
3
3
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
4
- [![Version](https://img.shields.io/badge/version-4.0.0-blue.svg)](CHANGELOG.md)
4
+ [![Version](https://img.shields.io/badge/version-4.0.1-blue.svg)](CHANGELOG.md)
5
5
  [![npm](https://img.shields.io/npm/v/session-orchestrator.svg)](https://www.npmjs.com/package/session-orchestrator)
6
6
  [![Tests](https://img.shields.io/badge/tests-vitest-brightgreen.svg)](docs/telemetry/telemetry-claims.md)
7
7
 
8
8
  Loop engineering for AI coding agents — turn ad-hoc sessions into a repeatable research → plan → wave-execute → close loop with verification gates. Runs on **Claude Code, Codex CLI, Cursor IDE, and [Pi](docs/pi-setup.md)**, as a community plugin (MIT, community-maintained) for solo devs and small teams.
9
9
 
10
- The same skills and commands are available on all four harnesses; **enforcement depth differs** — scope enforcement is full on Claude Code, bridged on Cursor and Pi, and currently unavailable on Codex CLI (see [Platform support](#platform-support)).
10
+ The same workflows are available on all four harnesses; Codex exposes commands as selectable skills. **Enforcement depth differs** — scope enforcement is full on Claude Code, bridged on Cursor and Pi, and currently unavailable on Codex CLI (see [Platform support](#platform-support)).
11
11
 
12
12
  ## Requirements
13
13
 
@@ -46,7 +46,7 @@ Setup guides: [Codex](docs/codex-setup.md) · [Cursor IDE](docs/cursor-setup.md)
46
46
  /plugin update session-orchestrator@kanevry # Claude Code
47
47
  ```
48
48
 
49
- Restart the harness afterwards, and re-run `npm install` in the plugin directory when the release adds dependencies. On Codex CLI, Cursor, and Pi the upgrade is `git pull` in your clone followed by the same install script you originally ran.
49
+ Restart the harness afterwards, and re-run `npm install` in the plugin directory when the release adds dependencies. On Cursor and Pi the upgrade is `git pull` in your clone followed by the same install script you originally ran. For Codex, follow the [refresh instructions](docs/codex-setup.md#refresh-and-explicit-cache-invalidation) for your marketplace source, then reload the skill picker or restart Codex.
50
50
 
51
51
  Session-start tells you when the running copy is behind: `scripts/lib/plugin-update-banner.mjs` compares the version of the code **that is actually loaded** against the published npm version and warns in the session-start banner (minor or major; patch-only updates stay silent). It fails silent — offline, a non-2xx response, or a malformed answer produces *no statement*, never a false "up to date".
52
52
 
@@ -67,6 +67,8 @@ Deleting `.orchestrator/metrics/` deletes your session history. Nothing is sent
67
67
 
68
68
  ## Quick Start
69
69
 
70
+ In Codex, select the corresponding **Session Orchestrator** skill in the picker or use `$session-orchestrator:<command>`; the slash commands below name the shared workflows. For example, bootstrap with `$session-orchestrator:bootstrap`. See [Codex usage](docs/codex-setup.md#usage).
71
+
70
72
  **1. Bootstrap the repo once.** Run `/bootstrap` in your project — it scaffolds the minimum structure and writes `.orchestrator/bootstrap.lock`, which session-start requires before `/session` will run.
71
73
 
72
74
  **2. Declare a Session Config.** Add a `## Session Config` section to your project's `CLAUDE.md` (Claude Code, Cursor IDE) or `AGENTS.md` (Codex CLI, Pi) — see [instruction-file-resolution](skills/_shared/instruction-file-resolution.md) for which file each platform reads. The smallest valid config is seven fields:
@@ -105,7 +107,15 @@ Everything else is opt-in. Full template: [`docs/session-config-template.md`](do
105
107
  /close # verify every item, commit cleanly, file carryover issues for the rest
106
108
  ```
107
109
 
108
- That is the whole loop. `/plan` and `/evolve` extend it, but you can start with just these three.
110
+ In Codex, invoke the same loop through the generated command skills:
111
+
112
+ ```text
113
+ $session-orchestrator:session feature
114
+ $session-orchestrator:go
115
+ $session-orchestrator:close
116
+ ```
117
+
118
+ These entries preserve each command's full workflow and prechecks. Codex's native `/goal` is a separate feature. `/plan` and `/evolve` extend the loop, but you can start with just these three.
109
119
 
110
120
  ## Lifecycle and waves
111
121
 
@@ -161,16 +171,16 @@ The system is markdown-driven config plus a thin Node runtime — skills, comman
161
171
 
162
172
  ## What you get
163
173
 
164
- Counts measured on 2026-09-06 with the command in brackets:
174
+ Counts measured on 2026-09-07 with the command in brackets:
165
175
 
166
176
  - **43 skills** for the session lifecycle (start, plan, execute, close, evolve), discovery, vault sync, MCP authoring, debugging, brainstorming, plan grilling, persona panels, cross-repo dispatch, learning→rule reconciliation, session-process eval, and audits (`ls -d skills/*/ | grep -v _shared | wc -l`)
167
177
  - **25 slash commands** (`/session`, `/go`, `/close`, `/discovery`, `/plan`, `/grill`, `/evolve`, `/autopilot`, `/dispatcher`, `/reconcile`, `/eval`, `/test`, `/debug`, …) (`ls commands/*.md | wc -l`)
168
178
  - **14 typed subagents** (code-implementer, test-writer, security-reviewer, session-reviewer, qa-strategist, architect-reviewer, …) (`ls agents/*.md | wc -l`)
169
179
  - **27 hook files across 10 event types**, enforcing scope, blocking destructive commands, gating templates-first, and capturing telemetry — full on Claude Code; experimental, post-hoc, or bridged elsewhere ([Platform support](#platform-support)) (`ls hooks/*.mjs | wc -l`)
170
180
  - **26 always-on rule files** and **18 ADRs** carrying the reasoning behind the mechanisms (`ls .claude/rules/*.md | wc -l`, `ls docs/adr/*.md | wc -l`)
171
- - **661 vitest test files** run on every commit — 13,962 static `it()`/`test()` definitions at that measurement, and the runtime total is higher because of parameterised blocks ([methodology](docs/telemetry/telemetry-claims.md)) (`find tests -name '*.test.mjs' | wc -l`)
181
+ - **667 vitest test files** run on every commit — 13,827 static `it()`/`test()` definitions at that measurement, and the runtime total is higher because of parameterised blocks ([methodology](docs/telemetry/telemetry-claims.md)) (`find tests -name '*.test.mjs' | wc -l`)
172
182
 
173
- **Portable across harnesses by construction.** The repo ships a root `AGENTS.md` generated byte-identical from `CLAUDE.md`, a root `plugin.json` following the [agent-plugins.org](https://agent-plugins.org) 1.0.0 schema, and a `.agents/skills/<name>/SKILL.md` mirror of all 43 skills carrying spec-legal frontmatter plus a pointer body. All three are generated by `scripts/generate-agents-skills.mjs` and drift-checked in `scripts/validate-plugin.mjs` — never hand-edited.
183
+ **Portable across harnesses by construction.** `scripts/generate-agents-skills.mjs` generates root `AGENTS.md` byte-identical from `CLAUDE.md` and the `.agents/skills/<name>/SKILL.md` mirrors, with spec-legal frontmatter and pointers to canonical instructions. `scripts/generate-codex-skills.mjs` generates the Codex command entrypoints. Plugin validation checks both surfaces. Separate manifests under `.claude-plugin/`, `.codex-plugin/` and `.cursor-plugin/` register each harness's components; see [Codex manifest compatibility](docs/codex-setup.md#manifest-compatibility).
174
184
 
175
185
  Full component inventory: [`docs/components.md`](docs/components.md). Version history and per-release detail: [CHANGELOG.md](CHANGELOG.md).
176
186
 
@@ -186,17 +196,15 @@ Full component inventory: [`docs/components.md`](docs/components.md). Version hi
186
196
 
187
197
  How this compares to other orchestrators — with the parts that are measured and the parts that are not: [`docs/components.md` § Comparisons](docs/components.md#comparisons).
188
198
 
189
- ## Recent highlights (v4.0.0)
199
+ ## Recent highlights (v4.0.1)
190
200
 
191
- v4.0.0 is the first release that REMOVES public surfaces, so read [docs/migration-v4.md](docs/migration-v4.md) before upgrading. Highlights of the v4.0.0 line: less surface, an instruction layer that loads on demand, and three instruments that were reporting numbers nobody could reproduce:
201
+ 4.0.1 is a patch on top of 4.0.0 — if you're upgrading from before 4.0, read [docs/migration-v4.md](docs/migration-v4.md) first; nothing below removes anything further. Highlights of the v4.0.1 line: Codex command entrypoints, a redesigned public site, and a review-hardened owner-privacy scanner — plus the sixteen follow-ups the 4.0.0 review left open:
192
202
 
193
- - **Five skills, three commands and eight top-level scripts are gone.** Removal followed a measured two-signal rule — 0 telemetry ∧ 0 fleet invocation over 90 days ∧ no runtime consumer — never a judgement call. Prose-invoked skills, which register 0 by construction, were exempt. `skills/domain-model/` was merged into `skills/architecture/` rather than dropped.
194
- - **`.claude/rules/` goes 61 → 26 files.** Forty-three machine-generated learning files were consolidated into eight thematic ones, each keeping its provenance markers so the reconcile engine still dedupes on them.
195
- - **The three largest instruction files are split, not shortened.** `session-start`, `session-end` and the wave loop keep every phase; the bodies move into per-phase files under `references/`, and the top-level file becomes an index that is heading-complete against the original. Nothing was summarised away.
196
- - **`ultradeep` is a profile over `deep`, not a fourth session type.** Seven waves with a blocking synthesis gate and a read-only review panel. Downstream tooling still sees `deep`, which is why it costs about eight touchpoints instead of forty-eight.
197
- - **A session-start banner now says when the plugin you are RUNNING is behind the one published** (minor or major; patch-only updates stay silent). This host had been running a copy five minors old for four weeks with no warning, because nothing anywhere compared installed against available.
198
- - **Two instruments were corrected rather than tuned.** Telemetry attributed the operator's own second machine to the external fleet, and the abandoned-session rate was an artefact of backfilled records. Both now report what they measure.
199
- - **A root `AGENTS.md`, a root `plugin.json` and a portable `.agents/skills/` mirror.** The repo now speaks the cross-harness instruction conventions it documents, generated and validated rather than hand-maintained.
203
+ - **4.0.0 removed public surfaces and split the largest instruction files.** Five skills, three commands and eight top-level scripts were dropped on a measured two-signal rule (0 telemetry ∧ 0 fleet invocation over 90 days ∧ no runtime consumer, never a judgement call); `.claude/rules/` went 61 → 26 files; `session-start`, `session-end` and the wave loop keep every phase, with bodies moved into per-phase `references/` files. Full detail and upgrade steps: [docs/migration-v4.md](docs/migration-v4.md).
204
+ - **Codex command workflows are now selectable skills.** `scripts/generate-codex-skills.mjs` generates 51 entries (25 command-backed, 26 skill-backed); `go`, `close`, and 6 others that were previously absent from the skill surface (`harness-audit`, `portfolio`, `release`, `session`, `templates-ack`, `test`) are now discoverable and invocable as `$session-orchestrator:<name>`. Native `commands: []` stops the installer from separately aliasing the source commands into policy-less duplicates. The intercepting standard root manifest moved to [`.cursor-plugin/plugin.json`](.cursor-plugin/plugin.json) so it no longer shadows Codex's own manifest resolution (Refs #1263).
205
+ - **Public website redesigned**, including a German `/de` landing page.
206
+ - **Review-driven hardening.** The owner-privacy scanner (CP11) now fails CLOSED on a corrupted or env-configured-but-unresolvable confidential-names list instead of silently degrading to allow, and no longer prints the names-file path into logs; `check-unwired-features` splits 46 coordinator-invoked modules out of its actionable finding set (52 → 5 unreachable), so the report names what an operator can actually act on; a new session-start probe (`telemetry-flush-health`) surfaces when the sandbox refused a telemetry flush instead of that failure staying silent.
207
+ - **Sixteen follow-ups from the 4.0.0 review closed, and the patch itself was reviewed before the cut.** A four-reviewer panel plus an external Codex gpt-6-astra pass over the packed npm tarball found two P1 and three P2 defects in this session's own changes — a names-file path printed into the scanner's failing output, a deep-import contract change, a flag swallowed as a value, a substring match that hid a real finding, a comment that counted as a target — all fixed before publishing. The residual list lives in GitLab #1268–#1273.
200
208
 
201
209
  Full list, with the evidence for each claim: [CHANGELOG.md](CHANGELOG.md).
202
210
 
@@ -204,7 +212,7 @@ Full list, with the evidence for each claim: [CHANGELOG.md](CHANGELOG.md).
204
212
 
205
213
  | Feature | Claude Code | Codex CLI | Cursor IDE | Pi |
206
214
  |---|---|---|---|---|
207
- | All 25 commands | Native slash commands | Native plugin commands | Native `.cursor/commands` slash commands | Prompt templates |
215
+ | All 25 commands | Native slash commands | Generated skills (`$session-orchestrator:<name>`) | Native `.cursor/commands` slash commands | Prompt templates |
208
216
  | Parallel agents | Agent tool | Multi-agent roles | Sequential only | Sequential (parallel planned) |
209
217
  | Session persistence | `.claude/STATE.md` | `.codex/STATE.md` | `.cursor/STATE.md` | `.pi/STATE.md` |
210
218
  | Scope enforcement | PreToolUse hooks | Unavailable — pending a real `apply_patch` adapter | `preToolUse` + `beforeShellExecution` via cursor-hook-bridge; `afterFileEdit` post-hoc | `tool_call` bridge |
@@ -283,7 +291,7 @@ This plugin is a methodology turned into code. The reasoning behind it — why e
283
291
 
284
292
  ## Links
285
293
 
286
- [Homepage](https://session-orchestrator.com) · [Privacy Policy](https://gotzendorfer.at/en/session-orchestrator/privacy) · [npm](https://www.npmjs.com/package/session-orchestrator)
294
+ [Homepage](https://session-orchestrator.com) (also at [/de](https://session-orchestrator.com/de) in German, with a plain-words layer above the developer detail) · [Privacy Policy](https://gotzendorfer.at/en/session-orchestrator/privacy) · [npm](https://www.npmjs.com/package/session-orchestrator)
287
295
 
288
296
  ## License
289
297
 
@@ -67,7 +67,7 @@ Codex reports three distinct states that must not be conflated:
67
67
 
68
68
  ## Refresh and Explicit Cache Invalidation
69
69
 
70
- **If you installed via the short remote form** (`codex plugin marketplace add owner/repo`), the refresh is a marketplace upgrade, not a re-install. Measured 2026-09-06 on codex-cli 0.144.4 — `codex plugin marketplace upgrade --help`: *"Refresh configured Git marketplace snapshots. Omit MARKETPLACE_NAME to upgrade all configured Git marketplaces."*
70
+ **If you installed via the short remote form** (`codex plugin marketplace add owner/repo`), refresh the Git marketplace snapshot before updating the installed plugin. Measured 2026-09-06 on codex-cli 0.144.4 — `codex plugin marketplace upgrade --help`: *"Refresh configured Git marketplace snapshots. Omit MARKETPLACE_NAME to upgrade all configured Git marketplaces."*
71
71
 
72
72
  ```bash
73
73
  codex plugin marketplace upgrade kanevry # or omit the name to refresh all
@@ -86,6 +86,8 @@ node scripts/codex-install.mjs
86
86
 
87
87
  Every installer run executes `codex plugin marketplace add` and `codex plugin add`, even when the marketplace is already configured. The repeated `plugin add` refreshes Codex's installed bundle from the current clone instead of treating installation as a one-time copy.
88
88
 
89
+ After either refresh path, confirm the installed version with `codex plugin list --available --json` and start a fresh task. Reopen the skill picker and search for `go` or `close`; if the updated entries are still missing, fully restart Codex. Editing the source clone or regenerating skills alone does not refresh the installed bundle.
90
+
89
91
  The tracked Codex manifest uses a version such as `3.14.0+codex.20260717175716`. The base must match `package.json`; the `+codex.<YYYYMMDDHHmmss>` UTC suffix is the repository's explicit invalidation marker. When a shipped bundle needs a new cache identity, maintainers commit a new timestamp in `.codex-plugin/plugin.json`. The installer validates that committed value and never mutates the tracked manifest.
90
92
 
91
93
  ## Configuration
@@ -176,14 +178,44 @@ An empty `PreToolUse` or `SubagentStart` array means the event belongs to the va
176
178
 
177
179
  ## Usage
178
180
 
179
- After installation and hook review, start a fresh task. Session Orchestrator exposes the shared skill surface, including:
181
+ After installation or refresh, start a fresh task. In the desktop composer, open the skill picker, search for `go` or `close`, and select the matching **Session Orchestrator** entry. In Codex CLI or the IDE extension, use `/skills` or mention the namespaced skill directly in your prompt. [OpenAI skill invocation](https://learn.chatgpt.com/docs/build-skills)
182
+
183
+ ```text
184
+ $session-orchestrator:session feature # start a session (housekeeping, feature or deep)
185
+ $session-orchestrator:go # execute the agreed plan
186
+ $session-orchestrator:close # verify and close the session
187
+ $session-orchestrator:plan feature # plan a project or feature (new, feature or retro)
188
+ $session-orchestrator:discovery # run quality probes; optionally add a scope
189
+ $session-orchestrator:evolve analyze # manage learnings (analyze, review or list)
190
+ ```
191
+
192
+ These are skill invocations in the Codex prompt, not shell commands. Invoking `go` reads the full canonical `commands/go.md`, including its Express Path and prechecks; invoking `close` reads `commands/close.md`, including its state and ledger checks before the session-end workflow. Codex's native `/goal` is a separate feature. Typing `/go` or `/close` alone is not a portable invocation contract; select the skill or use its explicit namespaced form.
193
+
194
+ ### Manifest Compatibility
195
+
196
+ The plugin uses `.codex-plugin/plugin.json` for Codex and `.cursor-plugin/plugin.json` for Cursor. It does not ship a root Agent Plugins `plugin.json`: on Codex CLI 0.153.3 and desktop runtime 0.153.4, that standard manifest takes precedence, fixes skill discovery to conventional `skills/`, and supplies the root version. The Codex overlay can supply hooks, apps and interface metadata, but cannot override that skill path or version. This was verified with read-only `plugin/read` probes on 2026-09-07. [Codex manifest parser](https://github.com/openai/codex/blob/main/codex-rs/core-plugins/src/agent_plugin_manifest.rs)
197
+
198
+ Moving the former root metadata to the native Cursor manifest lets Codex load its generated entrypoints and cache suffix. Cursor keeps the declared skills and MCP paths; the manifest explicitly disables discovery of extra rules, agents, commands and hooks. Its existing installer supplies the Cursor command and hook adapters. This follows the [Cursor manifest reference](https://cursor.com/docs/reference/plugins); native Cursor loading has not been runtime-tested as part of this change.
199
+
200
+ ### Generated Command Skills
201
+
202
+ The Codex manifest registers one generated skill tree at `.codex-plugin/skills/`. It contains the union of names from `commands/` and `skills/`: when both contain the same name, the command takes precedence, giving the plugin one public entry for that name. OpenAI recommends converting reusable Markdown commands into skills. [OpenAI conversion guidance](https://developers.openai.com/plugins/guides/submit-claude-plugin)
180
203
 
181
- - `/session [housekeeping|feature|deep]` — start a session
182
- - `/go` — execute the agreed plan
183
- - `/close` — end the session with verification
184
- - `/plan [new|feature|retro]` — plan a project or feature
185
- - `/discovery [scope]` — run quality probes
186
- - `/evolve [analyze|review|list]` — manage learnings
204
+ The manifest also declares top-level `"commands": []` to suppress the installer's automatic command migration. When that field was omitted, a public install with Codex 0.153.3 added nine `source-command-*` aliases alongside the generated entries, including `source-command-close`, without preserving invocation policy. The empty array selects no command sources; it does not register native slash commands. The generated skill tree remains the public invocation surface. [Codex 0.153.3 command-path parser](https://github.com/openai/codex/blob/rust-v0.153.3/codex-rs/core-plugins/src/manifest.rs#L203), [installer migration](https://github.com/openai/codex/blob/rust-v0.153.3/codex-rs/core-plugins/src/command_migration/plugin.rs)
205
+
206
+ The generated files are adapters, not separate workflow bodies. Each links to its canonical command or skill using a package-relative path, so it also works from the installed bundle. Command adapters read the full command first and resolve internal skill calls directly to `skills/<name>/SKILL.md`, avoiding a recursive call to the public entry. Trailing prompt text supplies the command's `$ARGUMENTS` as data; the adapter does not shell-expand arguments or globally substitute them into command documents.
207
+
208
+ Commands declaring `disable-model-invocation: true`, including `go` and `close`, receive `policy.allow_implicit_invocation: false` in `agents/openai.yaml`. This preserves explicit selection while disabling implicit skill invocation. Other commands retain their source setting. [OpenAI invocation policy](https://learn.chatgpt.com/docs/build-skills#optional-metadata)
209
+
210
+ Maintainers edit the canonical files, then regenerate and check the Codex surface from the plugin root:
211
+
212
+ ```bash
213
+ node scripts/generate-codex-skills.mjs
214
+ node scripts/generate-codex-skills.mjs --check
215
+ node scripts/validate-plugin.mjs
216
+ ```
217
+
218
+ `--check` reports stale generated files without writing them. Plugin validation also checks manifest wiring, command coverage, canonical targets and invocation policy. Commit the generated output with its source change, then follow [Refresh and Explicit Cache Invalidation](#refresh-and-explicit-cache-invalidation) to update the installed copy.
187
219
 
188
220
  ## Key Differences from Claude Code
189
221
 
@@ -203,6 +235,8 @@ Both platforms share session history and learnings through `.orchestrator/metric
203
235
 
204
236
  ## Platform Limitations
205
237
 
238
+ Repository skills under `.agents/skills/` and installed-plugin skills can both appear in the picker. The generated union prevents duplicate names within the plugin; it does not remove pre-existing entries from other discovery scopes. Select the installed command entry whose path is under `.codex-plugin/skills/` when a repository also offers a same-named internal skill.
239
+
206
240
  Claude Code dispatches role-specialized agents with dedicated definitions. Codex maps implementation work through its configured roles, so task prompts carry specialization that is not represented by a dedicated role. A project can add more specific TOML definitions under `.codex/agents/` when needed.
207
241
 
208
242
  Hook enforcement is limited to the validated payload-compatible Codex subset described above. In particular, the absence of Claude-only events and Edit/Write handlers is deliberate rather than an installation workaround.
@@ -219,6 +253,7 @@ codex plugin list --available --json
219
253
  - **The target is missing, disabled, duplicated, or at the wrong version:** run `codex plugin marketplace list --json`, remove the exact target with `codex plugin remove session-orchestrator@kanevry` when present, and rerun `node scripts/codex-install.mjs` to reinstall and verify it.
220
254
  - **A `session-orchestrator@openai-curated` or `session-orchestrator@local` installation remains:** these are the only allowlisted legacy IDs. Remove the exact stale ID with `codex plugin remove session-orchestrator@openai-curated` or `codex plugin remove session-orchestrator@local`; unrelated plugins remain untouched.
221
255
  - **The `kanevry` marketplace points at another source:** confirm the conflict with `codex plugin marketplace list --json`, run `codex plugin marketplace remove kanevry`, then rerun the installer from the intended clone so it performs the public marketplace add and plugin add lifecycle.
256
+ - **`go` or `close` is missing from the skill picker:** follow [the refresh steps](#refresh-and-explicit-cache-invalidation), verify the installed version, and restart Codex if reopening the picker does not load the new entries. Use the namespaced skill form from [Usage](#usage), rather than selecting the unrelated native Goal command.
222
257
  - **Plugin is installed and enabled but hooks do not fire:** start a fresh task or fully restart Codex, run `/hooks`, and review the trust state. Installation does not imply hook approval.
223
258
  - **Other pre-public plugin/config/cache/hook-state residue is suspected:** this state is unsupported. Do not modify private Codex files. File an issue with `codex --version`, `codex plugin list --available --json`, and `codex plugin marketplace list --json` output so the public recovery path can be diagnosed.
224
259
  - **Agent dispatch fails:** verify Codex multi-agent support and inspect the bundled or project-level role TOMLs.
@@ -247,4 +282,3 @@ codex mcp list | grep session-orchestrator # the launch string should mention
247
282
  ```
248
283
 
249
284
  The 0.144.4 minimum-version caveat above still stands: everything in this section was measured on **0.141.0**, below the documented minimum, and has not been re-verified on 0.144.4+ or on the reporter's 0.149.0-alpha.4.3.
250
-