Skip to content

Develop - #10

Open
amasiye wants to merge 32 commits into
mainfrom
develop
Open

amasiye wants to merge 32 commits into
mainfrom
develop

Conversation

@amasiye

@amasiye amasiye commented Sep 24, 2026 •

Copy link
Copy Markdown
Contributor

This pull request introduces several important enhancements and fixes related to actor identity migration, validation, and project scaffolding, along with improved error messaging and new test fixtures. The most significant update is the addition of the --migrate-actor-ids option to the validate command, enabling interactive and non-interactive migration of missing actor IDs and repair of legacy references. Additional improvements include more informative error handling for renderer manifest issues and updates to project scaffolding to explicitly assign actor IDs.

Actor Identity Migration and Validation:

  • Added the --migrate-actor-ids option to the validate command, enabling both interactive and non-interactive migration of missing actor IDs and repair of legacy actor references. The command now reports pending migrations, prompts interactively when appropriate, and applies migrations with improved error handling and reporting. (src/Commands/ValidateCommand.php, README.md) [1] [2] [3] [4] [5]
  • Updated test scripts in composer.json to include new validation and migration tests. (composer.json)

Project Scaffolding and Actor Data:

  • Project scaffolding now assigns explicit actor IDs when generating new projects and actors, ensuring consistency and forward compatibility with actor identity migration. (src/Support/NewProjectScaffolder.php, src/Commands/GenerateActorCommand.php) [1] [2] [3] [4]

Renderer Manifest Error Handling:

  • Improved error messages and remedies for various renderer manifest validation failures, including unreadable files, invalid JSON, schema mismatches, and unsafe executable paths. A new helper method provides consistent exception formatting. (src/Support/RendererPackageInstaller.php) [1] [2]

Test Fixtures:

  • Added a complete released-console-0.5.0-project test fixture, including .gitignore, actor, system, and data files, to support compatibility and migration testing. (tests/fixtures/released-console-0.5.0-project/) [1] [2] [3] [4] [5] [6]

These changes collectively improve the reliability and maintainability of actor identity management, enhance user feedback during validation and installation, and provide a stronger foundation for future migrations and project upgrades.

Git workflow governance

This update removes direct-main publishing allowances in repositories where Andrew created develop, and removes universal workflow wording that imposed it on repositories without that branch. It installs mirrored agent/Claude/Copilot instructions, a workflow policy, PR template, and portable Git guards. Remote working branch publication, branch deletion and history rewriting retain their explicit permission requirements. .github, docs, and demo-repository have no remote develop and are excluded; no branches were created there.

The local guards reject commits/merge commits and pushes to main. The push guard accepts only authorized fast-forward updates from local develop to existing remote develop; it does not grant publishing permission. Existing hooks and work are preserved. Local hooks can be bypassed by APIs or direct ref operations, so they are one layer alongside repository instructions and available server enforcement.

Validation: 42 guard/installer checks in real temporary Git repositories and bare destinations; five PR source-validator cases; shell syntax and governance whitespace checks. No gameplay, asset or dependency changes are in the governance commits; Linux/native gameplay suites were not run. This develop-to-main PR also includes earlier queued work, which must be reviewed separately.

The trusted pull_request_target source validator does not check out or execute PR code. It must first reach main through this PR before its status can be required. Main update and PR/history rules are active on the four public participating repositories: engine, editor, console and gpui-renderer. Private branch rules are unavailable on the current Free organization plan. No direct-main push, history rewriting, branch deletion, tag or release occurred.

Governance/develop head: e5f71fc208da4ecce32c5f4578d125f3b38dfe52.

Declare stable actor ids, reference them in starter parties, and offer source-preserving legacy migration during validation. Ignore private player settings in new projects and cover silent real-game startup.
Exercise the generated Console 0.5.0 project through muted New Game startup before and after explicit, source-preserving migration. Preserve the released fixture bytes and note the required future Editor dependency.
Remove automatic actor-migration planning from ordinary interactive validation when no missing actor ID or unresolved actor reference exists. Keep explicit migration and confirmed repairs for legacy references; exercise the real title alert on a released 0.5.0 project.
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 24, 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-09-24T01:28:08.971930Z a166d82 PR opened
ℹ️ 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: a166d82257

ℹ️ 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".


try {
$workspace = ProjectWorkspace::fromProject($workingDirectory);
$pendingActors = ActorIdentityMigration::getPendingActors($workspace->actorDatabase);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Require the Editor version that provides actor migration

In a normal checkout, including the CI workflow's locked composer install, composer.lock installs ichiloto/editor 0.5.1, while this commit's README explicitly notes that this version does not contain ActorIdentityMigration. Consequently every validate invocation reaches this call, catches the resulting class-not-found error as “The project could not be read,” and exits with failure before running ProjectValidator; the newly added Composer tests that invoke validation will fail as well. Update and lock the Editor dependency to a release containing these APIs, or retain a compatible fallback until that release exists.

Useful? React with 👍 / 👎.

Remove play refusal to launch when renderer preparation fails. Check declared source fingerprints without building, offer update, continue, or skip, and add renderer:update for requested builds. Reuse verified package installation and preserve the previous payload on failed builds.
… chain

ichiloto.json records "format"; a project without one is format 0. Each
format is one step class implementing ProjectUpgradeStepInterface (target
version, a plan with one human line per pending change, and apply
producing a report). The chain runs every step from the project's format
to its target in order and records the new format after each step. A
later format adds a step and never edits an earlier one.

The existing save metadata upgrade becomes step 1, SaveMetadataStep, with
unchanged behaviour and the --id option. LegacyProjectUpgrader is removed;
its logic moved into SaveMetadataStep.

The command needs no arguments. It lists each pending step's changes and
asks to continue; --dry-run changes nothing; in a Git working tree it
refuses to run over uncommitted changes unless --allow-dirty is given; it
prints the follow-up items and writes them to ichiloto-upgrade-report.md.
An up-to-date project reports that nothing is needed.

BREAKING CHANGE: without a terminal, ichiloto upgrade now changes nothing
unless --yes is given; it previously wrote the metadata immediately. Its
old output lines are replaced by the plan and the report.
Format 2 makes a map cell two terminal columns wide. The step regroups
every map layer and event layer by rewriting only the nowdoc body, never
evaluating it: an odd-width row gains a trailing space and a two-column
glyph starting halfway through a cell gets a space before it, then the
result must read back through MapLayer::parseGrid. Field x coordinates
are halved at their integer literal tokens (NPCs and wander areas,
triggers, event spawn points and scripts, common events, cinematic cast,
waypoints and finalizers, the new game start), classified from the
engine's command schema, subject kinds, movement route shapes and the
fields the loaders read; horizontal move route steps are halved and
listed. Retired tiles2d crops are removed and TwoColumnCellsMigration is
appended to the save compatibility chain in the manifest's own source.

The report lists event cells with two markers and layers that no longer
line up, then compares reachability instead of listing every cell that
became solid: walkable ground is flood-filled from each map's entry
points over the old per-column and the new per-cell collision, and event
areas, NPCs, transfer triggers and arrivals that are no longer reached
are named, with each cut-off region, a representative cell and the cell
that most likely closed it. Anything it cannot identify is reported
rather than guessed.
New projects record the current project format. The starter map and the
generate:map default are whole two-column cells with `##` walls, their
event layers are rows of blank cells, and the new game starts in cell 2,
the cell holding the old column 4. MapScaffolder refuses a row that ends
halfway through a cell before creating anything.

The startup test upgrades each copy of the released 0.5.0 project (and
the optional EpicQuest copy) before starting it, as an author would; the
released fixture itself is unchanged.
Both commands ask the engine (ProjectFormat::assertSupported) whether it
reads the project's recorded format and, when it does not, print the
engine's own explanation, which points to `ichiloto upgrade`, and exit
before launching the game or reading its data. Play fixtures in the
renderer tests now record the current format.

This narrows both commands: play no longer launches, and validate no
longer checks, a project whose format differs from the engine's until it
is upgraded.
Two-column map cells changed how the terminal plays, so project format 2
is withdrawn. Reverted: 18beccf (TwoColumnCellsStep, src/Upgrade/TwoColumnCells,
its fixtures and tests) and the map content of 8d3c965.

Removed: the format 2 upgrade step and its report sections, the
two-column starter map and generate:map default, blank-cell event layers
and MapScaffolder's refusal of a row ending halfway through a cell.

Kept: the numbered format chain with SaveMetadataStep as format 1, play and
validate refusing a project whose format differs from the engine's, and
new projects recording the engine's current format (1). Scaffolded maps
are 48 one-column cells wide with a spawn at x 4 again.

BREAKING CHANGE: ichiloto upgrade no longer converts to two-column cells,
and a project recording format 2 is refused as newer than the engine.
generate:map takes --kind, one of the project's tilesets in
assets/Data/Tilesets, and writes it into the new map's data as its tileset.
When it is omitted it asks for the kind interactively and fails without
writing anything non-interactively; a kind the project does not have is
refused. A project without tilesets still gets a map without a kind, and the
output says so.

Changed behaviour: in a project with tilesets, a non-interactive
generate:map without --kind now fails instead of creating the map.
The Console tracks the Editor's develop branch, and through it the Engine's,
from Packagist until the 0.6 release, with minimum-stability dev and
prefer-stable, as the Game does. generate:map --kind needs the Engine's
tilesets, which the released 0.5 Engine lacks. The lock resolves the Editor
at 61ca458 and the Engine at 2e32b6f.

Before the 0.6 release, set the Editor constraint back to a tagged version.
ichiloto battle takes --renderer and --gpui-renderer, or asks, through the
same renderer selector as play, offers a renderer update the same way, and
hands the choice to the arena through ICHILOTO_RENDERER, restoring the
caller's value afterwards. A renderer with --runs is refused, since a
simulation draws nothing.

The renderer update offer moves out of play into RendererUpdateOffer, so
both commands share it.
ichiloto battle takes one --member per party member (up to four), as
Actor[:level][,Slot=item...], with actors and items by id or name; without
it the party is the starting party. The setup is the engine's battle test
setup, used for playing and for --runs alike: playing hands it to the arena,
which builds a fresh party from it for every fight, and --runs builds its
party from it. Anything the party cannot be built from (an unknown actor or
item, a bad level, a slot the actor lacks, equipment that does not fit) is
refused before any battle starts, every problem named.

Removed: the console's own starting-party builder, which loaded actor files
by name and bypassed the engine's actor identity resolution; the engine's
setup replaces it. Also removed the README note calling ichiloto battle a
placeholder, which was no longer true. A project whose engine has no battle
test setup is told to update its engine.
There was no way to test a command, skill or summon before the game made
it available. --member now takes Commands=, Skills= and Summons=, each a
list separated by |: Commands replaces the member's command menu, by
command id or the label the project shows for it; Skills grants abilities
or spells from the project's skill catalogue; Summons grants summons by
id. They resolve through the Engine's own command types, skill catalogue
and summon library, and every unknown reference is named before a battle
starts. The keys never become equipment slots.

They reach the Engine's battle test setup for both playing and --runs. A
project engine that cannot take them says so instead of ignoring them.
…ry problem

--runs simulates with every battler attacking, so a member's Commands,
Skills and Summons would never be used and its numbers would pretend
otherwise. A simulation with a loadout is now refused, explaining that
playing the fight uses them; levels and equipment still simulate. This
narrows the previous commit, which passed loadouts to --runs.

A member whose loadout does not resolve is no longer built, so every
unknown command, skill and summon is reported together instead of the
first empty list stopping the setup. The README example gives Ifrit to
Kaelion, who may hold it.

Tests cover the loadout reaching the setup by id and label, every unknown
reference named, an ineligible summon holder refused by the Engine, and
the --runs refusal.
`ichiloto edit --gui` launches the native editor window with this console's
hidden `edit:host` as the session host it edits through (the Editor's
SessionHost over standard input and output). The terminal editor is
unchanged and remains the default.

- GuiEditorLocator finds the executable without building or downloading it:
  ICHILOTO_GUI_EDITOR, else a release then a debug build in the gui-editor
  checkout beside the console; otherwise it says how to build it.
- EditorProjectBootstrap owns preparing a process to edit a project (the
  engine and the project's PSR-4 classes); EditCommand's private bootstrap
  helpers moved there so both interfaces prepare it one way.
EditorProjectBootstrap sets ICHILOTO_CONSOLE_BIN to this console unless the author named one, so both the terminal and the graphical editor play test through the console that opened them rather than another found in the project or on the PATH.
New projects author enemies one record per file in assets/Data/Enemies,
so enemies.php returns what EnemyCatalog loads from there instead of an
empty list that would never include them.
…p loads

A new project's skills.php is the barrel over assets/Data/Skills, as enemies.php is over Enemies; abilities.php and magic.php are no longer written. The battle test fixture authors its skills as records.
The key is checked against the battle presentation's arenas, naming them when it is unknown. --runs and the terminal renderer refuse an arena they would not draw.
On macOS the locator prefers gui-editor/build/macos/Ichiloto.app, whose executable links to the release build, before the bare release and debug builds.
Last Legend's Ifrit is now Djin, so the help and README examples name djin.
The help example's member is Kaelion, since Liora never summons.
Without --member, ichiloto battle sets up the battle test its project keeps
in system data (the Engine's ProjectBattleTest: its party, else the starting
party, and its arena). --member replaces only the party and --arena only
the arena. A malformed project battle test is refused with its problems.
Engines without ProjectBattleTest keep the starting party.
Remove application of the develop-to-main restriction to repositories without an Andrew-created develop branch. Leave those repositories outside this remediation and do not infer authority to create develop or publish main.

Preserve existing-develop integration, explicit branch-publication permissions, branch preservation, history safeguards, and current repository guards.
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