<feed xmlns='http://www.w3.org/2005/Atom'>
<title>living-village.git/src/LivingVillage.Kernel/Occupation.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-29T00:09:12+00:00</updated>
<entry>
<title>p66: 每日任务目标具体化 TargetNpc/TargetTile 定点</title>
<updated>2026-09-29T00:09:12+00:00</updated>
<author>
<name>Somhairle H. Marisol</name>
<email>muqiu-han@outlook.com</email>
</author>
<published>2026-09-29T00:09:12+00:00</published>
<link rel='alternate' type='text/html' href='http://git.somhairle.bid/living-village.git/commit/?id=247d0bc083dffc648f043176eabf9bd4036f19e7'/>
<id>urn:sha1:247d0bc083dffc648f043176eabf9bd4036f19e7</id>
<content type='text'>
- Kernel Occupation：TaskTargets + targetNpcOf/targetTileOf + dailyTaskOfWith/
  refreshTodayWith/refreshStateWith（splitmix 同源定点，候选排序消除顺序依赖，禁随机）
- 仅既有 satisfiesCompletion 会读目标的模板定点：帮工→TargetNpc、翻土→TargetTile；
  其余 8 模板目标保持 None（不改完成语义）
- Desktop WorldBootstrap：reachableTargets（世界 NPC + 样板菜地瓦片）+
  occupationStateForWorld/refreshOccupationTodayWorld；Game 开局/跨日/证据路径切换
- 历史入口 dailyTaskOf/refreshState/occupationStateFor 保留为空候选通配包装（逐字节不变）
- 红先 P66TaskTargetTests（8 例）：同 seed 幂等、跨 seed 落在可达集合、候选顺序无关、
  历史通配回归、帮工/翻土定点门控完成、跨日重定点、v3 round-trip + v2 基线
- scripts/p66-target-report.fsx + docs/evidence/p66-analysis.txt（PASS）
- Desktop 328/328，Kernel 119/119；digest 953775FA…7F6C ×3 PASS；Sim.fs 未动
</content>
</entry>
<entry>
<title>p65: 职业切片五 货郎打听行情读 World.Rumors（中文行情短答 + 稿证据）</title>
<updated>2026-09-28T22:51:21+00:00</updated>
<author>
<name>Somhairle H. Marisol</name>
<email>muqiu-han@outlook.com</email>
</author>
<published>2026-09-28T22:51:21+00:00</published>
<link rel='alternate' type='text/html' href='http://git.somhairle.bid/living-village.git/commit/?id=2da1cbaf253245c437800e80b9aed9e8e47306b5'/>
<id>urn:sha1:2da1cbaf253245c437800e80b9aed9e8e47306b5</id>
<content type='text'>
- Kernel Occupation 新增 freshReliableRumors/inquiryRumor/marketInquiryText（纯判定+文案，
  对齐 Sim.latestRumorFor 新鲜度/可信度口径，全序命中规则，禁随机；不改 Sim.fs）
- Desktop chooseIntent：货郎 OfferTrade 读对话前谣言池，Status=inquiry|&lt;短答&gt;；statusLabel 透出
- 真字补 17 字（东头西北巷口盐巴米布茶柴涨两文落些）并重出 atlas（340 字/384x528）
- 红先 P65RumorInquiryTests（6 例）：命中/幂等/陈旧·微弱·空池/仅货郎/非货郎回归逐字节/
  save v2 头不变+v3 round-trip/穷举组合无缺字
- LV_P65_SHOT 钩子 + scripts/analyze-p65.py + docs/evidence/p65-*（PASS）
- Desktop 320/320，Kernel 119/119；digest 953775FA…7F6C ×3 PASS
</content>
</entry>
<entry>
<title>p55: 当日任务经济闭环——设计口径物品报酬入账(夜捕鱼×2/送粮食物×1, 其余不发) + 连续完成天数(streak 跨日保留/漏完成清零) + v3 streak 尾段与 save(None) 兼容 + LV_P55_SHOT 证据</title>
<updated>2026-09-28T16:24:08+00:00</updated>
<author>
<name>Somhairle H. Marisol</name>
<email>muqiu-han@outlook.com</email>
</author>
<published>2026-09-28T16:24:08+00:00</published>
<link rel='alternate' type='text/html' href='http://git.somhairle.bid/living-village.git/commit/?id=a59a4bbe1ab45adb29d1367995230d3f09847d9b'/>
<id>urn:sha1:a59a4bbe1ab45adb29d1367995230d3f09847d9b</id>
<content type='text'>
</content>
</entry>
<entry>
<title>p51: 职业系统实现首切片——开局钱/体力/背包侧车 + 当日任务/跨日刷新 + StartNewGameWith 读回(design §2.4-1)</title>
<updated>2026-09-28T14:38:52+00:00</updated>
<author>
<name>Somhairle H. Marisol</name>
<email>muqiu-han@outlook.com</email>
</author>
<published>2026-09-28T14:38:52+00:00</published>
<link rel='alternate' type='text/html' href='http://git.somhairle.bid/living-village.git/commit/?id=aa3baa953ea5c4f99f5f23cb3eef9400338b61ec'/>
<id>urn:sha1:aa3baa953ea5c4f99f5f23cb3eef9400338b61ec</id>
<content type='text'>
</content>
</entry>
<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>
<entry>
<title>feat(kernel): P31 step1 occupation dialogue response bias</title>
<updated>2026-09-22T08:16:40+00:00</updated>
<author>
<name>Somhairle H. Marisol</name>
<email>muqiu-han@outlook.com</email>
</author>
<published>2026-09-22T08:16:40+00:00</published>
<link rel='alternate' type='text/html' href='http://git.somhairle.bid/living-village.git/commit/?id=6c2f180cc7c8315e32d88cbe5d44928d495fe473'/>
<id>urn:sha1:6c2f180cc7c8315e32d88cbe5d44928d495fe473</id>
<content type='text'>
- Occupation.biasResponse: deterministic pure remap over Sim.responseFor;
  no occupation = byte-identical pass-through (all intents x personalities).
  farmer AskHelp Refused-&gt;Helpful; fisher SmallTalk Reserved-&gt;Friendly;
  peddler SmallTalk Reserved-&gt;Bargaining; scholar Joke fully overridden to
  Reserved (documented total-override semantics, opposite of personality).
- Sim.responseFor made public (same pure function, reused as the base path).
- Sim.chooseDialogueWith: extracted body of chooseDialogue with an injectable
  respond function; chooseDialogue keeps identity semantics unchanged.
- Sim.appendAnnal made public for the upcoming story annal writes.
- 9 new kernel tests (92 -&gt; 101); performance digest unchanged.
</content>
</entry>
<entry>
<title>feat(occupation): P15 补齐货郎/书生各 2 条每日任务模板 + 既有事件通道信号桥（Kernel 纯函数 TDD）</title>
<updated>2026-09-21T14:55:01+00:00</updated>
<author>
<name>Somhairle H. Marisol</name>
<email>muqiu-han@outlook.com</email>
</author>
<published>2026-09-21T14:55:01+00:00</published>
<link rel='alternate' type='text/html' href='http://git.somhairle.bid/living-village.git/commit/?id=0222501162d18447aa162e9c53e000bc42ccbbd9'/>
<id>urn:sha1:0222501162d18447aa162e9c53e000bc42ccbbd9</id>
<content type='text'>
- TaskTemplateId 扩出 BuyGoods(收货)/Resell(转卖)/ObserveNotes(观察记事)/ReasonDebate(论理)，
  taskPoolOf 货郎=[收货,转卖]、书生=[观察记事,论理]，四职业池均非空。
- TaskSignal 增 Purchased(玩家买入)/Observed(观察)，satisfiesCompletion 给出四模板完成判定；
  新增 occupationSeedOf/refreshToday（跨日才重生成，同日含 Done/Failed 终态保留）。
- signalOfInteraction/advanceTask：仅 playerId 发起的 DialogueEvent/TradeEvent 产生信号，
  NPC 互动不派任务；Offered 须先 acceptTask，终态不可复活。WorldSave 模板 token 双向同步。
- 测试 83 全绿（新增 6：池非空、货郎书生逐日池内确定、模板中文名、完成信号正负、
  事件桥含玩家买/卖与 NPC 忽略、既有 DialogueEvent→accept→Done 全链路、refreshToday 逐日）。
- 不动 Sim.step 数值路径；旧档 v3 模板 token 仅新增合法值，未知模板仍拒绝。
</content>
</entry>
<entry>
<title>feat(occupation): P12 报价偏置纯函数——货郎买卖±3.00%/书生解读±1.00%，4位定点基点，默认无职业=旧行为（TDD 6例）</title>
<updated>2026-09-21T11:30:33+00:00</updated>
<author>
<name>Somhairle H. Marisol</name>
<email>muqiu-han@outlook.com</email>
</author>
<published>2026-09-21T11:30:33+00:00</published>
<link rel='alternate' type='text/html' href='http://git.somhairle.bid/living-village.git/commit/?id=c348da258f072bc88ea422cbc534c0831817b3c8'/>
<id>urn:sha1:c348da258f072bc88ea422cbc534c0831817b3c8</id>
<content type='text'>
</content>
</entry>
<entry>
<title>feat(occupation): P11 存档 v3 today-task 尾段（annals 后追加）+ 双向兼容</title>
<updated>2026-09-21T10:49:50+00:00</updated>
<author>
<name>Somhairle H. Marisol</name>
<email>muqiu-han@outlook.com</email>
</author>
<published>2026-09-21T10:49:50+00:00</published>
<link rel='alternate' type='text/html' href='http://git.somhairle.bid/living-village.git/commit/?id=27f0ca0597e2799e2a1ed431aadeb559c6dfbcf2'/>
<id>urn:sha1:27f0ca0597e2799e2a1ed431aadeb559c6dfbcf2</id>
<content type='text'>
Occupation.State 增 Today: DailyTask option（State 声明移至 DailyTask 之后；TaskToken 保留为 v3 前缀占位扩展位）。WorldSave：saveWith 有任务时在 annals 之后追加尾段 task-today|&lt;template&gt;|&lt;state&gt;|&lt;offered&gt;|&lt;due&gt;|npc-none/some|tile-none/some；无任务/无职业不追加（默认 None = 旧行为，v2 逐字节不变）。load 重构为内部 parse 返回 (World, Occupation.State option)：尾段可选——旧 v3（P10 版式无尾段）新 reader 读出 Today=None；v1/v2 无任务；尾段后多余 token 或未知模板 token 拒绝（不吞档）。loadFromFileWith 顺手修正：不再经 stateOf 重置，前缀 task/stage 与 Today 全量保真。5 例测试：尾段位置（marker 在 annal 之后）+ 全字段 round-trip + 重存逐字节一致、无任务 v3 旧版式、v1/v2 无尾段 + 未知模板拒绝、尾段后垃圾拒绝、字节级双跑一致。
</content>
</entry>
</feed>
