Skip to content

Commit 1c5f2ac

Browse files
committed
Bump Codex package to 0.4.7
1 parent c8e5a4f commit 1c5f2ac

20 files changed

Lines changed: 435 additions & 17 deletions

File tree

.agents/skills/resume-from-handoff/SKILL.md

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ Read these in order. The handoff is the source of truth.
6363

6464
If the user passed a focus area, bias the worklist toward it, but still surface
6565
the handoff's own recommended Next Action and the vertical-slice forcing
66-
function.
66+
function. A focus argument biases ranking; it does not select a lane.
6767

6868
## Step 2: Apply The Vertical-Slice Forcing Function
6969

@@ -162,6 +162,11 @@ Reporting integrity: this skill runs no measurements by default, so it has no
162162
verified numbers of its own unless you actually produced them in this turn.
163163
Report handoff figures as claims, not as facts you observed.
164164

165+
FIRST verification cannot be waived by choosing another lane. Run any required
166+
read-only FIRST check before selection when project instructions authorize it.
167+
Otherwise put that check at the front of every affected lane and do not enter
168+
the selected workflow until the check clears or is reported blocked.
169+
165170
## Step 6: Write The Session Cache
166171

167172
Write `production/session-state/active.md` with the current session routing
@@ -245,11 +250,27 @@ Before you start - check / honor first:
245250
- <owed verification or gate>
246251
```
247252

248-
If one lane is clearly valid, state it as the recommended next action and give
249-
the exact starting command. If multiple lanes are genuinely viable, use a
250-
compact numbered prompt with exactly one `(Recommended)` item, or
251-
`request_user_input` when available. Do not end with an unstructured "what do you
252-
want to do?" line.
253+
The briefing ends at a selection boundary. Never start an unselected lane.
254+
255+
- If multiple lanes are genuinely viable, use `request_user_input` when
256+
available, with the recommendation as the first option. Keep the choices
257+
compact, preserve exactly one recommendation, and wait for the user's
258+
selection. If structured input is unavailable, use the same ordered lanes in
259+
a numbered prompt and wait for the numeric reply.
260+
- If exactly one lane is valid, present the numeric fallback:
261+
`Next action:` then `1. (Recommended) [action label] - [reason / command]`.
262+
Even for this single option, wait for the user to reply `1`; do not start it
263+
automatically.
264+
265+
Resume selection authorizes entering only the selected workflow. It does not
266+
authorize that workflow's writes, builds, boot smoke, mutating `gh`, commits,
267+
pushes, branch changes, design decisions, game-feel decisions, balance
268+
decisions, or any other mutation beyond approvals already declared by that
269+
workflow. A Follow-up fork inside the selected workflow is a new decision:
270+
use `request_user_input` when available, otherwise use a compact numbered or
271+
lettered prompt, and wait again.
272+
273+
Do not end with an unstructured "what do you want to do?" line.
253274

254275
Do not point the user back to `$resume-from-handoff` after work completes. Later
255276
closeouts should read or refresh the saved `## Session Worklist` in `active.md`.
@@ -263,8 +284,11 @@ closeouts should read or refresh the saved `## Session Worklist` in `active.md`.
263284
invoked `$resume-from-handoff`.
264285
- Use `request_user_input`, not a free-text prompt, for true multi-lane choices
265286
when the tool is available.
266-
- Never jump to work the user did not select unless there is one obvious next
267-
step and the invoked workflow already authorizes it.
287+
- Never start an unselected lane. A single obvious lane still waits for the
288+
user's numeric `1` selection.
289+
- Treat later workflow forks as new structured decisions; the resume choice
290+
does not pre-answer them.
291+
- FIRST verification remains mandatory regardless of lane choice.
268292
- Make one primary recommendation. The user should leave knowing the top thing
269293
to do, with the rest as a ranked menu.
270294
- The vertical-slice forcing function overrides doc-track drift.
@@ -273,6 +297,7 @@ closeouts should read or refresh the saved `## Session Worklist` in `active.md`.
273297
## What This Skill Does Not Do
274298

