Skip to content

Story 1.10: the Observer, part three, inventory, journal, log and prompts - #64

Merged
watchthelight merged 5 commits into
mainfrom
story/1-10-the-observer-part-three-inventory-journal-log-and-prompts
Sep 6, 2026
Merged

Story 1.10: the Observer, part three, inventory, journal, log and prompts#64
watchthelight merged 5 commits into
mainfrom
story/1-10-the-observer-part-three-inventory-journal-log-and-prompts

Conversation

@watchthelight

Copy link
Copy Markdown
Owner

Closes #23

Summary

The Observer gains its inventory, journal, log and prompt sections, and the header carries the Prompt's kind. The inventory is the belongings in the bag's order, each item as the slot, the item window and the log print it: its own name, so an unknown potion, scroll or ring is its appearance and a curse enchantment is named only once the curse is known; the level and curse flags with the values the slot draws; the status text, so a wand's charges appear only once known; the item window's actions and default.
The journal is every note the notes tab draws and the potions, scrolls and rings identified this Run. The log is the game's own message signal, captured by a listener that hook row 3, a new site inside GameScene.create(), re-registers right after the log pane replaces every listener and before the floor's own lines are emitted.
The Prompt is the window in front, admitted by the gate exactly when the game opened it and waits on it, classified by its class and, for an options window, by the class that opened it, and flattened into its drawn title, text and button labels through hook row 4's second site, a read-only accessor on Group.
The one thing to look at: Observer.inventory(), journal(), log(), prompt() and the gate, GameLogListener, Prompts.kind(), Windows, and the two hook sites.

What changed

  • core/.../scenes/GameScene.java: hook row 3, the scene seam, six lines and an import after add( log ); core/.../shatterfish/Hooks.java: the LogReplaced point; SPD-classes/.../noosa/Group.java: hook row 4's second site, shatterfishMembers(); docs/UPSTREAM.md: row 3, row 4's second site, the site index and the three digests.
  • shatterfish/harness/.../observer/Observer.java: the four sections, the header's kind, the gate under a Prompt; observer/GameLogListener.java (new); driver/Prompts.java: kind(); driver/Windows.java (new); driver/HeadlessDriver.java: the seam armed before the first scene, reset per Run, left on close.
  • shatterfish/api: PromptKind.ITEM and PromptKind.OTHER, appended.
  • Tests: ItemLeakTest (appearance names, the differential over level, curse, charges and counters, a potion's identification history, an artifact's status, the belongings' order, every family and slot, the known appearances against the Catalog, determinism), JournalSectionTest (the records, a floor the tab does not list, determinism), LogListenerTest (two floor changes with the scene destroyed and recreated, the cap, a message while the first floor is built), PromptGateTest (the chasm prompt, the harmful potion, the beneficial throw, the chalice, the quest, trade, subclass and resurrection windows, an options window of unlisted origin, an untitled one, a stacked message, a busy hero, a window that is not a Prompt); Skeleton around every section.
  • Docs: ADR-0006 amendment for story 1.10; two notes in ADR-0005; Test columns in docs/rules/identification.md and docs/rules/ui.md, three rows in ui.md.
  • _bmad-output/implementation-artifacts/epic-1-context.md: the build workflow's compiled epic context, committed as its cache.

How it was tested

  • ./gradlew build: green, 435 tests across 33 suites, fifty-two of them the eleven observer suites.
  • Mutation battery of thirty-one on the committed tree, twenty-two first and nine for the review's rules, each against the four new suites (story file, Evidence): Thirty of thirty-one caught at bba2ef279; M26 survived there through a clause that skipped item slots, whose texts the walk never reached, and was caught at 71bc11116 once the clause went and a test hid a block. All thirty-one caught..
  • Fairness review: fairness-reviewer on d3a5ce879: FINDINGS with none blocking, ten should-fix findings all taken in bba2ef279 and 71bc11116 (story file, The fairness review): the level and curse flags as the screen draws them, the journal through the tab's own calls, hidden members unread and the title read by type, one wait-state definition shared with the driver, the listener joining the signal at Run start, six cites and a prose count corrected, the pane's wipe and the holiday clock recorded as losses.
  • Rig numbers: n/a before E3.
  • Screenshots: n/a; both hooks are dead code to the game.

Docs

  • docs/adr/0006-observer-visibility-rules.md: amendment (the item, journal, log and prompt rules with their cites, the kind table, the losses).
  • docs/adr/0005-observation-schema-and-hashing.md: the capture point and the flattening rule.
  • docs/UPSTREAM.md: row 3 (new), row 4 (second site), the site index and the diff budget for GameScene.java, Hooks.java and Group.java.
  • docs/rules/identification.md: nine Test cells; docs/rules/ui.md: two Test cells and three rows.
  • Story file _bmad-output/implementation-artifacts/1-10-the-observer-part-three-inventory-journal-log-and-prompts.md.

Upstream files touched

  • core/.../scenes/GameScene.java: an import and six added lines after the log pane's construction, a marker, three comment lines and a two-line call of a nullable listener point; nothing wrapped, nothing removed; ledger row 3.
  • core/.../shatterfish/Hooks.java: the LogReplaced interface, its field and its line in clear(); row 2's digest.
  • SPD-classes/.../noosa/Group.java: nine added lines, a marker, four comment lines and one read-only method returning a copy of the members under the class's own lock; nothing wrapped, nothing removed; ledger row 4.

…mpts

The Observer gains its inventory, journal, log and prompt sections, and the header carries the
Prompt's kind. The inventory is the belongings in the bag's order, each item as the slot, the item
window and the log print it: its own name, so an unknown potion, scroll or ring is its appearance
and a curse enchantment is named only once the curse is known; the level and curse flags with the
values the slot draws; the status text, so a wand's charges appear only once known; the item
window's actions and default. The journal is every note the notes tab draws and the potions,
scrolls and rings identified this Run. The log is the game's own message signal, captured by a
listener the new hook row 3 re-registers inside GameScene.create(), right after the log pane
replaces every listener and before the floor's own lines are emitted. The Prompt is the window in
front, admitted by the gate exactly when the game opened it and waits on it, classified into a
PromptKind by its class and, for an options window, by the class that opened it, and flattened
into its drawn title, text and button labels through hook row 4's second site, a read-only
accessor on Group.

PromptKind gains ITEM and OTHER at the end of the list. Hooks.java gains the LogReplaced point.
Prompts.kind() is the one definition the driver and the Observer share. ItemLeakTest holds the
leaks absent by name and by byte-identical differential pairs; JournalSectionTest, LogListenerTest
(two floor changes with the scene recreated) and PromptGateTest hold the other three sections and
the gate. docs/UPSTREAM.md carries row 3, the second site of row 4 and the three digests; ADR-0006
carries the amendment, ADR-0005 two notes, and the rules pages their Test columns and three rows.
The epic context file is the workflow's compiled cache.
PromptGateTest holds the gate to the hero condition under a Prompt window as well: with the chasm
prompt in front and the hero not ready, every read is refused, as the driver confirms no wait then.
…rnal, the title by type, one wait state

The fairness review's ten findings, all taken. The level and curse flags follow the item's own
identification predicate where that is what the screen draws, so a potion identified by a scroll
and one of the same known type picked up later are one Observation. The journal is built from the
notes tab's own two calls, so a record on a floor the tab does not list is not a note. The window
walk skips a member the group would not draw and every item slot, and reads the icon title by
type, since a titled message brings its title bar to the front after laying it out and the drawing
order then has the title last. The gate's state condition is one method the driver and the
Observer share, HeadlessDriver.waitState, and the Observer says which two timing conditions are
the driver's. The log listener joins the signal at every Run's start, before the first floor is
built. Six cites corrected, row 4's prose count corrected, the pane's wipe recorded as a loss in
ADR-0005 and ADR-0006, and the holiday clock recorded in docs/ideas.md for the Profile story.

Tests added: the beneficial throw and the chalice's warning as an item's confirmation, the quest,
trade, subclass and resurrection windows by class, a message window over an options window, a
potion's identification history, an artifact's status, every family and slot, the Catalog against
the known appearances, a record beyond the deepest floor, a message while the first floor is built.
…dead item-slot clause goes

The battery showed the clause skipping item slots changed nothing: a slot's texts are bitmap texts, never text blocks, and out of the walk's reach by type. The clause goes, the docs say so, and PromptGateTest hides a text block and holds it unread, so the rule that a member the group would not draw is not read has a test and a mutation behind it.
…s to review

The story file records the thirty-one-mutation battery against the four new suites, the fairness review's ten findings and how each was taken over two passes, and the limitations handed on: the windows not yet recognised, a quest window's missing options, the lost inventory's greying, the pane's wipe, the gate's timing conditions, and the holiday clock.
@watchthelight watchthelight added this to the E1 Harness milestone Sep 6, 2026
@watchthelight watchthelight added epic:E1 Harness area:harness Area: harness touches-upstream Edits an upstream file (hook); must be listed in docs/UPSTREAM.md fairness Touches Observer, ActionExecutor, brain, or information parity labels Sep 6, 2026
@watchthelight
watchthelight merged commit 336f56f into main Sep 6, 2026
3 checks passed
@watchthelight
watchthelight deleted the story/1-10-the-observer-part-three-inventory-journal-log-and-prompts branch September 6, 2026 19:54
@watchthelight watchthelight mentioned this pull request Sep 6, 2026
21 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:harness Area: harness epic:E1 Harness fairness Touches Observer, ActionExecutor, brain, or information parity touches-upstream Edits an upstream file (hook); must be listed in docs/UPSTREAM.md

Projects

None yet

Development

Successfully merging this pull request may close these issues.

E1.10 The Observer, part three: inventory, journal, log and prompts

1 participant