Публічний реєстр
Звіт про здоров'я програмного забезпеченнясхема 0.27.0 · метрики 1.13.0 · 2026-07-24 15:06 UTC

ptyll / Tempo.Blazor

Blazor components for tailwind

C# · JavaScript · HTMLMIT★ 2 зірки⑂ 2 форкиз лют. 2026 р.Переглянути на GitHub ↗

ptyll/Tempo.Blazor має індекс здоров’я 58 зі 100, що відповідає смузі «Помірний». Найвищий показник — Vitality (83/100), найнижчий — Community & Adoption (33/100). Останнє оновлення — сьогодні. Більшість нещодавньої роботи виконує один учасник.

58
загалом / 100
Помірний

Індекс здоров'я програмного забезпечення

Метрики згруповано у зважені категорії на шкалі 1–100. Загальна оцінка починається як їхнє середнє; коли публічні дані активують Політику юрисдикцій високого ризику, рейтинг коригується й отримує верхню межу 49 («Під ризиком»). Готовність до ШІ не входить до індексу.

58
Відмінний85-100Зразковий; відповідає практично всім перевіреним критеріям
Добрий70-84Здоровий; незначні прогалини
Помірний50-69Прийнятний, але з помітними прогалинами; рекомендовано перевірку
У зоні ризику30-49Суттєві слабкі місця; впровадження потребує обережності
Критичний1-29Серйозні проблеми (покинутий, єдиний мейнтейнер, без базової гігієни)
ЖиттєздатністьСпільнота тавпровадженняСталість таврядуванняІнженернаякістьБезпекаГотовність доШІ

Профіль оцінок

Кожна вісь — окрема категорія. Форма важить більше, ніж середнє: здоровий об'єкт заповнює всю фігуру, тоді як профіль із піками та провалами означає, що сила в одному вимірі маскує ризик в іншому.

Власність

ptyllОсобистий обліковий запис
1 підписник3 публічні репозиторіїз квіт. 2017 р.

Цей репозиторій належить особистому обліковому запису. Проєкт з єдиним власником несе більший ризик безперервності, ніж підтримуваний організацією.

Пакетні екосистеми

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікаціяТеги
NuGetTempo.Blazor.All2.7.1-260 днів томуblazorcomponentsuicompatibilitymetapackagetempo-blazor
NuGetTempo.Blazor.Mcp2.7.1-260 днів томуblazormcpwireframediagramdraweditorreportingreportsaillmtools
NuGetTempo.Blazor.Maps2.7.1-160 днів томуblazorcomponentsmapleafletopenstreetmapmarkersclustering
NuGetTempo.Blazor.Codes2.7.1-260 днів томуblazorcomponentsqrbarcodeqrcodezxing
NuGetTempo.Blazor.GanttXlsx2.7.1-260 днів томуblazorganttxlsxexcelopenxmlimportexport
NuGetTempo.Blazor.Abstractions2.7.1-320 днів томуblazorabstractionsinterfacesmodels
NuGetTempo.Blazor.Collaboration2.7.1-260 днів томуblazordocumentscollaborationsignalrdocument-editor
NuGetTempo.Blazor.DataTableXlsx2.7.1-170 днів томуblazordatatablexlsxexcelopenxmlexport

Метрики за категоріями

Життєздатність

Чи живий проєкт — чи пишеться код і чи виходять релізи?

83Добрий · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 0 дн. тому
13.8/36Ритм комітів — 20/52 тижнів із комітами
18/18Обсяг комітів — 611 комітів за останній рік
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Використані вхідні дані
commits_last_year611
human_commit_share1
days_since_last_push0
active_weeks_last_year20
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 26 релізів
27/36Свіжість релізів — останній реліз 103 дн. тому
27/27Ритм релізів — реліз кожні ~3,4 дн.
0/10OpenSSF Scorecard: Signed-Releases — немає даних
Використані вхідні дані
releases_count26
latest_release_tagv1.1.15
releases_from_tagsні
days_since_latest_release103
mean_days_between_releases3,4
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Signed-Releases. Залишкові ваги перенормовано.

Спільнота та впровадження

Чи має проєкт користувачів, завантаження, увагу та влаштовані умови для контриб’юторів?

33У зоні ризику · 18% загального індексу
Як обчислюється оцінка
0/60Зірки — 2 зірок
0/25Форки — 2 форків
0/15Спостерігачі — 0 спостерігачів
Використані вхідні дані
forks2
stars2
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (MIT)
0/18Настанови CONTRIBUTING
0/13.5Кодекс поведінки
0/7.2Шаблон issue
0/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseтак
has_contributingні
has_issue_templateні
has_code_of_conductні
has_pull_request_templateні
Як обчислюється оцінка
49.6/80Сумарні завантаження — 58 924 завантажень за весь час у nuget
0/20Залежні пакети в реєстрі — ця екосистема цього не повідомляє
Використані вхідні дані
packagesTempo.Blazor.All, Tempo.Blazor.Mcp, Tempo.Blazor.Maps, Tempo.Blazor.Codes, Tempo.Blazor.GanttXlsx, Tempo.Blazor.Abstractions, Tempo.Blazor.Collaboration, Tempo.Blazor.DataTableXlsx
dependents
ecosystemsnuget
total_downloads58 924
monthly_downloads
Виключено з оцінювання (немає даних або не застосовно): Залежні пакети в реєстрі. Залишкові ваги перенормовано.

Сталість та врядування

Чи переживе проєкт своїх людей — бас-фактор, реактивність, хто за ним стоїть і як супроводжуються пакети?

51Помірний · 24% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
1.5/22.5Розподіл комітів — головний контриб’ютор — автор 93% комітів
2.7/13.5Широта контриб’юторів — 2 контриб’юторів
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Використані вхідні дані
bus_factor1
contributors_sampled2
top_contributor_share0,933
Як обчислюється оцінка
0/46.8Вирішення issue — немає issue або даних
38.2/38.3Прийняття PR — злито 13/13 вирішених PR
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Використані вхідні дані
merged_prs13
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Виключено з оцінювання (немає даних або не застосовно): Вирішення issue. Залишкові ваги перенормовано.

Власність та опіка

36У зоні ризику
Як обчислюється оцінка
10/30Підтримка власника — особистий (користувацький) обліковий запис
0/20Верифікований домен — не застосовно до користувацьких облікових записів
2.2/25Охоплення власника — 1 підписників у ptyll
16.4/25Послужний список — 3 публічних репозиторіїв, вік облікового запису ~9 р.
Використані вхідні дані
followers1
owner_typeUser
is_verified
owner_loginptyll
public_repos3
account_age_days3 382
Виключено з оцінювання (немає даних або не застосовно): Верифікований домен. Залишкові ваги перенормовано.

Супровід пакетів

100Відмінний
Як обчислюється оцінка
25/25Опубліковано й доступно — 8 пакет(ів) у nuget
35/35Свіжість публікацій — остання публікація 0 дн. тому
20/20Історія версій — 32 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packagesTempo.Blazor.All, Tempo.Blazor.Mcp, Tempo.Blazor.Maps, Tempo.Blazor.Codes, Tempo.Blazor.GanttXlsx, Tempo.Blazor.Abstractions, Tempo.Blazor.Collaboration, Tempo.Blazor.DataTableXlsx
ecosystemsnuget
any_deprecatedні
min_days_since_publish0

Інженерна якість

Чи наявні базові інженерні практики та документація?

71Добрий · 20% загального індексу
Як обчислюється оцінка
24/24Процеси CI — 4 процес(ів) CI
24/24Наявні тести
0/16Конфігурація лінтера
0/9.6Pre-commit-хуки
6.4/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — немає даних
Використані вхідні дані
has_ciтак
has_testsтак
has_editorconfigтак
has_linter_configні
has_precommit_configні
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: CI-Tests. Залишкові ваги перенормовано.
Як обчислюється оцінка
30/30README
25/25Каталог документації
0/15Сайт документації / домашня сторінка
10/10Опис репозиторію
0/10Теми
10/10Wiki
Використані вхідні дані
topics
has_wikiтак
homepage
has_readmeтак
has_docs_dirтак
has_descriptionтак

Безпека

Чи міцні видимі практики безпеки й ланцюга постачання, без непослабленої пов’язаності з юрисдикціями високого ризику?

44У зоні ризику · 16% загального індексу

Стан безпеки

44У зоні ризику
Як обчислюється оцінка
7.5/7.5Binary-Artifacts — no binaries found in the repo
2.2/7.5Branch-Protection — branch protection is not maximal on development and all release branches
0/2.5CI-Tests — немає даних
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Ліцензія — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — немає даних
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
6.8/7.5Vulnerabilities — 1 existing vulnerabilities detected
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate4,4
Виключено з оцінювання (немає даних або не застосовно): ci_tests, signed_releases. Залишкові ваги перенормовано.

Готовність до ШІ

Наскільки репозиторій оснащений для розробки та супроводу за участі ШІ-агентів? Незалежний, експериментальний бейдж — вага 0.0, тож він подається окремо і не впливає на загальний індекс здоров'я.

70Добрий · 0% загального індексу
Як обчислюється оцінка
45/45Інструкції для агентів — AGENTS.md, src/Tempo.Blazor/AGENT.md
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 99 з 100 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share0,99
agent_instruction_filesAGENTS.md, src/Tempo.Blazor/AGENT.md
agent_instruction_max_bytes33 173
Як обчислюється оцінка
12.6/18Розгортання однією командою — JsonDocumentation/JsonDocumentationGenerator/JsonDocumentationGenerator.csproj, src/Tempo.Blazor.Abstractions/Tempo.Blazor.Abstractions.csproj, src/Tempo.Blazor.All/Tempo.Blazor.All.csproj (домовленість інструментарію, без раннера задач)
22/22Автоматизовані тести
0/11Конфігурація лінтера / форматера
11/11Статична перевірка типів — C# (статично типізована)
10/10Відтворюване середовище — Dockerfile, lockfile
10/10Підтверджена практика роботи з агентами — 67 з останніх 100 комітів створено агентом або з його зазначенням
0/8Автоматизоване супроводження — автоматичних оновлень залежностей не виявлено
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Використані вхідні дані
has_nixні
has_testsтак
lockfilespackage-lock.json
has_dockerfileтак
typed_languageтак
bootstrap_files
has_devcontainerні
has_linter_configні
typecheck_configs
agent_commit_share0,67
toolchain_manifestsJsonDocumentation/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_share0
Як обчислюється оцінка
45/45Типізований код — C# (статично типізована)
54.3/55Керовані розміри файлів — 51/4 137 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageC#
largest_source_bytes1 039 207
source_files_sampled4 137
oversized_source_files51
Як обчислюється оцінка
0/40Схема API (OpenAPI/GraphQL/proto)
20/20Сервер MCP
0/40Придатні до запуску приклади
Використані вхідні дані
example_dirs
has_mcp_signalтак
api_schema_files

Ключові факти

2зірок GitHub
2контриб'юторів
611комітів за останні 12 місяців
0днів від останнього пушу
26релізів
1бас-фактор
0відкритих issue
npmпакетних екосистем

Попередження щодо збору даних

  • 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

Докладніше

Історія зірок і форків 0 ★ / 2 ⇿
0Зірки
2Форки
3Релізи

Коли додано кожну зірку й форк — зібрано з GitHub і згруповано за днями. Кумулятивне зростання розміщено просто над денними додаваннями, з яких воно складається, тож їх видно одне проти одного: рівномірне органічне накопичення виглядає зовсім інакше, ніж різкий короткочасний сплеск. Там, де цю різницю можна виміряти, її подано як автентичність росту.

111222212026-042026-052026-07
Мажорні 0Мінорні 0Патчі 3
OpenSSF Scorecard 4.4 / 10
4.4сукупно

Незалежна, не прив'язана до інструментів оцінка безпеки від відкритого проєкту OpenSSF Scorecard. Кожна перевірка винагороджує практику безпеки, а не інструмент конкретного постачальника. Перевірки, які Scorecard не зміг визначити, позначено н/д і виключено з оцінки безпеки (вони ніколи не зараховуються як нуль).Scorecard v5.5.0 · 2026-07-24 15:05 UTC

10Binary-Artifactsno binaries found in the repo
3Branch-Protectionbranch protection is not maximal on development and all release branches
н/дCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
н/дSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
9Vulnerabilities1 existing vulnerabilities detected
Прямі залежності 65
РеєстрПакетОбмеження версіїМаніфест
NuGetMicrosoft.Extensions.DependencyInjection.Abstractions8.0.0src/Tempo.Blazor.Abstractions/Tempo.Blazor.Abstractions.csproj
NuGetMicrosoft.Extensions.Logging.Abstractions8.0.0src/Tempo.Blazor.Abstractions/Tempo.Blazor.Abstractions.csproj
NuGetQRCoder1.6.0src/Tempo.Blazor.Codes/Tempo.Blazor.Codes.csproj
NuGetZXing.Net0.16.10src/Tempo.Blazor.Codes/Tempo.Blazor.Codes.csproj
NuGetMicrosoft.AspNetCore.Components.Web8.0.12src/Tempo.Blazor.Codes/Tempo.Blazor.Codes.csproj
NuGetMicrosoft.AspNetCore.Components.Web9.0.3src/Tempo.Blazor.Codes/Tempo.Blazor.Codes.csproj
NuGetMicrosoft.AspNetCore.Components.Web10.0.3src/Tempo.Blazor.Codes/Tempo.Blazor.Codes.csproj
NuGetMicrosoft.AspNetCore.SignalR.Client10.0.5src/Tempo.Blazor.Collaboration/Tempo.Blazor.Collaboration.csproj
NuGetStackExchange.Redis2.8.31src/Tempo.Blazor.Collaboration/Tempo.Blazor.Collaboration.csproj
NuGetDocumentFormat.OpenXml3.3.0src/Tempo.Blazor.DataTableXlsx/Tempo.Blazor.DataTableXlsx.csproj
NuGetMicrosoft.Extensions.DependencyInjection.Abstractions8.0.2src/Tempo.Blazor.DataTableXlsx/Tempo.Blazor.DataTableXlsx.csproj
NuGetMicrosoft.Extensions.DependencyInjection.Abstractions9.0.3src/Tempo.Blazor.DataTableXlsx/Tempo.Blazor.DataTableXlsx.csproj
NuGetMicrosoft.Extensions.DependencyInjection.Abstractions10.0.3src/Tempo.Blazor.DataTableXlsx/Tempo.Blazor.DataTableXlsx.csproj
NuGetMailKit4.17.0src/Tempo.Blazor.Demo.Api/Tempo.Blazor.Demo.Api.csproj
NuGetModelContextProtocol.AspNetCore1.2.0src/Tempo.Blazor.Demo.Api/Tempo.Blazor.Demo.Api.csproj
NuGetMicrosoft.EntityFrameworkCore.Sqlite10.0.9src/Tempo.Blazor.Demo.Api/Tempo.Blazor.Demo.Api.csproj
NuGetQuestPDF2026.2.4src/Tempo.Blazor.Demo.Api/Tempo.Blazor.Demo.Api.csproj
NuGetSkiaSharp3.119.2src/Tempo.Blazor.Demo.Api/Tempo.Blazor.Demo.Api.csproj
NuGetSkiaSharp.NativeAssets.Linux.NoDependencies3.119.2src/Tempo.Blazor.Demo.Api/Tempo.Blazor.Demo.Api.csproj
NuGetSQLitePCLRaw.bundle_e_sqlite33.0.3src/Tempo.Blazor.Demo.Api/Tempo.Blazor.Demo.Api.csproj
NuGetSvg.Skia4.2.0src/Tempo.Blazor.Demo.Api/Tempo.Blazor.Demo.Api.csproj
NuGetFluentValidation12.1.1src/Tempo.Blazor.Demo.Server/Tempo.Blazor.Demo.Server.csproj
NuGetFluentValidation12.1.1src/Tempo.Blazor.Demo.SharedUI/Tempo.Blazor.Demo.SharedUI.csproj
NuGetMicrosoft.AspNetCore.Components.Web10.0.3src/Tempo.Blazor.Demo.SharedUI/Tempo.Blazor.Demo.SharedUI.csproj
NuGetMicrosoft.Extensions.Localization10.0.3src/Tempo.Blazor.Demo.SharedUI/Tempo.Blazor.Demo.SharedUI.csproj
NuGetMicrosoft.Extensions.Http10.0.3src/Tempo.Blazor.Demo.SharedUI/Tempo.Blazor.Demo.SharedUI.csproj
NuGetMicrosoft.AspNetCore.SignalR.Client10.0.5src/Tempo.Blazor.Demo.SharedUI/Tempo.Blazor.Demo.SharedUI.csproj
NuGetFluentValidation12.1.1src/Tempo.Blazor.Demo/Tempo.Blazor.Demo.csproj
NuGetMicrosoft.AspNetCore.Components.WebAssembly10.0.3src/Tempo.Blazor.Demo/Tempo.Blazor.Demo.csproj
NuGetMicrosoft.AspNetCore.Components.WebAssembly.DevServer10.0.3src/Tempo.Blazor.Demo/Tempo.Blazor.Demo.csproj
NuGetMicrosoft.Extensions.Localization10.0.3src/Tempo.Blazor.Demo/Tempo.Blazor.Demo.csproj
NuGetMicrosoft.Extensions.Http10.0.3src/Tempo.Blazor.Demo/Tempo.Blazor.Demo.csproj
NuGetCsvHelper33.0.1src/Tempo.Blazor.DiagramEditor/Tempo.Blazor.DiagramEditor.csproj
NuGetMicrosoft.AspNetCore.Components.Web8.0.12src/Tempo.Blazor.DiagramEditor/Tempo.Blazor.DiagramEditor.csproj
NuGetMicrosoft.AspNetCore.Components.Web9.0.3src/Tempo.Blazor.DiagramEditor/Tempo.Blazor.DiagramEditor.csproj
NuGetMicrosoft.AspNetCore.Components.Web10.0.3src/Tempo.Blazor.DiagramEditor/Tempo.Blazor.DiagramEditor.csproj
NuGetAngleSharp1.5.2src/Tempo.Blazor.DocumentEditor/Tempo.Blazor.DocumentEditor.csproj
NuGetMicrosoft.AspNetCore.Components.Web8.0.12src/Tempo.Blazor.DocumentEditor/Tempo.Blazor.DocumentEditor.csproj
NuGetMicrosoft.AspNetCore.Components.Web9.0.3src/Tempo.Blazor.DocumentEditor/Tempo.Blazor.DocumentEditor.csproj
NuGetMicrosoft.AspNetCore.Components.Web10.0.3src/Tempo.Blazor.DocumentEditor/Tempo.Blazor.DocumentEditor.csproj
NuGetDocumentFormat.OpenXml3.3.0src/Tempo.Blazor.DocumentFormats/Tempo.Blazor.DocumentFormats.csproj
NuGetJint4.13.0src/Tempo.Blazor.DocumentFormats/Tempo.Blazor.DocumentFormats.csproj
NuGetAngleSharp1.5.2src/Tempo.Blazor.EmailTemplates.Abstractions/Tempo.Blazor.EmailTemplates.Abstractions.csproj
NuGetMjml.Net4.11.0src/Tempo.Blazor.EmailTemplates.Abstractions/Tempo.Blazor.EmailTemplates.Abstractions.csproj
NuGetScriban7.2.4src/Tempo.Blazor.EmailTemplates.Abstractions/Tempo.Blazor.EmailTemplates.Abstractions.csproj
NuGetFluentValidation12.1.1src/Tempo.Blazor.EmailTemplates.Abstractions/Tempo.Blazor.EmailTemplates.Abstractions.csproj
NuGetMicrosoft.Extensions.DependencyInjection.Abstractions10.0.0src/Tempo.Blazor.EmailTemplates.Abstractions/Tempo.Blazor.EmailTemplates.Abstractions.csproj
NuGetMicrosoft.Extensions.Localization.Abstractions10.0.0src/Tempo.Blazor.EmailTemplates.Abstractions/Tempo.Blazor.EmailTemplates.Abstractions.csproj
NuGetMicrosoft.Extensions.Logging.Abstractions10.0.0src/Tempo.Blazor.EmailTemplates.Abstractions/Tempo.Blazor.EmailTemplates.Abstractions.csproj
NuGetFluentValidation12.1.1src/Tempo.Blazor.FluentValidation/Tempo.Blazor.FluentValidation.csproj
NuGetMicrosoft.AspNetCore.Components.Web8.0.12src/Tempo.Blazor.FluentValidation/Tempo.Blazor.FluentValidation.csproj
NuGetMicrosoft.AspNetCore.Components.Web9.0.3src/Tempo.Blazor.FluentValidation/Tempo.Blazor.FluentValidation.csproj
NuGetMicrosoft.AspNetCore.Components.Web10.0.3src/Tempo.Blazor.FluentValidation/Tempo.Blazor.FluentValidation.csproj
NuGetDocumentFormat.OpenXml3.3.0src/Tempo.Blazor.GanttXlsx/Tempo.Blazor.GanttXlsx.csproj
NuGetMicrosoft.Extensions.DependencyInjection.Abstractions8.0.2src/Tempo.Blazor.GanttXlsx/Tempo.Blazor.GanttXlsx.csproj
NuGetMicrosoft.Extensions.DependencyInjection.Abstractions9.0.3src/Tempo.Blazor.GanttXlsx/Tempo.Blazor.GanttXlsx.csproj
NuGetMicrosoft.Extensions.DependencyInjection.Abstractions10.0.3src/Tempo.Blazor.GanttXlsx/Tempo.Blazor.GanttXlsx.csproj
NuGetMicrosoft.AspNetCore.Components.Web8.0.12src/Tempo.Blazor.Maps/Tempo.Blazor.Maps.csproj
NuGetMicrosoft.AspNetCore.Components.Web9.0.3src/Tempo.Blazor.Maps/Tempo.Blazor.Maps.csproj
NuGetMicrosoft.AspNetCore.Components.Web10.0.3src/Tempo.Blazor.Maps/Tempo.Blazor.Maps.csproj
NuGetFluentValidation12.1.1src/Tempo.Blazor.Mcp/Tempo.Blazor.Mcp.csproj
NuGetModelContextProtocol.Core1.2.0src/Tempo.Blazor.Mcp/Tempo.Blazor.Mcp.csproj
NuGetMicrosoft.Extensions.Localization.Abstractions8.0.12src/Tempo.Blazor.Mcp/Tempo.Blazor.Mcp.csproj
NuGetMicrosoft.Extensions.Localization.Abstractions9.0.3src/Tempo.Blazor.Mcp/Tempo.Blazor.Mcp.csproj
NuGetMicrosoft.Extensions.Localization.Abstractions10.0.3src/Tempo.Blazor.Mcp/Tempo.Blazor.Mcp.csproj
Усі залежності не зібрано

Не вдалося зібрати розв'язаний набір залежностей для цього звіту: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Звіт у форматі JSON машиночитний
{
  "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"
}

Оцінки — це сигнали, а не гарантії. Вони відображають публічно видимі практики на GitHub — це не аудит коду й не гарантія безпеки.

Відсутні дані виключаються, а ваги перенормовуються — нуль за відсутність ніколи не ставиться. Методологія версіонована й відкрита: метрики v1.13.0, схема v0.27.0 — повна методологія · вікі метрик.

Як окремий результат виглядає на тлі всього реєстру: сукупна статистикаNuGet.