275299
- Does not write anything except `production/session-state/active.md`.
300+
- Does not start follow-on work before the user selects a lane.
276301
- Does not commit or push; that is `$handoff`.
277302
- Does not perform a full artifact gap audit; that is `$project-stage-detect`.
278303
- Does not replace reading the handoff; it operationalizes the canonical handoff

.codex/README.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,14 @@ Current package version:
1212
explicit publish operations.
1313

1414
Current status:
15-
- The package version is `v0.3.0`.
15+
- The package version is `v0.4.7`.
16+
- `v0.4.7` hardens resume lane selection, validates Codex-native optional
17+
`gen-asset` cores and ACTIVE/STUB profiles, and keeps that project-local skill
18+
trackable without adding it to package ownership.
19+
- Release validation rejects stale package-version summaries in the root and
20+
runtime README files.
21+
- `v0.4.6` restored the in-session two-round `$handoff` review gate without
22+
nested CLI, subagent-review, companion, or external-model fallbacks.
1623
- `v0.2.0` added release versioning, release validation, schema-2 install
1724
state, and default patch-aware installs.
1825
- `v0.3.0` documents the latest root workflow alignment and the hook parser fix
@@ -25,6 +32,9 @@ Coexistence rules:
2532
- Do not write to `.claude/`.
2633
- Do not require or modify `CLAUDE.md`.
2734
- Keep neutral game project state such as `production/`, `design/`, `docs/architecture/`, `docs/engine-reference/`, `src/`, `tests/`, and `prototypes/` shared.
35+
- Keep optional `.agents/skills/gen-asset/**` content project-owned; the
36+
installer only makes that subtree trackable and never adds it to the package
37+
manifest.
2838

2939
Install and release notes:
3040
- Fresh targets and old install-state schemas receive a full install.

.codex/VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.4.6
1+
0.4.7

.codex/docs/COEXISTENCE.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ Rules:
1111
- Workflow-created shared folders such as `assets/`, `tests/`, `tools/`, and
1212
`prototypes/` are created lazily when needed.
1313
- Package ownership is tracked in `.codex/manifest/installed-files.json`.
14+
- The optional `.agents/skills/gen-asset/**` subtree is project-owned. The
15+
installer allowlists it so its core and profiles are trackable, but it is
16+
deliberately absent from `installed-files.json`; install and uninstall never
17+
copy, replace, own, or delete it.
1418
- Each target install writes `.codex/manifest/install-state.json` with schema
1519
version, installed CCGS version, package commit, timestamp, patch mode, file
1620
hashes, marker-block hashes, detected coexistence mode, Claude guardrail
@@ -35,6 +39,12 @@ Rules:
3539
- Uninstall removes only package-owned files, CCGS marker blocks, and CCGS
3640
migration blocks.
3741

42+
For a project that already has Claude-side `gen-asset` profiles, migrate only
43+
after reviewing the target inventory: create the Codex-native core under
44+
`.agents/skills/gen-asset/SKILL.md`, copy project-owned profiles byte-for-byte
45+
from `.claude/skills/gen-asset/profiles/`, and keep the Codex runtime independent
46+
of `.claude/**`. CCGS does not perform this project-specific migration itself.
47+
3848
Install detects three modes:
3949

4050
- `codex_only`: no Claude guardrail runtime is detected. Install writes the full

.codex/docs/MIGRATION.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,21 @@ This port maps upstream workflows to Codex-native surfaces:
1111
- Hooks live under `.codex/hooks/*.sh` and are wired by `.codex/hooks.json`.
1212
- Command policy lives in `.codex/rules/settings.rules`.
1313

