@polycode-projects/the-mechanical-code-talker 4.0.0 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/README.md +178 -9
  2. package/corpus/reference/index.json.gz +0 -0
  3. package/corpus/reference/manifest.json +8 -8
  4. package/corpus/reference/shards/ref-00.jsonl.gz +0 -0
  5. package/corpus/sprites/src/sprite-facts.jsonl +401 -0
  6. package/corpus/worlds/index.json.gz +0 -0
  7. package/corpus/worlds/manifest.json +49 -9
  8. package/corpus/worlds/shards/greyvale-museum.jsonl.gz +0 -0
  9. package/corpus/worlds/shards/lantern-cottage.jsonl.gz +0 -0
  10. package/corpus/worlds/shards/mud-hollow.jsonl.gz +0 -0
  11. package/corpus/worlds/shards/mud-warren.jsonl.gz +0 -0
  12. package/corpus/worlds/shards/spider-fly.jsonl.gz +0 -0
  13. package/corpus/worlds/src/greyvale-museum.jsonl +136 -0
  14. package/corpus/worlds/src/lantern-cottage.jsonl +60 -0
  15. package/corpus/worlds/src/mud-hollow.jsonl +82 -0
  16. package/corpus/worlds/src/mud-warren.jsonl +124 -0
  17. package/corpus/worlds/src/spider-fly.jsonl +1 -1
  18. package/data/sprites/animal-icon.toml +11 -5
  19. package/data/sprites/book-icon.toml +9 -5
  20. package/data/sprites/cabinet-icon.toml +10 -5
  21. package/data/sprites/cellar-icon.toml +16 -6
  22. package/data/sprites/container-icon.toml +7 -3
  23. package/data/sprites/desk-icon.toml +8 -5
  24. package/data/sprites/dog-icon.toml +8 -5
  25. package/data/sprites/dog-with-colour-icon.toml +13 -12
  26. package/data/sprites/drawing-room-icon.toml +14 -5
  27. package/data/sprites/egg-icon.toml +6 -3
  28. package/data/sprites/fly-icon.toml +10 -5
  29. package/data/sprites/furniture-icon.toml +5 -3
  30. package/data/sprites/garden-icon.toml +10 -3
  31. package/data/sprites/key-icon.toml +3 -1
  32. package/data/sprites/kitchen-icon.toml +15 -6
  33. package/data/sprites/lamp-icon.toml +9 -4
  34. package/data/sprites/letter-icon.toml +7 -4
  35. package/data/sprites/library-icon.toml +14 -3
  36. package/data/sprites/pan-icon.toml +7 -3
  37. package/data/sprites/person-icon.toml +6 -2
  38. package/data/sprites/poodle-icon.toml +1 -1
  39. package/data/sprites/portable-icon.toml +6 -4
  40. package/data/sprites/portrait-icon.toml +7 -4
  41. package/data/sprites/room-icon.toml +11 -2
  42. package/data/sprites/spider-icon.toml +9 -3
  43. package/data/sprites/study-icon.toml +10 -2
  44. package/package.json +5 -4
  45. package/src/adapters/memory/core.mjs +20 -0
  46. package/src/domain/ask-vocab.mjs +71 -0
  47. package/src/domain/ask.mjs +168 -0
  48. package/src/domain/game-config.mjs +11 -0
  49. package/src/domain/grammar/ace.mjs +40 -4
  50. package/src/domain/grammar/lexicon-core.json +2 -1
  51. package/src/domain/grammar/lexicon.mjs +18 -0
  52. package/src/domain/mud-facts.mjs +15 -0
  53. package/src/domain/reference-pack.mjs +31 -7
  54. package/src/domain/router/drive.mjs +35 -9
  55. package/src/domain/router/registry.mjs +24 -4
  56. package/src/domain/router/resolver.mjs +102 -40
  57. package/src/domain/scene-compose.mjs +117 -0
  58. package/src/domain/spider-fly-world.mjs +37 -1
  59. package/src/domain/sprite-facts.mjs +0 -0
  60. package/src/domain/sprite-request.mjs +156 -0
  61. package/src/domain/sprite-templates.mjs +169 -20
  62. package/src/services/adventure-editor.mjs +8 -14
  63. package/src/services/adventure-viz.mjs +209 -157
  64. package/src/services/adventure.mjs +526 -391
  65. package/src/services/chat-page-viz.mjs +69 -25
  66. package/src/services/chat.mjs +200 -51
  67. package/src/services/code-explorer-viz.mjs +102 -62
  68. package/src/services/extract-facts.mjs +4 -7
  69. package/src/services/ingest-viz.mjs +68 -82
  70. package/src/services/ledger-viz.mjs +136 -67
  71. package/src/services/memory-panel-viz.mjs +62 -0
  72. package/src/services/mud-editor.mjs +10 -15
  73. package/src/services/mud-turn.mjs +6 -6
  74. package/src/services/mud-viz.mjs +1016 -208
  75. package/src/services/p2p-room.mjs +90 -23
  76. package/src/services/plan-pddl.mjs +3 -1
  77. package/src/services/plan-viz.mjs +123 -64
  78. package/src/services/research-viz.mjs +160 -108
  79. package/src/services/spider-fly-turn.mjs +15 -23
  80. package/src/services/spider-fly-viz.mjs +146 -161
  81. package/src/services/spider-fly.mjs +69 -11
  82. package/src/services/sprite-catalog-viz.mjs +414 -240
  83. package/src/services/viz-boot.mjs +71 -0
  84. package/src/services/viz-room-graph.mjs +203 -0
  85. package/src/services/viz-theme.mjs +90 -1
  86. package/src/services/viz-ticker.mjs +22 -0
  87. package/src/surfaces/web/adventure-browser-entry.mjs +49 -33
  88. package/src/surfaces/web/chat-browser-entry.mjs +30 -105
  89. package/src/surfaces/web/code-explorer-browser-entry.mjs +168 -24
  90. package/src/surfaces/web/ingest-browser-entry.mjs +3 -13
  91. package/src/surfaces/web/ledger-browser-entry.mjs +7 -47
  92. package/src/surfaces/web/memory-ask-browser.bundle.js +127 -124
  93. package/src/surfaces/web/memory-stats.mjs +11 -0
  94. package/src/surfaces/web/mud-browser-entry.mjs +71 -29
  95. package/src/surfaces/web/plan-browser-entry.mjs +22 -40
  96. package/src/surfaces/web/research-browser-entry.mjs +26 -41
  97. package/src/surfaces/web/spider-fly-browser-entry.mjs +45 -28
  98. package/src/surfaces/web/sprites-browser-entry.mjs +14 -27
  99. package/src/surfaces/web/turn-session.mjs +120 -0
  100. package/src/tools/definitions.mjs +30 -0
  101. package/src/tools/handlers/index.mjs +6 -3
  102. package/src/tools/handlers/kit.mjs +19 -2
  103. package/src/tools/handlers/tmct-ask.mjs +11 -6
  104. package/src/tools/handlers/tmct-ingest.mjs +5 -1
  105. package/src/tools/handlers/tmct-related.mjs +4 -4
  106. package/src/tools/handlers/tmct-sprite.mjs +147 -0
  107. package/src/tools/memory-fallthrough.mjs +9 -2
  108. package/src/tools/server.mjs +25 -1
@@ -0,0 +1,124 @@
1
+ {"world":"mud-warren","kind":"meta","opening":"a deep warren under a beech wood, four galleries wide, with a fox earth off the north gallery and an owl on the stump above. Food is thin down here. Say \"look\" to look around and \"go down\" to drop into the warren. Above ground the only dig is straight down; under the soil you can dig north, south, east or west, or up to break the surface."}
2
+ {"world":"mud-warren","kind":"fact","subject":"clearing","predicate":"rdf:type","object":"room"}
3
+ {"world":"mud-warren","kind":"fact","subject":"clearing","predicate":"mgx:is-origin","object":"true"}
4
+ {"world":"mud-warren","kind":"fact","subject":"stump","predicate":"rdf:type","object":"room"}
5
+ {"world":"mud-warren","kind":"fact","subject":"warren-mouth","predicate":"rdf:type","object":"room"}
6
+ {"world":"mud-warren","kind":"fact","subject":"north-gallery","predicate":"rdf:type","object":"room"}
7
+ {"world":"mud-warren","kind":"fact","subject":"south-gallery","predicate":"rdf:type","object":"room"}
8
+ {"world":"mud-warren","kind":"fact","subject":"east-run","predicate":"rdf:type","object":"room"}
9
+ {"world":"mud-warren","kind":"fact","subject":"west-run","predicate":"rdf:type","object":"room"}
10
+ {"world":"mud-warren","kind":"fact","subject":"fox-earth","predicate":"rdf:type","object":"room"}
11
+ {"world":"mud-warren","kind":"fact","subject":"clearing","predicate":"mgx:has-exit-north","object":"stump"}
12
+ {"world":"mud-warren","kind":"fact","subject":"stump","predicate":"mgx:has-exit-south","object":"clearing"}
13
+ {"world":"mud-warren","kind":"fact","subject":"clearing","predicate":"mgx:has-exit-down","object":"warren-mouth"}
14
+ {"world":"mud-warren","kind":"fact","subject":"warren-mouth","predicate":"mgx:has-exit-up","object":"clearing"}
15
+ {"world":"mud-warren","kind":"fact","subject":"warren-mouth","predicate":"mgx:has-exit-north","object":"north-gallery"}
16
+ {"world":"mud-warren","kind":"fact","subject":"north-gallery","predicate":"mgx:has-exit-south","object":"warren-mouth"}
17
+ {"world":"mud-warren","kind":"fact","subject":"warren-mouth","predicate":"mgx:has-exit-south","object":"south-gallery"}
18
+ {"world":"mud-warren","kind":"fact","subject":"south-gallery","predicate":"mgx:has-exit-north","object":"warren-mouth"}
19
+ {"world":"mud-warren","kind":"fact","subject":"warren-mouth","predicate":"mgx:has-exit-east","object":"east-run"}
20
+ {"world":"mud-warren","kind":"fact","subject":"east-run","predicate":"mgx:has-exit-west","object":"warren-mouth"}
21
+ {"world":"mud-warren","kind":"fact","subject":"warren-mouth","predicate":"mgx:has-exit-west","object":"west-run"}
22
+ {"world":"mud-warren","kind":"fact","subject":"west-run","predicate":"mgx:has-exit-east","object":"warren-mouth"}
23
+ {"world":"mud-warren","kind":"fact","subject":"north-gallery","predicate":"mgx:has-exit-east","object":"fox-earth"}
24
+ {"world":"mud-warren","kind":"fact","subject":"fox-earth","predicate":"mgx:has-exit-west","object":"north-gallery"}
25
+ {"world":"mud-warren","kind":"fact","subject":"mole-1","predicate":"rdf:type","object":"adventurer"}
26
+ {"world":"mud-warren","kind":"fact","subject":"vole-1","predicate":"rdf:type","object":"adventurer"}
27
+ {"world":"mud-warren","kind":"fact","subject":"badger-2","predicate":"rdf:type","object":"adventurer"}
28
+ {"world":"mud-warren","kind":"fact","subject":"groundhog-1","predicate":"rdf:type","object":"adventurer"}
29
+ {"world":"mud-warren","kind":"fact","subject":"meerkat-1","predicate":"rdf:type","object":"adventurer"}
30
+ {"world":"mud-warren","kind":"fact","subject":"mole-1","predicate":"mgx:currently-in","object":"clearing"}
31
+ {"world":"mud-warren","kind":"fact","subject":"vole-1","predicate":"mgx:currently-in","object":"clearing"}
32
+ {"world":"mud-warren","kind":"fact","subject":"badger-2","predicate":"mgx:currently-in","object":"warren-mouth"}
33
+ {"world":"mud-warren","kind":"fact","subject":"groundhog-1","predicate":"mgx:currently-in","object":"warren-mouth"}
34
+ {"world":"mud-warren","kind":"fact","subject":"meerkat-1","predicate":"mgx:currently-in","object":"south-gallery"}
35
+ {"world":"mud-warren","kind":"fact","subject":"mole-1","predicate":"mgx:hasMass","object":"8"}
36
+ {"world":"mud-warren","kind":"fact","subject":"vole-1","predicate":"mgx:hasMass","object":"6"}
37
+ {"world":"mud-warren","kind":"fact","subject":"badger-2","predicate":"mgx:hasMass","object":"12"}
38
+ {"world":"mud-warren","kind":"fact","subject":"groundhog-1","predicate":"mgx:hasMass","object":"9"}
39
+ {"world":"mud-warren","kind":"fact","subject":"meerkat-1","predicate":"mgx:hasMass","object":"9"}
40
+ {"world":"mud-warren","kind":"fact","subject":"predator","predicate":"rdfs:subClassOf","object":"animal"}
41
+ {"world":"mud-warren","kind":"fact","subject":"fox","predicate":"rdfs:subClassOf","object":"predator"}
42
+ {"world":"mud-warren","kind":"fact","subject":"owl","predicate":"rdfs:subClassOf","object":"predator"}
43
+ {"world":"mud-warren","kind":"fact","subject":"fox-1","predicate":"rdf:type","object":"fox"}
44
+ {"world":"mud-warren","kind":"fact","subject":"fox-1","predicate":"mgx:currently-in","object":"fox-earth"}
45
+ {"world":"mud-warren","kind":"fact","subject":"fox-1","predicate":"mgx:is-predator","object":"true"}
46
+ {"world":"mud-warren","kind":"fact","subject":"fox-1","predicate":"mgx:hasMass","object":"40"}
47
+ {"world":"mud-warren","kind":"fact","subject":"owl-1","predicate":"rdf:type","object":"owl"}
48
+ {"world":"mud-warren","kind":"fact","subject":"owl-1","predicate":"mgx:currently-in","object":"stump"}
49
+ {"world":"mud-warren","kind":"fact","subject":"owl-1","predicate":"mgx:is-predator","object":"true"}
50
+ {"world":"mud-warren","kind":"fact","subject":"owl-1","predicate":"mgx:hasMass","object":"14"}
51
+ {"world":"mud-warren","kind":"fact","subject":"food","predicate":"rdfs:subClassOf","object":"portable"}
52
+ {"world":"mud-warren","kind":"fact","subject":"carrot","predicate":"rdfs:subClassOf","object":"food"}
53
+ {"world":"mud-warren","kind":"fact","subject":"lettuce","predicate":"rdfs:subClassOf","object":"food"}
54
+ {"world":"mud-warren","kind":"fact","subject":"tomato","predicate":"rdfs:subClassOf","object":"food"}
55
+ {"world":"mud-warren","kind":"fact","subject":"carrot","predicate":"rdf:type","object":"carrot"}
56
+ {"world":"mud-warren","kind":"fact","subject":"carrot","predicate":"mgx:located-in","object":"west-run"}
57
+ {"world":"mud-warren","kind":"fact","subject":"carrot","predicate":"mgx:hasMass","object":"3"}
58
+ {"world":"mud-warren","kind":"fact","subject":"lettuce","predicate":"rdf:type","object":"lettuce"}
59
+ {"world":"mud-warren","kind":"fact","subject":"lettuce","predicate":"mgx:located-in","object":"south-gallery"}
60
+ {"world":"mud-warren","kind":"fact","subject":"lettuce","predicate":"mgx:hasMass","object":"2"}
61
+ {"world":"mud-warren","kind":"fact","subject":"tomato","predicate":"rdf:type","object":"tomato"}
62
+ {"world":"mud-warren","kind":"fact","subject":"tomato","predicate":"mgx:located-in","object":"east-run"}
63
+ {"world":"mud-warren","kind":"fact","subject":"tomato","predicate":"mgx:hasMass","object":"2"}
64
+ {"world":"mud-warren","kind":"fact","subject":"root","predicate":"rdfs:subClassOf","object":"food"}
65
+ {"world":"mud-warren","kind":"fact","subject":"root","predicate":"mgx:hasMass","object":"2"}
66
+ {"world":"mud-warren","kind":"fact","subject":"worm","predicate":"rdfs:subClassOf","object":"food"}
67
+ {"world":"mud-warren","kind":"fact","subject":"worm","predicate":"mgx:hasMass","object":"2"}
68
+ {"world":"mud-warren","kind":"fact","subject":"mouse","predicate":"rdfs:subClassOf","object":"animal"}
69
+ {"world":"mud-warren","kind":"fact","subject":"mouse","predicate":"mgx:hasMass","object":"4"}
70
+ {"world":"mud-warren","kind":"fact","subject":"den","predicate":"rdfs:subClassOf","object":"underground-space"}
71
+ {"world":"mud-warren","kind":"fact","subject":"underground-space","predicate":"mgx:dig-spawns","object":"root"}
72
+ {"world":"mud-warren","kind":"fact","subject":"underground-space","predicate":"mgx:dig-spawns","object":"worm"}
73
+ {"world":"mud-warren","kind":"fact","subject":"underground-space","predicate":"mgx:den-spawns","object":"root"}
74
+ {"world":"mud-warren","kind":"fact","subject":"underground-space","predicate":"mgx:den-spawns","object":"worm"}
75
+ {"world":"mud-warren","kind":"fact","subject":"underground-space","predicate":"mgx:den-resident","object":"mouse"}
76
+ {"world":"mud-warren","kind":"fact","subject":"underground-space","predicate":"mgx:dig-spawn-max","object":"1"}
77
+ {"world":"mud-warren","kind":"fact","subject":"underground-space","predicate":"mgx:den-chance-in","object":"8"}
78
+ {"world":"mud-warren","kind":"fact","subject":"underground-space","predicate":"mgx:den-resident-chance-in","object":"2"}
79
+ {"world":"mud-warren","kind":"fact","subject":"clearing","predicate":"mgx:dig-reach","object":"10"}
80
+ {"world":"mud-warren","kind":"fact","subject":"mole-1","predicate":"mgx:mass-drain-per-turn","object":"0.10"}
81
+ {"world":"mud-warren","kind":"fact","subject":"vole-1","predicate":"mgx:mass-drain-per-turn","object":"0.09"}
82
+ {"world":"mud-warren","kind":"fact","subject":"badger-2","predicate":"mgx:mass-drain-per-turn","object":"0.14"}
83
+ {"world":"mud-warren","kind":"fact","subject":"groundhog-1","predicate":"mgx:mass-drain-per-turn","object":"0.11"}
84
+ {"world":"mud-warren","kind":"fact","subject":"meerkat-1","predicate":"mgx:mass-drain-per-turn","object":"0.09"}
85
+ {"world":"mud-warren","kind":"fact","subject":"stone","predicate":"rdf:type","object":"portable"}
86
+ {"world":"mud-warren","kind":"fact","subject":"stone","predicate":"mgx:located-in","object":"clearing"}
87
+ {"world":"mud-warren","kind":"fact","subject":"seed","predicate":"rdf:type","object":"portable"}
88
+ {"world":"mud-warren","kind":"fact","subject":"seed","predicate":"mgx:located-in","object":"stump"}
89
+ {"world":"mud-warren","kind":"fact","subject":"basket","predicate":"rdf:type","object":"furniture"}
90
+ {"world":"mud-warren","kind":"fact","subject":"basket","predicate":"mgx:fixed-in","object":"warren-mouth"}
91
+ {"world":"mud-warren","kind":"fact","subject":"basket","predicate":"mgx:is-container","object":"true"}
92
+ {"world":"mud-warren","kind":"fact","subject":"basket","predicate":"mgx:is-open","object":"true"}
93
+ {"world":"mud-warren","kind":"fact","subject":"room","predicate":"rdfs:subClassOf","object":"space"}
94
+ {"world":"mud-warren","kind":"fact","subject":"clearing","predicate":"rdf:type","object":"outdoor-space"}
95
+ {"world":"mud-warren","kind":"fact","subject":"stump","predicate":"rdf:type","object":"outdoor-space"}
96
+ {"world":"mud-warren","kind":"fact","subject":"warren-mouth","predicate":"rdf:type","object":"underground-space"}
97
+ {"world":"mud-warren","kind":"fact","subject":"north-gallery","predicate":"rdf:type","object":"underground-space"}
98
+ {"world":"mud-warren","kind":"fact","subject":"south-gallery","predicate":"rdf:type","object":"underground-space"}
99
+ {"world":"mud-warren","kind":"fact","subject":"east-run","predicate":"rdf:type","object":"underground-space"}
100
+ {"world":"mud-warren","kind":"fact","subject":"west-run","predicate":"rdf:type","object":"underground-space"}
101
+ {"world":"mud-warren","kind":"fact","subject":"fox-earth","predicate":"rdf:type","object":"underground-space"}
102
+ {"world":"mud-warren","kind":"fact","subject":"outdoor-space","predicate":"rdfs:subClassOf","object":"space"}
103
+ {"world":"mud-warren","kind":"fact","subject":"underground-space","predicate":"rdfs:subClassOf","object":"space"}
104
+ {"world":"mud-warren","kind":"rule","name":"go","ruleKind":"action-signature","slots":{"subjectClass":"adventurer","targetClass":"room"}}
105
+ {"world":"mud-warren","kind":"rule","name":"go","ruleKind":"action-signature","slots":{"subjectClass":"person","targetClass":"room"}}
106
+ {"world":"mud-warren","kind":"rule","name":"go","ruleKind":"action-effect","slots":{"predicate":"currently-in","subjectRole":"subject","objectRole":"target"}}
107
+ {"world":"mud-warren","kind":"rule","name":"take","ruleKind":"action-signature","slots":{"subjectClass":"portable","targetClass":"adventurer"}}
108
+ {"world":"mud-warren","kind":"rule","name":"take","ruleKind":"action-effect","slots":{"predicate":"located-in","subjectRole":"subject","objectRole":"target"}}
109
+ {"world":"mud-warren","kind":"rule","name":"drop","ruleKind":"action-signature","slots":{"subjectClass":"portable","targetClass":"room"}}
110
+ {"world":"mud-warren","kind":"rule","name":"drop","ruleKind":"action-effect","slots":{"predicate":"located-in","subjectRole":"subject","objectRole":"target"}}
111
+ {"world":"mud-warren","kind":"rule","name":"give","ruleKind":"action-signature","slots":{"subjectClass":"portable","targetClass":"person"}}
112
+ {"world":"mud-warren","kind":"rule","name":"give","ruleKind":"action-effect","slots":{"predicate":"located-in","subjectRole":"subject","objectRole":"target"}}
113
+ {"world":"mud-warren","kind":"rule","name":"open","ruleKind":"action-signature","slots":{"subjectClass":"adventurer","targetClass":"furniture"}}
114
+ {"world":"mud-warren","kind":"rule","name":"open","ruleKind":"action-precond","slots":{"shape":"fact-value","predicate":"stands-locked-in","role":"target","scope":"any","negate":"true"}}
115
+ {"world":"mud-warren","kind":"rule","name":"open","ruleKind":"action-precond","slots":{"shape":"fact-value","predicate":"is-open","role":"target","scope":"any","value":"true","negate":"true"}}
116
+ {"world":"mud-warren","kind":"rule","name":"open","ruleKind":"action-effect","slots":{"predicate":"is-open","subjectRole":"target","value":"true"}}
117
+ {"world":"mud-warren","kind":"rule","name":"close","ruleKind":"action-signature","slots":{"subjectClass":"adventurer","targetClass":"furniture"}}
118
+ {"world":"mud-warren","kind":"rule","name":"close","ruleKind":"action-precond","slots":{"shape":"fact-value","predicate":"is-open","role":"target","scope":"any","value":"true"}}
119
+ {"world":"mud-warren","kind":"rule","name":"close","ruleKind":"action-effect","slots":{"predicate":"is-open","subjectRole":"target","value":"false"}}
120
+ {"world":"mud-warren","kind":"rule","name":"unlock","ruleKind":"action-signature","slots":{"subjectClass":"adventurer","targetClass":"furniture"}}
121
+ {"world":"mud-warren","kind":"rule","name":"dig","ruleKind":"action-signature","slots":{"subjectClass":"adventurer","targetClass":"room"}}
122
+ {"world":"mud-warren","kind":"rule","name":"eat","ruleKind":"action-signature","slots":{"subjectClass":"adventurer","targetClass":"food"}}
123
+ {"world":"mud-warren","kind":"rule","name":"put","ruleKind":"action-signature","slots":{"subjectClass":"portable","targetClass":"furniture"}}
124
+ {"world":"mud-warren","kind":"rule","name":"put","ruleKind":"action-effect","slots":{"predicate":"located-in","subjectRole":"subject","objectRole":"target"}}
@@ -1,4 +1,4 @@
1
- {"world":"spider-fly","kind":"meta","opening":"a spider waits in its web; a fly drifts in from the edge of the board. Neither is yours to move — watch, or address one by name in chat."}
1
+ {"world":"spider-fly","kind":"meta","opening":"a spider waits in its web; a fly drifts in from the edge of the board. Neither is yours to move. Watch, or address one by name in chat."}
2
2
  {"world":"spider-fly","kind":"fact","subject":"cell-1-1","predicate":"rdf:type","object":"cell"}
3
3
  {"world":"spider-fly","kind":"fact","subject":"cell-1-1","predicate":"mgx:has-exit-south","object":"cell-1-2"}
4
4
  {"world":"spider-fly","kind":"fact","subject":"cell-1-1","predicate":"mgx:has-exit-east","object":"cell-2-1"}
@@ -1,13 +1,19 @@
1
- # animal — the deliberately plainest shape in the set: an unadorned
2
- # four-legged blob, so an unregistered species reads as "some animal"
3
- # rather than suggesting one the taxonomy never named. The declared root
4
- # fallback for the spider-and-fly world.
1
+ # animal — the deliberately plainest shape in the set: still an unadorned
2
+ # four-legged body, so an unregistered species reads as "some animal"
3
+ # rather than suggesting one the taxonomy never named. Small ears and a
4
+ # tail give it a quadruped-mammal silhouette instead of a bare blob, but
5
+ # no fixed markings or colour ever get added — that specificity belongs
6
+ # to the species that actually earns it (badger, dog, poodle). The
7
+ # declared root fallback for the spider-and-fly world.
5
8
  classes = ["animal"]
6
9
  svg = """
7
10
  <svg viewBox="0 0 24 24" aria-hidden="true">
8
11
  <ellipse cx="12" cy="13" rx="7" ry="4.4" fill="currentColor"/>
12
+ <path d="M20.4 12.6 C22.4 12 23 14 21.6 14.8 Z" fill="currentColor"/>
9
13
  <circle cx="12" cy="7" r="3.4" fill="currentColor"/>
10
- <g stroke="currentColor" stroke-width="1.6" stroke-linecap="round">
14
+ <path d="M9 4.4 L8 2.2 L10.4 3.6 Z" fill="currentColor"/>
15
+ <path d="M15 4.4 L16 2.2 L13.6 3.6 Z" fill="currentColor"/>
16
+ <g stroke="currentColor" stroke-width="1.8" stroke-linecap="round">
11
17
  <line x1="7" y1="17" x2="7" y2="21"/>
12
18
  <line x1="17" y1="17" x2="17" y2="21"/>
13
19
  </g>
@@ -1,12 +1,16 @@
1
- # book — the library's default portable: a closed hardback seen spine-on, the
2
- # cover boards and a page block, so a taken book reads as its own thing rather
3
- # than the generic portable box.
1
+ # book — the library's default portable: a closed hardback seen spine-on. The
2
+ # fore-edge shows a visible page block (paper is always lighter than a cover)
3
+ # and a ribbon marks a place — a wax-red fixed accent, since a bookmark
4
+ # ribbon's colour is its own trim rather than something a theme should own —
5
+ # so a taken book reads as its own thing rather than the generic portable box.
4
6
  classes = ["book"]
5
7
  svg = """
6
8
  <svg viewBox="0 0 24 24" aria-hidden="true">
7
9
  <path d="M6 3 H18 A1 1 0 0 1 19 4 V20 A1 1 0 0 1 18 21 H6 Z" fill="currentColor"/>
8
- <rect x="6" y="3" width="1.8" height="18" fill="currentColor" opacity="0.4"/>
10
+ <rect x="17.1" y="3.6" width="1.6" height="16.8" rx="0.3" fill="color-mix(in srgb, currentColor 34%, white)"/>
11
+ <rect x="6" y="3" width="1.8" height="18" fill="color-mix(in srgb, currentColor 78%, black)"/>
9
12
  <path d="M9.4 3 V21" stroke="currentColor" stroke-width="0.5" opacity="0.35"/>
10
- <path d="M11 7.5 H17 M11 10 H17 M11 12.5 H15" stroke="#000000" stroke-width="0.5" opacity="0.3"/>
13
+ <path d="M11 8 H15 M11 10.6 H15" stroke="color-mix(in srgb, currentColor 60%, black)" stroke-width="0.6"/>
14
+ <path d="M16.8 3 V11 L15.9 9.8 L15 11 V3 Z" fill="#8a2e2e"/>
11
15
  </svg>
12
16
  """
@@ -1,13 +1,18 @@
1
1
  # cabinet — Ashcombe Hall's own locked cabinet (a container): a two-door
2
- # wardrobe silhouette, the gap between the doors reading as the seam, with
3
- # two knobs and a cornice band.
2
+ # wardrobe silhouette, the gap between the doors reading as the seam. Each
3
+ # door carries a recessed raised-panel outline, the classic wardrobe-door
4
+ # cue, plus a cornice band above and a plinth below so it reads as a
5
+ # standing piece of furniture rather than a wall panel.
4
6
  classes = ["cabinet"]
5
7
  svg = """
6
8
  <svg viewBox="0 0 24 24" aria-hidden="true">
7
9
  <rect x="4.5" y="2.5" width="7.2" height="19" rx="1" fill="currentColor"/>
8
10
  <rect x="12.3" y="2.5" width="7.2" height="19" rx="1" fill="currentColor"/>
9
- <rect x="4.5" y="2.5" width="15" height="1.4" fill="currentColor" opacity="0.4"/>
10
- <circle cx="10.6" cy="12" r="0.9" fill="currentColor" opacity="0.35"/>
11
- <circle cx="13.4" cy="12" r="0.9" fill="currentColor" opacity="0.35"/>
11
+ <rect x="4.5" y="2.5" width="15" height="1.6" fill="color-mix(in srgb, currentColor 70%, black)"/>
12
+ <rect x="4.5" y="20.1" width="15" height="1.4" fill="color-mix(in srgb, currentColor 70%, black)"/>
13
+ <rect x="6" y="5.4" width="4.2" height="13.4" rx="0.4" fill="none" stroke="color-mix(in srgb, currentColor 55%, black)" stroke-width="0.6"/>
14
+ <rect x="13.8" y="5.4" width="4.2" height="13.4" rx="0.4" fill="none" stroke="color-mix(in srgb, currentColor 55%, black)" stroke-width="0.6"/>
15
+ <circle cx="10.6" cy="12" r="1" fill="color-mix(in srgb, currentColor 65%, black)"/>
16
+ <circle cx="13.4" cy="12" r="1" fill="color-mix(in srgb, currentColor 65%, black)"/>
12
17
  </svg>
13
18
  """
@@ -1,12 +1,22 @@
1
- # cellar — an underground space: a room box with a stair stepping down and
2
- # stone coursing, so the room-kind icon reads as below ground rather than a
3
- # plain room, matching the underground border.
1
+ # cellar — an underground space: a room box with a stair stepping down into
2
+ # it and stone coursing on the back wall, so the room-kind icon reads as
3
+ # below ground rather than a plain room, matching the underground border.
4
+ # The wash is a fixed white/black tint rather than currentColor-mixed (the
5
+ # same reason room.toml's own wash is fixed): a tint built from currentColor
6
+ # reverses direction between a light and a dark theme, a plain white/black
7
+ # one never does.
4
8
  classes = ["cellar"]
5
9
  svg = """
6
10
  <svg viewBox="0 0 24 24" aria-hidden="true">
7
- <rect x="3" y="3" width="18" height="18" rx="1" fill="currentColor" opacity="0.14"/>
11
+ <defs>
12
+ <linearGradient id="cellar-wash" x1="0" y1="0" x2="0.4" y2="1">
13
+ <stop offset="0%" stop-color="#ffffff" stop-opacity="0.06"/>
14
+ <stop offset="100%" stop-color="#000000" stop-opacity="0.22"/>
15
+ </linearGradient>
16
+ </defs>
17
+ <rect x="3" y="3" width="18" height="18" rx="1" fill="url(#cellar-wash)"/>
8
18
  <rect x="3" y="3" width="18" height="18" rx="1" fill="none" stroke="currentColor" stroke-width="1.6"/>
9
- <path d="M6 8 H10 V11 H14 V14 H18 V18 H6 Z" fill="currentColor" opacity="0.55"/>
10
- <path d="M3 12 H21 M3 16.5 H21" stroke="currentColor" stroke-width="0.5" opacity="0.4"/>
19
+ <path d="M8 3 V21 M14 3 V21" stroke="currentColor" stroke-width="0.4" opacity="0.25"/>
20
+ <path d="M6 7.5 H10 V10.5 H14 V13.5 H18 V17.5 H6 Z" fill="currentColor"/>
11
21
  </svg>
12
22
  """
@@ -1,12 +1,16 @@
1
1
  # container — the generic fallback for any container with no sprite of
2
2
  # its own (see cabinet/portrait for Ashcombe Hall's own two): a solid
3
- # chest silhouette with a carved lid-seam and a latch highlight.
3
+ # chest silhouette with a carved lid-seam and a latch plate with its own
4
+ # keyhole cut into it, so "container" reads as a locked chest rather than
5
+ # a plain crate.
4
6
  classes = ["container"]
5
7
  svg = """
6
8
  <svg viewBox="0 0 24 24" aria-hidden="true">
7
9
  <path d="M3 10 L5 5 H19 L21 10 Z" fill="currentColor"/>
8
10
  <rect x="3" y="10" width="18" height="10" rx="1.2" fill="currentColor"/>
9
- <rect x="3" y="10" width="18" height="1.6" fill="currentColor" opacity="0.35"/>
10
- <rect x="10.6" y="9.2" width="2.8" height="2.6" rx="0.5" fill="currentColor" opacity="0.85"/>
11
+ <rect x="3" y="10" width="18" height="1.8" fill="color-mix(in srgb, currentColor 70%, black)"/>
12
+ <rect x="10" y="9" width="4" height="3.2" rx="0.5" fill="color-mix(in srgb, currentColor 55%, black)"/>
13
+ <circle cx="12" cy="10.4" r="0.55" fill="color-mix(in srgb, currentColor 20%, white)"/>
14
+ <path d="M11.8 10.9 L12.2 10.9 L12.45 12 L11.55 12 Z" fill="color-mix(in srgb, currentColor 20%, white)"/>
11
15
  </svg>
12
16
  """
@@ -1,13 +1,16 @@
1
1
  # desk — Ashcombe Hall's own study desk: a tabletop bar over two drawer
2
- # blocks with pull-knobs, on tapered legs.
2
+ # blocks with pull-knobs and a drawer-front groove, on tapered legs.
3
3
  classes = ["desk"]
4
4
  svg = """
5
5
  <svg viewBox="0 0 24 24" aria-hidden="true">
6
6
  <rect x="3" y="7" width="18" height="2.6" rx="0.6" fill="currentColor"/>
7
- <rect x="4.4" y="9.6" width="6.6" height="5.6" rx="0.6" fill="currentColor" opacity="0.85"/>
8
- <rect x="13" y="9.6" width="6.6" height="5.6" rx="0.6" fill="currentColor" opacity="0.85"/>
9
- <circle cx="9.6" cy="12.4" r="0.55" fill="currentColor" opacity="0.4"/>
10
- <circle cx="16.4" cy="12.4" r="0.55" fill="currentColor" opacity="0.4"/>
7
+ <rect x="3.4" y="7.3" width="17.2" height="0.6" fill="color-mix(in srgb, currentColor 30%, white)"/>
8
+ <rect x="4.4" y="9.6" width="6.6" height="5.6" rx="0.6" fill="currentColor"/>
9
+ <rect x="13" y="9.6" width="6.6" height="5.6" rx="0.6" fill="currentColor"/>
10
+ <path d="M5.4 12.4 H10" stroke="color-mix(in srgb, currentColor 60%, black)" stroke-width="0.5"/>
11
+ <path d="M14 12.4 H18.6" stroke="color-mix(in srgb, currentColor 60%, black)" stroke-width="0.5"/>
12
+ <circle cx="9.6" cy="12.4" r="0.6" fill="color-mix(in srgb, currentColor 55%, black)"/>
13
+ <circle cx="16.4" cy="12.4" r="0.6" fill="color-mix(in srgb, currentColor 55%, black)"/>
11
14
  <path d="M4.6 15.2 L3.8 20.5 L5.6 20.5 L6.2 15.2 Z" fill="currentColor"/>
12
15
  <path d="M17.8 15.2 L17.2 20.5 L19 20.5 L18.2 15.2 Z" fill="currentColor"/>
13
16
  </svg>
@@ -1,15 +1,18 @@
1
1
  # dog — the plain-class sprite a taxonomy hop away from poodle/sheepdog.
2
2
  # Same body language as poodle's, without the pompom cut, so the family
3
- # reads as one dog rather than two unrelated animals.
3
+ # reads as one dog rather than two unrelated animals. A muzzle bump breaks
4
+ # the head silhouette and the tail curls up and alert rather than hanging,
5
+ # so the pose itself carries the identity even before any colour is added.
4
6
  classes = ["dog"]
5
7
  svg = """
6
8
  <svg viewBox="0 0 24 24" aria-hidden="true">
7
9
  <ellipse cx="13" cy="15" rx="6.4" ry="4.3" fill="currentColor"/>
10
+ <path d="M19 13.4 C22.4 11.6 23.4 14.8 21.4 16.2 C20.6 15 19.8 14.2 19 13.4 Z" fill="currentColor"/>
8
11
  <circle cx="7" cy="9" r="3.6" fill="currentColor"/>
9
- <ellipse cx="6.1" cy="8" rx="1" ry="1.3" fill="currentColor" opacity="0.3"/>
10
- <path d="M4.5 6.5 L2 3 L6 5 Z" fill="currentColor"/>
11
- <path d="M19 13 C22 12 22.5 15 20 16 Z" fill="currentColor"/>
12
- <g stroke="currentColor" stroke-width="1.6" stroke-linecap="round">
12
+ <ellipse cx="3.3" cy="9.8" rx="1.7" ry="1.3" fill="currentColor"/>
13
+ <path d="M4.6 6.4 C2.8 5 1.8 3.4 2.2 2.4 C4.2 2.6 6 4.4 6.4 6.6 Z" fill="currentColor"/>
14
+ <circle cx="5.3" cy="8.2" r="0.45" fill="color-mix(in srgb, currentColor 20%, black)"/>
15
+ <g stroke="currentColor" stroke-width="1.8" stroke-linecap="round">
13
16
  <line x1="9" y1="19" x2="9" y2="22"/>
14
17
  <line x1="17" y1="19" x2="17" y2="22"/>
15
18
  </g>
@@ -1,21 +1,22 @@
1
1
  # dog-with-colour — the parameterized-property worked example: "a dog that
2
- # is black". Same silhouette as dog.toml, but every filled shape takes its
3
- # color from the instance's OWN observed
4
- # mgx:hasProperty value rather than the page's currentColor accent, with a
5
- # thin currentColor stroke kept on each shape so a light value (white)
6
- # still reads against a light card background. A property value with no
7
- # entry in [parameters.colour.values] is not a match for this template at
8
- # all (see sprite-templates.mjs's own header for the naming/specificity
9
- # convention) — it falls through to the plain dog.toml sprite, never a
10
- # guessed color.
2
+ # is black". Same silhouette as dog.toml (muzzle bump, curled alert tail,
3
+ # floppy ear), but every filled shape takes its color from the instance's
4
+ # OWN observed mgx:hasProperty value rather than the page's currentColor
5
+ # accent, with a thin currentColor stroke kept on each shape so a light
6
+ # value (white) still reads against a light card background. A property
7
+ # value with no entry in [parameters.colour.values] is not a match for
8
+ # this template at all (see sprite-templates.mjs's own header for the
9
+ # naming/specificity convention) — it falls through to the plain dog.toml
10
+ # sprite, never a guessed color.
11
11
  classes = ["dog"]
12
12
  svg = """
13
13
  <svg viewBox="0 0 24 24" aria-hidden="true">
14
14
  <ellipse cx="13" cy="15" rx="6.4" ry="4.3" fill="{{FILL}}" stroke="currentColor" stroke-width="0.9"/>
15
+ <path d="M19 13.4 C22.4 11.6 23.4 14.8 21.4 16.2 C20.6 15 19.8 14.2 19 13.4 Z" fill="{{FILL}}" stroke="currentColor" stroke-width="0.9"/>
15
16
  <circle cx="7" cy="9" r="3.6" fill="{{FILL}}" stroke="currentColor" stroke-width="0.9"/>
16
- <path d="M4.5 6.5 L2 3 L6 5 Z" fill="{{FILL}}" stroke="currentColor" stroke-width="0.9"/>
17
- <path d="M19 13 C22 12 22.5 15 20 16 Z" fill="{{FILL}}" stroke="currentColor" stroke-width="0.9"/>
18
- <g stroke="currentColor" stroke-width="1.6" stroke-linecap="round">
17
+ <ellipse cx="3.3" cy="9.8" rx="1.7" ry="1.3" fill="{{FILL}}" stroke="currentColor" stroke-width="0.9"/>
18
+ <path d="M4.6 6.4 C2.8 5 1.8 3.4 2.2 2.4 C4.2 2.6 6 4.4 6.4 6.6 Z" fill="{{FILL}}" stroke="currentColor" stroke-width="0.9"/>
19
+ <g stroke="currentColor" stroke-width="1.8" stroke-linecap="round">
19
20
  <line x1="9" y1="19" x2="9" y2="22"/>
20
21
  <line x1="17" y1="19" x2="17" y2="22"/>
21
22
  </g>
@@ -1,13 +1,22 @@
1
1
  # drawing-room — a room floor plan marked by a framed picture on the wall (the
2
2
  # portrait hangs here), so the room-kind icon reads as the drawing room rather
3
- # than a plain room.
3
+ # than a plain room. The wash is a fixed white/black tint rather than
4
+ # currentColor-mixed (see room-icon.toml's own header for why), and the
5
+ # canvas behind the framed bust gets its own lighter tone so frame, canvas
6
+ # and figure read as three distinct layers rather than one flat block.
4
7
  classes = ["drawing-room"]
5
8
  svg = """
6
9
  <svg viewBox="0 0 24 24" aria-hidden="true">
7
- <rect x="3" y="3" width="18" height="18" rx="1" fill="currentColor" opacity="0.14"/>
10
+ <defs>
11
+ <linearGradient id="drawing-room-wash" x1="0" y1="0" x2="0.4" y2="1">
12
+ <stop offset="0%" stop-color="#ffffff" stop-opacity="0.1"/>
13
+ <stop offset="100%" stop-color="#000000" stop-opacity="0.14"/>
14
+ </linearGradient>
15
+ </defs>
16
+ <rect x="3" y="3" width="18" height="18" rx="1" fill="url(#drawing-room-wash)"/>
8
17
  <rect x="3" y="3" width="18" height="18" rx="1" fill="none" stroke="currentColor" stroke-width="1.6"/>
9
- <rect x="8.5" y="7" width="7" height="6" rx="0.4" fill="none" stroke="currentColor" stroke-width="1.3"/>
10
- <circle cx="12" cy="9.4" r="1.1" fill="currentColor" opacity="0.7"/>
11
- <path d="M9.6 12.4 C9.6 10.9 10.6 10 12 10 C13.4 10 14.4 10.9 14.4 12.4 Z" fill="currentColor" opacity="0.7"/>
18
+ <rect x="8.5" y="7" width="7" height="6" rx="0.4" fill="color-mix(in srgb, currentColor 22%, white)" stroke="currentColor" stroke-width="1.3"/>
19
+ <circle cx="12" cy="9.4" r="1.1" fill="currentColor"/>
20
+ <path d="M9.6 12.4 C9.6 10.9 10.6 10 12 10 C13.4 10 14.4 10.9 14.4 12.4 Z" fill="currentColor"/>
12
21
  </svg>
13
22
  """
@@ -1,9 +1,12 @@
1
- # egg — the spider-and-fly board's laid egg. The plain shell silhouette
2
- # plus one small carved highlight.
1
+ # egg — the spider-and-fly board's laid egg: the plain shell silhouette,
2
+ # lit from the upper left with a lighter highlight and a darker shadow
3
+ # side so the round shell reads as three-dimensional rather than a flat
4
+ # tinted disc.
3
5
  classes = ["egg"]
4
6
  svg = """
5
7
  <svg viewBox="0 0 24 24" aria-hidden="true">
6
8
  <path d="M12 2 C7 2 4 10 4 15.5 C4 20 7.6 22 12 22 C16.4 22 20 20 20 15.5 C20 10 17 2 12 2 Z" fill="currentColor"/>
7
- <ellipse cx="9.6" cy="9.5" rx="1.7" ry="2.4" fill="currentColor" opacity="0.28"/>
9
+ <path d="M12 2 C16 2 19 8.6 19.9 14 C18.4 15.2 16.6 15.8 15 14.6 C16.2 11 15.6 5.4 12 2 Z" fill="color-mix(in srgb, currentColor 65%, black)"/>
10
+ <ellipse cx="9.4" cy="8.8" rx="1.9" ry="2.8" fill="color-mix(in srgb, currentColor 25%, white)"/>
8
11
  </svg>
9
12
  """
@@ -1,17 +1,22 @@
1
- # fly — the spider-and-fly board's other agent. A round head, a tapered
2
- # body with a carved highlight, translucent wings, and two thin trailing
3
- # legs for a touch of character at rest.
1
+ # fly — the spider-and-fly board's other agent. A round head with a pair
2
+ # of large compound eyes, a tapered body with a carved highlight,
3
+ # translucent wings (opacity carries real translucency here, not a
4
+ # decorative wash, so it stays), and two thin trailing legs.
4
5
  classes = ["fly"]
5
6
  svg = """
6
7
  <svg viewBox="0 0 24 24" aria-hidden="true">
7
8
  <ellipse cx="12" cy="13.6" rx="3.4" ry="5.2" fill="currentColor"/>
8
9
  <circle cx="12" cy="7" r="2.7" fill="currentColor"/>
9
- <ellipse cx="11.1" cy="12" rx="1.1" ry="1.7" fill="currentColor" opacity="0.3"/>
10
+ <ellipse cx="11.1" cy="12" rx="1.1" ry="1.7" fill="color-mix(in srgb, currentColor 70%, black)"/>
10
11
  <g fill="currentColor" opacity="0.55">
11
12
  <path d="M9 10 C3 6 2 4 3 2 C6 2 9 6 10.5 10 Z"/>
12
13
  <path d="M15 10 C21 6 22 4 21 2 C18 2 15 6 13.5 10 Z"/>
13
14
  </g>
14
- <g stroke="currentColor" stroke-width="1" stroke-linecap="round">
15
+ <g fill="color-mix(in srgb, currentColor 70%, black)">
16
+ <ellipse cx="10.1" cy="6.1" rx="1.5" ry="1.9" transform="rotate(-18 10.1 6.1)"/>
17
+ <ellipse cx="13.9" cy="6.1" rx="1.5" ry="1.9" transform="rotate(18 13.9 6.1)"/>
18
+ </g>
19
+ <g stroke="currentColor" stroke-width="1.1" stroke-linecap="round">
15
20
  <path d="M9.6 17 L7.4 19.4"/>
16
21
  <path d="M14.4 17 L16.6 19.4"/>
17
22
  </g>
@@ -1,12 +1,14 @@
1
1
  # furniture — the generic fallback for any furniture piece with no sprite
2
- # of its own: a solid console-table silhouette (tapered legs, a carved
3
- # highlight along the top edge), replacing the old hollow-shelf outline.
2
+ # of its own: a solid console-table silhouette with a stretcher bar joining
3
+ # the tapered legs low down, the structural cue that reads as "a table"
4
+ # rather than "a shelf on the wall".
4
5
  classes = ["furniture"]
5
6
  svg = """
6
7
  <svg viewBox="0 0 24 24" aria-hidden="true">
7
8
  <rect x="3.5" y="6.5" width="17" height="3.2" rx="0.8" fill="currentColor"/>
8
- <rect x="3.5" y="6.5" width="17" height="1" fill="currentColor" opacity="0.35"/>
9
+ <rect x="3.5" y="6.5" width="17" height="1" fill="color-mix(in srgb, currentColor 30%, white)"/>
9
10
  <path d="M5.6 9.7 L4.6 20 L6.7 20 L7.2 9.7 Z" fill="currentColor"/>
10
11
  <path d="M18.4 9.7 L16.8 20 L18.9 20 L19.4 9.7 Z" fill="currentColor"/>
12
+ <rect x="6.4" y="15.6" width="11.2" height="1.3" rx="0.4" fill="color-mix(in srgb, currentColor 70%, black)"/>
11
13
  </svg>
12
14
  """
@@ -1,12 +1,19 @@
1
1
  # garden — an outdoor space, so no room box: a tree over a ground line reads
2
2
  # as open air rather than an interior, matching the outdoor room-kind border.
3
+ # The canopy is built from three overlapping lobes rather than one plain
4
+ # circle so it reads as foliage, and a couple of grass tufts at the base
5
+ # ground it as cultivated planting rather than bare earth.
3
6
  classes = ["garden"]
4
7
  svg = """
5
8
  <svg viewBox="0 0 24 24" aria-hidden="true">
6
9
  <path d="M3 20 H21" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/>
7
10
  <path d="M12 20 V12" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/>
8
- <circle cx="12" cy="8.5" r="5" fill="currentColor" opacity="0.7"/>
9
- <circle cx="7.5" cy="17" r="1" fill="currentColor" opacity="0.5"/>
10
- <circle cx="16.5" cy="17" r="1" fill="currentColor" opacity="0.5"/>
11
+ <circle cx="8.4" cy="9.4" r="3.6" fill="currentColor"/>
12
+ <circle cx="15.6" cy="9.4" r="3.6" fill="currentColor"/>
13
+ <circle cx="12" cy="6.6" r="4.2" fill="currentColor"/>
14
+ <g stroke="color-mix(in srgb, currentColor 55%, black)" stroke-width="1" stroke-linecap="round">
15
+ <path d="M5.4 20 C5.4 18.6 6.2 17.8 6.2 17.8"/>
16
+ <path d="M18.2 20 C18.2 18.6 17.4 17.8 17.4 17.8"/>
17
+ </g>
11
18
  </svg>
12
19
  """
@@ -1,6 +1,7 @@
1
1
  # key — Ashcombe Hall's own key (hidden in the portrait, unlocks the
2
2
  # cabinet): a classic round-bow skeleton key, bold strokes so it stays
3
- # legible at a 44px render.
3
+ # legible at a 44px render, plus a thin specular arc tracing the bow's own
4
+ # upper-left curve so the ring reads as metal rather than a flat ring.
4
5
  classes = ["key"]
5
6
  svg = """
6
7
  <svg viewBox="0 0 24 24" aria-hidden="true">
@@ -8,5 +9,6 @@ svg = """
8
9
  <path d="M10.4 12 L19.5 21.1" stroke="currentColor" stroke-width="2.2" stroke-linecap="round"/>
9
10
  <path d="M16.4 17.1 L18.6 14.9" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
10
11
  <path d="M18.6 19.3 L20.6 17.3" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
12
+ <path d="M5 6.6 A4.4 4.4 0 0 1 8.6 4.8" fill="none" stroke="color-mix(in srgb, currentColor 25%, white)" stroke-width="1" stroke-linecap="round"/>
11
13
  </svg>
12
14
  """
@@ -1,13 +1,22 @@
1
- # kitchen — a room floor plan marked by a stove with two burners, the same
2
- # distinguishing cue the large tier uses, so the room-kind icon reads as a
3
- # kitchen rather than a plain room.
1
+ # kitchen — a room floor plan marked by a stove with two burners and an
2
+ # oven-door handle, the same distinguishing cue the large tier uses, so
3
+ # the room-kind icon reads as a kitchen rather than a plain room. The wash
4
+ # is a fixed white/black tint rather than currentColor-mixed (see
5
+ # room-icon.toml's own header for why).
4
6
  classes = ["kitchen"]
5
7
  svg = """
6
8
  <svg viewBox="0 0 24 24" aria-hidden="true">
7
- <rect x="3" y="3" width="18" height="18" rx="1" fill="currentColor" opacity="0.14"/>
9
+ <defs>
10
+ <linearGradient id="kitchen-wash" x1="0" y1="0" x2="0.4" y2="1">
11
+ <stop offset="0%" stop-color="#ffffff" stop-opacity="0.1"/>
12
+ <stop offset="100%" stop-color="#000000" stop-opacity="0.14"/>
13
+ </linearGradient>
14
+ </defs>
15
+ <rect x="3" y="3" width="18" height="18" rx="1" fill="url(#kitchen-wash)"/>
8
16
  <rect x="3" y="3" width="18" height="18" rx="1" fill="none" stroke="currentColor" stroke-width="1.6"/>
9
17
  <rect x="8" y="10" width="8" height="7" rx="0.6" fill="none" stroke="currentColor" stroke-width="1.2"/>
10
- <circle cx="10.5" cy="12.6" r="1" fill="currentColor" opacity="0.7"/>
11
- <circle cx="13.5" cy="12.6" r="1" fill="currentColor" opacity="0.7"/>
18
+ <circle cx="10.5" cy="12.4" r="1" fill="currentColor"/>
19
+ <circle cx="13.5" cy="12.4" r="1" fill="currentColor"/>
20
+ <path d="M9.4 15.8 H14.6" stroke="currentColor" stroke-width="0.9" stroke-linecap="round"/>
12
21
  </svg>
13
22
  """
@@ -1,11 +1,16 @@
1
1
  # lamp — Ashcombe Hall's own study lamp: a Victorian hurricane-lamp
2
- # silhouette — base, glass globe, a neck, and a small carved flame.
2
+ # silhouette — base, glass globe, a neck, and a small flame. The globe gets
3
+ # its own lighter glass tone plus a specular streak so it reads as glass
4
+ # distinct from the solid metal base and neck, and the flame is a fixed
5
+ # warm amber regardless of theme — a flame's colour comes from what's
6
+ # burning, not from CSS.
3
7
  classes = ["lamp"]
4
8
  svg = """
5
9
  <svg viewBox="0 0 24 24" aria-hidden="true">
6
10
  <path d="M9 21 H15 L14 18 H10 Z" fill="currentColor"/>
7
- <path d="M8.4 18 C7 15.6 7 12.6 8.6 10.4 H15.4 C17 12.6 17 15.6 15.6 18 Z" fill="currentColor"/>
8
- <rect x="10.6" y="6.4" width="2.8" height="4.4" fill="currentColor" opacity="0.85"/>
9
- <path d="M12 3.2 C13.4 4.6 13.8 6 12 7.4 C10.2 6 10.6 4.6 12 3.2 Z" fill="currentColor" opacity="0.55"/>
11
+ <path d="M8.4 18 C7 15.6 7 12.6 8.6 10.4 H15.4 C17 12.6 17 15.6 15.6 18 Z" fill="color-mix(in srgb, currentColor 55%, white)"/>
12
+ <path d="M9.2 11.4 C9 13.4 9.1 15.6 9.9 17.4" fill="none" stroke="color-mix(in srgb, currentColor 20%, white)" stroke-width="0.8" stroke-linecap="round"/>
13
+ <rect x="10.6" y="6.4" width="2.8" height="4.4" rx="0.4" fill="currentColor"/>
14
+ <path d="M12 3.2 C13.4 4.6 13.8 6 12 7.4 C10.2 6 10.6 4.6 12 3.2 Z" fill="#f4b73f"/>
10
15
  </svg>
11
16
  """