<feed xmlns='http://www.w3.org/2005/Atom'>
<title>living-village.git/src/LivingVillage.Kernel.Tests/OccupationStoryTests.fs, branch main</title>
<subtitle>Unnamed repository; edit this file 'description' to name the repository.
</subtitle>
<id>http://git.somhairle.bid/living-village.git/atom?h=main</id>
<link rel='self' href='http://git.somhairle.bid/living-village.git/atom?h=main'/>
<link rel='alternate' type='text/html' href='http://git.somhairle.bid/living-village.git/'/>
<updated>2026-09-22T08:33:03+00:00</updated>
<entry>
<title>feat(kernel,desktop): P31 step3 story annals + identity entry + glyph atlas</title>
<updated>2026-09-22T08:33:03+00:00</updated>
<author>
<name>Somhairle H. Marisol</name>
<email>muqiu-han@outlook.com</email>
</author>
<published>2026-09-22T08:33:03+00:00</published>
<link rel='alternate' type='text/html' href='http://git.somhairle.bid/living-village.git/commit/?id=9821b54ff2a77539898b62471d79dc4685b59cad'/>
<id>urn:sha1:9821b54ff2a77539898b62471d79dc4685b59cad</id>
<content type='text'>
- Sim.AnnalKind gains StoryAnnal (summary lives in the existing Summary
  field); WorldSave v3 serializes it with the new 'story' token. v1/v2
  saves never contain the token and stay byte-identical; v3 save -&gt; load
  -&gt; save roundtrips byte-for-byte (tested).
- Occupation.Story.identitySummaryOf: plain chronicle-style identity line
  written to the yearbook at game start (design section 3), e.g. yi-da-yu-wei-sheng.
- Desktop: story summaries render in the chronicle panel; StartNewGame
  appends the identity annal; chooseIntent now routes responses through
  Occupation.biasResponse and advances the storyline (one stage per
  player dialogue) with the summary appended as a StoryAnnal.
- M5View gains Seed (world seed source for the story start-day hash).
- Chinese copy synced into requiredUiLabels; cjk-glyphs.txt +
  CjkGlyphAtlas.characterTable extended 238 -&gt; 307 glyphs (384x480),
  atlas regenerated with the deterministic script.
- 4 new kernel tests (115 -&gt; 119); performance digest unchanged.
</content>
</entry>
<entry>
<title>feat(kernel): P31 step2 story stage state machine</title>
<updated>2026-09-22T08:24:19+00:00</updated>
<author>
<name>Somhairle H. Marisol</name>
<email>muqiu-han@outlook.com</email>
</author>
<published>2026-09-22T08:24:19+00:00</published>
<link rel='alternate' type='text/html' href='http://git.somhairle.bid/living-village.git/commit/?id=0539bba17c260f6a4b51d3cefddac0ff448c19bc'/>
<id>urn:sha1:0539bba17c260f6a4b51d3cefddac0ff448c19bc</id>
<content type='text'>
- Occupation.Story: three-segment arc per occupation (accept task -&gt; visit
  households -&gt; conclude), driven one stage per player dialogue with day
  gates derived from the same splitmix pattern as the daily task pool
  (start day = hash(seed ^ storySeed, day 0) mod 3 + 2, range [2,4]).
- relationMeanToPlayer: decayed valence mean over acquainted NPCs only
  (same decay formula as Sim.relationMatrix); no acquaintances = 0.
- Three endings (warm/plain/distant) chosen by deterministic thresholds
  (&gt;=0.3 / &gt;=0.0 / &lt;0); ending text is fixed at the concluding dialogue.
- onDialogue returns (state, summary text option) for the caller to write
  into the yearbook; StoryStage itself is unchanged (0..3) and already
  roundtrips through the existing v3 occupation segment.
- 14 new kernel tests (101 -&gt; 115); performance digest unchanged.
</content>
</entry>
</feed>
