Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
388 commits
Select commit Hold shift + click to select a range
57e21b1
feat(cutscenes): author effect cadence and preview battle-paced effects
amasiye Oct 4, 2026
9c65495
fix(actors): repair every actor keyed presentation reference
amasiye Oct 4, 2026
ebbde3c
fix(actors): repair battle scale actor references
amasiye Oct 4, 2026
419774f
feat(session): draw wall shadows in the map world
amasiye Oct 4, 2026
06dc344
fix(session): send wall shadows only to a client that asks
amasiye Oct 4, 2026
0d5960d
feat(cutscenes): author a battle image's attachment and pivot
amasiye Oct 4, 2026
e694dc2
chore(merge): bring each actor's attack style authoring into develop
amasiye Oct 4, 2026
834ff58
chore(merge): bring equipment type icons as the shown icon into develop
amasiye Oct 4, 2026
ab2dd9c
fix(session): keep a read-only row's key
amasiye Oct 4, 2026
b70bc61
feat(maps): choose a map's region from the project's region names
amasiye Oct 4, 2026
00bbf3d
feat(database): save plain data files by editing their own source
amasiye Oct 4, 2026
204bbbf
feat(session): read a troop's graphical formation for arranging
amasiye Oct 4, 2026
a152ac5
refactor(database): edit animations through the shared record schema
amasiye Oct 4, 2026
f90bf11
feat(session): compose a troop formation through the Engine's layout
amasiye Oct 4, 2026
a0c6d7a
fix(database): keep numeric ids and one-record members unique on add …
amasiye Oct 4, 2026
cb1881e
fix(database): let comments block only a save that rewrites the file
amasiye Oct 4, 2026
425e725
feat(database): edit enemies as one data record per file
amasiye Oct 4, 2026
da5fde1
feat(session): preview an enemy as its terminal sprite and at battle …
amasiye Oct 4, 2026
5b7ed95
docs(roadmap): plan database completion across the terminal and GUI e…
amasiye Oct 4, 2026
4d2811e
refactor(database): edit classes through the shared record service
amasiye Oct 4, 2026
d056d55
fix(editor): list numbered records by number and name in the terminal
amasiye Oct 4, 2026
dc88ede
refactor(database): edit quests through the shared record service
amasiye Oct 4, 2026
b2f9cc3
feat(actors): choose the basic skill an actor attacks with
amasiye Oct 4, 2026
0086b85
refactor(database): edit System and Configuration through the shared …
amasiye Oct 4, 2026
fe9cc79
feat(database): edit actors in both editors through one actor service
amasiye Oct 4, 2026
44cf924
feat(database): author enemy drops and validate every record's refere…
amasiye Oct 4, 2026
3e28ea2
feat(database): edit the project's elements in Types, where the game …
amasiye Oct 4, 2026
eef3da8
feat(database): edit skills as one record per numbered file in both e…
amasiye Oct 4, 2026
aea440d
refactor(database): build the summaries beside a record once for both…
amasiye Oct 4, 2026
370e4c9
docs(manual): state each Database category's coverage in the GUI editor
amasiye Oct 4, 2026
ee4ab9a
feat(database): edit tilesets in both editors
amasiye Oct 4, 2026
b55dfd2
feat(database): edit items, weapons and armors as one record per file
amasiye Oct 4, 2026
3fb9655
feat(session): write an actor identity repair across files from the GUI
amasiye Oct 4, 2026
39dc2d9
fix(database): save every category back to the bytes it read after an…
amasiye Oct 4, 2026
f5a9508
feat(maps): author an encounter's battle arena, for the map and per t…
amasiye Oct 4, 2026
4dafbea
fix(maps): refuse a null battleArena rather than dropping it on the n…
amasiye Oct 4, 2026
7ec0894
feat(session): create projects and search one, for the GUI's File and…
amasiye Oct 4, 2026
e8aa29c
feat(session): build elemental affinities a row at a time, and previe…
amasiye Oct 4, 2026
8dcada7
feat(database): set actors' and enemies' battle art as data, from the…
amasiye Oct 4, 2026
2db50cb
fix(actors): rename actor identities in battle art bound as data
amasiye Oct 4, 2026
356f4b8
feat(session): preview an actor at battle scale for its battle art
amasiye Oct 5, 2026
de212d8
feat(animations): convert a legacy cell-frame animation to a timeline
amasiye Oct 5, 2026
cb25b79
fix(session): write only the file set the author was shown, and group…
amasiye Oct 5, 2026
0561f01
feat(editor): convert a legacy animation to a timeline from the terminal
amasiye Oct 5, 2026
b06ef53
fix(editor): keep the terminal conversion's controls on screen, and r…
amasiye Oct 5, 2026
e6591e1
fix(ui): wrap text indented deeper than the pane without losing it
amasiye Oct 5, 2026
572c430
feat(database): grant counter attacks from actors, enemies, states an…
amasiye Oct 5, 2026
21633e3
test(database): a skill linked to a summon is never offered or accept…
amasiye Oct 5, 2026
aa4c9a8
feat(database): report the Engine's formation clearance in previews a…
amasiye Oct 5, 2026
36db607
feat(database): keep a troop member's slot display scale through plac…
amasiye Oct 5, 2026
326e111
fix(validation): check summon aliases against the summons the project…
amasiye Oct 5, 2026
2671fc1
feat(session): choose the battle test troop and party, and play it
amasiye Oct 5, 2026
f8245bc
feat(session): describe a battle test draft without writing it
amasiye Oct 5, 2026
79a472d
fix(workspace): name each saveable database by its own category, so b…
amasiye Oct 5, 2026
662fe79
fix(canvas): keep a tile that stands for a glyph with its glyph and c…
amasiye Oct 6, 2026
0f1ebe3
test: remove the parity fixtures' temporary projects after each run
amasiye Oct 6, 2026
469a512
feat(session): edit summons and other cutscenes through the record RPCs
amasiye Oct 6, 2026
cc04226
feat(session): group the hello's categories as Database and Cutscenes
amasiye Oct 6, 2026
1ba8a15
feat(session): read reference choices in the context they are edited in
amasiye Oct 6, 2026
f153b71
feat(session): describe a summon or effect timeline and preview its f…
amasiye Oct 6, 2026
d47e900
feat(session): describe image track art and switch an effect's sequence
amasiye Oct 6, 2026
5c6afca
feat(session): create, duplicate and delete summons and other cutscen…
amasiye Oct 6, 2026
d196ff5
test(session): cover creating, duplicating and deleting summons throu…
amasiye Oct 6, 2026
26f0795
feat(schema): summon image tracks share the effect image track schema
amasiye Oct 6, 2026
67afae7
feat(cutscenes): compile summons per renderer, with their image track…
amasiye Oct 6, 2026
b204727
fix(database): keep zero where a field's absence means something else
amasiye Oct 6, 2026
e2c3815
feat(cutscenes): preview a summon in battle through the Engine's comm…
amasiye Oct 6, 2026
32ed8fe
fix(cutscenes): name summon wielders by stable actor id
amasiye Oct 6, 2026
b01ac84
feat(cutscenes): author how an image track fills its cells
amasiye Oct 6, 2026
b455ec8
feat(cutscenes): preview a cinematic through the session as the termi…
amasiye Oct 6, 2026
3b98cf9
feat(cutscenes): preview a summon in either presentation on one autho…
amasiye Oct 6, 2026
79c72c8
feat(cutscenes): preview a battle effect in the action that plays it
amasiye Oct 6, 2026
e309086
test(playtest): stop the game and remove its files even when an expec…
amasiye Oct 6, 2026
a7e6f52
test(cutscenes): a rest frame the summon timeline lacked is written t…
amasiye Oct 6, 2026
80fcfcc
feat(cutscenes): author a summon's terminal and graphical sequences a…
amasiye Oct 6, 2026
c7b2df3
refactor(cutscenes): read stage easings and paired timeline keys from…
amasiye Oct 6, 2026
d94e5f6
feat(database): name the entry each list row belongs to, and its name…
amasiye Oct 6, 2026
87ec026
feat(database): name a list row's entry for the person, such as Point 1
amasiye Oct 6, 2026
ff84138
fix(database): a category is unsaved while what its Save writes is, a…
amasiye Oct 6, 2026
58c47ed
feat(session): send terminal previews as the Engine's styled canvas
amasiye Oct 6, 2026
2e64f8b
fix(battle): say Time Gauge, not ATB, in the battle settings
amasiye Oct 6, 2026
9092b92
feat(pieces): draw a piece across an area by drag or two corners
amasiye Oct 7, 2026
33442ca
feat(pieces): stamp each piece cell in its own authored colours
amasiye Oct 7, 2026
fb20161
feat(pieces): place tileset pieces through the session the way the te…
amasiye Oct 7, 2026
993f9c2
feat(canvas): work out every brush shape and flood fill through the s…
amasiye Oct 7, 2026
6485f5b
feat(session): say when a field names a picture, and describe a tiles…
amasiye Oct 7, 2026
dafcd2e
feat(tilesets): mark a tile above characters or as a table from its p…
amasiye Oct 7, 2026
8b9d842
feat(audio): play a music or sound field through the game's own audio
amasiye Oct 7, 2026
c695f09
feat(session): draw a layer's tiles, count untiled glyphs and set an …
amasiye Oct 7, 2026
232d0f0
fix(cutscenes): pass over a folder of shared artwork as the game does
amasiye Oct 7, 2026
6055cc5
feat(preview): compose a previewed cinematic as the game's graphical …
amasiye Oct 7, 2026
08b3312
feat(canvas): copy, cut and paste a selection through one shared clip…
amasiye Oct 7, 2026
10e0368
feat(canvas): the eyedropper picks up the piece a glyph plays
amasiye Oct 7, 2026
f87b04b
feat(preview): one isolated capture for both views, and the graphical…
amasiye Oct 7, 2026
34aded5
feat(preview): name the graphical view's grid in each scene exchange
amasiye Oct 7, 2026
9f5c56a
feat(preview): play the map's own field effects in a previewed scene
amasiye Oct 7, 2026
cb51f9b
feat(cutscenes): preview an effect on the game's field
amasiye Oct 7, 2026
c789916
feat(inn): choose an inn's rest stage from the stage timelines
amasiye Oct 7, 2026
4bfdcc6
test(cutscenes): shift every authored sequence of a paired summon tim…
amasiye Oct 7, 2026
2bf2694
fix(governance): remove direct-main publishing allowances
amasiye Oct 8, 2026
31df57f
docs(governance): remove dependency on excluded shared repository
amasiye Oct 8, 2026
d662414
docs: remove universal workflow scope beyond Andrew-created develop
amasiye Oct 8, 2026
ec0f013
docs(manual): link the GUI editor plan at its new place
amasiye Oct 9, 2026
2e88734
chore(governance): preserve existing develop publishing safeguards
amasiye Oct 9, 2026
d01665b
chore(governance): merge published develop safeguards without rewriti…
amasiye Oct 9, 2026
c03c22d
feat(editor): add G4 field authoring and owned-stage previews
amasiye Oct 10, 2026
49f7384
feat(maps): preserve independent occupancy through authoring
amasiye Oct 10, 2026
4aab439
fix(source): preserve enum case edits and reject fake imports
amasiye Oct 10, 2026
1e9040b
feat(maps): add source-preserving physical collision painting
amasiye Oct 10, 2026
f4ab120
fix(source): remove enum read-only and literal replacement restrictions
amasiye Oct 10, 2026
8ccd402
feat(maps): author and stamp explicit physical footprints
amasiye Oct 10, 2026
95ac81c
feat(canvas): give an erased mounted piece's cell back to the face it…
amasiye Oct 10, 2026
1e7fdf0
feat(editor): author player ownership and actor field art
amasiye Oct 10, 2026
4c4af43
feat(editor): author map-owned world objects safely
amasiye Oct 10, 2026
0877bdd
feat(editor): pick a chest's loot from the database its loot type names
amasiye Oct 10, 2026
47e7184
test(session): follow the session's graphical categories and refusals
amasiye Oct 10, 2026
6af1acb
feat(editor): give the canvas preview its revision, layer ids and art…
amasiye Oct 10, 2026
15a4b6e
feat(editor): place named field resources as world objects
amasiye Oct 10, 2026
3e148a5
feat(database): author field resources in the graphical editor
amasiye Oct 10, 2026
e83bf6b
feat(playtest): start from the title, and report what a playtest can …
amasiye Oct 10, 2026
ee3c739
fix(canvas): keep a connected piece's kept layers as it is drawn and …
amasiye Oct 10, 2026
efd8dc1
feat(database): author sign boards, text roles and translatable sign …
amasiye Oct 11, 2026
599b559
feat(preview): lay out sign labels through the preview's own renderer…
amasiye Oct 11, 2026
9cd4621
feat(playtest): skip the title, choose the renderer automatically, op…
amasiye Oct 11, 2026
c603d14
test(maps): share the physical occupancy fixtures instead of borrowin…
amasiye Oct 11, 2026
a602229
feat(canvas): compose each open map's editing canvas through the Engi…
amasiye Oct 11, 2026
7ae8955
feat(text-roles): author glyph effects, and never rewrite objects onl…
amasiye Oct 11, 2026
28e20fc
feat(validation): warn for ground tiles that can show the background …
amasiye Oct 11, 2026
3b35c94
fix(validation): count a drawn world object's covered glyphs as hidde…
amasiye Oct 11, 2026
22878c6
feat(validation): warn for floor the player can reach that no tile co…
amasiye Oct 11, 2026
b8c2de6
feat(maps): remove rows and columns through the shared line plan
amasiye Oct 11, 2026
af69918
feat(maps): draw and erase forests of whole trees with the tree brush
amasiye Oct 11, 2026
c1b71b0
feat(maps): draw and erase trees over the terminal canvas selection
amasiye Oct 11, 2026
4878544
feat(maps): move existing saves off floor a map save makes solid, onc…
amasiye Oct 11, 2026
4800fb4
docs(manual): name the cells the save relocation review does not cover
amasiye Oct 11, 2026
0ec7df3
fix(maps): move saves only off cells a map save really takes
amasiye Oct 11, 2026
c27ce9e
feat(cutscenes): let the session answer a cinematic preview's dialogu…
amasiye Oct 12, 2026
a4619ee
fix(cutscenes): page preview dialogue on the text screen, not the fie…
amasiye Oct 12, 2026
b9afff5
feat(world-objects): let any world object choose a field resource, si…
amasiye Oct 12, 2026
4d2f922
fix(maps): draw the tree brush's terminal forest on a gameplay layer
amasiye Oct 12, 2026
eb413b6
fix(maps): let shared cap tiles stay free and move saves off every wa…
amasiye Oct 12, 2026
bd61b35
fix(maps): skip relocations on maps the player reaches nowhere today
amasiye Oct 12, 2026
76918d5
feat(playtest): launch every playtest from the real project root
amasiye Oct 13, 2026
31e528e
feat(database): author whether a level up restores HP and MP
amasiye Oct 13, 2026
ed74167
feat(playtest): hand the launch to the console as --launch-context
amasiye Oct 13, 2026
deffba4
build(deps): lock the Engine at its current develop
amasiye Oct 13, 2026
e359d4a
fix(session): declare every result saveMap returns
amasiye Oct 13, 2026
3f35a29
docs(manual): link the GUI editor's plan and README by their publishe…
amasiye Oct 13, 2026
85ebd58
feat(preview): accept a transfer's completion callback
amasiye Oct 13, 2026
5345c5c
fix(preview): complete a transfer only when its map loads
amasiye Oct 13, 2026
eb82327
feat(authoring): author chest-state conditions and terminal symbols
amasiye Oct 15, 2026
3816caf
fix(authoring): start a map event condition at the map's first event …
amasiye Oct 15, 2026
dd7b8ec
feat(authoring): choose a map event condition's event from the map it…
amasiye Oct 15, 2026
8d5c603
Merge chest-state condition and terminal symbol authoring into develop
amasiye Oct 15, 2026
5f2aff7
feat(authoring): choose each terminal presentation form and pick map …
amasiye Oct 15, 2026
51d16d6
Merge terminal presentation forms and Terminal map event picking into…
amasiye Oct 15, 2026
ad8b692
feat(events): author which way the player faces to start an event
amasiye Oct 16, 2026
3c873a6
Merge event facing authoring into develop
amasiye Oct 16, 2026
8f1f0ec
feat(events): author whether an event starts on its cells or by facin…
amasiye Oct 16, 2026
09bc635
Merge event engagement authoring into develop
amasiye Oct 16, 2026
fa49b0a
feat(skills): author each skill's battle message and preview what it …
amasiye Oct 16, 2026
c9cf766
Merge skill battle message authoring into develop
amasiye Oct 16, 2026
bc27cf3
feat(terms): offer every Engine message in Terms with its default and…
amasiye Oct 16, 2026
cfbab63
Merge the Engine message catalog in Terms into develop
amasiye Oct 16, 2026
5cf1167
fix(terms): show inherited vocabulary wording as a message's default
amasiye Oct 16, 2026
69ba32e
Merge inherited vocabulary defaults in Terms into develop
amasiye Oct 16, 2026
3eb7eee
feat(troops): compose troop members as RPG Maker's Troops tab
amasiye Oct 17, 2026
b65fb9c
Merge the RPG Maker style troop composer into develop
amasiye Oct 17, 2026
ef778ae
feat(map): author minimap landmarks in the Terminal and GUI inspectors
amasiye Oct 17, 2026
c05c8bb
Merge minimap landmark authoring into develop
amasiye Oct 17, 2026
f5609fc
docs(troops): record the Troops page and its Engine waits in the roadmap
amasiye Oct 17, 2026
59d5b98
docs(roadmap): keep the explored Scenario Director blueprint authorin…
amasiye Oct 17, 2026
a6d760e
feat(database): author the minimap atlas theme in a Menu Theme category
amasiye Oct 17, 2026
dd91181
Merge Menu Theme atlas authoring into develop
amasiye Oct 17, 2026
dd8a64b
feat(database): show the Engine's atlas limits on Menu Theme size rows
amasiye Oct 17, 2026
c3725e7
Merge the atlas limits on Menu Theme rows into develop
amasiye Oct 17, 2026
f59ad4d
feat(map): author atlas scope, parent entries and place categories
amasiye Oct 17, 2026
1244dfb
docs(roadmap): record the place category marker binding gap
amasiye Oct 17, 2026
1222eac
Merge atlas scope, parent entries and place categories into develop
amasiye Oct 17, 2026
2660f9d
feat(database): bind menu theme icons, atlas markers by role included
amasiye Oct 17, 2026
5d30f56
Merge menu theme icon and atlas marker binding into develop
amasiye Oct 17, 2026
7355ed1
feat(database): author the corner map's opacity in Menu Theme
amasiye Oct 17, 2026
ebeea43
Merge corner map opacity authoring into develop
amasiye Oct 17, 2026
a3a9371
feat(map): choose how the Terminal draws a map in its atlas rows
amasiye Oct 17, 2026
2c6066f
Merge the Terminal view choice in atlas rows into develop
amasiye Oct 17, 2026
b052293
feat(map): classify a map's own layer glyphs as atlas terrain
amasiye Oct 18, 2026
74a3720
docs(map): describe the places view as terrain and buildings with mar…
amasiye Oct 18, 2026
46e04e3
Merge atlas terrain classification authoring into develop
amasiye Oct 18, 2026
d440b57
feat(dialogue): author dialogue portraits, speaker names and line emo…
amasiye Oct 18, 2026
63f0d09
Merge dialogue portraits, speaker names and line emotion authoring in…
amasiye Oct 18, 2026
2f476bd
fix(source): refuse edits under code-built variables instead of flatt…
amasiye Oct 18, 2026
fbc8a27
Merge source writer refusal of code-built variables into develop
amasiye Oct 18, 2026
de96635
fix(validation): diagnose every chest reward the Engine cannot grant
amasiye Oct 18, 2026
d924b36
refactor(validation): ask the Engine which loot types a chest grants
amasiye Oct 18, 2026
86ceb6c
feat(world-objects): author when a placement is visible
amasiye Oct 18, 2026
c7bf007
refactor(validation): check chest rewards with the Engine's own rule
amasiye Oct 18, 2026
ada3186
feat(session): validated change sets for map writes, and player-visib…
amasiye Oct 18, 2026
e29c58c
fix(session): checking a change set reports the save relocations comm…
amasiye Oct 18, 2026
09dfc2a
feat(session): paint a rectangle of glyphs from its rows in one edit …
amasiye Oct 18, 2026
b2057fb
feat(world-objects): move an object with its covered cells and glyphs…
amasiye Oct 18, 2026
96b91a3
fix(validation): judge each map's current data, unsaved edits included
amasiye Oct 18, 2026
d8e2cf7
docs(guides): change maps from a script through the editor session
amasiye Oct 18, 2026
f7549c2
feat(session): create, copy and move maps at an author-chosen folder id
amasiye Oct 18, 2026
b8afac4
fix(world-objects): a moved object's glyphs keep the piece they play,…
amasiye Oct 18, 2026
9652aee
feat(inspector): choose and rename a landmark's stable id
amasiye Oct 18, 2026
acec3e6
Merge the Engine chest rule adapter into the map write path
amasiye Oct 18, 2026
30be966
feat(npc): let the author choose and change an NPC's stable id
amasiye Oct 18, 2026
2d64996
refactor(validation): judge maps by the Engine's completeness rule, k…
amasiye Oct 18, 2026
d9d526e
feat(events): bind an event to the world object it describes (event.s…
amasiye Oct 18, 2026
dde2c6f
Merge author-chosen map, landmark and NPC ids into the map write path
amasiye Oct 18, 2026
035324e
docs(guides): the Engine's map rule, subject binding and chosen ids i…
amasiye Oct 18, 2026
c838a00
refactor(conditions): the condition and write codecs say which author…
amasiye Oct 18, 2026
9612090
feat(events): every event's trigger fields, inline scripts and dialog…
amasiye Oct 18, 2026
b89975c
feat(inspector): pin a map to a cell of its region map
amasiye Oct 18, 2026
4277b47
feat(events): pick the heading a transfer arrives facing from the Eng…
amasiye Oct 18, 2026
b10720e
Merge event trigger fields, inline scripts, dialogue variants, map st…
amasiye Oct 18, 2026
6100cbf
docs(guides): event trigger fields, inline scripts, dialogue variants…
amasiye Oct 18, 2026
9398678
fix(records): never rewrite a condition or write list its line cannot…
amasiye Oct 18, 2026
6851e11
fix(cutscenes): choose a cinematic's map-local references on its star…
amasiye Oct 18, 2026
689f79e
feat(cutscenes): author subject-relative waypoints and staged positions
amasiye Oct 18, 2026
ea2c81a
Merge subject-relative route and stage positions into the map write path
amasiye Oct 18, 2026
41fcc8b
fix(inspector): map event routes offer the graphical editor's waypoin…
amasiye Oct 18, 2026
67c84c2
docs(guides): subject-relative waypoints and staged actors in the scr…
amasiye Oct 18, 2026
87e0cc9
refactor(validation): give unsaved maps to the Engine's reachability …
amasiye Oct 18, 2026
96b82cb
Merge Engine-rule chest reward validation into develop
amasiye Oct 18, 2026
09fe6e0
Merge the validated map write path, the Engine map rule gate and the …
amasiye Oct 18, 2026
5587643
Merge world-object placement conditions authoring into develop
amasiye Oct 18, 2026
d4a5c6a
build(deps): lock the Engine published on 2026-10-18
amasiye Oct 18, 2026
7e1b76e
fix(session): read field resources and event areas as the workspace h…
amasiye Oct 18, 2026
9e02ad9
fix(validation): read long array syntax as nested when finding duplic…
amasiye Oct 18, 2026
1563a51
docs(guides): the change set commit owns every save; later changes re…
amasiye Oct 18, 2026
5ff5004
Merge current field resources and event areas in session readers, and…
amasiye Oct 18, 2026
c22e769
fix(maps): follow reusable event script starts transitively before mo…
amasiye Oct 18, 2026
78c3400
fix(npc): follow common_event chains when finding what names an NPC id
amasiye Oct 18, 2026
4b873d7
test(playtest): cinematic playtests start on layered and single-file …
amasiye Oct 18, 2026
21209d8
fix(validation): follow a parallel lane's transfer into every lane
amasiye Oct 18, 2026
0759349
Merge transitive event script starts for map line edits into develop …
amasiye Oct 18, 2026
f8248c8
Merge NPC id references through common_event chains into develop (PR …
amasiye Oct 18, 2026
ff5e9ce
Merge cinematic playtest start map tests into develop (PR 12 review)
amasiye Oct 18, 2026
cc269bb
Merge parallel lane transfer modelling into develop (PR 12 review)
amasiye Oct 18, 2026
38003aa
fix(conditions): read condition and write lines only as written, name…
amasiye Oct 19, 2026
497aad3
Merge strict, escaped condition and write lines into develop
amasiye Oct 19, 2026
b178b4b
fix(npc): let exclusive phases share a tile and read structured refer…
amasiye Oct 19, 2026
72f4753
Merge exclusive NPC phases and structured NPC references into develop
amasiye Oct 19, 2026
0e20a91
fix(events): read the map event envelope and Script data from the Engine
amasiye Oct 19, 2026
2af775b
Merge Engine-owned map event envelope and Script data into develop
amasiye Oct 19, 2026
f805a4a
fix(source): hold edited values in the key order their files read back
amasiye Oct 19, 2026
20766e9
build(deps): lock the Engine published on 2026-10-19
amasiye Oct 19, 2026
d54a76e
fix(session): write a change set whole or not at all
amasiye Oct 19, 2026
602f612
Merge source-order read-back and whole change-set commits into develop
amasiye Oct 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
22 changes: 22 additions & 0 deletions .githooks/pre-commit
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#!/bin/sh
set -eu

branch=$(git symbolic-ref --quiet HEAD) || {
printf '%s\n' 'Commit blocked: work must be on develop or a local working branch, not detached HEAD.' >&2
exit 1
}
case "$branch" in
refs/heads/main)
printf '%s\n' 'Commit blocked: main receives changes only through a GitHub PR from develop.' >&2
exit 1
;;
refs/heads/release/*)
printf '%s\n' 'Commit blocked: release branches are Andrew-only.' >&2
exit 1
;;
refs/heads/*) ;;
*)
printf '%s\n' 'Commit blocked: cannot establish a local working branch.' >&2
exit 1
;;
esac
22 changes: 22 additions & 0 deletions .githooks/pre-merge-commit
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#!/bin/sh
set -eu

branch=$(git symbolic-ref --quiet HEAD) || {
printf '%s\n' 'Commit blocked: work must be on develop or a local working branch, not detached HEAD.' >&2
exit 1
}
case "$branch" in
refs/heads/main)
printf '%s\n' 'Commit blocked: main receives changes only through a GitHub PR from develop.' >&2
exit 1
;;
refs/heads/release/*)
printf '%s\n' 'Commit blocked: release branches are Andrew-only.' >&2
exit 1
;;
refs/heads/*) ;;
*)
printf '%s\n' 'Commit blocked: cannot establish a local working branch.' >&2
exit 1
;;
esac
31 changes: 31 additions & 0 deletions .githooks/pre-push
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#!/bin/sh
set -eu

deny() {
printf '%s\n' "Push blocked: $1" >&2
printf '%s\n' 'Only an authorized fast-forward from local develop to existing remote develop is eligible.' >&2
printf '%s\n' 'Main requires a GitHub PR from develop. Do not bypass this guard through options, config, APIs or UI.' >&2
exit 1
}

validate_oid() {
case "$1" in ''|*[!0-9a-fA-F]*) return 1 ;; esac
case ${#1} in 40|64) return 0 ;; *) return 1 ;; esac
}

updates=0
while read -r local_ref local_oid remote_ref remote_oid extra; do
[ -z "$extra" ] || deny 'malformed ref update.'
[ "$remote_ref" = refs/heads/develop ] || deny "$remote_ref is not develop."
[ "$local_ref" = refs/heads/develop ] || deny 'the source must be local refs/heads/develop.'
validate_oid "$local_oid" && validate_oid "$remote_oid" || deny 'malformed object ID.'
case "$local_oid" in *[!0]*) ;; *) deny 'branch deletion is forbidden.' ;; esac
case "$remote_oid" in *[!0]*) ;; *) deny 'remote branch creation needs Andrew’s explicit authorization.' ;; esac
current_oid=$(git rev-parse --verify refs/heads/develop) || deny 'local develop is missing.'
[ "$local_oid" = "$current_oid" ] || deny 'the source object is not the current local develop head.'
git cat-file -e "$remote_oid^{commit}" 2>/dev/null || deny 'remote develop commit is unavailable locally; fetch it and reassess.'
git cat-file -e "$local_oid^{commit}" 2>/dev/null || deny 'local develop is not a known commit.'
git merge-base --is-ancestor "$remote_oid" "$local_oid" || deny 'develop update would rewrite remote history.'
updates=$((updates + 1))
done
[ "$updates" -gt 0 ] || deny 'no ref updates were supplied; the destination cannot be established.'
140 changes: 140 additions & 0 deletions .githooks/test-guards.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
#!/bin/sh
set -eu

kit=$(CDPATH= cd -- "$(dirname "$0")/.." && pwd)
tmp=$(mktemp -d "${TMPDIR:-/tmp}/ichiloto-guards.XXXXXX")
trap 'rm -rf "$tmp"' EXIT HUP INT TERM
work="$tmp/work"
remote="$tmp/remote.git"
checks=0

pass() { checks=$((checks + 1)); }
fail() { printf 'FAIL: %s\n' "$1" >&2; cat "$tmp/log" >&2; exit 1; }
expect_failure() {
label=$1
shift
if "$@" >"$tmp/log" 2>&1; then fail "$label unexpectedly succeeded"; fi
pass
}
expect_success() {
label=$1
shift
if ! "$@" >"$tmp/log" 2>&1; then fail "$label failed"; fi
pass
}
check_update() {
expected=$1
label=$2
shift 2
printf '%s\n' "$@" >"$tmp/input"
if (cd "$work" && "$kit/.githooks/pre-push" origin "$remote" <"$tmp/input") >"$tmp/log" 2>&1; then
actual=allow
else
actual=deny
fi
[ "$actual" = "$expected" ] || fail "$label: expected $expected, got $actual"
pass
}

git init --quiet --initial-branch=main "$work"
git -C "$work" config user.name 'Governance fixture'
git -C "$work" config user.email 'governance-fixture@example.invalid'
printf 'seed\n' >"$work/content"
git -C "$work" add content
git -C "$work" commit --quiet -m 'test: seed fixture before installing guards'
seed=$(git -C "$work" rev-parse HEAD)
git -C "$work" branch develop
git clone --quiet --bare "$work" "$remote"
git -C "$work" remote add origin "$remote"
cp -R "$kit/.githooks" "$work/.githooks"
mkdir -p "$work/scripts"
cp "$kit/scripts/install-git-guards.sh" "$work/scripts/"

expect_success 'initial install' git -C "$work" -c core.hooksPath=.git/hooks status --short
(cd "$work" && ./scripts/install-git-guards.sh) >"$tmp/log" 2>&1 || fail 'initial guard installation'
pass
first_target=$(readlink "$work/.git/hooks/pre-push")
(cd "$work" && ./scripts/install-git-guards.sh) >"$tmp/log" 2>&1 || fail 'idempotent guard installation'
[ "$(readlink "$work/.git/hooks/pre-push")" = "$first_target" ] || fail 'installer replaced existing guard symlink'
pass

printf 'forbidden\n' >"$work/forbidden-main"
git -C "$work" add forbidden-main
expect_failure 'main commit' git -C "$work" commit --quiet -m 'test: must be blocked'
[ "$(git -C "$work" rev-parse HEAD)" = "$seed" ] || fail 'main commit changed HEAD'
pass
git -C "$work" reset --quiet
rm "$work/forbidden-main"

git -C "$work" switch --quiet develop
printf 'develop\n' >>"$work/content"
git -C "$work" add content
expect_success 'develop commit' git -C "$work" commit --quiet -m 'test: accepted develop fixture'
develop=$(git -C "$work" rev-parse HEAD)
git -C "$work" switch --quiet main
expect_failure 'main merge commit' git -C "$work" merge --no-ff -m 'test: blocked main merge' develop
[ "$(git -C "$work" rev-parse HEAD)" = "$seed" ] || fail 'main merge changed HEAD'
pass
git -C "$work" merge --abort
expect_failure 'main no-op push' git -C "$work" push origin main
git -C "$work" switch --quiet develop
expect_success 'existing develop fast-forward push' git -C "$work" push origin develop
[ "$(git --git-dir="$remote" rev-parse develop)" = "$develop" ] || fail 'remote develop did not advance'
pass

zero=0000000000000000000000000000000000000000
unknown=1111111111111111111111111111111111111111
check_update allow 'develop fast-forward' "refs/heads/develop $develop refs/heads/develop $seed"
check_update allow 'develop unchanged input' "refs/heads/develop $develop refs/heads/develop $develop"
check_update deny 'main update' "refs/heads/develop $develop refs/heads/main $seed"
check_update deny 'main no-op' "refs/heads/main $seed refs/heads/main $seed"
check_update deny 'main deletion' "(delete) $zero refs/heads/main $seed"
check_update deny 'develop deletion' "(delete) $zero refs/heads/develop $develop"
check_update deny 'develop creation' "refs/heads/develop $develop refs/heads/develop $zero"
check_update deny 'unknown remote object' "refs/heads/develop $develop refs/heads/develop $unknown"
check_update deny 'feature source into develop' "refs/heads/feature/test $develop refs/heads/develop $seed"
check_update deny 'mixed destination push' "refs/heads/develop $develop refs/heads/develop $seed" "refs/heads/develop $develop refs/heads/main $seed"
check_update deny 'false develop object' "refs/heads/develop $seed refs/heads/develop $seed"
check_update deny 'malformed update' "refs/heads/develop not-a-hash refs/heads/develop $seed"
check_update deny 'extra input field' "refs/heads/develop $develop refs/heads/develop $seed surprise"
for ref in refs/heads/feature/test refs/heads/fix/test refs/heads/release/1.0.0 refs/tags/v1.0.0; do
check_update deny "forbidden destination $ref" "refs/heads/develop $develop $ref $seed"
done

git -C "$work" update-ref refs/heads/main "$develop"
expect_failure 'actual direct main push' git -C "$work" push origin main
[ "$(git --git-dir="$remote" rev-parse main)" = "$seed" ] || fail 'blocked main push mutated remote'
pass
git -C "$work" update-ref refs/heads/develop "$seed"
expect_failure 'actual force rewrite of develop' git -C "$work" push --force origin develop
[ "$(git --git-dir="$remote" rev-parse develop)" = "$develop" ] || fail 'blocked rewrite mutated remote'
pass
git -C "$work" update-ref refs/heads/develop "$develop"
expect_failure 'actual remote working branch creation' git -C "$work" push origin develop:feature/test
expect_failure 'actual remote develop deletion' git -C "$work" push origin :develop
expect_failure 'actual mixed develop/main push' git -C "$work" push origin develop main

git -C "$work" switch --quiet --detach "$develop"
expect_failure 'detached commit' git -C "$work" commit --allow-empty --quiet -m 'test: detached must be blocked'
git -C "$work" switch --quiet -c release/1.0.0
expect_failure 'release commit' git -C "$work" commit --allow-empty --quiet -m 'test: release must be blocked'
git -C "$work" switch --quiet -c feature/test
expect_success 'local working branch commit' git -C "$work" commit --allow-empty --quiet -m 'test: local working branch is allowed'

# The configured hooks directory is preserved; unknown hooks block all installation.
git -C "$work" config core.hooksPath custom-hooks
mkdir "$work/custom-hooks"
printf '#!/bin/sh\nexit 0\n' >"$work/custom-hooks/pre-push"
chmod +x "$work/custom-hooks/pre-push"
cp "$work/custom-hooks/pre-push" "$tmp/existing-hook"
expect_failure 'unknown existing hook' sh -c 'cd "$1" && ./scripts/install-git-guards.sh' sh "$work"
cmp -s "$tmp/existing-hook" "$work/custom-hooks/pre-push" || fail 'installer changed unrelated hook'
[ ! -e "$work/custom-hooks/pre-commit" ] || fail 'blocked install partially changed hook directory'
[ "$(git -C "$work" config core.hooksPath)" = custom-hooks ] || fail 'installer changed core.hooksPath'
pass
rm "$work/custom-hooks/pre-push"
ln -s "$work/.githooks/pre-push" "$work/custom-hooks/pre-push"
expect_success 'configured hooks directory install' sh -c 'cd "$1" && ./scripts/install-git-guards.sh' sh "$work"
[ "$(git -C "$work" config core.hooksPath)" = custom-hooks ] || fail 'configured path was not retained'
pass
printf 'Passed %s guard and installer checks using real commits, merges and local bare push destinations.\n' "$checks"
9 changes: 9 additions & 0 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
Read `AGENTS.md` and `GIT_WORKFLOW.md` before acting. Andrew's develop-to-main
rule applies only where he has created a `develop` branch. This repository has
that existing branch: no direct commits, local merges or pushes to `main`.
All changes integrate into `develop` and reach `main` only through a
same-repository develop-to-main PR. Repositories found without Andrew-created
`develop` are outside this remediation and must be left alone; neither creating
that branch nor direct-main publishing is authorized by that exclusion.
Keep explicit branch-publication, deletion and history-rewrite permissions.
No historical private-repository exception grants permission.
12 changes: 12 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
## Change and validation

Describe the resulting behavior, tests run, and relevant limits.

## Git workflow

- [ ] I read `AGENTS.md` and `GIT_WORKFLOW.md` and preserved existing work.
- [ ] I confirmed Andrew created `develop` in this repository; the develop-to-main rule applies within that scope, and repositories without it are left alone.
- [ ] In this existing-develop repository, a PR into `main` comes from its `develop`.
- [ ] Any working branch here feeds `develop`; its publication has explicit approval.
- [ ] No direct-main commit/local merge/push here, unauthorized branch deletion or history rewrite; exclusion of other repositories grants no publishing permission.
- [ ] Removed, disabled or narrowed behavior is named plainly.
35 changes: 35 additions & 0 deletions .github/workflows/git-governance.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
name: Git workflow governance

on:
pull_request_target:
branches: [main]
types: [opened, synchronize, reopened, edited, ready_for_review]

permissions:
contents: read

jobs:
validate-develop-source:
name: Validate develop source
runs-on: ubuntu-latest
steps:
- name: Require same-repository develop for main
env:
EXPECTED_REPOSITORY: ${{ github.repository }}
run: |
python3 - <<'PY'
import json, os, sys
with open(os.environ['GITHUB_EVENT_PATH'], encoding='utf-8') as event_file:
pr = json.load(event_file)['pull_request']
head = pr.get('head') or {}
head_repo = head.get('repo') or {}
valid = (
pr.get('base', {}).get('ref') == 'main'
and head.get('ref') == 'develop'
and head_repo.get('full_name') == os.environ['EXPECTED_REPOSITORY']
)
if not valid:
print('Main accepts only a PR from this repository\'s develop branch.', file=sys.stderr)
sys.exit(1)
print('Verified: same-repository develop -> main.')
PY
58 changes: 37 additions & 21 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,21 +1,37 @@
# Editor Engineering Rules

These rules intentionally repeat the repository-level rules so editor work cannot drift into local-only shortcuts.

## Correctness First

Always favor correctness, maintainability, and complete design over speed. No shortcuts. No hacky solutions. If a problem deserves a proper model, architecture, state machine, picker, abstraction, or validation layer, build that instead of patching symptoms.

## Solve Globally By Default

When fixing a problem, solve the root issue globally rather than making a narrow local workaround, unless Andrew explicitly asks for a local-only change. Look for the broader pattern, existing architecture, and future maintenance cost before implementing.

## Best Practices Are Required

Apply best practices by default: explicit data models, stable references, validation at boundaries, clear ownership, cohesive APIs, tests for behavior, and clean separation of concerns. Avoid hidden conventions, magic strings, fragile coupling, and UI flows that rely on memory or perfect spelling.

## Editor References Must Be Selected

When editor fields reference another resource, they must use a selector, picker, dialog, browser, or constrained list. Do not require manual typing for references to actors, classes, items, skills, animations, summon cutscenes, maps, events, files, or other resources known to the editor. Manual text is for authored free text, not resource references.

Persist the selected stable reference after selection. Do not make authors remember or spell resource ids by hand.
# Editor Engineering Rules

## Binding Git workflow

Read [GIT_WORKFLOW.md](GIT_WORKFLOW.md) before work, after compaction and before
publishing. On Andrew's workstation also read the original
`/Users/andrewmasiye/.codex/AGENTS.md`. Andrew's develop-to-main rule applies
only where he has created a `develop` branch. This repository has that existing
branch: NEVER commit, merge locally or push directly to `main`, including private
documentation. Changes integrate into `develop`; `main` receives only a PR from
this repository's `develop`.
Repositories found without Andrew-created `develop` are outside this remediation
and must be left alone; do not create that branch or infer direct-main permission.
Remote working branches, history rewrites and branch deletion require explicit
scoped authorization. Within the existing-develop scope, prior direct-main
exception claims are superseded by Andrew's 2026-10-08 rule.
Install the tracked Git guards before committing or publishing here.

These rules intentionally repeat the repository-level rules so editor work cannot drift into local-only shortcuts.

## Correctness First

Always favor correctness, maintainability, and complete design over speed. No shortcuts. No hacky solutions. If a problem deserves a proper model, architecture, state machine, picker, abstraction, or validation layer, build that instead of patching symptoms.

## Solve Globally By Default

When fixing a problem, solve the root issue globally rather than making a narrow local workaround, unless Andrew explicitly asks for a local-only change. Look for the broader pattern, existing architecture, and future maintenance cost before implementing.

## Best Practices Are Required

Apply best practices by default: explicit data models, stable references, validation at boundaries, clear ownership, cohesive APIs, tests for behavior, and clean separation of concerns. Avoid hidden conventions, magic strings, fragile coupling, and UI flows that rely on memory or perfect spelling.

## Editor References Must Be Selected

When editor fields reference another resource, they must use a selector, picker, dialog, browser, or constrained list. Do not require manual typing for references to actors, classes, items, skills, animations, summon cutscenes, maps, events, files, or other resources known to the editor. Manual text is for authored free text, not resource references.

Persist the selected stable reference after selection. Do not make authors remember or spell resource ids by hand.
11 changes: 11 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Claude instructions

Read `AGENTS.md` and `GIT_WORKFLOW.md` in full before work, after compaction
and before publishing. Andrew's develop-to-main rule applies only where he
has created a `develop` branch. This repository has that existing branch:
no direct-main commits, local merges or pushes; all main changes use a
same-repository `develop` -> `main` PR. Repositories found without that branch
are outside this remediation and must be left alone. That exclusion does not
authorize creating `develop` or publishing directly to `main`. Never infer an
exception from historical messages; retain all explicit branch-publication,
deletion and history-rewrite permission requirements.
Loading
Loading