Skip to content

feat(id): wire id world fork CLI + provenance inspect (F12.2 remainder) (#556) - #3291

Merged
dezren39 merged 2 commits into
mainfrom
queue/4824-556-world-fork-cli
Nov 1, 2026
Merged

dezren39 merged 2 commits into
mainfrom
queue/4824-556-world-fork-cli

Conversation

@dezren39

@dezren39 dezren39 commented Nov 1, 2026 •

Copy link
Copy Markdown
Member

What

Wires the F12.2 store-level world fork into the CLI — the remainder from triage task 2141 on #556 (store layer landed in 8a84035; WorldCommand had no Fork variant, so forking/templates were library-only). Queue task 4824.

  • id world fork <SOURCE_DIR> <DIR> [--name ID] [--template] [--json] — local, like world new/doctor. Destination must be absent or empty (the New guard). The new world id defaults to the destination directory's name (the id a host serving .id-worlds/<name> opens it under) and is validated with validate_world_name; the source world id is read from its journal Created header, so the origin can't be misnamed. Calls world_store::fork_world unchanged, then reads back and prints the recorded provenance.
  • id world provenance <DIR> [--json] — the inspect surface for local durable worlds: prints the journal's Created id plus the Forked entry (origin, module hash at fork point, template flag, fork sequence). Scope note: no local inspect surface existed and host world list returns name/open only (reading journals there would be a protocol change), so this is the smallest honest wiring that makes a template fork identifiable.

world_store::fork_world behaviour is untouched.

Tests

New pkgs/id/tests/world_fork_cli.rs runs the real binary:

  • CLI fork creates a world whose journal opens and WorldCore::restores under the new id, with the parent's program (module hash + seed) restored; provenance output reports origin/hash/sequence.
  • F11.11 pin: the forked directory contains only journal.jsonl + modules/, even when the source world holds a seed.secret file — journal state only, nothing else inherited.
  • --template is recorded in the fork's provenance and identifiable afterwards via id world provenance; a never-forked world reports no origin.
  • A non-empty destination and an invalid world name are refused.

Verified on the laptop: cargo test --test world_fork_cli 4/4, --test world_fork 4/4 (existing store suite), --lib cli:: 112/112; rustfmt --check clean on the touched files. (Local clippy is blocked by a laptop rustc version mismatch — 1.99 clippy vs 1.98.1 artifacts — CI covers it.)

Refs #556


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.

WorldCommand::Fork wires the store-level fork_world into the CLI:
source world directory, destination directory (absent-or-empty guard,
New pattern), --name for the new world id (default: destination dir
name, validated with validate_world_name, matching how a host opens
.id-worlds/<name>), and --template setting ForkSpec.template. The
source world id is read from its journal Created header, so callers
cannot misname the origin; fork_world itself is unchanged.

WorldCommand::Provenance is the inspect surface for local durable
worlds: it reads a world directory journal and prints its Created id
plus the Forked entry (origin, module hash, template flag, fork
sequence), in text or --json. No local inspect surface existed and
host list returns name/open only, so template forks are now
identifiable through this.

Tests (tests/world_fork_cli.rs, runs the real binary): CLI fork
creates a world whose journal opens and restores under the new id
with the parent program (module hash + seed); the forked directory
contains only journal.jsonl + modules/ even when the source holds a
seed.secret (F11.11 pin); --template is recorded and identifiable via
provenance, and a never-forked world reports no origin; a non-empty
destination and an invalid world name are refused.

Verified on laptop: cargo test --test world_fork_cli 4/4, --test
world_fork 4/4, --lib cli:: 112/112; rustfmt clean.

Refs #556
@dezren39
dezren39 requested a review from a team as a code owner November 1, 2026 01:58
@coderabbitai

coderabbitai Bot commented Nov 1, 2026 •

Copy link
Copy Markdown

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 13 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

Learn how review limits work.

Review configuration:

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 48dac3c5-8be4-4ed2-b120-8e59af368d30
Commits

Reviewing files that changed from the base of the PR and between cf1b243 and c8c1737.

Files selected for processing: 3
  • pkgs/id/src/cli.rs
  • pkgs/id/src/commands/world.rs
  • pkgs/id/tests/world_fork_cli.rs
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Nov 1, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-11-01T02:05:13.224684Z c8c1737 New commits
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: d7385168f3

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread pkgs/id/src/commands/world.rs Resolved
Comment thread pkgs/id/src/commands/world.rs Resolved
…tail entries

Codex review on the fork CLI (PR for #556): (1) world_provenance used
find_map over the journal, returning the OLDEST Forked entry — in an
A->B->C chain C reported A (and Bs template flag) as its origin; now
scans in reverse so the worlds own fork record wins. (2)
read_world_journal accepted an unterminated final entry when it
happened to parse; FileJournal::open and the store fork reader drop
every unterminated fragment as never-acknowledged, so the inspect
reader now pops the final chunk before parsing when the file does not
end in a newline.

Regression tests: chained fork provenance reports the immediate
origin + own template flag; a complete-JSON but unterminated Forked
line is not reported by provenance.
@dezren39
dezren39 merged commit b56ccda into main Nov 1, 2026
1 check passed
@dezren39
dezren39 deleted the queue/4824-556-world-fork-cli branch November 1, 2026 02:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant