Informe JSON sin procesar legible por máquina
{
"data": {
"repo": {
"topics": [],
"is_fork": false,
"size_kb": 690130,
"has_wiki": true,
"homepage": null,
"languages": {
"C#": 24916986,
"CSS": 2165958,
"HTML": 5176574,
"TSQL": 17332,
"Shell": 7071,
"Dockerfile": 6266,
"JavaScript": 7330457,
"PowerShell": 3448
},
"pushed_at": "2026-07-24T14:47:14Z",
"created_at": "2026-02-28T23:39:29Z",
"owner_type": "User",
"updated_at": "2026-07-24T02:39:36Z",
"description": "Blazor components for tailwind",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "main",
"license_spdx_raw": "MIT",
"primary_language": "C#",
"significant_languages": [
"C#",
"JavaScript",
"HTML"
]
},
"owner": {
"blog": null,
"name": null,
"type": "User",
"login": "ptyll",
"company": null,
"location": null,
"followers": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/27801209?v=4",
"created_at": "2017-04-20T06:18:05Z",
"is_verified": null,
"public_repos": 3,
"account_age_days": 3382
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v1.1.15",
"kind": "patch",
"published_at": "2026-04-12T02:55:44Z"
},
{
"tag": "v1.1.13",
"kind": "patch",
"published_at": "2026-04-06T00:40:35Z"
},
{
"tag": "v1.1.11",
"kind": "patch",
"published_at": "2026-04-05T07:02:40Z"
},
{
"tag": "v1.1.6",
"kind": "patch",
"published_at": "2026-04-03T14:14:44Z"
},
{
"tag": "v1.1.5",
"kind": "patch",
"published_at": "2026-03-22T18:09:23Z"
},
{
"tag": "v1.1.4",
"kind": "patch",
"published_at": "2026-03-20T03:12:05Z"
},
{
"tag": "v1.1.3",
"kind": "patch",
"published_at": "2026-03-16T06:34:47Z"
},
{
"tag": "v1.1.2",
"kind": "patch",
"published_at": "2026-03-14T10:55:38Z"
},
{
"tag": "v1.1.1",
"kind": "patch",
"published_at": "2026-03-14T08:53:19Z"
},
{
"tag": "v1.1.0",
"kind": "minor",
"published_at": "2026-03-12T04:33:44Z"
},
{
"tag": "v1.0.15",
"kind": "patch",
"published_at": "2026-03-10T03:11:44Z"
},
{
"tag": "v1.0.14",
"kind": "patch",
"published_at": "2026-03-10T01:21:52Z"
},
{
"tag": "v1.0.13",
"kind": "patch",
"published_at": "2026-03-10T01:17:14Z"
},
{
"tag": "v1.0.12",
"kind": "patch",
"published_at": "2026-03-10T01:13:54Z"
},
{
"tag": "v1.0.11",
"kind": "patch",
"published_at": "2026-03-09T16:48:43Z"
},
{
"tag": "v1.0.10",
"kind": "patch",
"published_at": "2026-03-09T04:35:35Z"
},
{
"tag": "v1.0.9",
"kind": "patch",
"published_at": "2026-03-08T10:27:39Z"
},
{
"tag": "v1.0.8",
"kind": "patch",
"published_at": "2026-03-08T08:43:42Z"
},
{
"tag": "v1.0.7",
"kind": "patch",
"published_at": "2026-03-08T08:18:30Z"
},
{
"tag": "v1.0.6",
"kind": "patch",
"published_at": "2026-03-08T07:01:53Z"
},
{
"tag": "v1.0.5",
"kind": "patch",
"published_at": "2026-03-08T03:44:33Z"
},
{
"tag": "v1.0.4",
"kind": "patch",
"published_at": "2026-03-08T02:51:11Z"
},
{
"tag": "v1.0.3",
"kind": "patch",
"published_at": "2026-03-07T14:54:46Z"
},
{
"tag": "v1.0.2",
"kind": "patch",
"published_at": "2026-03-07T14:08:54Z"
},
{
"tag": "v1.0.1",
"kind": "patch",
"published_at": "2026-03-07T10:15:46Z"
},
{
"tag": "v1.0.0",
"kind": "major",
"published_at": "2026-03-07T08:53:01Z"
}
],
"recent_commits": [
{
"oid": "c74528f58e965abcc9bf46be184c126739e7284e",
"body": null,
"is_bot": false,
"headline": "refactor(notion): remove granular block persistence",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-24T02:35:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a171ffd426b5503bac9fa1d79d1004d091d2e5d4",
"body": null,
"is_bot": false,
"headline": "release: complete Notion 2.7.0 authoring gate",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-23T21:04:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ea133e5bc4bc843a91d9a750d2e860d1595d4511",
"body": null,
"is_bot": false,
"headline": "feat(notion): preserve DOCX table fidelity",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-23T19:06:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4f1d66b4de287c5dd8334119acfb655562d78029",
"body": null,
"is_bot": false,
"headline": "feat(notion): use atomic aggregate authoring",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-23T18:21:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d19dbd847b588e3622c3678b178c23adde559fdd",
"body": null,
"is_bot": false,
"headline": "feat(notion): add recursive read and schema catalogs",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-23T16:46:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b6d775e29eed6f76873f181cfefdf119dfadc4c9",
"body": null,
"is_bot": false,
"headline": "feat(notion): validate grids and sanitize content",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-23T16:09:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6696b36d0843886c25a5ba9a69f83865a637c475",
"body": null,
"is_bot": false,
"headline": "feat(notion): add strict atomic operations",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-23T15:25:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f3a5312c657cb58d6721460cbf470732408ecb6f",
"body": null,
"is_bot": false,
"headline": "feat(notion): add atomic authoring engine",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-23T14:54:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "37aff2a7d89fbed967fb6003ed8482119f52018a",
"body": null,
"is_bot": false,
"headline": "feat(notion): define atomic aggregate contract",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-23T14:26:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b3916a7c56c68eaa18bb6e6510b3edea02f4a3ec",
"body": null,
"is_bot": false,
"headline": "feat(TmSankeyChart): add demo and visual coverage",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-23T13:59:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "baf4d9541642f364fb8291fe5ab36b8c5a521b52",
"body": null,
"is_bot": false,
"headline": "feat(TmSankeyChart): add interactions",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-23T13:03:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ef24acbcdf4a7d38139b3e5793caf6bc36008b35",
"body": null,
"is_bot": false,
"headline": "feat(TmSankeyChart): add SVG renderer",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-23T12:18:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "784df89b2fec2e81ed9ee3b9783536ec4e657d15",
"body": null,
"is_bot": false,
"headline": "feat(TmSankeyChart): add models and layout engine",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-23T11:45:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5dd6c8b8b5c2197616cf24d9c2c411d1c89e1dda",
"body": null,
"is_bot": false,
"headline": "feat(TmCalendarHeatmap): add demo and documentation",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-23T11:16:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "22e583e45586518c49546912cb9552e21a8498ca",
"body": null,
"is_bot": false,
"headline": "feat(TmCalendarHeatmap): add labels and interaction",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-23T10:58:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0584003070bd9338b93fc1cdee7318231deffe2f",
"body": null,
"is_bot": false,
"headline": "feat(TmCalendarHeatmap): add intensity color schemes",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-23T10:39:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9226e8c62441eefadaea02651e1a9f4f8c538bbc",
"body": null,
"is_bot": false,
"headline": "feat(TmCalendarHeatmap): add culture-aware date grid",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-23T10:16:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "02b45fb3280be28edc4fe127365951ce08cdcb49",
"body": null,
"is_bot": false,
"headline": "docs(TmChart): dokončit demo a vizuální kontrolu",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-23T09:43:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1e156127c232a9b1388bbd4baaf04bd3edf895de",
"body": null,
"is_bot": false,
"headline": "feat(TmChart): přidat waterfall graf",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-23T09:19:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c5b39160f5a58271d5327b3435f5947523531d84",
"body": null,
"is_bot": false,
"headline": "feat(TmChart): přidat nastavitelné krytí Area grafu",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-23T08:40:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5f0a78f68d17bd6c12bbd69fee3a844569dd2545",
"body": null,
"is_bot": false,
"headline": "feat(TmChart): ověřit stacked bar grafy",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-23T08:09:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8921861e61ea4818b13d8f965a8e288c16547fdc",
"body": "fix(TmSelect): předvýběr Value i u ChildContent (raw <option>)\n\nTmSelect řídil předvýběr jen přes selected= na <option>, které přidával\npouze pro Placeholder a Options. <option> dodané jako ChildContent tak\nnikdy neměly selected → prohlížeč vždy ukázal první možnost, i když Value\nmířila jinam.\n\nŘeše\n[…]\naceholder.\n\n+ 2 testy (ChildContent předvýběr / výchozí hodnota), release bump 2.6.1,\naktualizovaná JSON dokumentace komponenty.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n@",
"is_bot": false,
"headline": "@",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-23T05:06:29Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9c5619e94680309d5cdd97d29939170f0d7ee742",
"body": null,
"is_bot": false,
"headline": "feat(datatable): complete inline edit and export demo",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-23T04:38:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "85934a310918a7c87de81ab3e4b810a2276cdfdd",
"body": null,
"is_bot": false,
"headline": "feat(datatable): add typed XLSX export package",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-23T04:38:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9f602b3cae94c2447c6be90ddb3aeb909c74b5e8",
"body": null,
"is_bot": false,
"headline": "feat(datatable): add toolbar CSV export",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-23T04:38:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b4371796265c9e3cf0ba1daaa7857a582483c25a",
"body": null,
"is_bot": false,
"headline": "feat(datatable): add inline row validation context",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-23T04:38:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "061634102d5362bd449510ea5a6dbd2cf21e2c2c",
"body": null,
"is_bot": false,
"headline": "feat(datatable): complete inline row editing actions",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-23T04:38:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "67a7449e793d6b685807f33dcdad20c4ba9f54d5",
"body": "The pre-existing Enum_DefinesAllThreeKinds test hard-coded exactly three kinds\nand failed on CI once Modeling was added (2.6.0). Renamed to Enum_DefinesAllKinds\nand added Modeling to the enum-membership and camelCase serialize/deserialize\nround-trip cases. This was the sole failing test that skipped the v2.6.0 publish.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(documentkind): cover the additive TempoDocumentKind.Modeling value",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-23T01:50:38Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "d733f77a954ae55b78b21299444ea72eae89f1c2",
"body": "Phase 4 of Upstream II. Bumps all packable <Version> to 2.6.0 (next minor\nafter v2.5.5; the plan's original 2.2.0 is superseded) and adds an end-to-end\nagent walkthrough (list_notations → get_model_tree → apply_operations →\nvalidate → get_view → diagram_render_svg) to docs/modeling-mcp-tools.md, wit\n[…]\nTempo.Blazor.Mcp at 2.6.0 verified. Tag v2.6.0 + nuget.org\npublish are deferred pending explicit user confirmation (plan rule 24).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "release: bump packages to 2.6.0 + modeling MCP worked example",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-23T01:34:59Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6edc7aae4121da1fb956b17c013bf91590a81498",
"body": "… as data)\n\nPhase 3 of Upstream II. Adds a Tempo.Blazor.Mcp modeling suite so LLM agents\ncan list/read/mutate/validate architecture models, plus a diagram render tool.\n\nNew tools (all additive, English literals per the Mcp convention):\n- modeling_list_models / modeling_get_model_tree / modeling_get_\n[…]\nggregates;\nvalidate --fail-on-drift clean. Localization subtask is N/A (Phase 1 decision:\nMCP tool output stays English literals).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(mcp): modeling MCP tool suite + diagram_render_svg (architecture…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-23T01:31:54Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f50fe7006975636ac00375315c3d118e261f549b",
"body": "…mSvgRenderer)\n\nPhase 2 of Upstream II. Adds a browser-free, deterministic diagram SVG\nexport behind IDiagramSvgRenderer (Abstractions), implemented by\nDiagramSvgRenderer over DiagramStencilRegistry and registered as a\nsingleton by AddTempoBlazorDiagramEditor().\n\n- Promotes the SVG-building logic ou\n[…]\ng-mcp-tools.md.\n\nNote: headless renderer has no UI, so E2E/screenshots are N/A; the committed\ngolden SVGs are the visual artifact.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(diagrameditor): headless DiagramDocument → SVG renderer (IDiagra…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-23T01:14:43Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e9f2d2cb5dc5ce656130c2ea2327bf6a49d94eeb",
"body": "…m SVG export\n\nApproved public-contract design for Upstream II (target 2.6.0, additive):\n- Modeling MCP suite mirrors the diagram/wireframe pattern: new\n IModelingModelDocumentProvider + TempoDocumentKind.Modeling; tools\n list_models/get_model_tree/get_view/apply_operations/validate/list_notations\n[…]\nmo-only DiagramExportSvgBuilder (+ light/dark theme).\n- MCP messages stay English literals (no resx), per existing Mcp convention.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(modeling): Phase 1 design — Modeling MCP tools + headless diagra…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-23T00:53:08Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "65cd99b21d6af69c11191b4ba1adb2404cc30d86",
"body": null,
"is_bot": false,
"headline": "Release 2.5.5: TmCodeEditor TrapTab and Wrap",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-22T17:18:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7dac396fca1ccb6d4e721f11b20cec3a319b5a73",
"body": "TmCodeEditor.json gains both new parameters (with defaults and the reasoning\nfor turning them on), an example of the prose-like editor inside a form, the\ntm-code-editor--wrap class, and a description that no longer sells Tab\nindentation as unconditional.\n\nThe three aggregates were regenerated with J\n[…]\nin components take\nprop metadata from BuiltInComponentSchemas (the pack JSON declares none), so\ntempo.stencil.json needs no change; tests assert both the schema and the pack\ndefinition carry the prop.",
"is_bot": false,
"headline": "Document TrapTab/Wrap and expose wrap in the wireframe stencil",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-22T17:14:45Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "30d879e79829fd8c7a8b4d9b52ba681a8b8637b0",
"body": "The editor trapped Tab unconditionally and never wrapped, so an editor placed\namong ordinary form fields (a Gherkin step, a note) locked keyboard users in\nand scrolled long sentences sideways instead of wrapping them.\n\nTrapTab (default true) keeps today's indent/outdent behaviour, so upgrading\nchang\n[…]\n\nstylesheet consumers actually reference. Verified in the demo (Server host):\nTab leaves the wrap editor while the default editor still indents, and a long\nsentence wraps without horizontal scrolling.",
"is_bot": false,
"headline": "TmCodeEditor: TrapTab and Wrap parameters",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-22T17:04:02Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ecf2decd392f4cf8baff7bf65acea03923e3d902",
"body": "… TEMPO_PERF_BUDGETS\n\nThe two wall-clock asserts in JintDocumentLayoutBenchmarkTests measured the\nGitHub-hosted runner, not the layout engine: the same run was observed at\n35 / 40.8 / 36.1 / green / 49 / 44 s cold, i.e. 16-18x the dev-machine number,\nwhere the budget assumed ~3x. They now run only u\n[…]\n the budget was derived from. Notes that the fixture lays out to ~54\npages, so MinimumPages=21 is a floor, not the expected count.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(documentformats): gate the Jint layout wall-clock budgets behind…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-22T14:05:33Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "8f7bbc9393735507f035e1535fe2c40c8dbd930a",
"body": "…c both publish workflows\n\nFollow-up to 999be6ff, which used a bare `MsSql` substring in the NuGet.org workflow\nonly. Three corrections, no product code touched.\n\n1. The filter is anchored to `Tempo.ReportServer.Api.Tests.MsSql` instead of the bare\n substring. The substring also matched `Rendering\n[…]\ns that, and now a test says so.\n\nVerified: whole solution under the CI filter green (Tempo.Blazor.Tests 8984/8984,\nTempo.ReportServer.Api.Tests 148/148, ReportServer.Web.Tests 98/98 under LANG=en_US).",
"is_bot": false,
"headline": "ci(reportserver): anchor the MsSql exclusion to its namespace and syn…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-22T13:24:40Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "999be6ff27d2df91a8303e7b0fd9bb00a85fe9fb",
"body": "… exclude MsSql tests on CI\n\nThe release pipeline has been red on main since the Report Server merge (487f101e),\nwhich blocks every tag publish. Two independent causes, two different fixes.\n\n1. ScheduledReportWebhookGuard: the absolute-URL gate was platform-dependent.\n Uri.TryCreate(\"/etc/passwd\",\n[…]\nlution green. (Tempo.ReportServer.Web.Tests\nfails 10/98 on a cs-CZ machine because it asserts the English default shell; under\nLANG=en_US it is 98/98, which is what CI runs and what the CI log shows.)",
"is_bot": false,
"headline": "fix(reportserver,ci): platform-independent webhook absolute-URL gate;…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-22T12:32:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "df353cb14f5c9848edb296230b4cb1cc15fb1b75",
"body": "…themes; release 2.5.4\n\nTmCheckbox, TmRadio/TmRadioGroup and the TmMultiSelect option checkbox all carried\ntheir state in two graphical objects that were below the 3:1 non-text minimum, in\nBOTH themes — the defect was never dark-only, and light was the worse half.\n\nMeasured from the token graph (ide\n[…]\nompanion mutations\n(reverting each fix turns it red, incl. deleting a single token line, which reproduces\nexactly 2.5424:1 for checkbox, multiselect and the dash).\n\nTempo.Blazor.Tests 8984/8984 green.",
"is_bot": false,
"headline": "fix(inputs,tokens): selection-control contrast (WCAG 1.4.11) in both …",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-22T12:11:24Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "139bb427a863d57da345192b3b0811c729ff6733",
"body": "…ous commits\n\ntempo-blazor.json and tempo-reporting-*.json do not match the tempo-blazor-*.json\nstaging glob used earlier, so they kept the pre-repair descriptions while every other\naggregate was updated. Regenerating leaves the tree clean.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: regenerate the three per-package aggregates missed by the previ…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-22T10:55:35Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "4df680e29058898636ac8cc1074a4c5ea02080f7",
"body": "The <see cref> fix only helped items the generator re-derives on every run. Type,\nparameter and member descriptions stored in overlay files always win the merge, so\n~190 sentences stayed broken with a hole where the reference used to be\n(\"Default is .\", \"Extension methods for .\", \"Supported values m\n[…]\nDeleting documentation is not a safe automatic action -- some of these are types\n that moved rather than types that were removed.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(generator): repair command for descriptions the old parser mangled",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-22T10:43:54Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7aa3e68a1d3ee45e13e4c65a4977fa4d87df7f52",
"body": "…API + stacked chart stencil\n\nThe Report Server work (plan 2, Fáze 0-19) added 47 public types to\nTempo.Reporting.Abstractions and Tempo.Reporting.Engine without the matching\nJsonDocumentation overlays, and added three ChartType values that the wireframe\nstencil never learned about.\n\n- generator: Re\n[…]\n draws\n them segmented rather than falling through to plain bars, so the designer preview\n matches what the type actually means.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(reporting,wireframe): overlay docs for the Report Server public …",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-22T10:03:48Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "487f101e2a31639349286d4940cf26e86cb5a8db",
"body": "# Conflicts:\n#\tsrc/Tempo.Blazor/wwwroot/css/components/_drawer.css\n#\tsrc/Tempo.Blazor/wwwroot/css/tempo-blazor.bundled.css",
"is_bot": false,
"headline": "Merge branch 'plan2-report-server': Tempo Report Server (Fáze 0-19)",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-22T09:16:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2424d897973099fd9375d1586bf137540a767417",
"body": "…t-in CardMode; release 2.5.3\n\nTwo responsive additions consumed downstream (EmusCz mobile UX).\n\n1. TmDashboard (_dashboard.css): widgets carry an inline `grid-column: X / span W`\n emitted by GetWidgetStyles, so collapsing the grid template alone cannot stack\n them on mobile - the inline placeme\n[…]\nical markup, so the 9 existing consumers are\n untouched. Compatible with server-side data/sort (DataProvider + SortDescriptors).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(dashboard,data-table): TmDashboard mobile-stack + TmDataTable op…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-21T18:50:33Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d9a38f40070dd43b1cf1e7a1bb865fc5f9c71bd6",
"body": "…d/l10n, drawer z-index band; release 2.5.2\n\nThree UI fixes consumed downstream (EmusCz), shipped as one patch release.\n\n1. TmRadioGroup / TmRadio (_radio-group.css): the stylesheet targeted class\n names the components never render (.tm-radio-wrapper/-help/-group-error-msg),\n so radio options re\n[…]\n-tm-z-drawer (1036) band below --tm-z-modal and\n pointed _drawer.css at it (backdrop < panel < modal). --tm-z-overlay unchanged.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(inputs,layout,tokens): radio class-drift, command-palette keyboar…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-21T04:52:52Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "906e3372662591278395301d7c75e219bcce325a",
"body": "Parser RDL → interní ReportDefinition (RdlReportImporter v Abstractions,\njen System.Xml.Linq, žádná nová závislost):\n- Namespace-agnostické matchování (LocalName) → SSRS 2008/2010/2016 i Telerik.\n- Mapováno: page setup (plochý i vnořený <Page>), ReportParameters, DataSets\n (query/fields/typy), Text\n[…]\nt_ImportsRdl_CreatesRealReport_ShownInDesigner_AndPersisted (ověřeno\nproti živému stacku: upload → designer → DB řádek). Aditivně.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fáze 19 (C4): RDL import (SSRS/Telerik) do katalogu",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-20T05:34:55Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "45b1eba71e49727f7ccd53dafd0687d62f34df3c",
"body": "Napojení UAX#9 BiDi core (3a) na render:\n- + SkiaSharp.HarfBuzz 3.119.2 (match SkiaSharp) + HarfBuzzSharp 8.3.1.3.\n- BidiTextShaper: bidi resolve → split na level runs → shape každý run HarfBuzzem\n se správnou direction → uspořádání runů dle conformance-tested VisualOrder →\n L4 mirroring (HarfBuzz\n[…]\ner není bidi/shape-aware (multi-line RTL wrap approx);\nHarfBuzzSharp 8.3.1.3 seed do offline CI cache; Line/Area chart RTL labely.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fáze 18 (C7) pass 3b/3b: HarfBuzz shaping + RTL v PDF renderu",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-20T04:33:31Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "766f922a1996118cc4f617cd19c47dde30aca715",
"body": "…l children operation-addressable; release 2.5.1\n\nPlan 3 follow-up (remaining tasks 2 & 3).\n\ntable.cell.text (JS applier + deterministic ids):\n- transform.mjs applySetBlockAttribute implements the cell-targeting semantics\n (resolve the TABLE block with a fallback without the cell preference, replac\n[…]\ngreen (bUnit 8924, Mcp 312, DocumentFormats 353, Node lane 614, fixture\n6/6 both sides, headless bundle no drift). All packages bumped to 2.5.1.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(document-editor): converge table.cell.text + make content-contro…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T18:46:59Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f0f0300e3f5f596e9e311bd4e8814ab89472fccc",
"body": "Plný Unicode Bidirectional Algorithm (rozhodnutí uživatele) — základ pro RTL\nrender. Samostatný modul Tempo.Reporting.Engine/Text/:\n- BidiAlgorithm.Resolve(text, paragraphLevel?) → BidiResult(ParagraphLevel,\n Levels[], VisualOrder[], Mirrored[]). Věrný C# port Unicode reference\n implementace: P2/P\n[…]\nb: HarfBuzz shaping + integrace do ReportPdfRenderer (per-line L1/L2,\nL4 draw, RTL glyph positioning, right-align, TextDirection).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fáze 18 (C7) pass 3a/3b: Unicode BiDi algoritmus (UAX#9) core",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T18:21:52Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ef590d27bddd8a15a608634ea0b2706bf77f8a29",
"body": "Phase 8 of plan 3 (document MCP tools).\n\n- docs/document-mcp-tools.md: catalog of ALL document MCP tools (introspection,\n semantic edits, blocks/tables, authoring, templates/assembly, rendering,\n diff/redline, live co-editing bridge) with the addressing & concurrency\n contract and the agent edit→\n[…]\n screenshot\n committed and UX-reviewed\n- CHANGELOG 2.5.0; all packages bumped to 2.5.0 (input for the rentcontrol\n NAJM-009 agent integration)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(mcp): document MCP tool catalog + agent demo; release 2.5.0",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T17:54:40Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f32e946abb155e42ca94f678424f1131afd30f2d",
"body": "- TempoDocumentMcpCollaborationOptions + TempoDocumentMcpCollaborationBridge:\n opt-in (Enabled default false) publishing of MCP-applied operation batches;\n the agent joins IDocumentCollaborationProvider once per document as a named\n participant and broadcasts batches + a presence cursor (name + c\n[…]\nase unwatched edit saves fine\n- TDD: 9 new tests (Mcp.Tests 308/308); JSON doc overlays for 4 new public\n types; validate --fail-on-drift clean\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(mcp): Fáze 7 — opt-in live co-editing bridge",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T17:44:59Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e09c6de043b0f034672f93029af9e1786d234daf",
"body": "- document_editor_diff_versions: compare two saved versions or a version vs.\n the current state via DocumentComparisonService — structured diff with\n summary counters, added/removed/changed blocks, word-level diff segments and\n a redlineAvailable flag; identical versions yield an empty diff\n- doc\n[…]\n11 new tests incl. edge cases (missing version/document, unknown\n format); Mcp.Tests 299/299; JSON doc overlay + validate --fail-on-drift clean\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(mcp): Fáze 6 — diff and redline tools",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T17:25:32Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "8642d16d7aac7cca84aa29c4ed78399da08cf51f",
"body": "…ence\n\n- document_editor_insert_token: TokenRun at a plain-text offset (run split via\n updateBlock persistence payload), computed expressions, key validation against\n an optional IDocumentTokenValueProvider (validateKey switch)\n- document_editor_wrap_conditional: wrap top-level body blocks into\n \n[…]\nw tests incl. authoring→describe→assemble round-trip with branch\n flip over two datasets (Mcp.Tests 289/289); JSON doc overlay + validate clean\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(mcp): Fáze 5 — template/assembly tools + content-control converg…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T17:16:32Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "00acfb960a7e65172bfefe0771b041f7897dcf95",
"body": "…nt_render_pdf\n\n- TempoDocumentMcpRenderOptions + TempoDocumentMcpFontCatalog: configurable\n font catalog (explicit ReportPdfFontFace list, family aliases, system\n Arial/DejaVu fallback registered under Arial + Aptos alias) plus ImageResolver\n seam and MaxPreviewPages cap; AddTempoDocumentEditorM\n[…]\nommitted and UX-reviewed\n- TDD: 18 new tests (Mcp.Tests 271/271); JSON doc overlays for all 5 new public\n types; validate --fail-on-drift clean\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(mcp): Fáze 4 — visual feedback: document_render_preview + docume…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T17:04:38Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "64351c9021b9f25fc683cc381d4b712ac531884a",
"body": "- document_editor_create: empty document with one addressable paragraph\n (firstBlockId returned), title + landscape + optional pageSettingsJson;\n fails on existing id\n- document_editor_import: markdown/HTML (text) and DOCX/ODT (base64) via the\n DocumentFormats importers; creates a new document or\n[…]\n253/253, DocumentFormats.Tests 353/353, full bUnit suite 8915/8915;\n JSON doc overlay + regenerated aggregates + validate --fail-on-drift clean\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(mcp): Fáze 3 — create/import/export authoring tools",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T16:51:47Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "13f53dbe2bd65d27b122998590adaa9e759ff8f1",
"body": "- document_editor_insert_block: paragraph/heading/list/quote into the body\n (order-value, fractional insert, append default) or a table cell (index);\n duplicate-id guard; returns new blockId\n- document_editor_delete_block / move_block: body order-value with\n moved-block-wins-ties, cell index sema\n[…]\n coverage doc\n- TDD: 22 new tests (Mcp.Tests 234/234), C# fixture + Node lane 610/610 green;\n JSON doc overlay + validate --fail-on-drift clean\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(mcp): Fáze 2 — block/table tools + convergence fixture extension",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T16:43:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d0525f407de6b4c5d11c0ef1ee12abff3a168aea",
"body": "…+ viewer)\n\nDrill-through end-to-end (aditivně):\n- Definice: ReportDrillThroughAction (TargetReportPath?/TargetReportId? +\n ParameterMappings{ParameterName, SourceKind Static|Field|Parameter, Source})\n nullable na ReportTextBoxElement/ReportChartSeries/ReportTableCell; validace\n (target povinný).\n[…]\nrting 27/0, Web.Tests 96/0.\nCarry-forward: Fit-mode overlay scale (JS-derived), Line/Area/Pie/Donut regiony,\nPDF link annotations.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fáze 18 (C6) pass 2/3: drill-through mezi reporty (definice + engine …",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T16:33:34Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2ae29f317de02f60f8f28a2e399c885df02bb569",
"body": "…ical operations\n\n- document_editor_insert_text / replace_text / delete_text: plain-text offset/length\n addressing (per docs/document-mcp-addressing.md), compiled into per-run\n insertText/deleteText operations; multi-run blocks with tokens supported,\n table-cell targets via tableCellId\n- document\n[…]\n 31 new tests (Mcp.Tests 212/212 green); addressing doc extended with\n compilation semantics; JSON doc overlay + validate --fail-on-drift clean\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(mcp): Fáze 1 — semantic text/formatting tools compiling to canon…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T16:30:54Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "3064d251e0cf259e3841b14f623837cf6e45d0d5",
"body": "…scribe_document\n\n- docs/document-mcp-addressing.md: stable block addresses (blockId, tableCellId,\n content-control path, headers/footers), plain-text offset/length ranges aligned\n with DocumentSearchService, operationAddressable semantics, concurrencyToken vs\n contentDigest contract\n- new MCP to\n[…]\n new tests in Tempo.Blazor.Mcp.Tests (181/181 green)\n- JSON doc overlay item + regenerated tempo-blazor-mcp.json; validate --fail-on-drift clean\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(mcp): Fáze 0 — semantic addressing contract + document_editor_de…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T16:21:33Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a293fdfa36e17256139beac73cfd2f346f155a57",
"body": "Stacked chart typy (aditivně, žádné přeřazení enumů):\n- Report definition ReportChartType += StackedColumn/StackedBar/StackedArea\n (Elements.cs); engine ChartLayout.cs kumulativní stacking od baseline\n (osa škáluje na max STACK TOTAL, kontinuální segmenty se stroke separací,\n přesné area ratios),\n[…]\nfont-subset test\nfailure ověřen jako pre-existing/Windows přes git stash, nesouvisí).\n\nPass 2 (drill-through) a 3 (RTL) následují.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fáze 18 (C5) pass 1/3: stacked charts v rendering enginu + TmChart",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T15:44:29Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "60e9c3e571512c73a8912d6401031e19d53fda5b",
"body": "C2 — Distribuovaná render fronta (multi-node): EfReportRenderJobQueue (DB-backed\nIReportRenderJobQueue) + RenderJobs tabulka + migrace. Atomický claim (jediný\nconditional ExecuteUpdateAsync, WHERE re-kvalifikuje Status+lease) → přesně jeden\nnode renderuje (ověřeno reálným MSSQL race testem); crashlý\n[…]\n69/0/1skip (MSSQL race/fairness/lease reálně), Web.Tests 95/0.\nAditivně, defaulty (InMemory queue, Memory token store) beze změny.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fáze 17 (C2,C3): škálování report serveru na více nodů",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T15:08:04Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a13270b552ad5b3666508f7816a78a6419ce833e",
"body": "… own parallelism\n\nThe default retention (processor count) is below the test's 8-thread\nparallelism on small CI machines: returned engines were disposed and later\nwaves created new ones, busting the 'engines ≤ parallelism' assertion — the\ninvariant is a property of a sufficiently-retaining pool, so the test now\nconstructs the engine with maxRetainedEngines matching its thread count.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(document-formats): pool concurrency test retains engines for its…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T14:41:18Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "2b5da6a8a781ce5b570f9a680a32db908d7bc840",
"body": "… embeds real images\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(e2e): refresh headless export parity screenshots — server export…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T14:30:08Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "2ccd05b61ee76971204491ba4198448b5b384900",
"body": "…ained CI containers\n\nThe gate catches order-of-magnitude regressions; parallel full-suite runs in\nresource-constrained containers tripled dev-machine timings and tripped the\nold 15 s/6 s budgets. New budgets: 30 s cold / 15 s warm.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(document-formats): widen headless layout perf budgets for constr…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T14:27:44Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "cbe15a680bfe273c62c4c42cca0c81f91c7d32d2",
"body": "…e resolution; full applier convergence\n\nFollow-ups completing the headless document runtime plan (v2.4.0):\n\n- Platform-aware Skia fixtures: byte-exact comparisons only on Windows (the\n generator platform); other platforms compare structurally with tight\n tolerances — Skia's scaler backend (FreeTy\n[…]\n nested moves stay in their source cell; convergence fixture extended with\n insert/update/move incl. cell containers and persistence payloads.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(document-formats): Linux-safe Skia parity fixtures; headless imag…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T14:22:03Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "117055639b1854febb9945f185ce882047c91f45",
"body": "Linux-kontejner deploy stack (deploy/docker/):\n- Api.Dockerfile + Web.Dockerfile: multi-stage SDK 10.0→aspnet 10.0, publish jen\n cílený projektový graf; SkiaSharp Linux native deps pro PDF (libfontconfig1,\n fontconfig, fonts-dejavu-core, fonts-liberation, fc-cache); non-root, NuGetAudit=false.\n W\n[…]\nkiaSharp.so + entrypoint dll), YAML/skript lint, base-image tagy. Code review\nAPPROVED. Žádná změna host kódu (vše config-driven).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fáze 16 (C1): kontejnerový deploy report serveru",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T14:06:33Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "5e8c3e298a3f577153e8ee426d900c0c34e047f3",
"body": "…es, doc drift guard; release 2.4.0\n\nPhase 6 of the headless document runtime plan.\n\n- docs/document-canonical-model.md: reference of the canonical\n DocumentEditorDocument JSON (serialization conventions, block/inline types\n with $type discriminators, marks, content controls + assembly metadata,\n \n[…]\n Reporting.Engine, DocumentEditor and the rest of the suite); CHANGELOG\n finalized. The version is the input for the rentcontrol NAJM-009 plan.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(document-editor): canonical model + operation semantics referenc…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T13:52:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "55d1d6d031eeb354cfd2553f765f5cdab101886a",
"body": "…, mark-range splitting, C#↔JS convergence\n\nPhase 5 of the headless document runtime plan.\n\n- Coverage audit across DocumentOperationApplier (C#), transform.mjs (JS) and\n the conflict resolver: docs/document-operation-applier-coverage.md.\n- C# applier resolves targets inside table cells like the JS\n[…]\nual in the Node lane. Known divergences (insertBlock/updateBlock payload\n shape, body moveBlock order-vs-index) documented and carried forward.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(document-editor): server-side operation applier — nested targets…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T13:46:04Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "70feff21739f2eefd8ded957afad50149f26ce3e",
"body": "B5 — Tempo.ReportServer.Web portál lokalizován přes ITmLocalizer (řeší\ncarry-forward z F12): 153 ReportServer_*/CreateReport_* klíčů do\nTmResources.{json,cs,fr}.json (reálné CS/FR překlady, identické key-sety),\nLoc injektován globálně přes _Imports, hardcoded EN texty odstraněny ze shellu,\nvšech str\n[…]\ndál na push/PR. Verze řízena tagem\nnapříč balíčky. Žádný secret hardcoded.\n\nApi.Tests 161/0/1skip. Aditivně, prod path beze změny.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fáze 15 (B5,B6): lokalizace portálu (EN/CS/FR) + nuget push v CI",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T13:37:45Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0e8fd2d0bc7f20b7d9eed4dc37ba5cf43cdea8e7",
"body": "…less layout → PDF + PNG page previews\n\nPhase 4 of the headless document runtime plan.\n\n- ITempoDocumentService/TempoDocumentService: RenderPdfAsync(template/document\n + tokenValues, options) composes DocumentAssemblyService.Assemble (IF/ELSE,\n repeating sections, computed expressions) → ITempoDoc\n[…]\ntotals, due date TODAY+14).\n- JSON doc overlays for the six new public types; COMPONENTS.md gained the\n 'Headless dokumentový runtime' section.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(document-formats): TempoDocumentService facade — assembly → head…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T13:29:25Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ee183523f2c9e5e6382575dc3861c50e8c1ae60f",
"body": "…Demo.Api headless path, E2E\n\nPhase 3 of the headless document runtime plan.\n\n- Committed 21-page parity pair (headless-parity-document/request/snapshot,\n regenerate with TEMPO_REGENERATE_HEADLESS_PARITY_FIXTURE=1): the Jint layout\n matches the browser-generated layout-snapshot-parity-fixture.json\n[…]\nid\n single-page PDF. Known follow-up: URL-resolved images need server-side\n asset resolution (placeholder rects today; reported as remaining).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(document-formats): headless ↔ browser export parity — fixtures, …",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T13:15:04Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "70248a618ef1dab359742d5a8b06744821ef2ba5",
"body": "B1 — Webhook SSRF DNS-rebinding pin: ScheduledReportWebhookConnector resolvuje\nhost jednou, odmítne pokud JAKÁKOLI adresa je neveřejná, a připne socket na\nvalidovanou IP přes SocketsHttpHandler.ConnectCallback (žádné re-resolve při\nconnectu → uzavře TOCTOU). TLS/SNI ověřuje handler proti hostname (n\n[…]\n p95<5s → PASS). Report docs/report-server-load.md.\n\nApi.Tests 161/0/1skip (MSSQL lease race test reálně). Aditivně, prod path OK.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fáze 14 (B1–B4): provozní hardening 2 report serveru",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T12:51:52Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ffdab0aa57f338eeda333548e4c4791f90fcb20e",
"body": "…t over the headless layout bundle\n\nPhase 2 of the headless document runtime plan. GenerateLayoutSnapshotJson lays\nout a DocumentEditorDocument server-side with the exact canvas layout chain\n(embedded bundle, new generateHeadlessLayoutSnapshotJson JSON-in/JSON-out seam)\nand Skia advance tables, retu\n[…]\n canvas converter.\nAddTempoDocumentLayout() registers the singleton. Perf gate: 54-page document\ncold ≈2.2 s / warm ≈0.9 s (budgets 15 s / 6 s).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(document-formats): ITempoDocumentLayoutService — pooled Jint hos…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T12:51:27Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "65209919b4fb849bf2522909034b7b77569371b8",
"body": "… advance tables\n\nPhase 1 of the headless document runtime plan. TempoFontAdvanceTableExtractor\n(+ TempoFontAdvanceFace) reads glyph advances and vertical metrics from the SAME\nReportPdfFontFace bytes the PDF renderer embeds (SKTypeface/SKFont, unhinted\nlinear metrics in font units) behind a thread-\n[…]\ncommitted font-advance-parity-fixture.json (Czech\ndiacritics + letter-spacing samples, regenerable with\nTEMPO_REGENERATE_FONT_PARITY_FIXTURE=1).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(document-formats): font-accurate headless metrics from SkiaSharp…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T12:35:35Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b3cda11b120427c2c5651864658a6c0f764e0ff4",
"body": "…get, guard/smoke tests, drift gate\n\nPhase 0 of the headless document runtime plan: the canvas layout chain\n(buildLayoutSnapshotExport → buildDisplayList → layoutCanvasDocument →\ntranslateDisplayListToLayoutSnapshot incl. line breaker, paragraph engine and the\ninjectable font-metrics service) is bun\n[…]\nti-page snapshot), and a\ntwo-layer drift check (--check in the Node lane + incremental MSBuild pre-build\ntarget) that fails on a stale artifact.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(document-formats): embedded headless layout bundle — esbuild tar…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T12:13:46Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "154060c7e65e2001162d95454633e7984f9ce287",
"body": "Gated full-stack E2E ([TestCategory(\"ReportServerFullStack\")], env TM_RS_FULLSTACK\n— CI ho NEspouští). Živě ověřeno 9/9 proti reálnému stacku (Keycloak service +\nsmtp4dev + Api MSSQL + Web OIDC-on):\n- ApiKey→audit→revoke→401: render přes X-Api-Key 200 → RenderReport audit řádek\n → revoke 204 → Revo\n[…]\n BFF bearer session žije (Api přijme /auth/token bearer).\nRozšiřuje F5b nálezy #4/#5. Handoff test asertuje jen co reálně funguje.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fáze 13 (A5) pass B/2: nightly full-stack E2E lane + handoff/prerender",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T12:03:00Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a0058cd74aaa0b0b460e1f2fc21e264ec5556632",
"body": "…ommands open the panel, cow for field inserts\n\nPhase 10 of the canvas command-layer plan (closure):\n\n- tableProperties/cellProperties/replaceImage/setImageLink were the last dead\n ribbon/palette commands (routed ids the engine never registered). They now open\n the Properties side panel — the pane\n[…]\ns: Node 569/569, bUnit 8900/8900, smoke 16/16 3× green, new E2E green\n(Phase10_PropertiesCommands_OpenPropertiesSidePanel + phase-9 token menu).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(document-editor): hard C#↔engine command contract — properties c…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T11:58:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1326f9df43486cd6f15b562ac70e357ca4f7084c",
"body": "…n menu actually inserts tokens\n\nThe Insert-ribbon token button routed openTokenMenu, a command the engine never\nregistered — a silent no-op. Decision DOC-EDITOR-TOKEN-MENU-BLAZOR-SIDE: the menu\nis a Blazor floating panel (inside the positioned workspace, below the ribbon);\npicking a token routes th\n[…]\nfore.\n- Dispatcher passes insertedRunIds through for structural rendering.\n\nKNOWN_MISSING contract allowlist shrinks 5 → 4 (opentokenmenu gone).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(document-editor): Blazor token panel + engine insertToken — toke…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T11:58:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "dafaa29dbdd5a4c0d52bad13e0ec9f8e47ce653d",
"body": "…ually protects\n\nThe ribbon protect/mark-editable actions toggled C# state and routed\nsetProtectionMode, but the engine never registered the command, so\nmodel.isProtected/restrictedMarkers never changed: the existing\ntext-edit veto and overlay never engaged and typing stayed possible\neverywhere.\n\nen\n[…]\n a\nregion → typing inside passes, save/reload keeps the state and the veto.\nsetprotectionmode removed from the contract KNOWN_MISSING allowlist.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(document-editor): setProtectionMode enforcement — protection act…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T11:58:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2b7d034a47a99a571ff4a03393bc3c4a95b5994c",
"body": "… panel mirror refresh\n\nThe properties side panel routed setTableProperties/setCellProperties —\ncomposite commands the engine never registered (it only had the granular\nsettablecellformat/borders/margins operations), so Apply was a silent\nno-op.\n\ntable-ops.mjs registers both: setTableProperties appl\n[…]\n-lane E2E driving\nthe real context-menu → properties panel with geometry, model and\nsave/reload assertions. Both ids removed from KNOWN_MISSING.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(document-editor): engine setTableProperties + setCellProperties,…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T11:58:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "06d2cca1a27b0a5b8da3739e472a98865bc5d322",
"body": "…nu works in canvas mode\n\ndeletePageBreak was a double no-op: the engine never registered the\ncommand AND the canvas context-menu path never marked page-break blocks\n(BlockType stayed null/Image), so the Delete-page-break item could not\neven appear.\n\nfields.mjs registers deletePageBreak {blockId} (f\n[…]\ne (page\ncount returns, model break gone), undo/redo, save/reload persistence.\ndeletePageBreak removed from the contract KNOWN_MISSING allowlist.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(document-editor): engine deletePageBreak + page-break context me…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T11:58:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "04a0c9a22ed9bf796dd7c2197eef842b11ab9ce4",
"body": "…text menu clamps into viewport\n\nThe table context menu's Delete table and Header row entries routed\ncommand ids the engine never registered — both silent no-ops.\n\ntable-ops.mjs registers deleteTable (resolves via {tableId} or {cellId},\nremoves the whole table block, caret to the following/previous \n[…]\nn table with pixel-sampled\nheader tinting, delete+undo, and save/reload persistence. Both ids\nremoved from the contract KNOWN_MISSING allowlist.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(document-editor): engine deleteTable + toggleTableHeaderRow, con…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T11:58:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ee3645987f9cb6a28201a70662fbd04a4b27975a",
"body": "…picker creates real tables\n\nThe Insert-ribbon table grid routed execCommand('insertTable', {rows,\ncolumns, appendToBodyEnd}) but the engine only registered operations on\nEXISTING tables, so the grid was a silent no-op (earlier table E2E used\nseeds that already contained tables, masking it).\n\ntable-\n[…]\nons.\nParityCoverageMatrix row 14 notes insertTable is genuinely covered only\nnow; insertTable removed from the contract KNOWN_MISSING allowlist.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(document-editor): engine insertTable command — the toolbar grid …",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T11:58:11Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "af0463c419513162dda201c9038a4cedce11bcb9",
"body": "…tered command ids with target state\n\nThe ribbon Different-first-page / Different-odd-even buttons routed\ntoggleDifferentFirstPage / toggleDifferentOddEven — ids the engine never\nregistered (it registers differentFirstPage / differentOddEven), so both\nbuttons were silent no-ops. The route now uses t\n[…]\nhe phase-16 seed\nwith layout-snapshot assertions and save/reload persistence. Both ids\nremoved from the contract test's KNOWN_MISSING allowlist.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(document-editor): header/footer ribbon toggles route engine-regis…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T11:58:11Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "14175e8e66a2e3257460fa7408376458369b4d4d",
"body": "…gine command contract test\n\nRouteToCanvasEngineAsync returned true whenever the canvas engine was\nmounted, so a command id the engine never registered masqueraded as\nsuccess: optimistic toolbar state was applied and every legacy fallback\nunder 'if (await Route...) return;' was permanently dead. The\n[…]\ns/replaceImage/\nsetImageLink newly discovered by the contract) and a companion test\nforces the allowlist to shrink as phases 3–9 implement them.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(document-editor): RouteToCanvasEngineAsync honors Handled + C#↔en…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T11:58:11Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9376ebd0ed6b18ae9acb337fb343e0739d00363a",
"body": "…dit gate\n\nDocumentEditorFullscreenE2ETests (full lane) covers the View-tab fullscreen\ntoggle end to end: body class + scroll lock + position:fixed viewport\ncoverage + opaque editor root, Escape layer-peeling (side panel first,\nfullscreen second), re-entry after exit, and dispose cleanup when\nnaviga\n[…]\n-notion-color-* aliases in _notion-variables.css, --tm-wd-fill in the\nwireframe palette, and auto fallbacks for the unused inline-drawing sizes.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(document-editor): fullscreen E2E regression + CSS token drift au…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T11:58:11Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "409f3e3e26e40c95d014e32855080569726c152d",
"body": "…setFullscreen browser global\n\nFullscreen was routed to a canvas-engine command that the engine never\nregistered (broken since 295b7020 deleted document-editor.js), so the\ntoggle flipped C# state with no visual effect. ToggleFullscreenAsync now\ncalls the restored tmDocumentEditor.setFullscreen globa\n[…]\n + scroll lock), cleans up on dispose, and\nthe missing --tm-color-surface-secondary token is defined so the editor\nroot is opaque in fullscreen.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(document-editor): restore fullscreen toggle via tmDocumentEditor.…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T11:58:11Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9fe273d5b0311169421233ab5becfd5a7868901f",
"body": "Převod ad-hoc Node E2E driverů do commitnutého C# .NET Playwright suite\n(rozhodnutí uživatele: repo-konzistentní C#, koncepty E2E skillu). CI demo lane:\n\n- ReportServerE2ETestBase (self-host Api :7001 + Web :7150 přes EnsureHostAsync\n vzor, gated TM_RS_E2E; DB asserty přes reálný ReportServerDbCont\n[…]\n(Keycloak/smtp4dev + handoff/prerender) je pass B.\nWeb.Tests 87/0, ReportServerE2E 7/7, guard 3/3. Aditivně, prod path beze změny.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fáze 13 (A5) pass A/2: commitnutý C# E2E lane report serveru (CI demo)",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T11:02:50Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f5196785218073e05a852d5b155cfe0114477210",
"body": "Živé E2E (Api :7001 SqlServer + Web :7150 OIDC/Keycloak, author1/viewer1) —\nvšech 6 scénářů PASS s přímým DB důkazem: create→Reports, favorite→Favorites\n(per-user), param Run→RenderRuns (s ParametersJson), un-favorite→smazáno,\nviewer1 role-gated, prázdné stavy. Screenshoty + result JSON v docs/repor\n[…]\nts 84/0, Api.Tests 136/0/1skip (12 MSSQL reálně). Regresní guardy pro\nkaždou vadu. Portál konvence zachována, žádný library churn.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fáze 12 (A4) pass 3/3: živé E2E + oprava vad odhalených E2E + UX",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T08:50:03Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a945a330f93e17ad2e44b13f2d9721382cb9ce5a",
"body": "Oprava překryvu TmDraweru: backdrop patří pod panel (z-index)\n\nToken --tm-z-overlay (1060) je nad --tm-z-modal (1040), ale _drawer.css dával\nbackdrop na --tm-z-overlay a panel na --tm-z-modal. Backdrop se tak vykresloval\nNAD panelem draweru → každý klik (i na obsah/tlačítka) dopadl na overlay a přes\n[…]\nůstává v modal vrstvě (--tm-z-modal) a panel je těsně nad ním\n(calc(--tm-z-modal + 1)). Sjednoceno i v tempo-blazor.bundled.css.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n@",
"is_bot": false,
"headline": "@",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T07:57:35Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d43bc2835c38ff6aeda86a72eaa8a040f281d33a",
"body": "…parametrický render\n\n- NewReportForm (Author-gated): jméno + cílová složka + Blank/Upload-JSON\n (InputFile parsuje ReportDefinition), FluentValidation FE inline chyby,\n CreateReportRequestValidator sdílený s POST /reports (400) → CreateReportAsync\n → naviguje na /designer/{id}.\n- Favorites (serv\n[…]\nts 78/0,\nApi.Tests 134/0/1skip. Portál konvence (hardcoded EN chrome) zachována; žádný\nchurn library Tm* komponent. E2E je pass 3.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fáze 12 (A4) pass 2/3: portál UI — upload, favorites, historie běhů, …",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T07:37:58Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1c8d6cf6b92ecd6b8f1d5925cd29bd3b48791f84",
"body": "Server-side favorites a persistence ad-hoc render běhů (rozhodnutí uživatele:\nfull-server varianta):\n- EF ReportFavoriteEntity (unique TenantId+UserId+ReportId) + RenderRunEntity\n (Outcome/Format/PageCount/ByteSize/DurationMs/ParametersJson) + migrace\n ReportFavoritesAndRenderRuns + idempotentní S\n[…]\n failure outcome (defensivně, TimeProvider), navíc k F11 auditu.\n\nApi.Tests 133/0/1skip, Web.Tests 62/0. UI + E2E jsou pass 2 a 3.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fáze 12 (A4) pass 1/3: backend favorites + persistované render runs",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T06:56:15Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "50a8554f8c0202276144d1bcc775d2791538f76e",
"body": "Autorizace (hybrid posture, rozhodnutí uživatele):\n- ACL enforcement + audit navěšeny in-handler na živé /api endpointy\n (/render, /folders, /reports, /datasources); render řeší report→folder\n leak-safe dle vzoru /resolve. Audit Allowed až po úspěchu, Denied při 403.\n- Catalog/datasource write end\n[…]\nověřeny\nend-to-end). Nový ReportServerLiveAuthorizationTests; resolver testy pro\ndeny-wins/Role/Application + api-key author-path.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fáze 11 (A2/A3/A6): dokončení autorizace a auditu report serveru",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T06:04:48Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f0800259edbbec4d5061779b63959d33dbece805",
"body": "…HH:mm time sub-field\n\nAdds an optional [Parameter] string? TimeLabel that renders a <label class=\"tm-picker-label\">\nabove the .tm-datetime-time-section (the TmTimeInput). Null/empty = no label (backward\ncompatible — no layout change for existing consumers). Enables downstream apps to label the\ntime sub-field (e.g. „Čas\"/„Time\") which previously had no label slot.\n\nVersion bump 2.3.9 → 2.3.10.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(pickers): TmDateTimePicker optional TimeLabel — label above the …",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T05:19:33Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "20ef26d1f9e9452444c3f02a959e52574d55b6f5",
"body": "… driver\n\n- report-server-e2e-results.md: sekce Fáze 10 řešící nález #3 (portál napojen na OIDC principal)\n- author1: nav reports/designer/schedules/revisions; viewer1: jen reports (role-based proof)\n- tenant-switcher absent + tenant-display \"default\" v OIDC módu; access-token claims projekce ověřena\n- f10-e2e.mjs driver (MODE=demo|author|viewer) + screenshoty a result.json\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fáze 10 (A1): živé OIDC E2E důkazy (author1/viewer1 role-based nav) +…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T05:08:12Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e21a15f08810874e375593b9b40d9033d585166a",
"body": "The publish workflows fail at eng/verify-nuget-package-manifest.sh because the\npackage project added in Phase 7 was missing from eng/nuget-packages.txt.\nVerified locally: manifest check passes and eng/pack-nuget-packages.sh packs\nall 26 packages incl. the new one; Release build + the CI test filter are green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: add Tempo.Blazor.Proofing.LanguageTool to the NuGet package manifest",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T04:31:08Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e8f97ca3f2dea3f52512495f71ff2727018967aa",
"body": "…uild\n\n- AngleSharp 1.1.2 -> 1.5.2 (NU1902, GHSA-pgww-w46g-26qg) in DocumentEditor and\n EmailTemplates.Abstractions; published packages no longer depend on the\n vulnerable version\n- bunit 1.38.5 -> 2.7.2 across all five bUnit test projects: AngleSharp 1.4+\n reabstracted IHtmlCollection's indexer \n[…]\n (incl. smtp4dev), DocumentFormats 312, Mcp 170,\n EmailTemplates.Abstractions 192, Reporting.Engine 61 + Abstractions 15,\n ReportServer.Api 22\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(deps): resolve NuGet audit vulnerabilities blocking the publish b…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T04:03:47Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "91463730f599c343636b5f2ecee5d5d28233b5a7",
"body": "Fáze 10 (A1): projekce Keycloak rolí/tenantu z access tokenu do cookie principalu\n\nŽivé E2E odhalilo, že po OIDC loginu portál UI zobrazil identitu (author1) správně,\nale VŠECHNY nav položky skryté a tenant=default — cookie principal (z id_tokenu+\nuserinfo) nenese realm_access/tenant_id, které Keycl\n[…]\nincipalu.\n\nRegresní test AccessTokenClaimsProjectionTests (5) — bug bUnit nezachytil (injektuje\nclaims napřímo). Web.Tests 62/0.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n@",
"is_bot": false,
"headline": "@",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T04:01:53Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9c8694295ea3a213aa870ae67e50095e1c47025c",
"body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore(demo-api): refresh diagrams.db after local E2E verification runs",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-19T03:12:35Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "f58aed7d951315b40f3f76004286f687ee748209",
"body": "…it-test hardening\n\nRoot cause of the startup caret race (typed text landing at block start,\nautocapitalized): TmDocumentCanvasEngineHost.OnAfterRenderAsync assigns\n_handle only AFTER the awaited mount interop completes, so several quick\nstartup renders interleaved past the guard and mounted the eng\n[…]\n suite 198/198 incl. RequiresSmtp4Dev)\n- Suites: smoke 3x 16/16, bUnit 8892, Node 529, Demo.Api 198 (with smtp4dev\n in Docker), phase E2E 11/11\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(document-editor): canvas engine mount reentrancy race + pointer h…",
"author_name": "Pavel Tyll",
"author_login": null,
"committed_at": "2026-07-18T21:08:01Z",
"body_truncated": true,
"is_coding_agent": true
}
],
"releases_count": 26,
"commits_last_year": 611,
"latest_release_at": "2026-04-12T02:55:44Z",
"latest_release_tag": "v1.1.15",
"releases_from_tags": false,
"days_since_last_push": 0,
"active_weeks_last_year": 20,
"days_since_latest_release": 103,
"mean_days_between_releases": 3.4
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": false,
"health_percentage": 42,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "Tempo.Blazor.All",
"exists": true,
"license": null,
"keywords": [
"blazor",
"components",
"ui",
"compatibility",
"metapackage",
"tempo-blazor"
],
"ecosystem": "nuget",
"matches_repo": true,
"registry_url": "https://www.nuget.org/packages/Tempo.Blazor.All",
"is_deprecated": false,
"latest_version": "2.7.1",
"repository_url": "https://github.com/ptyll/Tempo.Blazor",
"versions_count": 26,
"total_downloads": 5000,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-24T14:59:04.420000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 0
},
{
"name": "Tempo.Blazor.Mcp",
"exists": true,
"license": null,
"keywords": [
"blazor",
"mcp",
"wireframe",
"diagram",
"draw",
"editor",
"reporting",
"reports",
"ai",
"llm",
"tools"
],
"ecosystem": "nuget",
"matches_repo": null,
"registry_url": "https://www.nuget.org/packages/Tempo.Blazor.Mcp",
"is_deprecated": false,
"latest_version": "2.7.1",
"repository_url": null,
"versions_count": 26,
"total_downloads": 5167,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-24T14:59:17.393000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 0
},
{
"name": "Tempo.Blazor.Maps",
"exists": true,
"license": null,
"keywords": [
"blazor",
"components",
"map",
"leaflet",
"openstreetmap",
"markers",
"clustering"
],
"ecosystem": "nuget",
"matches_repo": true,
"registry_url": "https://www.nuget.org/packages/Tempo.Blazor.Maps",
"is_deprecated": false,
"latest_version": "2.7.1",
"repository_url": "https://github.com/ptyll/Tempo.Blazor",
"versions_count": 16,
"total_downloads": 2770,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-24T14:59:16.217000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 0
},
{
"name": "Tempo.Blazor.Codes",
"exists": true,
"license": null,
"keywords": [
"blazor",
"components",
"qr",
"barcode",
"qrcode",
"zxing"
],
"ecosystem": "nuget",
"matches_repo": true,
"registry_url": "https://www.nuget.org/packages/Tempo.Blazor.Codes",
"is_deprecated": false,
"latest_version": "2.7.1",
"repository_url": "https://github.com/ptyll/Tempo.Blazor",
"versions_count": 26,
"total_downloads": 5945,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-24T14:59:05.473000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 0
},
{
"name": "Tempo.Blazor.GanttXlsx",
"exists": true,
"license": null,
"keywords": [
"blazor",
"gantt",
"xlsx",
"excel",
"openxml",
"import",
"export"
],
"ecosystem": "nuget",
"matches_repo": true,
"registry_url": "https://www.nuget.org/packages/Tempo.Blazor.GanttXlsx",
"is_deprecated": false,
"latest_version": "2.7.1",
"repository_url": "https://github.com/ptyll/Tempo.Blazor",
"versions_count": 26,
"total_downloads": 6005,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-24T14:59:15.160000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 0
},
{
"name": "Tempo.Blazor.Abstractions",
"exists": true,
"license": null,
"keywords": [
"blazor",
"abstractions",
"interfaces",
"models"
],
"ecosystem": "nuget",
"matches_repo": true,
"registry_url": "https://www.nuget.org/packages/Tempo.Blazor.Abstractions",
"is_deprecated": false,
"latest_version": "2.7.1",
"repository_url": "https://github.com/ptyll/Tempo.Blazor",
"versions_count": 32,
"total_downloads": 25928,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-24T14:59:03.460000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 0
},
{
"name": "Tempo.Blazor.Collaboration",
"exists": true,
"license": null,
"keywords": [
"blazor",
"documents",
"collaboration",
"signalr",
"document-editor"
],
"ecosystem": "nuget",
"matches_repo": null,
"registry_url": "https://www.nuget.org/packages/Tempo.Blazor.Collaboration",
"is_deprecated": false,
"latest_version": "2.7.1",
"repository_url": null,
"versions_count": 26,
"total_downloads": 5149,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-24T14:59:06.440000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 0
},
{
"name": "Tempo.Blazor.DataTableXlsx",
"exists": true,
"license": null,
"keywords": [
"blazor",
"datatable",
"xlsx",
"excel",
"openxml",
"export"
],
"ecosystem": "nuget",
"matches_repo": true,
"registry_url": "https://www.nuget.org/packages/Tempo.Blazor.DataTableXlsx",
"is_deprecated": false,
"latest_version": "2.7.1",
"repository_url": "https://github.com/ptyll/Tempo.Blazor",
"versions_count": 17,
"total_downloads": 2960,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-24T14:59:07.380000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 0
}
]
},
"popularity": {
"forks": 2,
"stars": 2,
"watchers": 0,
"fork_history": {
"days": [
{
"date": "2026-04-05",
"count": 1
},
{
"date": "2026-07-17",
"count": 1
}
],
"complete": true,
"collected": 2,
"total_forks": 2
},
"star_history": null,
"open_issues_and_prs": 0
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": true,
"has_mcp_signal": true,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [
"JsonDocumentation/JsonDocumentationGenerator/JsonDocumentationGenerator.csproj",
"src/Tempo.Blazor.Abstractions/Tempo.Blazor.Abstractions.csproj",
"src/Tempo.Blazor.All/Tempo.Blazor.All.csproj",
"src/Tempo.Blazor.Codes/Tempo.Blazor.Codes.csproj",
"src/Tempo.Blazor.Collaboration/Tempo.Blazor.Collaboration.csproj",
"src/Tempo.Blazor.DataTableXlsx/Tempo.Blazor.DataTableXlsx.csproj",
"src/Tempo.Blazor.Demo.Api/Tempo.Blazor.Demo.Api.csproj",
"src/Tempo.Blazor.Demo.InteractiveAuto/Tempo.Blazor.Demo.InteractiveAuto.Client/Tempo.Blazor.Demo.InteractiveAuto.Client.csproj",
"src/Tempo.Blazor.Demo.InteractiveAuto/Tempo.Blazor.Demo.InteractiveAuto/Tempo.Blazor.Demo.InteractiveAuto.csproj",
"src/Tempo.Blazor.Demo.Server/Tempo.Blazor.Demo.Server.csproj",
"src/Tempo.Blazor.Demo.Shared/Tempo.Blazor.Demo.Shared.csproj",
"src/Tempo.Blazor.Demo.SharedUI/Tempo.Blazor.Demo.SharedUI.csproj",
"src/Tempo.Blazor.Demo/Tempo.Blazor.Demo.csproj",
"src/Tempo.Blazor.DiagramEditor/Tempo.Blazor.DiagramEditor.csproj",
"src/Tempo.Blazor.DocumentEditor/Tempo.Blazor.DocumentEditor.csproj",
"src/Tempo.Blazor.DocumentFormats/Tempo.Blazor.DocumentFormats.csproj",
"src/Tempo.Blazor.EmailTemplates.Abstractions/Tempo.Blazor.EmailTemplates.Abstractions.csproj",
"src/Tempo.Blazor.EmailTemplates/Tempo.Blazor.EmailTemplates.csproj",
"src/Tempo.Blazor.FluentValidation/Tempo.Blazor.FluentValidation.csproj",
"src/Tempo.Blazor.GanttXlsx/Tempo.Blazor.GanttXlsx.csproj",
"src/Tempo.Blazor.Maps/Tempo.Blazor.Maps.csproj",
"src/Tempo.Blazor.Mcp/Tempo.Blazor.Mcp.csproj",
"src/Tempo.Blazor.Modeling/Tempo.Blazor.Modeling.csproj",
"src/Tempo.Blazor.NotionEditor/Tempo.Blazor.NotionEditor.csproj",
"src/Tempo.Blazor.PdfViewer/Tempo.Blazor.PdfViewer.csproj",
"src/Tempo.Blazor.Proofing.LanguageTool/Tempo.Blazor.Proofing.LanguageTool.csproj",
"src/Tempo.Blazor.Reporting/Tempo.Blazor.Reporting.csproj",
"src/Tempo.Blazor.Signing/Tempo.Blazor.Signing.csproj",
"src/Tempo.Blazor.Spreadsheet/Tempo.Blazor.Spreadsheet.csproj",
"src/Tempo.Blazor.WebPush/Tempo.Blazor.WebPush.csproj",
"src/Tempo.Blazor.Wireframe/Tempo.Blazor.Wireframe.csproj",
"src/Tempo.Blazor/Tempo.Blazor.csproj",
"src/Tempo.ReportServer.Api/Tempo.ReportServer.Api.csproj",
"src/Tempo.ReportServer.Web.Client/Tempo.ReportServer.Web.Client.csproj",
"src/Tempo.ReportServer.Web/Tempo.ReportServer.Web.csproj",
"src/Tempo.Reporting.Abstractions/Tempo.Reporting.Abstractions.csproj",
"src/Tempo.Reporting.Engine/Tempo.Reporting.Engine.csproj",
"tests/Tempo.Blazor.Demo.Api.Tests/Tempo.Blazor.Demo.Api.Tests.csproj",
"tests/Tempo.Blazor.DocumentFormats.Tests/Tempo.Blazor.DocumentFormats.Tests.csproj",
"tests/Tempo.Blazor.E2E/Tempo.Blazor.E2E.csproj",
"tests/Tempo.Blazor.EmailTemplates.Abstractions.Tests/Tempo.Blazor.EmailTemplates.Abstractions.Tests.csproj",
"tests/Tempo.Blazor.EmailTemplates.Tests/Tempo.Blazor.EmailTemplates.Tests.csproj",
"tests/Tempo.Blazor.FluentValidation.Tests/Tempo.Blazor.FluentValidation.Tests.csproj",
"tests/Tempo.Blazor.Mcp.Tests/Tempo.Blazor.Mcp.Tests.csproj",
"tests/Tempo.Blazor.Reporting.Tests/Tempo.Blazor.Reporting.Tests.csproj",
"tests/Tempo.Blazor.Tests/Tempo.Blazor.Tests.csproj",
"tests/Tempo.ReportServer.Api.Tests/Tempo.ReportServer.Api.Tests.csproj",
"tests/Tempo.ReportServer.Web.Tests/Tempo.ReportServer.Web.Tests.csproj",
"tests/Tempo.Reporting.Abstractions.Tests/Tempo.Reporting.Abstractions.Tests.csproj",
"tests/Tempo.Reporting.Engine.Tests/Tempo.Reporting.Engine.Tests.csproj"
],
"largest_source_bytes": 1039207,
"source_files_sampled": 4137,
"oversized_source_files": 51,
"agent_instruction_files": [
"AGENTS.md",
"src/Tempo.Blazor/AGENT.md"
],
"agent_instruction_max_bytes": 33173
},
"dependencies": {
"manifests": [
"package.json"
],
"advisories": {
"error": null,
"scope": null,
"source": null,
"findings": [],
"collected": false,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 0,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"npm"
],
"dependencies": [
{
"name": "Microsoft.Extensions.DependencyInjection.Abstractions",
"manifest": "src/Tempo.Blazor.Abstractions/Tempo.Blazor.Abstractions.csproj",
"ecosystem": "nuget",
"version_constraint": "8.0.0"
},
{
"name": "Microsoft.Extensions.Logging.Abstractions",
"manifest": "src/Tempo.Blazor.Abstractions/Tempo.Blazor.Abstractions.csproj",
"ecosystem": "nuget",
"version_constraint": "8.0.0"
},
{
"name": "QRCoder",
"manifest": "src/Tempo.Blazor.Codes/Tempo.Blazor.Codes.csproj",
"ecosystem": "nuget",
"version_constraint": "1.6.0"
},
{
"name": "ZXing.Net",
"manifest": "src/Tempo.Blazor.Codes/Tempo.Blazor.Codes.csproj",
"ecosystem": "nuget",
"version_constraint": "0.16.10"
},
{
"name": "Microsoft.AspNetCore.Components.Web",
"manifest": "src/Tempo.Blazor.Codes/Tempo.Blazor.Codes.csproj",
"ecosystem": "nuget",
"version_constraint": "8.0.12"
},
{
"name": "Microsoft.AspNetCore.Components.Web",
"manifest": "src/Tempo.Blazor.Codes/Tempo.Blazor.Codes.csproj",
"ecosystem": "nuget",
"version_constraint": "9.0.3"
},
{
"name": "Microsoft.AspNetCore.Components.Web",
"manifest": "src/Tempo.Blazor.Codes/Tempo.Blazor.Codes.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.3"
},
{
"name": "Microsoft.AspNetCore.SignalR.Client",
"manifest": "src/Tempo.Blazor.Collaboration/Tempo.Blazor.Collaboration.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.5"
},
{
"name": "StackExchange.Redis",
"manifest": "src/Tempo.Blazor.Collaboration/Tempo.Blazor.Collaboration.csproj",
"ecosystem": "nuget",
"version_constraint": "2.8.31"
},
{
"name": "DocumentFormat.OpenXml",
"manifest": "src/Tempo.Blazor.DataTableXlsx/Tempo.Blazor.DataTableXlsx.csproj",
"ecosystem": "nuget",
"version_constraint": "3.3.0"
},
{
"name": "Microsoft.Extensions.DependencyInjection.Abstractions",
"manifest": "src/Tempo.Blazor.DataTableXlsx/Tempo.Blazor.DataTableXlsx.csproj",
"ecosystem": "nuget",
"version_constraint": "8.0.2"
},
{
"name": "Microsoft.Extensions.DependencyInjection.Abstractions",
"manifest": "src/Tempo.Blazor.DataTableXlsx/Tempo.Blazor.DataTableXlsx.csproj",
"ecosystem": "nuget",
"version_constraint": "9.0.3"
},
{
"name": "Microsoft.Extensions.DependencyInjection.Abstractions",
"manifest": "src/Tempo.Blazor.DataTableXlsx/Tempo.Blazor.DataTableXlsx.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.3"
},
{
"name": "MailKit",
"manifest": "src/Tempo.Blazor.Demo.Api/Tempo.Blazor.Demo.Api.csproj",
"ecosystem": "nuget",
"version_constraint": "4.17.0"
},
{
"name": "ModelContextProtocol.AspNetCore",
"manifest": "src/Tempo.Blazor.Demo.Api/Tempo.Blazor.Demo.Api.csproj",
"ecosystem": "nuget",
"version_constraint": "1.2.0"
},
{
"name": "Microsoft.EntityFrameworkCore.Sqlite",
"manifest": "src/Tempo.Blazor.Demo.Api/Tempo.Blazor.Demo.Api.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.9"
},
{
"name": "QuestPDF",
"manifest": "src/Tempo.Blazor.Demo.Api/Tempo.Blazor.Demo.Api.csproj",
"ecosystem": "nuget",
"version_constraint": "2026.2.4"
},
{
"name": "SkiaSharp",
"manifest": "src/Tempo.Blazor.Demo.Api/Tempo.Blazor.Demo.Api.csproj",
"ecosystem": "nuget",
"version_constraint": "3.119.2"
},
{
"name": "SkiaSharp.NativeAssets.Linux.NoDependencies",
"manifest": "src/Tempo.Blazor.Demo.Api/Tempo.Blazor.Demo.Api.csproj",
"ecosystem": "nuget",
"version_constraint": "3.119.2"
},
{
"name": "SQLitePCLRaw.bundle_e_sqlite3",
"manifest": "src/Tempo.Blazor.Demo.Api/Tempo.Blazor.Demo.Api.csproj",
"ecosystem": "nuget",
"version_constraint": "3.0.3"
},
{
"name": "Svg.Skia",
"manifest": "src/Tempo.Blazor.Demo.Api/Tempo.Blazor.Demo.Api.csproj",
"ecosystem": "nuget",
"version_constraint": "4.2.0"
},
{
"name": "FluentValidation",
"manifest": "src/Tempo.Blazor.Demo.Server/Tempo.Blazor.Demo.Server.csproj",
"ecosystem": "nuget",
"version_constraint": "12.1.1"
},
{
"name": "FluentValidation",
"manifest": "src/Tempo.Blazor.Demo.SharedUI/Tempo.Blazor.Demo.SharedUI.csproj",
"ecosystem": "nuget",
"version_constraint": "12.1.1"
},
{
"name": "Microsoft.AspNetCore.Components.Web",
"manifest": "src/Tempo.Blazor.Demo.SharedUI/Tempo.Blazor.Demo.SharedUI.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.3"
},
{
"name": "Microsoft.Extensions.Localization",
"manifest": "src/Tempo.Blazor.Demo.SharedUI/Tempo.Blazor.Demo.SharedUI.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.3"
},
{
"name": "Microsoft.Extensions.Http",
"manifest": "src/Tempo.Blazor.Demo.SharedUI/Tempo.Blazor.Demo.SharedUI.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.3"
},
{
"name": "Microsoft.AspNetCore.SignalR.Client",
"manifest": "src/Tempo.Blazor.Demo.SharedUI/Tempo.Blazor.Demo.SharedUI.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.5"
},
{
"name": "FluentValidation",
"manifest": "src/Tempo.Blazor.Demo/Tempo.Blazor.Demo.csproj",
"ecosystem": "nuget",
"version_constraint": "12.1.1"
},
{
"name": "Microsoft.AspNetCore.Components.WebAssembly",
"manifest": "src/Tempo.Blazor.Demo/Tempo.Blazor.Demo.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.3"
},
{
"name": "Microsoft.AspNetCore.Components.WebAssembly.DevServer",
"manifest": "src/Tempo.Blazor.Demo/Tempo.Blazor.Demo.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.3"
},
{
"name": "Microsoft.Extensions.Localization",
"manifest": "src/Tempo.Blazor.Demo/Tempo.Blazor.Demo.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.3"
},
{
"name": "Microsoft.Extensions.Http",
"manifest": "src/Tempo.Blazor.Demo/Tempo.Blazor.Demo.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.3"
},
{
"name": "CsvHelper",
"manifest": "src/Tempo.Blazor.DiagramEditor/Tempo.Blazor.DiagramEditor.csproj",
"ecosystem": "nuget",
"version_constraint": "33.0.1"
},
{
"name": "Microsoft.AspNetCore.Components.Web",
"manifest": "src/Tempo.Blazor.DiagramEditor/Tempo.Blazor.DiagramEditor.csproj",
"ecosystem": "nuget",
"version_constraint": "8.0.12"
},
{
"name": "Microsoft.AspNetCore.Components.Web",
"manifest": "src/Tempo.Blazor.DiagramEditor/Tempo.Blazor.DiagramEditor.csproj",
"ecosystem": "nuget",
"version_constraint": "9.0.3"
},
{
"name": "Microsoft.AspNetCore.Components.Web",
"manifest": "src/Tempo.Blazor.DiagramEditor/Tempo.Blazor.DiagramEditor.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.3"
},
{
"name": "AngleSharp",
"manifest": "src/Tempo.Blazor.DocumentEditor/Tempo.Blazor.DocumentEditor.csproj",
"ecosystem": "nuget",
"version_constraint": "1.5.2"
},
{
"name": "Microsoft.AspNetCore.Components.Web",
"manifest": "src/Tempo.Blazor.DocumentEditor/Tempo.Blazor.DocumentEditor.csproj",
"ecosystem": "nuget",
"version_constraint": "8.0.12"
},
{
"name": "Microsoft.AspNetCore.Components.Web",
"manifest": "src/Tempo.Blazor.DocumentEditor/Tempo.Blazor.DocumentEditor.csproj",
"ecosystem": "nuget",
"version_constraint": "9.0.3"
},
{
"name": "Microsoft.AspNetCore.Components.Web",
"manifest": "src/Tempo.Blazor.DocumentEditor/Tempo.Blazor.DocumentEditor.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.3"
},
{
"name": "DocumentFormat.OpenXml",
"manifest": "src/Tempo.Blazor.DocumentFormats/Tempo.Blazor.DocumentFormats.csproj",
"ecosystem": "nuget",
"version_constraint": "3.3.0"
},
{
"name": "Jint",
"manifest": "src/Tempo.Blazor.DocumentFormats/Tempo.Blazor.DocumentFormats.csproj",
"ecosystem": "nuget",
"version_constraint": "4.13.0"
},
{
"name": "AngleSharp",
"manifest": "src/Tempo.Blazor.EmailTemplates.Abstractions/Tempo.Blazor.EmailTemplates.Abstractions.csproj",
"ecosystem": "nuget",
"version_constraint": "1.5.2"
},
{
"name": "Mjml.Net",
"manifest": "src/Tempo.Blazor.EmailTemplates.Abstractions/Tempo.Blazor.EmailTemplates.Abstractions.csproj",
"ecosystem": "nuget",
"version_constraint": "4.11.0"
},
{
"name": "Scriban",
"manifest": "src/Tempo.Blazor.EmailTemplates.Abstractions/Tempo.Blazor.EmailTemplates.Abstractions.csproj",
"ecosystem": "nuget",
"version_constraint": "7.2.4"
},
{
"name": "FluentValidation",
"manifest": "src/Tempo.Blazor.EmailTemplates.Abstractions/Tempo.Blazor.EmailTemplates.Abstractions.csproj",
"ecosystem": "nuget",
"version_constraint": "12.1.1"
},
{
"name": "Microsoft.Extensions.DependencyInjection.Abstractions",
"manifest": "src/Tempo.Blazor.EmailTemplates.Abstractions/Tempo.Blazor.EmailTemplates.Abstractions.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.0"
},
{
"name": "Microsoft.Extensions.Localization.Abstractions",
"manifest": "src/Tempo.Blazor.EmailTemplates.Abstractions/Tempo.Blazor.EmailTemplates.Abstractions.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.0"
},
{
"name": "Microsoft.Extensions.Logging.Abstractions",
"manifest": "src/Tempo.Blazor.EmailTemplates.Abstractions/Tempo.Blazor.EmailTemplates.Abstractions.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.0"
},
{
"name": "FluentValidation",
"manifest": "src/Tempo.Blazor.FluentValidation/Tempo.Blazor.FluentValidation.csproj",
"ecosystem": "nuget",
"version_constraint": "12.1.1"
},
{
"name": "Microsoft.AspNetCore.Components.Web",
"manifest": "src/Tempo.Blazor.FluentValidation/Tempo.Blazor.FluentValidation.csproj",
"ecosystem": "nuget",
"version_constraint": "8.0.12"
},
{
"name": "Microsoft.AspNetCore.Components.Web",
"manifest": "src/Tempo.Blazor.FluentValidation/Tempo.Blazor.FluentValidation.csproj",
"ecosystem": "nuget",
"version_constraint": "9.0.3"
},
{
"name": "Microsoft.AspNetCore.Components.Web",
"manifest": "src/Tempo.Blazor.FluentValidation/Tempo.Blazor.FluentValidation.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.3"
},
{
"name": "DocumentFormat.OpenXml",
"manifest": "src/Tempo.Blazor.GanttXlsx/Tempo.Blazor.GanttXlsx.csproj",
"ecosystem": "nuget",
"version_constraint": "3.3.0"
},
{
"name": "Microsoft.Extensions.DependencyInjection.Abstractions",
"manifest": "src/Tempo.Blazor.GanttXlsx/Tempo.Blazor.GanttXlsx.csproj",
"ecosystem": "nuget",
"version_constraint": "8.0.2"
},
{
"name": "Microsoft.Extensions.DependencyInjection.Abstractions",
"manifest": "src/Tempo.Blazor.GanttXlsx/Tempo.Blazor.GanttXlsx.csproj",
"ecosystem": "nuget",
"version_constraint": "9.0.3"
},
{
"name": "Microsoft.Extensions.DependencyInjection.Abstractions",
"manifest": "src/Tempo.Blazor.GanttXlsx/Tempo.Blazor.GanttXlsx.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.3"
},
{
"name": "Microsoft.AspNetCore.Components.Web",
"manifest": "src/Tempo.Blazor.Maps/Tempo.Blazor.Maps.csproj",
"ecosystem": "nuget",
"version_constraint": "8.0.12"
},
{
"name": "Microsoft.AspNetCore.Components.Web",
"manifest": "src/Tempo.Blazor.Maps/Tempo.Blazor.Maps.csproj",
"ecosystem": "nuget",
"version_constraint": "9.0.3"
},
{
"name": "Microsoft.AspNetCore.Components.Web",
"manifest": "src/Tempo.Blazor.Maps/Tempo.Blazor.Maps.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.3"
},
{
"name": "FluentValidation",
"manifest": "src/Tempo.Blazor.Mcp/Tempo.Blazor.Mcp.csproj",
"ecosystem": "nuget",
"version_constraint": "12.1.1"
},
{
"name": "ModelContextProtocol.Core",
"manifest": "src/Tempo.Blazor.Mcp/Tempo.Blazor.Mcp.csproj",
"ecosystem": "nuget",
"version_constraint": "1.2.0"
},
{
"name": "Microsoft.Extensions.Localization.Abstractions",
"manifest": "src/Tempo.Blazor.Mcp/Tempo.Blazor.Mcp.csproj",
"ecosystem": "nuget",
"version_constraint": "8.0.12"
},
{
"name": "Microsoft.Extensions.Localization.Abstractions",
"manifest": "src/Tempo.Blazor.Mcp/Tempo.Blazor.Mcp.csproj",
"ecosystem": "nuget",
"version_constraint": "9.0.3"
},
{
"name": "Microsoft.Extensions.Localization.Abstractions",
"manifest": "src/Tempo.Blazor.Mcp/Tempo.Blazor.Mcp.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.3"
}
],
"all_dependencies": {
"error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"source": null,
"packages": [],
"collected": false,
"truncated": false,
"total_count": null,
"direct_count": null,
"indirect_count": null
}
},
"maintainership": {
"issues": {
"open_prs": 0,
"merged_prs": 13,
"open_issues": 0,
"closed_ratio": null,
"closed_issues": 0,
"closed_unmerged_prs": 0
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "ptyll",
"commits": 14,
"avatar_url": "https://avatars.githubusercontent.com/u/27801209?v=4"
},
{
"type": "User",
"login": "agriffard",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/703248?v=4"
}
],
"contributors_sampled": 2,
"top_contributor_share": 0.933
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"document-editor-performance.yml",
"publish-nuget-org.yml",
"publish-nuget.yml",
"report-server-container-smoke.yml"
],
"has_docs_dir": true,
"linter_configs": [],
"has_editorconfig": true,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [
"package-lock.json"
],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 3,
"reason": "branch protection is not maximal on development and all release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": null,
"reason": "no pull request found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/30 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 0,
"reason": "project has 0 contributing companies or organizations -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 0,
"reason": "no update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 10,
"reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": 10,
"reason": "packaging workflow detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 0,
"reason": "dependency not pinned by hash detected -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "no SAST tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 0,
"reason": "detected GitHub workflow tokens with excessive permissions",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 9,
"reason": "1 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "c74528f58e965abcc9bf46be184c126739e7284e",
"ran_at": "2026-07-24T15:05:43Z",
"aggregate_score": 4.4,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-24T05:55:41Z",
"oldest_open_prs": [],
"last_merged_pr_at": "2026-07-13T08:10:50Z",
"ci_last_conclusion": "FAILURE",
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/ptyll/Tempo.Blazor",
"host": "github.com",
"name": "Tempo.Blazor",
"owner": "ptyll"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 58,
"inputs": {
"security": 44,
"vitality": 83,
"community": 33,
"governance": 51,
"engineering": 71
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "good",
"name": "Vitality",
"value": 83,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "good",
"name": "Development activity",
"note": null,
"notes": [],
"value": 78,
"inputs": {
"commits_last_year": 611,
"human_commit_share": 1,
"days_since_last_push": 0,
"active_weeks_last_year": 20
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 0
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "20/52 weeks with commits",
"points": 13.8,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 20
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "611 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 611
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 90,
"inputs": {
"releases_count": 26,
"latest_release_tag": "v1.1.15",
"releases_from_tags": false,
"days_since_latest_release": 103,
"mean_days_between_releases": 3.4
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "26 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 26
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 103 days ago",
"points": 27,
"status": "partial",
"details": [
{
"code": "release_recency",
"params": {
"days": 103
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~3.4 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 3.4
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "unverified",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": "repository_too_young",
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": null,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "maintenance record not established from the collected data",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_unverified",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "at_risk",
"name": "Community & Adoption",
"value": 33,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 1,
"inputs": {
"forks": 2,
"stars": 2,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "2 stars",
"points": 0,
"status": "missed",
"details": [
{
"code": "stars",
"params": {
"count": 2
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "2 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 2
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "0 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 0
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "moderate",
"name": "Community health",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (MIT)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "MIT"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
},
{
"key": "ecosystem_adoption",
"band": "moderate",
"name": "Ecosystem adoption (downloads)",
"note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"registry_dependents"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 62,
"inputs": {
"packages": [
"Tempo.Blazor.All",
"Tempo.Blazor.Mcp",
"Tempo.Blazor.Maps",
"Tempo.Blazor.Codes",
"Tempo.Blazor.GanttXlsx",
"Tempo.Blazor.Abstractions",
"Tempo.Blazor.Collaboration",
"Tempo.Blazor.DataTableXlsx"
],
"dependents": null,
"ecosystems": "nuget",
"total_downloads": 58924,
"monthly_downloads": null
},
"components": [
{
"key": "total_downloads",
"name": "Total downloads",
"detail": "58,924 downloads all-time across nuget",
"points": 49.6,
"status": "partial",
"details": [
{
"code": "downloads_total",
"params": {
"count": 58924,
"ecosystems": "nuget"
}
}
],
"max_points": 80
},
{
"key": "registry_dependents",
"name": "Registry dependents",
"detail": "not reported by this ecosystem",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_reported_by_this_ecosystem",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "moderate",
"name": "Sustainability & Governance",
"value": 51,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 13,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 2,
"top_contributor_share": 0.933
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "1 contributor(s) cover half of all commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 1
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 93% of commits",
"points": 1.5,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 93
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "2 contributors",
"points": 2.7,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 2
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "good",
"name": "Issue & PR responsiveness",
"note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"issue_resolution"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 72,
"inputs": {
"merged_prs": 13,
"open_issues": 0,
"closed_issues": 0,
"issue_closed_ratio": null,
"closed_unmerged_prs": 0
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "no issues or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_issues_or_data",
"params": {}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "13/13 decided PRs merged",
"points": 38.2,
"status": "met",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 13,
"decided": 13
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "at_risk",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 36,
"inputs": {
"followers": 1,
"owner_type": "User",
"is_verified": null,
"owner_login": "ptyll",
"public_repos": 3,
"account_age_days": 3382
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "personal (user) account",
"points": 10,
"status": "partial",
"details": [
{
"code": "owner_personal",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": "not applicable to user accounts",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_applicable_to_user_accounts",
"params": {}
}
],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "1 followers of ptyll",
"points": 2.2,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 1,
"login": "ptyll"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "3 public repos, account ~9 yr old",
"points": 16.4,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 3
}
},
{
"code": "account_age_years",
"params": {
"years": 9
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"Tempo.Blazor.All",
"Tempo.Blazor.Mcp",
"Tempo.Blazor.Maps",
"Tempo.Blazor.Codes",
"Tempo.Blazor.GanttXlsx",
"Tempo.Blazor.Abstractions",
"Tempo.Blazor.Collaboration",
"Tempo.Blazor.DataTableXlsx"
],
"ecosystems": "nuget",
"any_deprecated": false,
"min_days_since_publish": 0
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "8 package(s) on nuget",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 8,
"ecosystems": "nuget"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 0 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 0
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "32 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 32
}
}
],
"max_points": 20
},
{
"key": "not_deprecated",
"name": "Not deprecated",
"detail": "active, not deprecated or yanked",
"points": 20,
"status": "met",
"details": [
{
"code": "package_not_deprecated",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "good",
"name": "Engineering Quality",
"value": 71,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "moderate",
"name": "Engineering practices",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_ci_tests"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 68,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": true,
"has_linter_config": false,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "4 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 4
}
}
],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 24,
"status": "met",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 9.6
},
{
"key": "editorconfig",
"name": ".editorconfig",
"detail": null,
"points": 6.4,
"status": "met",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "good",
"name": "Documentation",
"note": null,
"notes": [],
"value": 75,
"inputs": {
"topics": [],
"has_wiki": true,
"homepage": null,
"has_readme": true,
"has_docs_dir": true,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 25,
"status": "met",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "at_risk",
"name": "Security",
"value": 44,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "at_risk",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): CI-Tests, Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"ci_tests",
"signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 44,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 16,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 2,
"scorecard_aggregate": 4.4
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection is not maximal on development and all release branches",
"points": 2.2,
"status": "partial",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow detected",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "no SAST tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "detected GitHub workflow tokens with excessive permissions",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "1 existing vulnerabilities detected",
"points": 6.8,
"status": "partial",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 2
},
"components": [
{
"key": "policy_exposure_multiplier",
"name": "Policy exposure multiplier",
"detail": "no confirmed policy-scope location match",
"points": 100,
"status": "met",
"details": [
{
"code": "jurisdiction_no_match",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "good",
"name": "AI Readiness",
"value": 70,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "excellent",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 0.99,
"agent_instruction_files": [
"AGENTS.md",
"src/Tempo.Blazor/AGENT.md"
],
"agent_instruction_max_bytes": 33173
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "AGENTS.md, src/Tempo.Blazor/AGENT.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "AGENTS.md, src/Tempo.Blazor/AGENT.md"
}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "99 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 99,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 66,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"package-lock.json"
],
"has_dockerfile": true,
"typed_language": true,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 0.67,
"toolchain_manifests": [
"JsonDocumentation/JsonDocumentationGenerator/JsonDocumentationGenerator.csproj",
"src/Tempo.Blazor.Abstractions/Tempo.Blazor.Abstractions.csproj",
"src/Tempo.Blazor.All/Tempo.Blazor.All.csproj",
"src/Tempo.Blazor.Codes/Tempo.Blazor.Codes.csproj",
"src/Tempo.Blazor.Collaboration/Tempo.Blazor.Collaboration.csproj",
"src/Tempo.Blazor.DataTableXlsx/Tempo.Blazor.DataTableXlsx.csproj",
"src/Tempo.Blazor.Demo.Api/Tempo.Blazor.Demo.Api.csproj",
"src/Tempo.Blazor.Demo.InteractiveAuto/Tempo.Blazor.Demo.InteractiveAuto.Client/Tempo.Blazor.Demo.InteractiveAuto.Client.csproj",
"src/Tempo.Blazor.Demo.InteractiveAuto/Tempo.Blazor.Demo.InteractiveAuto/Tempo.Blazor.Demo.InteractiveAuto.csproj",
"src/Tempo.Blazor.Demo.Server/Tempo.Blazor.Demo.Server.csproj",
"src/Tempo.Blazor.Demo.Shared/Tempo.Blazor.Demo.Shared.csproj",
"src/Tempo.Blazor.Demo.SharedUI/Tempo.Blazor.Demo.SharedUI.csproj",
"src/Tempo.Blazor.Demo/Tempo.Blazor.Demo.csproj",
"src/Tempo.Blazor.DiagramEditor/Tempo.Blazor.DiagramEditor.csproj",
"src/Tempo.Blazor.DocumentEditor/Tempo.Blazor.DocumentEditor.csproj",
"src/Tempo.Blazor.DocumentFormats/Tempo.Blazor.DocumentFormats.csproj",
"src/Tempo.Blazor.EmailTemplates.Abstractions/Tempo.Blazor.EmailTemplates.Abstractions.csproj",
"src/Tempo.Blazor.EmailTemplates/Tempo.Blazor.EmailTemplates.csproj",
"src/Tempo.Blazor.FluentValidation/Tempo.Blazor.FluentValidation.csproj",
"src/Tempo.Blazor.GanttXlsx/Tempo.Blazor.GanttXlsx.csproj",
"src/Tempo.Blazor.Maps/Tempo.Blazor.Maps.csproj",
"src/Tempo.Blazor.Mcp/Tempo.Blazor.Mcp.csproj",
"src/Tempo.Blazor.Modeling/Tempo.Blazor.Modeling.csproj",
"src/Tempo.Blazor.NotionEditor/Tempo.Blazor.NotionEditor.csproj",
"src/Tempo.Blazor.PdfViewer/Tempo.Blazor.PdfViewer.csproj",
"src/Tempo.Blazor.Proofing.LanguageTool/Tempo.Blazor.Proofing.LanguageTool.csproj",
"src/Tempo.Blazor.Reporting/Tempo.Blazor.Reporting.csproj",
"src/Tempo.Blazor.Signing/Tempo.Blazor.Signing.csproj",
"src/Tempo.Blazor.Spreadsheet/Tempo.Blazor.Spreadsheet.csproj",
"src/Tempo.Blazor.WebPush/Tempo.Blazor.WebPush.csproj",
"src/Tempo.Blazor.Wireframe/Tempo.Blazor.Wireframe.csproj",
"src/Tempo.Blazor/Tempo.Blazor.csproj",
"src/Tempo.ReportServer.Api/Tempo.ReportServer.Api.csproj",
"src/Tempo.ReportServer.Web.Client/Tempo.ReportServer.Web.Client.csproj",
"src/Tempo.ReportServer.Web/Tempo.ReportServer.Web.csproj",
"src/Tempo.Reporting.Abstractions/Tempo.Reporting.Abstractions.csproj",
"src/Tempo.Reporting.Engine/Tempo.Reporting.Engine.csproj",
"tests/Tempo.Blazor.Demo.Api.Tests/Tempo.Blazor.Demo.Api.Tests.csproj",
"tests/Tempo.Blazor.DocumentFormats.Tests/Tempo.Blazor.DocumentFormats.Tests.csproj",
"tests/Tempo.Blazor.E2E/Tempo.Blazor.E2E.csproj",
"tests/Tempo.Blazor.EmailTemplates.Abstractions.Tests/Tempo.Blazor.EmailTemplates.Abstractions.Tests.csproj",
"tests/Tempo.Blazor.EmailTemplates.Tests/Tempo.Blazor.EmailTemplates.Tests.csproj",
"tests/Tempo.Blazor.FluentValidation.Tests/Tempo.Blazor.FluentValidation.Tests.csproj",
"tests/Tempo.Blazor.Mcp.Tests/Tempo.Blazor.Mcp.Tests.csproj",
"tests/Tempo.Blazor.Reporting.Tests/Tempo.Blazor.Reporting.Tests.csproj",
"tests/Tempo.Blazor.Tests/Tempo.Blazor.Tests.csproj",
"tests/Tempo.ReportServer.Api.Tests/Tempo.ReportServer.Api.Tests.csproj",
"tests/Tempo.ReportServer.Web.Tests/Tempo.ReportServer.Web.Tests.csproj",
"tests/Tempo.Reporting.Abstractions.Tests/Tempo.Reporting.Abstractions.Tests.csproj",
"tests/Tempo.Reporting.Engine.Tests/Tempo.Reporting.Engine.Tests.csproj"
],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "JsonDocumentation/JsonDocumentationGenerator/JsonDocumentationGenerator.csproj, src/Tempo.Blazor.Abstractions/Tempo.Blazor.Abstractions.csproj, src/Tempo.Blazor.All/Tempo.Blazor.All.csproj (toolchain convention, no task runner)",
"points": 12.6,
"status": "partial",
"details": [
{
"code": "toolchain_convention",
"params": {
"files": "JsonDocumentation/JsonDocumentationGenerator/JsonDocumentationGenerator.csproj, src/Tempo.Blazor.Abstractions/Tempo.Blazor.Abstractions.csproj, src/Tempo.Blazor.All/Tempo.Blazor.All.csproj"
}
}
],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 22,
"status": "met",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "C# (statically typed)",
"points": 11,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "C#"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "Dockerfile, lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Dockerfile, lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "67 of the last 100 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 67,
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 99,
"inputs": {
"primary_language": "C#",
"largest_source_bytes": 1039207,
"source_files_sampled": 4137,
"oversized_source_files": 51
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "C# (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "C#"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "51/4137 source files over 60KB",
"points": 54.3,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 4137,
"oversized": 51
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "critical",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 20,
"inputs": {
"example_dirs": [],
"has_mcp_signal": true,
"api_schema_files": []
},
"components": [
{
"key": "api_schema_openapi_graphql_proto",
"name": "API schema (OpenAPI/GraphQL/proto)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 40
},
{
"key": "mcp_server",
"name": "MCP server",
"detail": null,
"points": 20,
"status": "met",
"details": [],
"max_points": 20
},
{
"key": "runnable_examples",
"name": "Runnable examples",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 40
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
],
"report_type": "repository",
"generated_at": "2026-07-24T15:06:25.027497Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/p/ptyll/Tempo.Blazor.svg",
"full_name": "ptyll/Tempo.Blazor",
"license_state": "standard",
"license_spdx": "MIT"
}