session-orchestrator 4.0.0 → 4.1.0

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 (123) 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 +213 -1
  82. package/README.md +70 -58
  83. package/commands/release.md +4 -4
  84. package/docs/codex-setup.md +43 -9
  85. package/docs/components.md +3 -2
  86. package/docs/instruction-delivery.md +12 -5
  87. package/docs/migration-v4.md +33 -9
  88. package/hooks/_lib/hook-import-set.json +4 -3
  89. package/hooks/hooks-codex.json +1 -1
  90. package/hooks/hooks.json +1 -1
  91. package/hooks/on-stop.mjs +25 -4
  92. package/package.json +2 -2
  93. package/scripts/ci/assert-coverage-green.mjs +100 -0
  94. package/scripts/generate-codex-skills.mjs +246 -0
  95. package/scripts/generate-hook-import-set.mjs +51 -8
  96. package/scripts/lib/codex/plugin-contract.mjs +6 -0
  97. package/scripts/lib/config/host-paths.mjs +20 -4
  98. package/scripts/lib/events.mjs +3 -3
  99. package/scripts/lib/gates/gate-full.mjs +7 -3
  100. package/scripts/lib/owner-config-banner.mjs +7 -9
  101. package/scripts/lib/owner-yaml.mjs +8 -1
  102. package/scripts/lib/plugin-update-banner.mjs +10 -2
  103. package/scripts/lib/project-hygiene.mjs +182 -6
  104. package/scripts/lib/reconcile/engine.mjs +38 -7
  105. package/scripts/lib/session-identity/own-session.mjs +24 -13
  106. package/scripts/lib/session-schema/constants.mjs +38 -11
  107. package/scripts/lib/session-start-probes.mjs +12 -0
  108. package/scripts/lib/telemetry/schema.mjs +39 -18
  109. package/scripts/lib/telemetry-flush-health-banner.mjs +211 -0
  110. package/scripts/lib/validate/check-codex-skills.mjs +191 -0
  111. package/scripts/lib/validate/check-owner-leakage.mjs +107 -62
  112. package/scripts/lib/validate/check-skill-links.mjs +37 -7
  113. package/scripts/lib/validate/check-test-git-config-target.mjs +192 -12
  114. package/scripts/lib/validate/check-unwired-features.mjs +163 -13
  115. package/scripts/lib/validate/confidential-names.mjs +95 -30
  116. package/scripts/lib/validate/repo-files.mjs +48 -14
  117. package/scripts/lib/vault-mirror/render-sessions.mjs +8 -1
  118. package/scripts/release.mjs +141 -29
  119. package/scripts/site-numbers.mjs +344 -8
  120. package/scripts/validate-plugin.mjs +3 -0
  121. package/skills/session-start/SKILL.md +2 -2
  122. package/skills/session-start/references/phase-4-ssot-environment-check.md +5 -0
  123. 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.1.0",
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,217 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [4.1.0] - 2026-09-08
11
+
12
+ ### Added
13
+
14
+ - The owner-privacy scanner accepts `--include-untracked` to check new files before staging while respecting Git ignore rules. Tracked-only remains the default (#1267).
15
+
16
+ ### Fixed
17
+
18
+ - Privacy scanning includes MDX and preserves filenames containing Unicode or newlines. Failure output includes the scanned-file count, and the pre-commit regression verifies that an unavailable confidential-name policy blocks the commit (#1267, #1269).
19
+ - Native Codex `CODEX_THREAD_ID` now participates in process-confirmed session ownership and event attribution. Explicit harness selection prevents inherited IDs from proving ownership; ambiguous IDs remain unconfirmed. Test workers isolate the invoking harness's identity (#1274).
20
+ - GitHub release recovery prints commands with the exact repository and tag, retains failed-create notes for retry, and inspects uncertain release state before any creation (#1095).
21
+ - CI audit detection examines executable GitHub steps and GitLab jobs, recognizes package-manager options and supported wrappers, and excludes metadata, comments, unused templates and help-only invocations. Local GitLab references, inheritance and `spec:inputs` headers are supported; external includes and dynamic conditions remain outside this heuristic (#1040).
22
+ - Vault session notes render lifecycle agent counts, preserve measured zero, and label counts known only as completed or planned (#1276).
23
+ - Guide copy buttons stay beside their command blocks, including multiline snippets and narrow screens (#1275).
24
+ - Full-repository validation runs once before Vitest workers start, and its result is shared by the existing smoke assertions. This avoids four competing scans during coverage while retaining mandatory validation and failure propagation (#1278).
25
+ - Coverage verification now requires generated reports and compares structured measurements with the canonical Vitest thresholds before writing its verified marker. Missing artifacts and low coverage previously passed through shell conditions that did not stop the CI job (#1279).
26
+
27
+ ### Changed
28
+
29
+ - README, English/German landing pages, guide and machine-readable summaries now agree on installation prerequisites, active plugin-cache selection, Codex command skills, Pi package management, platform-specific enforcement and update-cache behavior (#1275).
30
+ - Refreshed distribution evidence and submission drafts, corrected stable repository steering, and recorded the product-quality review with Chrome and backlog evidence (#824, #1080).
31
+ - Release instructions now place the fully green preflight after commit, both remote pushes and exact-commit CI, matching the executable gate's requirements (#1277).
32
+
33
+ ## [4.0.1] - 2026-09-07
34
+
35
+ A PATCH release, two work streams. Codex CLI command entrypoints (closing Epic #1263 and
36
+ sub-issues #1264/#1265/#1266) make every `commands/*.md` and `skills/*/SKILL.md` entry
37
+ discoverable and selectable inside Codex. A 5-wave mechanical-fix session (7 Discovery + 12
38
+ Impl-Core + 5 Impl-Polish + a 4-reviewer/Codex-gpt-6-astra Quality panel with 5 fixers) closes
39
+ 16 follow-up issues surfaced by the `4.0.0` 360° audit. The site redesign already staged in
40
+ `[Unreleased]` (session-orchestrator.com relaunch, closing GitLab #1237 and #1080 points
41
+ 1/3/5/6/7) folds in unchanged below as `### Changed`.
42
+
43
+ ### Added
44
+
45
+ - **Codex command workflows are now discoverable and selectable skills — 51 unique generated
46
+ entries (25 command-backed, 26 skill-backed), closing an 8-command discovery gap (`close`,
47
+ `go`, `harness-audit`, `portfolio`, `release`, `session`, `templates-ack`, `test`) and
48
+ resolving 17 same-name command/skill overlaps in the command's favor (`cf0876c3`, Refs
49
+ #1263/#1264/#1265/#1266).** `scripts/generate-codex-skills.mjs` builds `.codex-plugin/skills/`
50
+ as the union of `commands/` and `skills/` names; each generated entry links via a
51
+ package-relative path to its canonical `commands/<name>.md` or `skills/<name>/SKILL.md`, so it
52
+ resolves from the installed bundle, not only the source checkout. Command adapters read the
53
+ full canonical command before resolving any internal skill call directly, avoiding recursive
54
+ dispatch back to the public entry. Trailing prompt text passes through as `$ARGUMENTS` — no
55
+ shell expansion, no global substitution.
56
+ - **`disable-model-invocation: true` now maps to `agents/openai.yaml`
57
+ `policy.allow_implicit_invocation: false`, so `go`, `close`, `bootstrap`, `brainstorm`, `plan`,
58
+ and `release` keep requiring explicit selection under Codex too (`cf0876c3`, Refs
59
+ #1263/#1264).** All other commands retain their source setting.
60
+ - **`scripts/lib/validate/check-codex-skills.mjs` independently re-derives the expected Codex
61
+ surface from the emitted artifacts, not from the generator's own expected text, and is wired
62
+ into `scripts/validate-plugin.mjs` (`cf0876c3`, Refs #1263/#1265).** It checks source-name
63
+ coverage, manifest registration, frontmatter/metadata types, invocation-policy booleans, and
64
+ canonical-link targets; its CLI also re-runs `generate-codex-skills.mjs --check`.
65
+ - **Native Codex `commands: []` now suppresses the installer's automatic `commands/` migration
66
+ (`ae16dfcb`, Refs #1263/#1265/#1266).** Without it, a real install on Codex 0.153.3 added nine
67
+ `source-command-*` aliases (including `source-command-close`) beside the generated entries,
68
+ with no invocation policy attached. `scripts/lib/codex/plugin-contract.mjs` now requires
69
+ `commands` to be an empty array when present.
70
+ - **The root `plugin.json` (added in 4.0.0) is replaced by `.cursor-plugin/plugin.json`,
71
+ Cursor's native manifest format (`cf0876c3`, Refs #1263/#1264).** Read-only `plugin/read`
72
+ probes on Codex CLI 0.153.3 and desktop 0.153.4 found the root Agent Plugins manifest
73
+ overrides Codex's own declared skill path (fixing it to `./skills`) and root version —
74
+ silently defeating the generated `.codex-plugin/skills/` surface even though every adapter
75
+ unit test passed. `package.json` `files[]` and `scripts/release.mjs`'s version-surface table
76
+ are updated accordingly (`.cursor-plugin/` added, root `plugin.json` removed).
77
+ - **Installed acceptance verified end to end (`3862505c`, `a244b870`, Refs #1263/#1266).**
78
+ Public `codex plugin add session-orchestrator@local --json` produced enabled version
79
+ `4.0.0+codex.20260907174300`; Codex desktop 0.153.4 returns exactly 51 unique enabled skills
80
+ via both `plugin/read` and `skills/list`, no migration aliases, and all six explicit-only
81
+ commands retain `allow_implicit_invocation: false`. Visible-picker selection is **not yet
82
+ confirmed** — Computer Use cannot drive the Codex desktop app — and remains open under #1266
83
+ (see Notes).
84
+ - **Documented the Codex command entrypoints across `README.md`, `docs/codex-setup.md`,
85
+ `docs/components.md`, `docs/migration-v4.md`, and `docs/instruction-delivery.md` (`cf0876c3`,
86
+ Refs #1263/#1266).**
87
+
88
+ ### Changed
89
+
90
+ - 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).
91
+ - 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.
92
+ - German landing page at `/de` with `hreflang` alternates (`en`, `de`, `x-default`), same section ids and census spans as the English page.
93
+ - 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.
94
+ - Six AI-generated illustrations (gpt-image-2), each captioned "AI-generated illustration (gpt-image-2)" in EN/DE.
95
+ - FAQ section with `FAQPage` JSON-LD on both the EN and DE landing pages.
96
+ - Author block linking to the personal site (root + `utm_source=session-orchestrator`), closing GitLab #1237.
97
+ - `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).
98
+ - 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).
99
+ - `vercel.json` cache headers for `/assets`, `/img`, `/vendor`; ESLint now ignores `site/vendor/**` (vendored three.js) and declares browser globals for `site/assets/**`.
100
+
101
+ ### Fixed
102
+
103
+ - **`CHANGELOG.md`'s `[4.0.0]` entry and `docs/migration-v4.md` corrected two overclaims found
104
+ by post-tag review (`a4315993`).** `package.json` `files[]` admits the whole
105
+ `.orchestrator/policy/` directory, not a curated file list — the packlist test, not npm, is
106
+ what pins the shipped set to the tracked set. `pi-install.mjs --settings-only` actually
107
+ **rewrites** an existing Pi settings file (upsert), unlike `cursor-install.mjs`, which skips
108
+ existing destinations. Note for readers of the published `v4.0.0` tag: this correction lands
109
+ after that tag, so the tagged CHANGELOG text still carries the two overclaims — only `main`
110
+ and `4.0.1` have the corrected wording.
111
+ - **`tests/scripts/site-numbers.test.mjs` fixtures run offline
112
+ (`SO_SITE_NUMBERS_OFFLINE=1`) (`4ea84d3e`).** Without it, the census-block tests fetched live
113
+ npm download counts and went red whenever the live count moved past the fixture snapshot
114
+ (measured in CI 2026-09-07: 1237 vs. 1165).
115
+ - **`tests/lib/validate/check-auq-clarity.test.mjs` gets a 120 s hook timeout for its
116
+ `validate-plugin.mjs` spawn in `beforeAll` (`19b66e6e`).** GitLab pipelines 8790 and 8791
117
+ (2026-09-07) failed only here: the shared runner exceeded vitest's default 30 s `hookTimeout`
118
+ running the full validator (~12 s locally). Aligns with the sibling
119
+ `tests/scripts/validate-plugin.test.mjs`.
120
+
121
+ #### 4.0.1 — mechanical-fix session (16 follow-up issues from the 4.0.0 audit)
122
+
123
+ - **Reconcile-idempotency now has a contract and a regression test, not just a claim (#1242).**
124
+ Discovery found the acceptance criterion already held — tracked Provenance markers already
125
+ dedupe re-runs, a fresh-clone simulation regenerated 0 of 30 keys — so the delivered fix is a
126
+ contract doc (the scan is authoritative, the sidecar is a cache) plus a mutation-proven
127
+ fresh-clone consolidated-shape test, not new production code.
128
+ - **`check-unwired-features.mjs`'s Category S4 no longer conflates "genuinely unreachable" with
129
+ "reachable only via coordinator dispatch" (#1239).** Discovery measured 52 raw S4 findings, 46
130
+ of them (88.5%) false positives — modules invoked only through a coordinator `Task`/skill
131
+ dispatch, never a static import. S4 now splits into 5 truly-unreachable findings and 46
132
+ coordinator-invoked findings reported as advisory rather than blocking, with `skills/`
133
+ recognised as a first-class reachability edge source; a same-wave fix-pass tightened the
134
+ coordinator-invoked match to token boundaries (a Codex-repro case where a bare substring match
135
+ over-matched) and dropped the advisory line's WARN severity per `host-resources.md` HR-101.
136
+ The check's exit code is unchanged.
137
+ - **`inspectConfidentialNames()` is a new function; `loadConfidentialNames()` keeps its 4.0.0
138
+ `string[] | null` public contract (#1250).** This session's own Wave-2 refactor had changed
139
+ `loadConfidentialNames()`'s return shape to an object — a semver-breaking change the Wave-4
140
+ review panel and Codex gpt-6-astra both caught before the cut, not after. The fix reinstates
141
+ `loadConfidentialNames()` as a thin wrapper over the richer `inspectConfidentialNames()`. A new
142
+ `'all-dropped'` status (every entry in the confidential-names file invalid) now fails closed
143
+ instead of silently returning an empty list, and the loader's WARN on a missing/malformed file
144
+ is redacted to the file's basename — the same fix-pass had regressed the full path into
145
+ stderr, reopening the class of leak `check-owner-leakage.mjs` exists to prevent; found and
146
+ fixed inside this session's own review cycle, before release.
147
+ - **`loadHostPaths()` no longer loads `owner.yaml` twice (#1251).** Health-check state now
148
+ passes through from the caller's single load instead of triggering a second read.
149
+ - **Four small fixes under #1262: an env-configured standalone confidential-names copy now fails
150
+ closed instead of passing through silently (point 2); `docs/migration-v4.md` gained rollback
151
+ prose (point 3); `OPTIONAL_OBJECT_SECTIONS` is now an exported constant with a parity test,
152
+ replacing a duplicated mirror list (point 4); a stale comment on the full quality-gate path was
153
+ corrected (point 5).** Point 1 (a Codex-surface regeneration check) was dropped — Discovery
154
+ measured the existing set-equality pack test as the stronger pin, so no code change was needed.
155
+ - **`VALID_SESSION_PROFILES` moved to a single source of truth in
156
+ `scripts/lib/session-schema/constants.mjs`, with `SHARED_LIST_BOUNDS`/`INGEST_LIST_BOUNDS`
157
+ parity enforced (#1252).** A re-export shim stayed at the old location for compatibility,
158
+ pinned by an identity test.
159
+ - **Four git-fixture files and the two largest `rmSync` call sites now route through a shared
160
+ tmp-fixture helper instead of ad hoc cleanup; `listRepoFiles()` now swallows only
161
+ `ENOENT`/`ENOTDIR`, not every error (#1253).** This is a partial pass, not a sweep: 501 bare
162
+ **recursive** `rmSync` call sites remain unrouted (574 claimed → 524 measured → 501 after this
163
+ session) and are carried forward as #1268 with a Revisit-Trigger, not silently left
164
+ unmentioned.
165
+ - **`check-skill-links.mjs` now scans `docs/` (previously skill/command files only), takes a
166
+ `dirs` option, and right-anchors its GitLab `-/issues` carve-out (#1258).** The carve-out was
167
+ previously unanchored and could match a URL fragment elsewhere in a line. Two dangling
168
+ documentation links were repaired, both pointing at content that had moved to the vault
169
+ archive.
170
+ - **An unknown or valueless CLI flag on `generate-hook-import-set.mjs` now exits 2 with a usage
171
+ message instead of triggering the write (#1249).** `--out --check` no longer writes a file
172
+ literally named `--check` — the argv loop had read `--check` as `--out`'s value.
173
+ - **A platform allowlist check now uses `Object.hasOwn()` (#1256).** Discovery's companion claim
174
+ in the same issue — that a related export was dead code — was checked against real call sites
175
+ and refuted; that half closes as "working as designed".
176
+ - **Desktop notifications now carry a platform-aware label (#1254).** `detectPlatform()` drives
177
+ the OSC notify text so a Codex CLI session's notification reads differently from a Claude Code
178
+ session's.
179
+ - **A new session-start probe, `telemetry-flush-health`, surfaces telemetry-sender problems that
180
+ were previously silent (#1255).** It tail-reads the last `orchestrator.telemetry.flush` event:
181
+ a `sandbox:*` refusal reason now renders as a WARN banner instead of nothing, and an
182
+ unreadable ledger renders explicitly as `ledger-unreadable` rather than falling through to
183
+ silence. The reason string is bounded to 120 characters with control characters stripped.
184
+ - **The tests:src ratio census now resolves calls made through `fixtureGit`/`fixtureGitSpawn`
185
+ wrappers, including the `NO_BACKGROUND_WRITER` spread pattern, and strips comments before
186
+ reading a wrapped call's second positional argument (#1259).** Applicable call sites rose from
187
+ 17 to 200 (measured 2026-09-07 on the release tree with
188
+ `node scripts/lib/validate/check-test-git-config-target.mjs .`) — the tokenizer previously
189
+ couldn't see wrapper calls at all — and the reporting floor was raised from 20 to 100 to match.
190
+ - **Four tests now pin Node 24's `err.url` behaviour using a real spawned `node` child process,
191
+ not an in-process `vitest` failure (#1260).** An in-process `ERR_MODULE_NOT_FOUND` never
192
+ carries a `url` field, so the previous test could not observe the behaviour it claimed to pin.
193
+ The standalone single-file copy path is confirmed inert / fails closed for the same case.
194
+ - **A Discovery premise was refuted before any code changed (#1257).** `vault-sync`'s
195
+ sub-package dependency pins looked accidental; they are intentional, because CI already
196
+ installs the sub-package separately. Documented in `skills/vault-sync/SKILL.md` §
197
+ Dependencies instead of "fixed".
198
+ - **`release.mjs`'s drift sweep now judges version literals as whole tokens and skips comment
199
+ prose and lockfile dependency rows; its history allowlist admits nine files whose only literal
200
+ is prose history of the 4.0.0 major (`CLAUDE.md`, its generated twin `AGENTS.md`,
201
+ `CONTRIBUTING.md`, `NOTICE`, `.husky/pre-push`, `site/llms-full.txt`,
202
+ `skills/architecture/references/domain-model.md`, `skills/autopilot/SKILL.md`,
203
+ `templates/_shared/journey-manifest.md`).** Measured 2026-09-07 mid-release: `4.0.0` matched
204
+ inside `>=24.0.0` in package.json, 72 third-party rows in package-lock.json, and `// pre-4.0.0`
205
+ comments — none a version surface. The sweep's detail line now carries the total hit count
206
+ instead of truncating at five, which is how the last four files had stayed hidden.
207
+
208
+ ### Notes
209
+
210
+ - **4.0.1 is a PATCH: no public export changed shape.** `loadConfidentialNames()` keeps its
211
+ `string[] | null` contract; the new exports (`inspectConfidentialNames`, `SHARED_LIST_BOUNDS`,
212
+ `INGEST_LIST_BOUNDS`, `OPTIONAL_OBJECT_SECTIONS`, `stripComments`, `wrapperHasCwd`,
213
+ `checkTelemetryFlushHealth`, `renderBanner`, `TAIL_BYTES`, and `VALID_SESSION_PROFILES` in
214
+ `constants.mjs`) are additive. Reviewed by a 4-reviewer panel plus Codex gpt-6-astra on the
215
+ packed tarball; 2 P1 + 3 P2 Codex findings were fixed before the cut, not after.
216
+ - **Visible Codex picker confirmation (#1266) remains an operator step; not a release gate.**
217
+ - **The telemetry ingest server was redeployed for this release (#1261).** Operational step, not
218
+ a code change — rollback tag `telemetry-ingest:1.0.0-pre401` kept in place; health confirmed
219
+ post-restart.
220
+
10
221
  ## [4.0.0] - 2026-09-06
11
222
 
12
223
  > **A MAJOR, because public surfaces are REMOVED** (see *Removed (BREAKING)* below).
@@ -978,7 +1189,8 @@ manual cleanup steps: [`docs/migration-v4.md`](docs/migration-v4.md).
978
1189
  `npm pack --dry-run`, not a mock). The release leakage gate's `.orchestrator/`
979
1190
  exclusion is narrowed to carve THIS directory back IN (`scripts/release.mjs`
980
1191
  around line 319) — the operator's own `metrics/`, `debug/` artefacts and live
981
- `*.lock` files stay excluded; only the tracked policy floor ships. **The
1192
+ `*.lock` files stay excluded. `files[]` admits the directory, not a file list — what
1193
+ keeps the shipped set equal to the TRACKED policy set is the packlist test below, not npm. **The
982
1194
  Wave-4 review panel found this test asserted only a FLOOR (≥ 6 files) while
983
1195
  `package.json`'s `files[]` admits the WHOLE `.orchestrator/policy/` directory
984
1196
  and the carve-out above matched the path anywhere in the string, not just at