Repository navigation
M7 - Factions, Reputation, and Building v1 (draft through E10) - #8
Draft
jlucasmcrell wants to merge 71 commits into
Draft
jlucasmcrell wants to merge 71 commits into
jlucasmcrell wants to merge 71 commits into
Conversation
DECISIONS gains D-13 (navigation is a derived, deterministic, headless domain grid; Godot navigation is never authoritative) and D-14 (building v1 is one storey), plus dated notes on D-04 (derived identities) and D-08 (quarter turns on a 3 m lattice, Q1). WORLD_ARCHITECTURE drops the baked Recast navmesh from the presentation table; cells never partition movement or navigation; RK-A2 is to be proven in M7. RISK_REGISTER's RK-14 no longer needs the engine, RK-06 restamps a domain grid, and one storey is an accepted risk. PERSISTENCE and SYSTEMS name the grid derived and the committed route saved mover state. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ROADMAP's M7 entry gains the reading the owner approved: the navmesh is the domain navigation grid, floors are ground pads (one storey), rotation is staged as quarter turns, crime/bounty/pardon and territory gating are deferred to Phase 3, one persisted work-anchor assignment, one build area across a seam, and the entry criterion met inside M7 by E1 and E4. GAMEPLAY_LOOPS records property threats as M10's; the content bible's no-building line is superseded for M7 by the crossing build area; PROTOTYPE A-2 records that no faction_id was ever built; HUD_INPUT makes radials optional mirrors; IMPLEMENTATION_PRECEDENCE cites the feel-test ruling. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
docs/M7_STATUS.md records the owner's authorization of 2026-09-25 (agent, worktree G:\UNNAMED_M7, branch claude/m7-factions-building, base a696931, one persistent draft PR through E10), the rulings as applied, Q1-Q5 and the owner's further decisions (art coverage reported, dialogue approved, the m7 tag at merge, the feel test and RAZER), the slice table and the E0 checklist, all twelve lines passing. AGENTS.md names M7 in progress, D-13 and D-14, the M7 worktree and branch, and the committed GameSaves. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ests The derived, integer, seam-free lattice of D-13 (design section 3): NavConfig, NavGeometry (exact integer fit, point and swept-circle tests), NavInputs, NavTile and NavGrid (build, rectangle rebuild, walkability, window stamps), NavScratch, NavSearch (snap, enclosure probes, windowed optimal A*, string pulling), NavRoute (validating factories, value equality, digest terms) and NavCounters. Nothing is wired into the simulation yet. Tests N-D1, N-D3 to N-D6, N-D9, N-D11 to N-D16, N-D21 and N-D22. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
content/config/navigation.yaml (section 3.16: 250 mm nodes, the person class, max_expansions 65536) and NavigationContent: Build (NavConfig, or NavConfig.Default when a pack has none) and Validate, hooked after QuestContent. NAV001-NAV003 and NAV007 are the configuration's own rules; NAV004 and NAV005 hold it to the built MovementRules; NAV006 floods each region from its spawn with every gate passable and requires every authored place to be reached. NavigationLayout (World) gives the content lint and the runtime one reading of a region's tiles and authored inputs. Tests: N-X2 (config.navigation in LoadAll_Loads_Yaml_Files), N-X3, NavConfigDefault_IsTheShippedFile. Lint: 103 definitions, 0 errors. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… N-A10 StateSlice.Navigation and RuntimeState.SetNavigation; NavigationSystem (Build, CurrentInputs, Reachable, View; its own scratch and counters); SimulationSetup.Navigation, composed after CraftingSystem and built after the effects are seeded; the get-only Simulation.Navigation view; GameSession.Boot builds it from content. TestWorlds.HollowSetup builds the game's rules for World.Tests. Tests: N-W1, N-W2, N-W3, N-A1. The planner now counts the goal pop as an expansion, as the design's model does (9,709 and 1,179 reproduced), and its hot loops are JIT-optimised with a cached tile lookup; results are unchanged. N-A10 is not committed: on ASTRAL three authored pairs exceed the E1 bound of 43,690 expansions (worst 52,985), an E1 STOP. The evidence and the decision asked of the owner are in docs/M7_STATUS.md. The E1 architecture guards and commit 4 wait on that decision. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The owner resolved the N-A10 STOP (2026-09-25): optimal A* and the 65,536 cap stay; the exhaustive authored-pair sweep is diagnostic coverage, every pair Found within the cap, its costliest pairs recorded as residue; the two-thirds headroom and the new 15 ms target / 20 ms STOP apply to actual mover routes (E4, E9). M7_STATUS records the ruling beside the original STOP evidence. N-A10 (E1 part): the full build, and all 180 authored pairs Found. Guards: N-X1 NavDomain_IsIntegerOnly, G3, G4, G5, G8, G15, G24, G25, AuthorityNeverReadsAClock. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… b01-b02 The overlay draws the navigation grid near the player and every gate shut or open; the structure debug panel shows the grid's digest, tiles and barriers. --build-shots runs beats b01 (the smithy walls) and b02 (a tile corner) and asserts on what the overlay drew. E1 evidence and scope-ledger rows in docs/M7_STATUS.md. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…saved WorldDelta gains placed pieces with their structure sequence, the named NPCs' errands and the piece chest's derived container; the snapshot, its rebuild and the effective-cell digest (v3) cover them. EntityId gains Derived and the pce_ kind; the runtime gains the Factions slice, claimed by a FactionSystem with no behaviour yet. The simulation digest (v3) covers the structure sequence. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
SchemaV14 holds schema 14's PlayerDto, CompanionDto and EntitiesSectionDto as they stand, and the 11->12, 12->13 and 13->14 steps write those frozen shapes, so schema 15's fields cannot leak into an older step. No migration output changes: every historical fixture still matches its expected.json. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The current fixture pack cannot add config.navigation and still pass its checks: navigation's times need config.time, and config.time turns on combat and magic checks the fixture's stub creatures and spell fail. docs/M7_STATUS.md records the STOP, the three readings and the recommended one, (b): the pack omits config.navigation. E2.3 stays uncommitted until the owner rules. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…aved The player gains its faction ledger and each companion a route; the entities section gains placed pieces, the structure sequence and NPC errands, every one required on decode. SchemaV14ToV15 adds them empty; the definition-ID pass carries M7's rows (the chest spill, the errand fix-up, merges, the via check, a broken record as a Blocker). The player digest is v10, the effective-cell digest v3. Test data: the v15 fixture, the writer pack 0.1.7 and the current fixture pack 0.2.9, which omits the optional config.navigation (owner ruling on STOP S9); v1-v14 expected.json gain only the empty M7 fields. Tests: G11, G12's player half, G28, G29, F-E1, F-E4, the corrupt, quarantine, row-rejection and definition-pass tests, the capture tests, and the M6 acceptance save's player rows. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
docs/M7_STATUS.md records the owner's ruling on the E2.3 STOP (the fixture pack omits config.navigation), E2.3's scope-ledger readings and its evidence (898 tests; playthrough verify 968 fields, 0 differences; the second run byte-identical). It also records a new STOP: section 7.14 asserts the M6 acceptance save's 14 -> 15 step is "the fourth of four", while the design's path 12 -> 13 -> 14 -> 15, and the loader, give three steps. E2.4's test stays uncommitted until the owner rules. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
TheM6AcceptanceSave_LoadsIntoM7_NothingBuiltNeutralNoErrand migrates the committed schema-12 save through exactly three steps (12 -> 13, 13 -> 14, 14 -> 15: the owner's ruling on the E2.4 STOP), with no transition, blocker, loss or alias. It finds no piece, sequence 0, no errand, Kera at her site, an empty ledger, and Tavar with no route and his saved trail. The first save keeps the original byte for byte under pre_migration_12_manual_acceptance, and a reload differs in nothing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PERSISTENCE.md: M7's derived-state rows, the as-built file set, the ledger and route fields, pieces, the structure sequence, errands and piece chests, the 11 -> 12, 12 -> 13 and 14 -> 15 chain rows, no new transition, the as-built load order, the tests mapped to T-01 to T-23, and the "step g" labels corrected to "step k". DATA_MODEL.md section 6: rule 1 corrected, and the save-sensitive M7 constants. The fixture README: packs 0.1.7 and 0.2.9 (without config.navigation), the v15 world rows and provenance. M7_STATUS: the owner's ruling on the E2.4 STOP, the E2 record and its evidence (899 tests; verify 968 fields, 0 differences). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Factions.cs gains the relation words, reactions, faction definitions, the standing ladder (PROGRESSION section 10's eleven tiers) and the pure rules: Learn applies a reaction once per faction and act, keeps an unidentified row at delta 0 until a report upgrades it, and clamps to -999 and 1000; Compact evicts the oldest act first. The dialogue model gains the reputation and act_done conditions and the report_act consequence; a stock row gains its standing requirement. So that this commit builds, the runtime's FactionSetup, SimulationSetup.Factions, StandingOf and the two explicit IDialogueFacts members land here too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
config.factions (PROGRESSION section 10's ladder, the point range, a 256-act log), the Waystation (Renn, Kera) and the Survey (Sel), the armour's +100/-100 and the steadied heart's +100. Kera and Sel gain their DRAFT report replies and Sel her notes line behind the Survey's standing; both tavar_back replies report the steadying. FAC001 holds content to the ladder, single-instance reactions of built kinds, members at their seat and never a companion, and R1, R3, R4 and R5. FAC001 rejected the fixture pack's switch reaction, which no fixture switch sets: the pack is fixed under 0.2.10, never the lint. Kera's billet row lands with its gate in E3.3. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
FactionSystem records an act when some faction reacts to it (the armour killed by the character, the heart steadied), and a report_act reply tells the speaker's faction, which learns each matching act once and moves its standing: ActRecorded, FactionLearned and ReputationChanged, and the Factions and Acts views. Kera's billets are withheld until the Waystation stands at accepted (keyed by item; a raw BuyCommand is refused), and Sel's notes open and close with the Survey. The quest debugger describes both new conditions in words. Tests: the P script on shipped content (the same act, Waystation +100 and Survey -100), the F fixture rows, save and resume, save-then- continue, command-log replay, two fresh runs, the layers kept apart, a companion's kill, both gates, the axis 2x2s, G2, G5, G6 (reflection over IL), G27 and the report-only guard. NpcTests' bought-out trader keeps the withheld billets (the design's permitted edit). FAC001 now reads the world once per validation. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
docs/M7_REPUTATION_TABLE.md: the ladder, the reaction matrix (the armour's +100/-100 marked opposite), the factions, the channels built and reserved, and every scenario row measured in the running simulation - F1, F2, F4, F5, F8, F10 to F14, U1, P1 to P5 and N1. The generator fails when the committed table differs, writes it only on request and never under CI=true, and asserts F1's and P5's opposite signs itself. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The first playthrough with the six faction beats died in m7_armour: the sentinel (65, 34, facing 242 degrees) hears the character's running approach within 18 m, turns, and wins the fight face to face. Section 13.7 makes this a STOP with two options for the owner - tune the beat (mend first; approach from behind at a walk) or drop the kill from the playthrough. docs/M7_STATUS.md records the transcript, the measured cause, both options and the recommendation, E3's scope-ledger readings, and the Phase-1 async-save test that flakes under local load. E3.5 and E3.6 stay uncommitted until the owner rules. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tion beats, and the documents
F6 shows each faction's standing, tier, seat, members and relations, the
act log with what each faction knows, the service gates, and the last
eight faction events. A reported change is a HUD log line ("The Survey:
neutral (-100), told to Sel Arien"). The playthrough gains six faction
beats between follow and ward: Tavar waits, Kera refuses the billets,
the Animated Armour is killed from behind, Kera and Sel are told.
The armour beat is tuned under the owner's ruling on the E3 STOP: a
mending stop, a run round to 12 m behind the sentinel outside its sight
and earshot, and a walk in. No game rule, number or content changed.
Documents: SYSTEMS S-27, DATA_MODEL 4.12, 4.13 and 4.15, PROGRESSION 10,
PROTOTYPE A-2, the INDEX crime row and two flagged VERTICAL_SLICE lines,
as built. M7_STATUS: the ruling, the measured awareness, E3's evidence
(verify 1,080 fields, 0 differences; the second run byte-identical) and
residues.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
NavFollower.Next, pure and integer: replan on the first of the eight triggers that holds (none, retry, goal moved, geometry, blocked, stuck, the end of a partial route, off the line), hold an unreachable route until its retry, advance past corners reached or seen past, arrive, open the nearest closed door across the way within reach (chosen by geometry, never the key), or walk to the current corner. Tests N-D2, N-D7, N-D8, N-D10, N-D17 and N-D18. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The internal OpenDoor lets a companion open an authored door from within reach of their own body; NPCs never close one, and an open door is an accepted no-op. The Phase-1 all-bodies close refusal (L-16) is lifted into SystemContext.BodyIn, and the companion's obstacle set moves verbatim to SystemContext.PersonObstacles. Neutral for the player. Tests: OpenDoor_ACompanionInReach_OpensAnAuthoredDoor_AndNeverClosesIt (World), NoDoorCloses_OnAnyBody's authored-door half (Application). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CompanionSystem.Follow gains a route mode and a nav mode (M7 design 3.11): Direct > Route > Trail > Nav. With no mark in clear view Tavar plans to the character through NavigationSystem.Follow, opens a closed door in his way with OpenDoor (a refusal counts as stuck), and with no route falls back to the oldest mark as before. The route resets at follow_near, Direct, Order, downed, Up, CatchUp and Fall. RoutePlanned is published on each replan; NavigationView.Movers lists the companion. Tests: N-A11 TheCompanion_OpensTheLodgeDoor_AfterWaitThenFollow (fails on the Phase-1 trail rule), N-A6(a) MidRoute_SaveLoad_GoesOnTheSame (saved 10 ticks after the first plan: the route is active for 16), the route assertion in HisState_RoundTripsThroughASave_FieldByField_AndGoesOnTheSame, and RoutePlanned in G5 and G27. Every other companion test is unmodified. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
F2's navigation stage draws each mover's active route as a line 0.3 m above the ground through its corners, and the companion's trail marks as posts, redrawn at most four times a second. The panel shows the last RoutePlanned. The playthrough notes each RoutePlanned as one row. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
E4 done with no STOP: 962 tests, 106 definitions, playthrough verify 1,080 fields with 0 differences, the second run byte-identical, the follow beat with no catch-up and its rows equal to E3's plus one RoutePlanned row. The ledger records the as-built readings (NavFollower.Next's reach, OpenDoor's check order, N-A6 (a)'s save point at 10 ticks). E3's own FactionContent CS8601 is fixed, and E3's evidence line on warnings is corrected where it stood. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
src/Domain/Building/Building.cs: piece definitions and their content keys, BuildingCatalog, BuildingConstants (Problem(), BLD009's ceilings), the 3 m Lattice and its slot keys, QuarterTurn, BuildingMath (world parts, sockets, strict integer overlap, reach distance, pad relief, refunds), PiecePose and Snapper. StructureFootprints.cs: TraversalClass, NavFootprint and StructureOrder. RegionLayout gains BuildAreaSite. Tests: the seven Domain building tests of section 12.3. The shipped relief is as the design measured it: 228 mm at (111-114, 105-108), 96 mm at (99-102)^2, and all 81 squares of the area under 250 mm. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ProgressionContentTests.ACopyOfTheGameConfig_Lints copies every config
file into a pack with no pieces and expects no error; with
config.building shipped, BLD006 as written ("present iff any piece or
build area exists") refuses it. Both readings and the recommendation are
recorded in M7_STATUS. E5.2's content and lints stay uncommitted until
the owner rules.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… lints Content: piece.pad/wall/doorway/roof.timber, config.building (melee damage only), item.material.timber (no_sell), loot.timber_stack and container.timber_stack at (84, 118), and build_area.hollow_crossing over the four-cell corner. BuildingContent validates and builds them: BLD001- BLD004, BLD006 and BLD007 (with the protected zones shared with check 11, ProtectedZones in World) and BLD009; WorldContent adds WLD015. SimulationSetup.Building, GameSession and TestWorlds wire BuildingSetup. BLD006 follows the owner's ruling on the E5 STOP (S1): config.building is required when any piece or build area exists, and validated in full whenever present; a valid inert config is allowed. The Phase-1 ProgressionContentTests are unedited. Tests: TheGamePack_BuildsTheCatalogueTheAreaAndTheTimberStack, EachBuildingLint_RefusesItsCraftedBadFile, the three BLD006 cases, and LoadAll_Loads_Yaml_Files' seven new IDs (113 definitions). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
piece.storage.chest (twelve stacks, its owner's alone) reuses the container model: a synthesized ContainerSite per standing chest, keyed by its piece, its identity derived from the piece, an empty baseline, the owner refusal, "empty the chest first" on take-down, and the record discarded with the piece. BLD005 gains the container rule; the replayable dump names a chest's key by its piece. Placement protects the chest's site (NewSite) and its reach. Tests: the chest rows, the two identity tests, F-E10, N-A13 (c). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
piece.station.anvil reuses the M3f station model: each standing bench is an anvil at its part's centre, keyed by its piece. SystemContext.Stations() lists the authored stations, then the benches in StructureOrder; crafting, the F4 debugger and Simulation.Stations read it. BLD005 gains the station rule (a recipe-used kind, the work anchor 0.65 m clear). Placement protects a new bench's work anchor (NewSite) and every bench's reach. The replayable dump names a bench's key by its piece, as a chest's. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Trace's bisection to the first wall moves into FirstStop, which also names every blocker the line meets there; Trace calls it and gives the same outputs. Proven neutral: every combat and Aim test unchanged and green; the playthrough transcript equals E7's row for row but the content hash and the save's run-specific raw digest, and its replayable dump differs only by the fields E8.1 and E8.2 added (null InstanceId and Owner on the authored container sites, an empty piece_stations). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Kera's workshop routes (E8's N-A10 rows; 22,685 and 40,751 expansions, as the design's model counted) took 13.5 and 22 ms a plan in Debug, where CI runs; its bound is 45 ms and CI has run 5-10x slower. Following the E1 ruling's path - profile, optimize without changing any result, re-measure: A* was nearly all of it. A shorter way to a node now moves its heap entry up instead of adding a second one (the better entry always popped first, so the pop sequence is the one the old heap gave), the (f, h) pair is one long key, the loop runs in the window's int coordinates, and a diagonal reuses its two orthogonals' walkability. Results identical: all 231 plans N-A10 makes (216 authored pairs, the model routes, Kera's) have equal expansions, probe nodes and paths before and after, and every navigation test is unchanged. The walk home: 22 ms -> 8 ms Debug, 8.8 ms -> about 3.5 ms Release. The heap holds a window's nodes at most, not 8x the cap. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The same results again (all 231 N-A10 plans equal to the E7 planner's in expansions, probe nodes and paths): a neighbour's walkability and the step onto it are read and tested in the loop, and only a node seen for the first time goes to Walk; a closed or no-shorter neighbour costs no call. Measured whole plans, median of five (the previous commit's message put the walk home at about 3.5 ms in Release before measuring it; measured it was 6.6 ms): the walk home 22.1 ms Debug / 8.8 ms Release before either commit, 7.2 ms / 6.0 ms now; Kera to the bench 13.5 / 5.2 before, 4.1 / 3.5 now. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The one damage rule: a sword's swing that strikes no creature lands, at its active window's end, on the first blocker along the facing within reach (FirstStop) when every blocker it meets there is a piece part - DamagePiece(10, "melee") in place of the miss; an authored wall, door or barrier shields. At 0 a piece is destroyed through RemoveCore with no refund: a doorway takes its door first, a chest spills each stack where it stood with its item ID kept and only its cnt_ retired (SpillContainer, ReleaseContainer). RepairPieceCommand mends to full for the cost scaled by the health missing, rounded up, refused in order. Events PieceDamaged, PieceDestroyed, PieceRepaired. Tests: the damage rules (arrows, the impulse bolt and a boar's charge take nothing), a struck creature, the authored shield, destruction and the doorway's door, repair, the chest spill, RepairCost, the footprint rule over damage, repair and destroy, G20's repair spend, the view test and G27, N-A10 with Kera's three workshop routes (22,685 / 40,751 / 40,639 expansions, as the design's model), and T10: five seeds of 500 commands with saves and loads, none throwing, each replayed equal. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The E8 rows push the Crossing Workshop's save inside a fight with a wolf, and step 10's save-and-continue then differs in the character's health (80 against 85 after 600 ticks): the character's regeneration clocks (LastCombat, LastExertion, LastCast and the part-point accumulators) are not saved, a Phase-1 gap. Both readings recorded for the owner: save the clocks (a persisted field after E2), or keep the format and save the table at rest. Recommendation: save them. E8.1-E8.4 stand as pushed; E8.5 is written and not committed. Also recorded: E8.3's neutrality, Kera's measured routes, the planner's corrected Release figure, the E8 scope ledger and the CI runner-variance risk. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A save taken while the character's pools were catching up went on differently after a load: the pauses before health, stamina, Focus and Strain return, and the part-points each had accrued, lived only in the running combat state, and a load started them at rest - health came back 8 s early (the Crossing Workshop's 80 against 85). The player record now carries VitalsClock: the absolute ticks of the last blow taken or dealt, exertion and working (or never), and the health, stamina, Focus, Strain and sprint part-points (0-999). PlayerCombat resumes from it and a capture reads it back; every With* carries it; the digest covers it (player v11). Persistence: schema 16. The player DTO gains required, strictly checked vitals; schema 15's player shape is frozen (Sections/V15) and 14 -> 15 repointed at it; 15 -> 16 gives an older save a character at rest - exactly how every older save always loaded, since the timing it did not keep cannot be reconstructed. v16 fixture written by the probe (writer pack 0.1.7); v1-v15 fixtures untouched, their expected.json gaining only the rested vitals. The migration-order assertions carry the new step. Kept out, as the documented policy: an action or blow in progress (swing, dodge, working, stagger, guard, stagger immunity, death recap). Tests: VitalsContinuationTests (failed before the fix: health, stamina and Focus diverged within a few ticks of the load), Schema16Tests, and the completeness, fixture and M6-save tests reconciled. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With schema 16 the character's vitals are equal across the save, but the Crossing Workshop's step 10 still differs: at the R46 save a wolf is one tick from biting, and a creature's attack in progress is, by the documented policy, not saved; the lost bite starts a bleed on another schedule and the worlds never meet again (health 80 against 85). Both readings recorded for the owner - save a creature's attack in progress, or keep the policy and its contract - with the recommendation to save it. Also recorded: the owner's ruling on the first E8.5 STOP, the schema-16 record, and the AsyncSave investigation (thread-pool queueing of the save continuation while other test classes run; reproduced before schema 16; not a game defect). docs/M7_VISUAL_INTEGRATION_HANDOFF.md gives the visual branch the shared files, the input and HUD contracts, the save format, the combined-build tests, and why the inventory request is not implemented. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ng on AsyncSave) A background save ran as a continuation on the shared thread pool and, in a busy parallel test run, waited up to 13 s just to begin, which is why AsyncSaveTests failed intermittently. SaveLane is one long-lived thread per session, started by its first background save, taking saves in the order queued, one at a time. Ordering, the single writer, SaveStore's atomic commit and profile lock, the one-pending-autosave rule, waits before loads, and failures as outcomes are unchanged. Disposing the session finishes the queued saves and ends the thread; a lane dropped without closing ends it too. SaveLaneTests cover ordering, one-at-a-time, a throwing save, closing while queued and while running, no thread before a save or after a close or a drop, and a save beginning while every pool thread is held. The AsyncSave test's 5 s budget is unchanged. N-A10's navigation timings now run alone after the parallel tests: a single placement check once took 47 ms (median 1.3 ms) with other classes' work landing in it. The design's 30 ms bound is unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… second E8.5 STOP) With the vitals saved, the Crossing Workshop's step 10 still differed: at the save a wolf was one tick from biting, a creature's attack in progress was not kept, and the loaded wolf began again and bit late - its bleed then fell on other ticks, 80 against 85 health after 600 ticks. Traced through Creatures.Act/Aim/Strike and Combat's CreatureStrike: the blow is the definition's one ordinary attack, no target is latched (Foe is picked every tick), nothing random is chosen at the start (the roll is keyed at impact), and a swing lands once. So the creature record's continuation gains only the tick the attack began and whom it has landed on, written while the attack still matters and restored into the same ActionState. A charge's run, companions' actions and the character's own action stay transient, as ruled. The load rule: no target is stored, so none goes stale; an attack on a creature not alive, alongside a stagger, begun before tick 0 or landed on anything but a character or NPC is rejected with its record; a landing is never looked up. Cell digest v4. Persistence: schema 17. Schema 16's creature, continuation and entities shapes frozen (Sections/V16), 13 -> 14 and 14 -> 15 repointed at them; 16 -> 17 gives older saves no attack in progress - as they always loaded; the lost windup cannot be reconstructed (documented). v17 fixture by the probe (writer pack 0.1.7) with a third den wolf mid-bite; v1-v16 bytes untouched, their expected.json gaining only "attack": null. Migration order assertions carry the new step. PERSISTENCE.md's contract now separates transient state (never persisted) from authoritative state whose omission changes the continuation (persisted when its system requires it), and names what is still not kept. Tests: CreatureAttackContinuationTests (five save moments, tick by tick and field by field against the unsaved world; four failed without the capture; a migrated schema-16 save; an absent landing), Schema17Tests, WorldDeltaTests. CrossingWorkshop_10, unchanged, passes with the E8.5 work that follows. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… in play Presentation: the build_repair action (T), bound and in F1 and the build panel's legend; build mode's target line names the piece, its health and the keys; PieceDamaged, PieceDestroyed and PieceRepaired reach the log and the toast; OpenStation reads Simulation.Stations (placed benches too); KeepContainerInReach closes the panel of a station that has vanished; Describe names piece chests and benches; the anvil bench drawn in greybox; FocusOn finds piece chests and benches. The Crossing Workshop's E8 rows (R07-R08, R15, R26-R37), with per-action gaps (blows 20 ticks apart) and a pose row that waits its After first. The headless runner plays them (CrossingWorkshop_4and8_CraftBlowsMendAndSpill, and 1to3 through the bench and chest); --build-shots plays them as b07 (step 1: 19 pieces, 31 timber, sequence 19, IDs derived 1-19), b10 (the spear at the placed bench, 1.36 m from its site), b15 (three blows, T, a fourth; the target line in words), b16 (the chest's cycle under one derived ID, ten blows, the spill picked up) and b17's chest rows; b06 no longer ends step 1. CrossingWorkshop_10, unchanged since the E8.5 STOPs, passes with schemas 16 and 17. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ints BLD005 refuses a works_at kind no recipe is worked at, and a work place farther on an axis than a walk to work can plan. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…, and their tests NpcSystem owns the errand beside the NPC: BeginWork and EndWork, a mover with no tier gate that lands exactly on the work anchor and home again, opening the doors it may. AssignWorkerCommand and ReleaseWorkerCommand refuse in the design's order; taking a station down sends its worker home. The errand's anchor and body are protected points; talk and recruitment wait for a walk to end. A load repairs errands the region no longer supports, each with an audit line. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…lk home, N-A3, N-A4 and N-A6 (b) Criterion 14 (CrossingWorkshop_5to6) holds every tick with Kinematics.Step's millimetre rounding allowed and nothing more, as E5's chase test allows it: her deepest contact is 0.483 mm. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rk anchors, b11-b13, b17's Kera rows, b20 and v3 The building perf segment asks Kera at the forge shed and lets her go. b11-b13 run with F2's navigation stage on for the seam recording. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1fe89dc; the visual handoff through E9 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…p and the crowd's reach Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…10's memory lines T2 resumes the character at (84, 110) and takes down the west wall at (87, 106.5) (the owner's ruling on the E10 STOP). It logs each timing's distribution with the collections inside it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…umbers against the budget sheet Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…only those it touches The owner's ruling on the second E10 STOP. A footprint edit no longer allocates two 160,000-byte layers on the large-object heap, which fed the background gen-2 collections that ordinary wall placements overlapped (14-18 ms). The bytes, the grid digest and every plan are unchanged (compared before and after through five edit states). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The save's synchronous capture allocated 406,680 B at the full area, rehashing the same cell's baseline for every piece and creature; now 43,256 B. The digests, and so the saved bytes, are unchanged. Steady p99 on ASTRAL 0.24-0.35 ms (target 1 ms). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each placement is the ghost's ask and then the commit, timed apart; the session's cold first use of the navigability check is logged on its own, and held under the 33 ms hitch line; each kind's first commit and the ordinary commits are logged beside all 256. A save is the synchronous capture (its cold first apart), the encode, and end to end through the store. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Steps 1-9 of the workshop table replayed from the command log: the grid, every route, the movers, the (tick, rejected) pairs and the navigation counters equal, the replayable dump with no difference, and the raw digest over step 1, which mints no item (G8). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Main times GameSession.Frame; save_ms is the synchronous capture only (a quicksave's, or the autosave frame's), the encode and the write running on the save lane (the owner's E10 ruling). Appended after the nine columns; each segment's summary gains their distributions. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…o the design's permitted list E9 made the errand getter public and added it to WorldDelta_ExposesNoPublicMutation's read list, an edit of a Phase-1 test that §12.10 does not list (S1), found at the E10 closeout. Its readers are all in the World assembly, so the getter is internal and the test is exactly as E2 left it. No behaviour changes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ORLD_ARCHITECTURE RK-A2, DATA_MODEL, SYSTEMS S-32, AGENTS.md, README The owner's ruling on the second E10 STOP and its measurement definitions are recorded (M7_STATUS, RISK_REGISTER RK-02), with the original distributions kept. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… integration handoff docs/acceptance/m7 (the playthrough) and docs/acceptance/m7_build (the build shots) from the final runs; the final runtime checks in M7_STATUS; the integration handoff with the tested commit, migration and compatibility, the runtime evidence, the files shared with the visual branches (recomputed read-only, with the in-memory merge's conflicts) and the combined-build tests. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Verdict: ready with accepted minor observations. No blocker or major finding; 1278b9c -> ac8d9d8 verified documentation-only; build, the full suite (1,092 passed + 1 Windows-only skip) and the content lint reproduced in the cloud; no pre-M7 test weakened. Adds only the audit report. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HcV4bVVVALKjUjujqNqyzF
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
One persistent draft PR for M7, per the owner's authorization of 2026-09-25. It stays a draft through E10; the owner merges and tags
m7at the merge.mainata69693108b89d471cdb409a229ba0bdf78b08fa4(Phase 1 closed).claude/m7-factions-building. Worktree:G:\UNNAMED_M7.M7_IMPLEMENTATION_DESIGN.md(kept outside the repository, in the project history folder).docs/M7_STATUS.md, updated at the end of every slice.Slices
Do not merge until the owner authorizes it at the E10 checkpoint.
🤖 Generated with Claude Code