14+
Optional project-local skills are migrated separately from the CCGS package.
15+
For `gen-asset`, place the Codex-native direct-image-generation core at
16+
`.agents/skills/gen-asset/SKILL.md` and copy the project's profile files
17+
byte-for-byte from `.claude/skills/gen-asset/profiles/` only when the project
18+
owner approves that migration. The installed runtime must not read or modify
19+
the Claude-side copy. The `.agents/skills/gen-asset/**` subtree remains outside
20+
`.codex/manifest/installed-files.json`, so CCGS install and uninstall do not own
21+
it.
22+
1423
Partial parity gaps are intentional:
1524

1625
- Built-in footer items are represented by `[tui].status_line`; the upstream scripted Stage/session footer is blocked until Codex exposes a documented project custom footer item, with `studio-status-on-start.sh` and `$studio-status` as startup/on-demand fallbacks.
1726
- Structured choice prompts are written as numbered natural-language choices.
1827
- Role delegation is written as Codex subagent delegation by upstream role name.
1928
- Per-agent tool fences, max-turns, and worktree isolation are preserved as explicit instructions and policy checks rather than unsupported TOML fields.
29+
- Image generation extensions invoke Codex's built-in `image_gen` capability
30+
directly. Nested `codex exec`, session-ID parsing, CLI/API fallbacks, and
31+
legacy `.Codex/` skill paths are not part of the Codex-native contract.

.codex/docs/VALIDATION.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,17 @@ Validator policy:
3333
commits against the actual previous release tag ref, not mutable GitHub
3434
Release branch metadata.
3535
- Runtime files must not depend on Claude-owned paths.
36+
- `$resume-from-handoff` validation enforces the lane-selection pause, FIRST
37+
verification, structured follow-up forks, dynamic slice pointer, stage/catalog
38+
guards, and one-file session-cache boundary.
39+
- If an optional project-local `$gen-asset` skill exists, validation rejects
40+
nested Codex CLI generation, legacy runtime paths, API/CLI fallbacks, and
41+
unbounded newest-image discovery. ACTIVE profiles require the full semantic
42+
schema; minimal STUB profiles remain valid refusal markers.
43+
- Coexistence validation requires `.agents/skills/gen-asset/**` to stay
44+
trackable while remaining absent from package ownership.
45+
- Release validation requires the root and `.codex` README version summaries
46+
to match `.codex/VERSION`.
3647
- Generated skills must not retain raw structured-choice tool names, raw Claude task-delegation syntax, unsupported frontmatter, or bare custom slash commands.
3748
- Generated agents must not use unsupported top-level fields such as `tools`, `disallowedTools`, `maxTurns`, `memory`, `skills`, or `isolation`.
3849
- Hooks must not include a `Notification` event.

.codex/docs/session-continuity.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,23 @@ On resume:
8282
4. Verify drift-prone claims cheaply before acting on them.
8383
5. Continue from the saved `## Session Worklist` unless there is a real
8484
inconsistency.
85+
6. Stop at lane selection. A focus argument changes ranking but does not select
86+
work. For multiple viable lanes, use `request_user_input` when available and
87+
put the recommendation first. For one valid lane, show the numeric
88+
`Next action:` fallback and wait for `1`. Never start an unselected lane.
89+
7. Treat FIRST verification as mandatory across every lane, and treat each
90+
follow-up workflow fork as a new structured decision. Resume selection
91+
authorizes entering the selected workflow only; it grants no additional
92+
mutation authority.
93+
94+
## Optional Asset-Generation Continuity
95+
96+
When a project provides `$gen-asset`, explicit invocation authorizes built-in
97+
generation and scratch writes only under `tmp/gen-asset/**`. Preserve one
98+
contact-sheet gate containing candidate verdicts, exact final paths, overwrite
99+
warnings, and the adapter command. Approval authorizes only those listed final
100+
paths and that adapter command; dependency installation, unrelated writes, and
101+
placement before approval remain outside the invocation.
85102

86103
## Context Thresholds
87104

.codex/docs/skills-reference.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
77 core skills organized by phase. Invoke them from Codex with the `$skill-name` form when available.
44

5+
Projects may also provide optional local extensions. They are not part of the
6+
77 shipped skills and remain owned by the game project rather than CCGS.
7+
58
## Onboarding & Navigation
69

710
| Command | Purpose |
@@ -35,6 +38,17 @@
3538
| `$asset-spec` | Generate per-asset visual specifications and AI generation prompts from GDDs, level docs, or character profiles |
3639
| `$asset-audit` | Audit assets for naming conventions, file size budgets, and pipeline compliance |
3740

41+
Optional project-local extension:
42+
43+
| Command | Purpose |
44+
|---------|---------|
45+
| `$gen-asset` | Generate profiled raster candidates with built-in image generation, stage them under `tmp/gen-asset/**`, and wait for one contact-sheet approval before placement |
46+
47+
CCGS validates a present `.agents/skills/gen-asset/` core and its profiles but
48+
does not ship, install, uninstall, or count it among the 77 core skills. ACTIVE
49+
profiles must define the full generation/placement schema; minimal STUB
50+
profiles are valid and refuse generation.
51+
3852
## UX & Interface Design
3953

4054
| Command | Purpose |

.codex/lib/install.sh

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,8 +340,15 @@ ccgs_deploy_paths() {
340340
fi
341341
}
342342

343+
ccgs_project_owned_allowlist_paths() {
344+
# Sentinel only: this makes the optional project-local subtree trackable.
345+
# It is deliberately absent from deploy paths and installed-files ownership.
346+
printf '%s\n' ".agents/skills/gen-asset/SKILL.md"
347+
}
348+
343349
ccgs_gitignore_allowlist_paths() {
344350
ccgs_deploy_paths
351+
ccgs_project_owned_allowlist_paths
345352
printf '%s\n' "$ccgs_install_state_rel"
346353
}
347354

@@ -369,6 +376,10 @@ shared_content_roots = {
369376
"tools",
370377
}
371378
379+
project_owned_roots = {
380+
".agents/skills/gen-asset",
381+
}
382+
372383
def is_shared_content_path(path: str) -> bool:
373384
return path.split("/", 1)[0] in shared_content_roots
374385
@@ -389,7 +400,7 @@ for raw in Path(sys.argv[1]).read_text(encoding="utf-8").splitlines():
389400
390401
def emit_dir(path: str) -> None:
391402
print("!" + escape(path) + "/")
392-
if not is_shared_content_path(path):
403+
if not is_shared_content_path(path) and path not in project_owned_roots:
393404
print(escape(path) + "/*")
394405
for child in sorted(children.get(path, ())):
395406
emit_dir(child)

.codex/lib/validate_install.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ def validate_gitignore_allowlist(root: Path, errors: list[str]) -> None:
5757
for required in (
5858
".codex/*",
5959
".agents/*",
60+
"!.agents/skills/gen-asset/",
6061
"!design/registry/entities.yaml",
6162
"!docs/WORKFLOW-GUIDE.md",
6263
"!production/session-state/.gitkeep",
@@ -65,6 +66,9 @@ def validate_gitignore_allowlist(root: Path, errors: list[str]) -> None:
6566
if required not in lines:
6667
errors.append(f"gitignore allowlist missing expected pattern: {required}")
6768

69+
if ".agents/skills/gen-asset/*" in lines:
70+
errors.append("gitignore allowlist must keep project-local gen-asset descendants trackable")
71+
6872

6973
def main() -> int:
7074
parser = argparse.ArgumentParser()
@@ -116,6 +120,8 @@ def main() -> int:
116120
seen.add(path)
117121
if path.startswith(".claude/") or path == "CLAUDE.md" or "/.claude/" in path or path.endswith("/CLAUDE.md"):
118122
errors.append(f"installed-files must not own Claude path {path}")
123+
if path == ".agents/skills/gen-asset" or path.startswith(".agents/skills/gen-asset/"):
124+
errors.append(f"installed-files must not own project-local gen-asset path {path}")
119125
if not (root / path).exists():
120126
errors.append(f"installed-files path missing on disk: {path}")
121127
validate_gitignore_allowlist(root, errors)

0 commit comments

Comments
 (0)