Story 1.10: the Observer, part three, inventory, journal, log and prompts - #64
Merged
watchthelight merged 5 commits intoSep 6, 2026
Conversation
…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
deleted the
story/1-10-the-observer-part-three-inventory-journal-log-and-prompts
branch
September 6, 2026 19:54
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 afteradd( log );core/.../shatterfish/Hooks.java: theLogReplacedpoint;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.ITEMandPromptKind.OTHER, appended.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);Skeletonaround every section.docs/rules/identification.mdanddocs/rules/ui.md, three rows inui.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.bba2ef279; M26 survived there through a clause that skipped item slots, whose texts the walk never reached, and was caught at71bc11116once the clause went and a test hid a block. All thirty-one caught..fairness-reviewerond3a5ce879: FINDINGS with none blocking, ten should-fix findings all taken inbba2ef279and71bc11116(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.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 forGameScene.java,Hooks.javaandGroup.java.docs/rules/identification.md: nine Test cells;docs/rules/ui.md: two Test cells and three rows._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: theLogReplacedinterface, its field and its line inclear(); 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.