Developer's diary · 270 commits, 5 September to 22 September 2026
In the morning I tagged a checkpoint and started on the Act 7 prototypes while the playtest of the earlier acts waits on me. I kept them outside the campaign and built the shed first: a small room with three wheeled racks on parking tracks and a tray on the rear shelf, with Ding walking to a pale grip before she rolls anything. Then I probed the geometry. The card wanted six essential moves, but the probe found a safe route in three, and I left it in, because I think a rule the player cannot see would be cheating.
In the afternoon I made the paper: six torn pieces of a packing note and two scraps from other forms, shuffled into a tray for the player to sort. But the words can be read on the loose pieces already, so the building may be only ceremony, and I want blind play to tell me. Later on a blind player got stuck, because the rack's click box swallowed clicks through its open frame, which I think is my fault. So I fixed the picking, and on the repaired run they cleared the shed alone and rejected a plausible scrap by its torn edge.
In the evening I took the things the lab had to invent by subclassing the panel and put them into the engine contract, because I think the next table should not have to invent them again. They are a picture per language, a canvas and pitch so torn paper draws edge to edge, a refusal spoken at the table, and dragging a piece to its place. Then the prototype adopted the shared panel and its own adapter went, but the review handed back two findings, so I made Read look into every menu and let the table use its height, so the loose scraps stay readable.
In the morning I planned Act 7, the puzzle investigation and the production gates around it, and answered the engine handoff that came out of the plan. Then I reviewed last night's motion revamp with the same suites, made the journey suite follow the current Look text, and dropped a stale hold from the generated graph index. The gait itself I still have to watch with my own eyes, so that verdict stays open.
Before noon I built the story workspace, a table where pieces are placed, flipped and turned on a grid, and the arrangement is story state that the save keeps. I built it because the puzzle store cannot say that two pieces may not share a place, and it would have needed thirty-six values per piece to try. It comes with its own store, a panel, a fifth save schema and validators, and the registry ships empty, because nothing in it is Act 7 content yet.
In the afternoon the content review found seven things wrong with it. A past visit to the table stood in for permission to rearrange it now, the tray silently hid pieces past its first column, a checkpoint could put two pieces in one slot, and there were four more like that, so I repaired them all with tests. The recheck found five more at the edge where access meets the requirement clauses, so I repaired those too, and then the workspace was accepted for a bounded Act 7 prototype.
The last thing I changed was the planner. It used to stop counting workspace alternatives at its budget and say nothing, and I think a proof that quietly stops counting is worse than no proof, so now identical branches collapse and a real overflow fails with a name.
After midnight I kept going with the speech. I hardened the provenance so that every line binds to its English, its translations, its recording and its conditions. Then I rewrote the opening and all the speech in Acts 1 to 5 from what each character has actually earned by that point, because the old lines kept lending people knowledge they could not have yet. Then I rebuilt the conversations around questions the player has earned, with guarded categories and answers that close when a topic is done, and went to bed very late.
In the morning I reviewed the overhaul. The campaign bot had missed alternatives inside nested menus, so it tried a card branch that was already excluded and failed, and the Hu suite still asserted seven fixed lines that no longer exist, so I fixed both. The rewrite had also left nearly five hundred dead translation keys behind, so I pruned them through the chapter sources that own them. Then I refreshed the Act 6 plan around earned knowledge and player consequences and authorized the build.
In the afternoon Act 6 landed, The Balance Due. Tang's county workroom, a treadle investigation that can be undone, independent accounts, an explicit sample and reply handover, three illustrated transitions and the Mandarin performances, all packaged for the Windows playtest.
Later on I reviewed it with the campaign bot planning every ordered outcome across the six acts, registered the workroom on the bot, and prepared the human review. Sewing machine is difficult.
Late at night I went back to how people move. I gave Ding a walk and a jog that recover less between steps, made the early town pay attention more often, shortened Shen's pauses, and gave Ning and Xiaodie their own gestures in the court, then I refreshed the ambient gestures for the rest of the villagers. I kept all of it in a separate worktree with a saved comparison against the old motion, because I want to watch it myself before it goes anywhere near the real build, and I fixed the generated JSON so a fresh Windows checkout keeps the same bytes.
In the morning I did the engine work for Act 5. Puzzle state now survives a save, there are first-person inspection views, routines give the villagers something to do, optional activity tables came with it, and sound cues belong to the activity that makes them. I also fixed a dead zone when a villager arrived at a routine spot, and observer geometry that showed up inside the inspection view.
Before noon Act 5 landed, the viewpoint inquiry, village activity and working NPCs, then I reviewed it and found a bug worth writing down. Once puzzle definitions existed, the conversation service stamped a puzzle revision on every dialogue, so a plain Look looked like a pending puzzle preview. Now the stamp belongs only to a dialogue that carries an event, because I think a label should be clear to the user, although the system knows what it is.
In the afternoon I went back to the picture. I refined the roadside channel and kept the plants on dry ground, softened the ambient footsteps and tidied the scene captions. Then the golden stills, because the road water moved between frames and the stills never matched, so now a still freezes the water and pins every caption, and twelve regions got fresh visual approvals. Later on I planned Act 6, the workroom trial and the conflicting promises, and mapped the campaign pacing, because I want to be sure the mystery can always be finished.
In the evening I played the game myself from the start, and I saw things the tests had not told me. Ding faced away from town when she arrived on the field road, because every arrival reset her heading, so now the facing comes from the route she came through. A note's source line came out as something Ding said, so I moved that evidence into a Notes panel and went through the copy for production words. Then I lowered the footsteps again, added Save and fullscreen to the notebook, and hid the floor circles, because I think the cursor, the name and E are enough.
Later on I reviewed that batch and found two things I did not like. Closing the window could trap the player, because the close refused to quit when the save said no, but the save also says no during a transition, so now the close waits for it and a second close leaves without saving. The runner also took a scope variable from the shell, so a leftover variable could quietly shrink a release run, and now it only takes a scope that is declared. Late at night I kept one verified local build and put Act 6 on hold, because I want to play Acts 1 to 5 through myself first.
Then I played, and one line stopped me. Ding told Hu that one bag delivered to a courtyard tells her about the job and not how Xiaodie is now, and I did not believe she would say that, although the caption routing was correct. So before bed I fixed the copy leaks and started an audit of every spoken line, with a ledger per character, judged from what the speaker knows at that moment and not from what I know as the author.
In the morning I did a long run of small engine services, handovers between characters, nested conversation topics, music rules, presence requirements, translation catalogues, a recap when you press Continue, and each one was small, but I need all of them before Act 3 can work. I also fixed a bedroom shared by two rooms that showed two approach circles where one is right.
One of those services taught me something. I gave every region a budget, triangles, texture bytes once the scene has settled, the peak during a transition, and the time from load to the first drawn frame, and a new region without a budget now fails validation. I also wrote a rule down for myself, because I know I will be tempted later: if a scene is heavy I fix the scene, I do not raise the threshold to make the test pass. I also learnt that hidden objects still cost memory, so I count them too.
In the afternoon I built the Act 3 household visit, then I reviewed everything that had landed since the HUD change and found a quiet bug. The checkpoint planner moved a save into a region without playing the arrival beats, so the save was in town but did not know it. I think arriving somewhere has to be an event in the game and not only a position, so I made the planner play those beats too. Then I wrote the plan for Act 4.
In the evening I did a refactor, conversation and staging moved out of the main game script into their own files, and nothing the player can see changed, which is what I wanted from a refactor. On the way a new check caught an environment atlas older than the art it was built from, and I would only have noticed that when a texture looked wrong in a build. Late at night Act 4 landed, the workshop puzzle, the departure arrangement and the delivery inquiry, and I accepted the candidate build.
Then one more thing before bed. The story-graph analysis took almost three minutes, because every action got its own search from the start, but a search for one action already walks through states that prove other actions, so now it keeps those as witnesses instead of searching again. It gives the same result and takes half the time. Then I wrote the plan for Act 5 and stopped.
After midnight I settled the story direction, then in the morning I made the player's actions explicit. To use a belonging you now choose it in the notebook, press Use, then act on something, and nothing is offered by itself any more. The flask fill in Act 1 stopped working first, and that showed me how much I had been doing for the player without asking.
In the afternoon I split Look from Act, because the two had been mixed for a long time and every inspect line carried a hidden discovery. Right click looks now, Ding Ding describes what you point at from where she stands and nothing changes, and left click acts. I think looking should be free, and only acting should commit to anything.
In the evening I moved the portals, gates and regions out of code into a routes file, then I wrote a small tool that proves from that file that every region, milestone and item is reachable and that no room is a dead end. It found nothing wrong, but I want it there before I need it. The saves now keep a backup of the old bytes when they migrate. Late at night I added the Yang search before Act 2 and handed over a Windows build.
I made the first checkpoint of the project late in the afternoon, the opening film, Act 1 and the pipeline in one commit, then I went to sound. I lifted the village and the footsteps, made everything else duck under conversations, and made leaving a scene more forgiving, because the exits felt too strict when I played it. Then I released that for Windows and the web.
In the evening I worked on the picture. I tried to judge the analogue look from screenshots, but I could not, so I built a preview on the Windows machine and switched between the old look and the new look in place. The opening wanted softness but gameplay wanted to be sharp, so I gave them different amounts of blur. Then I tried halation, then grain with colour noise in the shadows, then I locked the look and moved on.
Before bed I gave Act 1 six villagers with their own faces and voices, and I gave Ding Ding a proper jogging animation. Then I wrote a document with the story options and the first deduction milestone, so that tomorrow I can start from a decision instead of thinking about it all again.
One row per day, newest at the top, left to right through the day. Larger dots changed more files. The peach dots are the steps I would point at.