{"session": "d934c0db-2307-441f-978e-6fba4b5950f9", "env": "main", "command": "journal todo create \"A row's indexed fields are read one declared way, not by a fallback\" --brief \"Found by a house-style review of tonight's commits, 2026-10-11. src/controllers/stored.py's _row now reads every indexed field as getattr(r, k, r.data.get(k)), for every resource type, because priority and rank are properties on Todo rather than entries in r.data. That is a default placed over a design gap: the index should read each indexed field one declared way, decided where the row is born. Fix it at the birth of the row - let a type declare how each indexed field is read, or make the property-backed fields entries like the rest - and take the fallback out.\" --set priority=high 2>&1 | tail -1; journal todo create \"The board's read model of a to-do carries real types, not object\" --brief \"Found by a house-style review, 2026-10-11. OpenTodo in src/features/kanban/board.py is a hand-built read model whose pending, blocked, reported and struck fields are typed object and whose after is a bare tuple, which is a type lying about what it holds. The house already has typed read shapes - the TypedDicts Worker and PlanSummary, and MergeWait as a value object. Give OpenTodo real field types, or reuse the summary shape it is standing in for. board.py also imports position_of from resources.shapes, which nothing else in the board uses.\" 2>&1 | tail -1; journal todo create \"Rivals and take share the one filter instead of writing it twice\" --brief \"Found by a house-style review, 2026-10-11. src/engine/sessions.py: take now carries a copy of the old body of rivals - the mine = self.agent(session, pid) and holder not in mine filter is written in both. Pull it out as one private method, for example _others(env, session, pid), and let rivals add the .pid filter on top. The same review notes that the test change removed agents_anywhere and with it the check that sessions waiting in another environment are known; put that check back somewhere.\" 2>&1 | tail -1", "parts": ["journal todo create \"A row's indexed fields are read one declared way, not by a fallback\" --brief \"Found by a house-style review of tonight's commits, 2026-10-11. src/controllers/stored.py's _row now reads every indexed field as getattr(r, k, r.data.get(k)), for every resource type, because priority and rank are properties on Todo rather than entries in r.data. That is a default placed over a design gap: the index should read each indexed field one declared way, decided where the row is born. Fix it at the birth of the row - let a type declare how each indexed field is read, or make the property-backed fields entries like the rest - and take the fallback out.\" --set priority=high 2>&1 | tail -1", "journal todo create \"The board's read model of a to-do carries real types, not object\" --brief \"Found by a house-style review, 2026-10-11. OpenTodo in src/features/kanban/board.py is a hand-built read model whose pending, blocked, reported and struck fields are typed object and whose after is a bare tuple, which is a type lying about what it holds. The house already has typed read shapes - the TypedDicts Worker and PlanSummary, and MergeWait as a value object. Give OpenTodo real field types, or reuse the summary shape it is standing in for. board.py also imports position_of from resources.shapes, which nothing else in the board uses.\" 2>&1 | tail -1", "journal todo create \"Rivals and take share the one filter instead of writing it twice\" --brief \"Found by a house-style review, 2026-10-11. src/engine/sessions.py: take now carries a copy of the old body of rivals - the mine = self.agent(session, pid) and holder not in mine filter is written in both. Pull it out as one private method, for example _others(env, session, pid), and let rivals add the .pid filter on top. The same review notes that the test change removed agents_anywhere and with it the check that sessions waiting in another environment are known; put that check back somewhere.\" 2>&1 | tail -1"]}