fix(logging): finish the object-argument sweep
#107 caught three sites by grepping for an object literal as the second console argument. That pattern misses the more common form, a variable holding an object, so five more were still landing in the journal as [object Object]. This time the list came from the machine itself: every distinct such line in three days of sintra's journal. The five: the bay list at HAL init, the inventory loaded from state.db, the inventory pushed to the renderer, the amounts sent to a dispense, and the access-control audit record. Three sibling sites in the mock and service paths are fixed too; they had not run recently enough to appear in the journal but carry the same shapes. The audit line is the one that mattered. It is the entire record of who was granted or denied terminal access until #90 persists it to state.db, and every field of it was being discarded. formatBays and formatInventory render the denomination/count shapes these sites share. `count` is optional on a device-config cassette, so an absent one prints as unknown rather than as zero, which would read as a drained bay.
This commit is contained in:
parent
74e488cd00
commit
d66f50dbdf
4 changed files with 43 additions and 17 deletions
|
|
@ -5,3 +5,26 @@ import { twMerge } from 'tailwind-merge'
|
|||
export function cn(...inputs: ClassValue[]) {
|
||||
return twMerge(clsx(inputs))
|
||||
}
|
||||
|
||||
/**
|
||||
* Render a denomination/count list for the journal.
|
||||
*
|
||||
* Electron's console bridge stringifies every console argument on its way to
|
||||
* the journal, so passing the array itself arrives as `[object Object]` and
|
||||
* the numbers are lost. Interpolate one of these instead. See CLAUDE.md,
|
||||
* "Useful invariants when debugging".
|
||||
*/
|
||||
export function formatBays(rows: { denomination: number; count?: number }[]): string {
|
||||
if (!rows?.length) return '(none)'
|
||||
// `count` is optional on a device-config cassette: a preset can declare the
|
||||
// denomination a bay holds without claiming how many notes are in it. Show
|
||||
// that as unknown rather than as zero, which would read as a drained bay.
|
||||
return rows.map((r) => `${r.denomination}x${r.count ?? '?'}`).join(' ')
|
||||
}
|
||||
|
||||
/** Same, for a denomination-keyed count map as `getInventory()` returns. */
|
||||
export function formatInventory(inv: Record<number, number>): string {
|
||||
const entries = Object.entries(inv ?? {})
|
||||
if (!entries.length) return '(none)'
|
||||
return entries.map(([denom, count]) => `${denom}x${count}`).join(' ')
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue