<feed xmlns='http://www.w3.org/2005/Atom'>
<title>living-village.git/src/LivingVillage.Kernel/Occupation.fs, branch p20-map-gen-foundation</title>
<subtitle>Unnamed repository; edit this file 'description' to name the repository.
</subtitle>
<id>http://git.somhairle.bid/living-village.git/atom?h=p20-map-gen-foundation</id>
<link rel='self' href='http://git.somhairle.bid/living-village.git/atom?h=p20-map-gen-foundation'/>
<link rel='alternate' type='text/html' href='http://git.somhairle.bid/living-village.git/'/>
<updated>2026-09-21T14:55:01+00:00</updated>
<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>
<entry>
<title>feat(occupation): P11 每日任务生成纯函数 + TaskState 状态机（Kernel 侧）</title>
<updated>2026-09-21T10:40:17+00:00</updated>
<author>
<name>Somhairle H. Marisol</name>
<email>muqiu-han@outlook.com</email>
</author>
<published>2026-09-21T10:40:17+00:00</published>
<link rel='alternate' type='text/html' href='http://git.somhairle.bid/living-village.git/commit/?id=f8830705272cfa2c877cd0b984f61d1fa7a77ec2'/>
<id>urn:sha1:f8830705272cfa2c877cd0b984f61d1fa7a77ec2</id>
<content type='text'>
Occupation.fs 增补：TaskState(Offered|Active|Done|Failed)、TaskTemplateId 首期池=农夫3(送粮/帮工/翻土)+渔夫3(夜捕/卖渔/询价)、DailyTask 记录（设计 §2/§3）。生成 = taskHash(seed ^ occupationSeed, dayIndex) mod |pool|，与 Rng.fs splitmix 同源（禁 System.Random），输出只依赖三元组；taskHash 以 5 个 splitmix 已知向量钉死。完成判定 = satisfiesCompletion 纯谓词，信号 TaskSignal(Dialogued/Traded/ArrivedAt/NightAtWater) 全部来自既有事件通道（DialogueEvent/TradeEvent/到达瓦片/夜+水边），TargetNpc/TargetTile None=通配；acceptTask/applySignal/expireAt 状态机纯函数，Sim.step 数值路径零改动。货郎/书生空池 → dailyTaskOf = None。13 例测试：splitmix 向量、池约束、逐日确定性、窗口=整日、中文名、状态机转移、六模板正负完成信号、终态不可复活、逾期判负。
</content>
</entry>
<entry>
<title>feat(occupation): 职业系统第一片 — Kernel 结构 / bootstrap 注入 / 存档 v3</title>
<updated>2026-09-21T09:18:11+00:00</updated>
<author>
<name>Somhairle H. Marisol</name>
<email>muqiu-han@outlook.com</email>
</author>
<published>2026-09-21T09:18:11+00:00</published>
<link rel='alternate' type='text/html' href='http://git.somhairle.bid/living-village.git/commit/?id=cf214889490a62ba4fe84fb0055bc2133776e8a2'/>
<id>urn:sha1:cf214889490a62ba4fe84fb0055bc2133776e8a2</id>
<content type='text'>
Occupation.fs（Kind/Profile/State + 农夫/渔夫/货郎/书生 中文名常量，按设计 §1 表给初始 Money/Energy/Inventory）；ItemKind 扩出 Fish/Spice/Scroll（basePrice 分支补齐，Food 10.0f 数值路径不变 → 无职业 digest 不动）；WorldBootstrap.initialWorldWithOccupation 默认 None = 旧行为（Money/Energy 覆盖，库存字段先留数据侧、物理挂接留交易单——取舍见 design §2-C 反对加字段）；WorldSave: v3 头仅在有职业时写入（保存 saveToFileWith / loadFromFileWith，v1/v2/v3 无职业类型默认，token 顺序 version|w|h|kind|task|story|…），默认路径 save 输出逐字节等同现行 v2；P10 测试 5 例（§1 表值、v3 round-trip、v1/v2 不吞档、双 seed 逐字节、中文名）；Kernel.Tests 引用 Desktop 以驱动 WorldBootstrap（取舍：不做测试专用 shim）。TaskToken/StoryStage 为 v3 占位（任务系统后续单实现）。
</content>
</entry>
</feed>
