Changelog:
Added:
- Log source manifest and richer log tab entries.
run.jsongainslogSources, one entry per registeredLogQueryServicesource with itsid,fileand whether that file waspresentwhen the run finished. A log tab's entry incustomTabContentsnow carriessourceId,identifierandentries, plus a.jsonlrecordssidecar beside its.txtfile, one{"identifier","text"}record per line. A source that produced no records is recorded withentries: 0and no file, and a tab@KensaTab.visibilityskips on a pass is recorded withvisibilityand no file; both additive to older bundles (#228). - Three MCP log tools.
list_log_sourceslists the sources a run registered and whether each file was present.invocation_logslists one invocation's log tabs with entry and error counts, plus skipped tabs and registered sources with no tab.read_logreads one tab's records filtered by pattern or level, capped and truncated (#228). - The report shows file-less log tabs instead of hiding them. A tab recorded with
entries: 0and no file now renders "No entries for this invocation" rather than vanishing from the invocation. A tab an@KensaTab(visibility = OnlyOnFailure)skips on a pass still carries no file and stays hidden, unchanged from before (#228).
Fixes:
@ExpandableRenderedValuenames render as prose. The sentence showed the raw method name,theObservedLifecycle, where@ExpandableSentenceshowedthe Observed Lifecycle. The name is now scanned like any other identifier, for the default and tabular styles (#229).- A chained call after an argument-less expandable stays in the sentence. In Kotlin,
withTheExpectedFields().and(aFirstName of "John")putand aFirstName of Johnin the expandable's parameter box, because the argument check looked at the whole call chain instead of the expandable's own parentheses.this.withTheExpectedFields("Mr")had the opposite problem, and its arguments were not shown. Both@ExpandableSentenceand@ExpandableRenderedValueare fixed (#242). - Parameter values are typed in the report. A string parameter whose value was literally
null,trueor42was styled as null, boolean or number in the parameter table and matrix, because the kind was inferred from the rendered text. Each invocation now carriesparameterKindsbesideparameters, written from the real type, and the views use it. Reports without the field keep the old inference. A parameter whose Kotlin type is aNumbernow renders as a number even when a registeredValueRendererformats it, for example£1,234.00. (#147). - An empty
@Highlightvalue no longer hangs the report. A field or parameter annotated@Highlightwhose value was""built a highlight pattern that matched at every position of every text node, so expanding an interaction never returned and the browser tab hung. Empty highlights are now ignored (#186, thanks to Michael Orr). - Badge filters and tag clicks stay where you are. Choosing Filter by this issue from a badge, or clicking a tag, applied the query at whichever page the report was first opened on, usually the Overview, instead of on the test in view. The handlers held the first render's
setSearchParams, which navigates relative to the location it was created in (#227). - Embed frames shrink as well as grow. The embed posted
document.documentElement.scrollHeight, which inside an iframe never drops below the frame's own height, so a frame sized bykensa-embed.jsgrew to fit the sequence diagram and stayed there when a shorter tab was chosen. The embed now measures its own content root, so the posted height follows the content both ways (#226).
Breaking:
TableRendererremoved. The interface was public and documented but nothing could register one, so the default table shapes always applied. Removed rather than frozen at 1.0; the docs now describe the supported row shapes (#231).
Changed:
- Kotlin 2.4.20. Toolchain bump from Kotlin 2.4.10; no API changes. The compiler plugin loads only in the Kotlin version it was built against, so consumers must now compile with Kotlin 2.4.20. Build-plugin users get the matching compiler plugin in the next build-plugins release.
- Kotest 6.2.4, Gradle 9.7.1. Dependency bumps; no API changes. Also PlantUML 1.2026.6, Jackson 2.22.2, Byte Buddy 1.18.12, Selenium 4.47.0.
- Amber accent. The report, its mark and kensa.dev now use the Kensa family colour, amber, wherever an accent appears: the logo, focus rings, the selected tag, the active package crumb, the environment picker. Pass, fail and disabled keep green, rose and orange. The report looks the same in every host, including Kensa Hub.
- Dark mode follows the OS until you choose. A report with no stored preference matches the system appearance and tracks changes to it. Pressing the switch stores a choice, which then wins.
?theme=and embeds are unchanged and never write the preference.