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

mosaic-media / module-stremio-addons

Stremio addon-source module for the Mosaic platform — a Go client of the Stremio addon protocol, built against the Mosaic SDK.

GoMIT★ 0 зірок⑂ 0 форківз лип. 2026 р.Переглянути на GitHub ↗

mosaic-media/module-stremio-addons має індекс здоров’я 42 зі 100, що відповідає смузі «У зоні ризику». Найвищий показник — AI Readiness (79/100), найнижчий — Security (21/100). Останнє оновлення — сьогодні. Більшість нещодавньої роботи виконує один учасник.

42
загалом / 100
У зоні ризику

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

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

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

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

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

Власність

MosaicОрганізація
0 підписників16 публічних репозиторіївз лип. 2026 р.

За цим репозиторієм стоїть організація — спільна, підзвітна опіка, здатна пережити будь-якого окремого мейнтейнера.

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

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікація
Gogithub.com/mosaic-media/module-stremio-addonsv0.30.0-320 днів тому

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

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

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

68Помірний · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 0 дн. тому
1.4/36Ритм комітів — 2/52 тижнів із комітами
15.3/18Обсяг комітів — 50 комітів за останній рік
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Використані вхідні дані
commits_last_year50
human_commit_share1
days_since_last_push0
active_weeks_last_year2
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 9 релізів
36/36Свіжість релізів — останній реліз 0 дн. тому
27/27Ритм релізів — реліз кожні ~0,4 дн.
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Використані вхідні дані
releases_count9
latest_release_tagv0.30.0
releases_from_tagsні
days_since_latest_release0
mean_days_between_releases0,4

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

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

24Критичний · 18% загального індексу
Як обчислюється оцінка
0/60Зірки — 0 зірок
0/25Форки — 0 форків
0/15Спостерігачі — 0 спостерігачів
Використані вхідні дані
forks0
stars0
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ні

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

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

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

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

39У зоні ризику
Як обчислюється оцінка
30/30Підтримка власника — у власності організації
0/20Верифікований домен
0/25Охоплення власника — 0 підписників у mosaic-media
9/25Послужний список — 16 публічних репозиторіїв, вік облікового запису ~0 р.
Використані вхідні дані
followers0
owner_typeOrganization
is_verified
owner_loginmosaic-media
public_repos16
account_age_days15

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

100Відмінний
Як обчислюється оцінка
25/25Опубліковано й доступно — 1 пакет(ів) у go
35/35Свіжість публікацій — остання публікація 0 дн. тому
20/20Історія версій — 32 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packagesgithub.com/mosaic-media/module-stremio-addons
ecosystemsgo
any_deprecatedні
min_days_since_publish0

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

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

56Помірний · 20% загального індексу
Як обчислюється оцінка
24/24Процеси CI — 2 процес(ів) CI
24/24Наявні тести
0/16Конфігурація лінтера
0/9.6Pre-commit-хуки
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — немає даних
Використані вхідні дані
has_ciтак
has_testsтак
has_editorconfigні
has_linter_configні
has_precommit_configні
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: CI-Tests. Залишкові ваги перенормовано.

Документація

50Помірний
Як обчислюється оцінка
30/30README
0/25Каталог документації
0/15Сайт документації / домашня сторінка
10/10Опис репозиторію
0/10Теми
10/10Wiki
Використані вхідні дані
topics
has_wikiтак
homepage
has_readmeтак
has_docs_dirні
has_descriptionтак

Безпека

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

21Критичний · 16% загального індексу

Стан безпеки

21Критичний
Як обчислюється оцінка
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/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
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — немає даних
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 — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0.8/7.5Vulnerabilities — 9 existing vulnerabilities detected
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate2,1
Виключено з оцінювання (немає даних або не застосовно): ci_tests, packaging. Залишкові ваги перенормовано.

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

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

79Добрий · 0% загального індексу
Як обчислюється оцінка
45/45Інструкції для агентів — CLAUDE.md
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 50 з 50 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share1
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes8 729
Як обчислюється оцінка
12.6/18Розгортання однією командою — go.mod (домовленість інструментарію, без раннера задач)
22/22Автоматизовані тести
0/11Конфігурація лінтера / форматера
11/11Статична перевірка типів — Go (статично типізована)
10/10Відтворюване середовище — lockfile
10/10Підтверджена практика роботи з агентами — 47 з останніх 50 комітів створено агентом або з його зазначенням
0/8Автоматизоване супроводження — автоматичних оновлень залежностей не виявлено
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Використані вхідні дані
has_nixні
has_testsтак
lockfilesgo.sum
has_dockerfileні
typed_languageтак
bootstrap_files
has_devcontainerні
has_linter_configні
typecheck_configs
agent_commit_share0,94
toolchain_manifestsgo.mod
dependency_bot_commit_share0
Як обчислюється оцінка
45/45Типізований код — Go (статично типізована)
55/55Керовані розміри файлів — 0/15 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageGo
largest_source_bytes34 214
source_files_sampled15
oversized_source_files0

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

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

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

  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Докладніше

OpenSSF Scorecard 2.1 / 10
2.1сукупно

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

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/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
0Maintainedproject was created within the last 90 days. Please review its contents carefully
н/дPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
1Vulnerabilities9 existing vulnerabilities detected
Прямі залежності 3
РеєстрПакетОбмеження версіїМаніфест
Gogithub.com/mosaic-media/contractsv0.60.0go.mod
Gogithub.com/mosaic-media/sdkv0.26.0go.mod
Gogithub.com/mosaic-media/sdk/hostv0.8.0go.mod
Усі залежності не зібрано

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

Звіт у форматі JSON машиночитний
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 188,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Go": 161279
      },
      "pushed_at": "2026-07-27T16:30:20Z",
      "created_at": "2026-07-20T01:06:02Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-27T16:31:06Z",
      "description": "Stremio addon-source module for the Mosaic platform — a Go client of the Stremio addon protocol, built against the Mosaic SDK.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Mosaic",
      "type": "Organization",
      "login": "mosaic-media",
      "company": null,
      "location": null,
      "followers": 0,
      "avatar_url": "https://avatars.githubusercontent.com/u/304150337?v=4",
      "created_at": "2026-07-12T20:17:48Z",
      "is_verified": null,
      "public_repos": 16,
      "account_age_days": 15
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.30.0",
          "kind": "minor",
          "published_at": "2026-07-27T16:31:38Z"
        },
        {
          "tag": "v0.29.0",
          "kind": "minor",
          "published_at": "2026-07-27T03:02:24Z"
        },
        {
          "tag": "v0.28.0",
          "kind": "minor",
          "published_at": "2026-07-26T15:39:00Z"
        },
        {
          "tag": "v0.27.0",
          "kind": "minor",
          "published_at": "2026-07-26T15:03:40Z"
        },
        {
          "tag": "v0.26.0",
          "kind": "minor",
          "published_at": "2026-07-25T05:06:47Z"
        },
        {
          "tag": "v0.25.2",
          "kind": "patch",
          "published_at": "2026-07-24T23:48:42Z"
        },
        {
          "tag": "v0.25.1",
          "kind": "patch",
          "published_at": "2026-07-24T23:42:35Z"
        },
        {
          "tag": "v0.25.0",
          "kind": "minor",
          "published_at": "2026-07-24T23:12:48Z"
        },
        {
          "tag": "v0.24.0",
          "kind": "minor",
          "published_at": "2026-07-24T14:32:58Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "fa9b18d38ce3f9185a23c22cd18bc59d4f45afb6",
          "body": "SDK v0.26.0 gave StreamLink the three fields parseStreamMeta had always\nproduced and had nowhere to put, so streamLinkFrom no longer narrows the parse\nto quality, size and seeders. Until now the same walk over the same text\nproduced a richer answer for a Part than for a link, and the only place left\n[…]\nhich left the fake unable to observe the thing\nthis module is most responsible for: no test here could tell a filled Container\nfrom an empty one.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Carry container and codec on a link, and address a subtitle by episode",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-27T16:30:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5956d30ede7a4c1eab20cecb8469841ffcf20300",
          "body": "M2 slice 4, this module's share — and the one of the three catalog\nproviders that is out of process, so the filter argument reaches it over\nthe wire rather than through a Go call.\n\n`ExtraDecl` read only a parameter's name, which was enough to detect\n`search` and nothing else. It now reads `options` \n[…]\navailable where no addon reports a total.\n\nAnd `Genres` on the work at import, so a library facet can be answered\nwithout a round trip per title.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Catalogs declare what an addon says they can be narrowed by",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-27T03:01:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "296a1d3c2d61645e135cb4d60951a00809f7b273",
          "body": "Three editor and OS artefacts were ignored in some repositories and not others,\nfor no reason beyond which one was set up when. Levelled up so the same three\nlines are in all twelve. Nothing was tracked, so this only stops them appearing\nin working trees.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Ignore .vscode/ and .DS_Store, matching the other repositories",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-26T19:21:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2009c60793e02df562691397b019a53acf1699c6",
          "body": "JetBrains project files had been committed by accident — the .iml, modules.xml,\nvcs.xml and the IDE's own .idea/.gitignore. They are per-machine editor state\nrather than anything the repository needs, and the ignore rule alone would have\nchanged nothing, because an ignore does not apply to a file already tracked. So\nthey are untracked here as well, and left on disk.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Ignore .idea/, and stop tracking the IDE scaffolding already committed",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-26T19:18:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4c900f07735b0aeb8d2fe100ca5ca6ba2320eaf9",
          "body": "The link text still read `sdui` while the href already pointed at\nmosaic-media/contracts, so the sentence named a repository that was renamed\nunder ADR 0044. The Go module path and the npm package are untouched — the\ncontract itself did not move when the repository did.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Name the contracts repository by its current name",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-26T17:51:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b34c5bed14d6a30e1a8840222a08f20af2b1df90",
          "body": "ADR 0081 took this module out of the Platform binary, so a release no\nlonger reaches anyone through a go.mod bump — a Platform gains this\nmodule when a user installs it from the official registry's signed index.\nThe dispatch still fired `core-module-release` at mosaic-media/platform,\nwhich would hav\n[…]\nver showed up as a failure.\n\nThe `binaries` job's comment said the same stale thing in passing — that\nthe module \"is still composed statically into the Platform today\" — and is\ncorrected alongside it.",
          "is_bot": false,
          "headline": "Point the release dispatch at the registry, not the Platform",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-26T16:29:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b68830ef855a69cd8c75a01554e13d2a99b07687",
          "body": "contracts v0.54.0 adds the module-wire fields for Crew, RuntimeMinutes and\nHasMore, and sdk/host v0.6.0 maps them in each direction. This module runs out\nof process, so it is one of the ones the gap actually bit: a value set here for\nany of the three reached the Platform as a zero.\n\nNothing in this module sources them yet. Taking the releases keeps the floor\nlevel with what the Platform ships and makes the capability available.",
          "is_bot": false,
          "headline": "Take the contracts and host releases that carry the three new fields",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-26T15:37:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ad5883c00f13418d798797869361c560c4e8db13",
          "body": "The requires named sdk v0.22.0, contracts v0.32.0 and sdk/host v0.4.0 while the\nPlatform ships v0.24.0, v0.53.0 and host/v0.5.0. Minimal version selection\nraised all three in every build that included the Platform, so boundary_test.go\nwas asserting the boundary of a dependency set that never runs.\n\nNo source change was needed: the sdk minors added fields, and the contracts\nsurfaces this module uses only gained generated builders.",
          "is_bot": false,
          "headline": "Raise the SDK, contracts and host floors to what the Platform ships",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-26T15:02:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e04ab63ac746a32633f72f6d10fb6c7e204d3d45",
          "body": "The guard on PLATFORM_DISPATCH_TOKEN warned and exited 0, so a release run\nwith no token reported green while the Platform bump never fired. The token\nhas never in fact been set in this repository: every release so far has been\none of those green runs, and the platform repo has never seen a bump PR.\n[…]\nhere can un-publish\nthem. A red run costs a red run — which is the point, since it is the only\nway a bump chain that has stopped working says so.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fail the release when the dispatch token is missing",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-26T14:19:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "086b7f86da2abef9a41c3ac691683ecae027ed6e",
          "body": "The manifest URL was a SubmitField splicing its text into the action by\nstring, and that primitive is gone in contracts v0.32.0.\n\nAdding an addon appends to a list, which a form merge cannot do. So\nsettings carry addAddon: the form writes one URL there, addonsFrom\nappends it to addons with the existing dedup, and the field is stored\nback empty. Nothing new on the wire.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Author the add-addon form, and fold the pending addition",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-25T05:05:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "17d75df5e1e56b2c9875e33f6929c20a78d167da",
          "body": "The previous tag's artefact still had none: the field stopped at\nmodulesign, which reassembles the manifest and dropped what it did not\nknow about. That is fixed in the platform tool the release workflow\nbuilds from, so this tag is the first whose published manifest.json\ndescribes the module.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Re-release so the manifest carries the description",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-24T23:48:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ab7f1255c2b483cbc44b49b4ef659dc70f779b52",
          "body": "The last release catalogued fine and published a manifest.json with no\n`description` in it. The field was on the module's own manifest and on\nthe SDK — but `sdk/host` is a separate module, and it is host's\n--mosaic-manifest that writes the document a release publishes and the\nregistry signs. Bumping sdk alone moved the field everywhere except the\none place that serialises it.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Bump sdk/host to v0.4.0, so the release carries the description",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-24T23:41:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bd4be1a38fb86e93afa11e5bcc1ee0cfd135f202",
          "body": "The description this module declares needs Manifest.Description, which\nlands in v0.22.0.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Bump to sdk v0.22.0 for the manifest description",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-24T23:11:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "efb1484d226d57799f450b5babb23d8525c9f6a6",
          "body": "The Platform can read the roles off this manifest and tell a user what\nthis module can DO; only its author can say what it IS. Without that, the\ncard offering to install it named it, listed its capabilities, and left\nthe actual question — what is this for — unanswered.\n\nOne sentence: a host for what\n[…]\ngistry's index rather than being prose added downstream.\n\nNeeds sdk >= 0.22.0 for Manifest.Description; the require bump lands with\nthat release.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Say what this module is, not only what it fills",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-24T22:56:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "58c55ae87475d88e300379295d69dcffcc4e85db",
          "body": "Slice 2.5a. The module's release gains a `binaries` job that cross-compiles\ncmd/module-stremio-addons for the Platform's targets (linux/darwin amd64+arm64,\nwindows/amd64; CGO off so one runner covers all five), asks the binary what it\nis via host's --mosaic-manifest, and joins that identity with the\n[…]\nmanifest format\nis extracted to a public module.\n\nBumps sdk/host to v0.3.0, which adds the --mosaic-manifest flag the identity\nstep depends on.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: produce out-of-process binaries and a signed-ready manifest",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-24T14:20:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "18a2a465c7c7acbab23802380b75fa69f7412fb6",
          "body": "This repository had no CI at all — no gate on push, no tag validation,\nnothing to prove a published tag is resolvable, and nothing to fire ADR\n0078's dispatch. module-tmdb was the only module with workflows, so the\ntag-dispatch covered one module rather than the set. These two mirror\nthat template.\n\n[…]\nhe Platform\nbump ADR 0078 automates. The dispatch warns rather than fails when\nPLATFORM_DISPATCH_TOKEN is unset, so it is inert until the secret exists.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "CI: verify on push/PR, release on tag (ADR 0078)",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-24T12:51:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9a252c99153037612e23feb0e21bdecce3368076",
          "body": "A main.go of one line — host.Serve(stremio.New(nil)) — and nothing else\nin this module changes. That is the property ADR 0064 is arranged\naround, and this is the first real module to test it: the Capability is\nthe same plain Go value, its six roles are the same methods, and its\ntests still run with \n[…]\n process is unguarded until the forward proxy ADR\n0064 specifies is built, which is one reason the Platform still composes\nthis module statically today.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Run as a process: cmd/module-stremio-addons (ADR 0064, ADR 0077)",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-24T03:47:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "da956573d47d2d01533ea518f92f992b68ac2fdb",
          "body": "github.com/mosaic-media/sdui is now github.com/mosaic-media/contracts.\nADR 0044 decided the rename when it made these contracts protobuf; it\nnever happened, and ADR 0064 forces it now because the extension module\nwire lives in that workspace and the generated bindings end up behind\nsdk/host, which a\n[…]\necouples the npm scope from the\nrepository, and renaming the contract because the repository moved would\nbe renaming something nobody decided to rename.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Follow the contract repository rename to contracts (ADR 0044)",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-24T02:31:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2759fcd8c783d52b51f00091597bc9c8ec85f325",
          "body": "…0073)\n\nThe Platform now asks every stream provider about any materialised item, not\nonly the ones the provider itself imported. So a ref arrives here in two\nshapes and addressOf is the fork between them.\n\nThe module's own ref is unchanged: NativeID and NativeType are already\nStremio's and are used \n[…]\n the helper is used there only so a foreign ref\nis declined rather than becoming a request with two empty strings in it.\n\nRequires SDK v0.20.0.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.21.0: resolve streams for content this module did not source (ADR …",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-23T22:17:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0a61bb5d96b7ab98214d78e77f3eeacbba7b0990",
          "body": "This module bundled Cinemeta so a fresh install had metadata (ADR 0035). That\nguarantee now belongs to module-cinemeta, a core module that cannot be switched\noff or misconfigured (ADR 0072), and keeping a second Cinemeta here would have\nshown every title twice in search — the Platform unions search \n[…]\nport — so the directory path is exercised hermetically rather than by\nreaching Stremio's real one, and the browse grid is asserted to populate.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Drop the bundled Cinemeta default; keep the addon directory",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-23T20:52:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b167b55b8ef585714075238d0e7b5ed05a1954b7",
          "body": "An addon proxying a real artwork database returns a landscapePoster beside the\nportrait poster, and the module decoded neither the field nor passed it on — so\nwide key art the source supplied was dropped at the boundary. It is translated\nhere rather than left for the Platform to learn (ADR 0051) and\n[…]\nk.Landscape at import (ADR 0071).\n\nCinemeta has no such field, so it stays empty for that source rather than being\nsubstituted from the poster.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.19.0: decode landscapePoster; SDK v0.16.0",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-23T20:41:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cb2a963a38cd7e43b7a618c43ee7167ab150fdfd",
          "body": "Fills Artwork{Poster, Backdrop, Logo} on AddContentWork from the metadata the\nmodule already fetches, so the Platform stores it on the node (ADR 0071) and\nlist surfaces like the continue-watching rail render art without re-querying.\n\nBumps the SDK require to v0.15.0. The jump from v0.13.0 also pulle\n[…]\nte surface, so fakeContent gains stubs for the methods\nContentService now declares — this module sources content, it does not consume\nplayback.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.18.0: store artwork on import; SDK v0.15.0",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-23T19:53:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0480cbc3b492fbbdc8cb73c826fc2bf271b7152a",
          "body": "Adds docker-compose.test.yml (golang:1.25, pinned to go.mod) running\ngofmt, build, vet and test. CLAUDE.md and README gain a \"nothing runs on\nthe host\" section; the README's Build section also drops a stale claim\nthat the SDK needs a `replace ../sdk` \"until published\" — go.mod requires\nit published \n[…]\ntainer has network and certificates on purpose.\n\nVerified: `docker compose -f docker-compose.test.yml run --rm test`\npasses (exit 0), no skips.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Run gates in a container, not on the host",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-23T17:47:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4d5f5d58430f36429974b304b473699f12a2ee48",
          "body": "This repository had none, so a session starting here had to infer the module\nboundary — import only the published contracts, and nothing else — from a\nboundary test rather than being told it up front.\n\nWritten in another session; committed here with the rest of the tree.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add CLAUDE.md",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-23T16:59:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "25ab3826fa5dec067821175b92013c6ad63f9ddb",
          "body": "This module had one log.Printf, and it was a good line — which source supplied\nthe identity and which supplied the artwork, so that \"the artwork came from\nCinemeta because your first addon had none\" is answerable after the fact.\n\nIt was also written the only way that was available, and every propert\n[…]\nre a provider's own identifiers and describe content, not a person.\nContributors became a count, which is what the line was really saying.\n\nSDK v0.13.0.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Record through the SDK instead of printing (ADR 0059)",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-22T20:00:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "391db2740aef924ab5e9e0f6e8e5f761a83ace6f",
          "body": "The hand-maintained constant had drifted across two releases: it read 0.7.0\nwhile the repository was tagged v0.9.0, so the Platform logged a version that\nhad not been true for months. Nothing forced it to agree with anything, which is\nwhy it did not.\n\nIt now resolves once at startup from whatever wa\n[…]\ner than a literal. That also frees the User-Agent, which was a\ncompile-time concatenation of the constant and is now built from the same value.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Derive the module version from the build graph (v0.16.0)",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-22T15:53:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "66bebae49210d9351d81b56ef8927d19d079be3d",
          "body": "The cast rail showed names and no faces, and the reason was that the module read\nthe wrong field.\n\nThe standard Stremio meta shape carries cast in `links` as a name plus a search\nURL -- no character, no photograph. An addon proxying a real metadata database\nhas more than that and nowhere to put it, \n[…]\nthrough it. The earlier TMDB-first heuristic was aiming at\nsomething already true; the ordering work still stands, but this was the actual\ngap.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Read cast photos and characters from app_extras (v0.15.0)",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-22T14:46:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f14b63e6a84980d01bfe9ad3edca87e2a85100ed",
          "body": "v0.13.0 unioned metadata field by field, which fills gaps well and can assemble\na record no single source would recognise. Stremio does the opposite -- it keeps\neach addon's answer whole and picks one -- which is always coherent and always\ngappy. Neither extreme is right, so the merge is now tiered \n[…]\nted Cinemeta came first. That was the behaviour, not the\nintent; it now asserts the ordering rule and that the configured position is\nrecorded.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Tiered metadata merge, and configured order as the priority (v0.14.0)",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-22T14:37:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "67e88d088e5feb7c0ad263d69afd0da6ba49c36c",
          "body": "The module asked one addon and stopped. Meta and Subtitles returned the first\nthat answered, so with the bundled Cinemeta prepended it always won -- and every\nricher source a user had deliberately installed was never even fetched. That is\nnot a preference anyone chose; it is an accident of list orde\n[…]\nguration order afterwards, so\nconcurrency does not make candidate ordering depend on which addon answered\nfirst. Selection ranks on that order.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Union every addon read: metadata, subtitles and streams (v0.13.0)",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-22T14:23:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "26d16be4bf903fdbb3b730f83ad2dbe34eff5ee7",
          "body": "…0.12.0)\n\nThe flat cap was actively harmful and this is the bug that cost the most time.\n\nAn aggregator ranks its listing by quality descending. Taking the first 40 of it\ntherefore takes the largest, least playable releases and discards every smaller\none. Measured against a real film: the source off\n[…]\nould repeat this same mistake on another axis.\n\nSource order is preserved within each bucket -- within one resolution the addon\ndoes know best.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Sample candidates across resolutions, not off the head of the list (v…",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-22T14:10:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c2c1158c4dd063bb315570c3baffcb887c3acd3b",
          "body": "Import used to return early when the work already existed, so a re-import did\nnothing at all. Every item imported before the module stored a whole candidate\nset was therefore stranded on its single release forever, selection had nothing\nto choose between, and from outside that is indistinguishable f\n[…]\nistContentParts -- a module cannot tell a new release\nfrom a stored one without reading its own writes, which is the hole that\naddition closes.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Re-import refreshes an item's candidate releases (v0.11.0)",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-22T13:43:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f2bafeefb5ab108a8357787a5702838019fecfa4",
          "body": "The candidate-set and boundary-translation changes alter what composing this\nmodule produces, so it gets its own version rather than riding under the old one.\n\nThe constant was also stale: it read 0.7.0 while the repository was tagged\nv0.9.0, so the Platform logged a version that had not been true for two\nreleases. Corrected to match the tag rather than continuing the drift.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.10.0: report the new module version",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-22T12:40:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f254945e1df0b3f4d6045e910ec82884219b4e82",
          "body": "…0049, 0051)\n\nTwo changes, both of which the module should always have been doing.\n\nIt now parses container, video codec, audio codec and nominal dimensions out of\na stream's filename and descriptive text, and writes them into the SDK's typed\nfields on the Part. Those fields have existed since the c\n[…]\nn applied silently,\nbecause a cap nobody can see reads as \"we stored everything\" when it did not.\n\ngo build, go vet and go test -race all pass.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Translate release detail at the boundary; store every candidate (ADR …",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-22T12:20:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4810eda5e3451743b3ee7de4e2cb69ce9d23b3cf",
          "body": "Port settingsui.go from the retired sdui option-bag builders to the\ndeclarative ui layer (github.com/mosaic-media/sdui/ui). The screen now reads\nas a widget tree; helpers return *ui.Element and the screen is serialised\nwith Element.BuildJSON(), which emits the canonical protojson UINode bytes\nthe Pl\n[…]\nuires sdui v0.6.1 (for the ui layer, Element.BuildJSON, and the OpenURL /\nBanner helpers this screen uses); drops the pre-protobuf sdui v0.3.0.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Author the settings UI with the sdui ui layer (require sdui v0.6.1)",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-21T22:30:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "deceddbc2396de1f7348d349c1ea6d3839bd1887",
          "body": "Repos dropped the redundant mosaic- prefix on 2026-07-21 (ADR 0043):\narchitecture, platform, sdk, sdui, module-stremio-addons. Update repo names,\nGo module paths, sibling folder paths, and GitHub/Pages URLs in the living\ndocs. The three web repos (mosaic-shell, mosaic-sdui-react, mosaic-storybook)\nand the cmd/mosaic-platform code path are unchanged. Version numbers not\ntouched here.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: update repo references after mosaic- prefix drop (ADR 0043)",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-21T16:18:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f516072b05acf48c0ff384652b4356ebd4854da1",
          "body": "Repo renamed mosaic-module-stremio -> module-stremio-addons under the\nmosaic-media org. Update the Go module path and internal imports, and\nretarget dependencies to sdk v0.8.0 and sdui v0.3.0 (their renamed paths).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: rename module path -> module-stremio-addons; retarget sdk/sdui",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-21T14:54:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e2011f1261abba96a570f5eb04589275a4ed3653",
          "body": "Hide addons that are not content sources: a resource floor (must fill a role\nMosaic sources — meta/catalog/stream/subtitles) plus a curated deny-list of\nknown overlay/status/presence/companion addons that inject non-content through\nthose same resources and so can't be told apart by manifest. Add a d\n[…]\nthat Mosaic doesn't support every Stremio addon and community addons are\nused at the user's own risk. Curated list is non-exhaustive by design.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Filter browse to compatible addons + disclaimer (ADR 0038)",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-21T01:43:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3dcc74a083fcbb1d7f0ed13c0b96c2aa38506a76",
          "body": "…DR 0038)\n\nRender installed and browse addons as a grid of cards showing each addon's name,\nlogo and description (read from its manifest) instead of raw manifest URLs. The\nbundled Cinemeta default is deduped against an explicit user addon for the same\nURL, so it appears once (as the Default, with a \n[…]\nigure\ncontrol that opens its own /configure page. Add Logo/Description/behaviorHints\nto the manifest read and an InstalledAddons client method.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Settings v2: addon cards with name/logo, dedupe default, Configure (A…",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-21T01:27:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fdb4d5c105e36bff4a6679a88b040a3b41f26387",
          "body": "Implement RoleSettingsUI: the module renders its own settings screen as SDUI\n(add an addon by manifest URL, view/remove installed addons, toggle the bundled\nCinemeta default, and browse installable addons via the addon_catalog resource),\nbuilt with the shared mosaic-sdui producer binding. Every cont\n[…]\nnow skipped rather than failing the whole\noperation, so one bad addon can't blank search, browse, or metadata. Require the\nreleased SDK v0.7.0.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Release v0.5.0: addon_catalog + a contributed settings UI (ADR 0038)",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-21T01:12:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9754a11a314e02508b691b1e387c01c63dab76cf",
          "body": "Complete the Stremio source surface. Bundle Cinemeta as a module-owned default\n(with a disableDefaultAddons opt-out) so metadata and search work with zero\nconfig (realises ADR 0035's default provider). Implement the subtitles resource\n(SubtitlesProvider / RoleSubtitles). Parse release detail — quality, size,\nseeders — out of stream titles/behaviorHints onto the richer StreamLink. Require\nthe released SDK v0.6.0 and drop the local replace.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Release v0.4.0: Cinemeta default, subtitles, richer streams (ADR 0037)",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-21T00:22:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c271ea0b8a790c422c0e444f66af337ee80c073b",
          "body": "Require mosaic-sdk v0.5.0 and drop the local replace now that it is tagged. The\nmodule decodes the rich Cinemeta fields into the grown ContentMetadata (ADR\n0034).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Release v0.3.0: rich metadata fields, on published SDK v0.5.0",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-20T23:04:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cfafef020b4f48afeedec11f44a0fd301fec7eca",
          "body": "Cinemeta returns a clearlogo, cast, imdbRating, runtime and — per episode — an\noverview, thumbnail and air date; the module decoded none of them. Add them to\nthe Meta/Video wire structs (incl. the modern `links` array cast lives in), and\nmap them into the grown ContentMetadata: Logo, Cast (top-bille\n[…]\nisodes projected from the videos.\nModule v0.3.0. A local replace bridges the unreleased SDK v0.5.0 until it is\ntagged (release step in go.mod).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Decode the rich Cinemeta fields into the metadata (ADR 0034)",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-20T22:54:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "93610932968d1f586e5406be24524cce06a7e8a2",
          "body": "Matches the self-reported Manifest version (and User-Agent) to the\nv0.2.0 tag carrying the SDK v0.4.0 provider surface.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Bump module version to 0.2.0 for the provider-roles release",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-20T18:46:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "94703f6bcd1ea7aa95a703b33a087574f663bf3e",
          "body": "The module was a single Import verb; SDK v0.4.0 (ADR 0027) turns the\ncontract into declared provider roles, and this fills all four.\n\n- Metadata: descriptive enrichment from the addon `meta` resource.\n- Search: free-text search over search-capable catalogs, returning\n  virtual candidates with no raw\n[…]\ns Provides for all four\nroles, asserted at compile time.\n\nRequires mosaic-sdk v0.4.0 (published); the local replace used during dev\nis removed.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Implement the four provider roles against SDK v0.4.0",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-20T18:44:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ab491237fd58c08b03ce5c5ff45e53fb1b222d76",
          "body": "Two blocking bugs made real addons fail on the input a user actually has:\n\n- The configured addon URL was treated as a base URL, so pasting the\n  manifest URL Stremio hands out (\".../manifest.json\") produced\n  \".../manifest.json/manifest.json\" and 404'd every request. normalise-\n  AddonURL now accep\n[…]\nL normalisation and the\nUser-Agent, and documents the metadata-addon vs stream-addon split in\nthe README (the meta-only case is not a failure).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix addon reachability: accept manifest URLs and set a User-Agent",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-20T17:35:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9adeff7389cc041a4b3156a6323ec506cfeeaf29",
          "body": "The module now resolves mosaic-sdk from the module proxy as an ordinary\ntagged dependency, so a fresh clone builds without a sibling SDK checkout.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Require the published SDK v0.3.0 (drop the local replace)",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-20T01:37:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2eb159c6300786df55b8a0c93244d999dc5f2cb6",
          "body": "MIT matches the Stremio addon SDK's own license and is frictionless for an\nofficial example other module authors copy. The module depends only on the\nApache-2.0 SDK and may be compiled into the AGPL Platform under its Module\nLinking Exception.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "License the module under MIT",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-20T01:27:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "da316f1a3d8d4993e5ac4a50d776760a5c95fa71",
          "body": "Extracted from mosaic-platform (modules/stremio) into its own repository,\nas a third-party module would be. The SDK replace now points at the\nsibling ../mosaic-sdk instead of the old nested path, and requires\nmosaic-sdk v0.3.0. Adds a README describing the module and a nominative-use\nnote: this is unofficial and not affiliated with Stremio / SmartCode OOD.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Stand alone: point the SDK replace at the sibling SDK, add a README",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-20T01:11:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "37a5761ee7d664b185b25dd4525d50bf39fb346f",
          "body": "The first SDK gap the Stremio module surfaced. Addon URLs were an env var\n(MOSAIC_STREMIO_ADDONS) read at composition; the real need is a user\nadding an addon through the running API. Fills the gap end to end.\n\nStorage: a Platform-owned ModuleSettingsStore — one jsonb document per\nmodule id (migrati\n[…]\nhe\nshape and names the next gap the module surfaced (module-declared cron,\nwhich needs the jobs runner, a scheduler, and the system principal).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "User-managed module settings: add a Stremio addon at runtime",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-20T00:58:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "05fe89cd2039f0705e94f0848b06a273e8ac322d",
          "body": "Builds the composition-and-invocation half of the extension story the\nreference capability could not: registering a separately-compiled module\nand invoking it. The reference capability proved a package can be written\nagainst the SDK alone; this proves the Platform can register and run one.\n\nSDK (v0.\n[…]\nemoteLocation path.\n\nADRs 0019 (capability/invocation contract) and 0020 (composition model)\nrecord the shapes, written after the code settled.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "The first optional module: Stremio addon source, composed and invoked",
          "author_name": "AdamNi-7080",
          "author_login": "Pickles2235",
          "committed_at": "2026-07-20T00:23:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        }
      ],
      "releases_count": 9,
      "commits_last_year": 50,
      "latest_release_at": "2026-07-27T16:31:38Z",
      "latest_release_tag": "v0.30.0",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 2,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 0.4
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 50,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/mosaic-media/module-stremio-addons",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/mosaic-media/module-stremio-addons",
          "is_deprecated": false,
          "latest_version": "v0.30.0",
          "repository_url": "https://github.com/mosaic-media/module-stremio-addons",
          "versions_count": 32,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-27T16:30:18Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 0,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_stars": 0,
        "collected_at": null
      },
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 34214,
      "source_files_sampled": 15,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 8729
    },
    "dependencies": {
      "manifests": [
        "go.mod"
      ],
      "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": [
        "go"
      ],
      "dependencies": [
        {
          "name": "github.com/mosaic-media/contracts",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.60.0"
        },
        {
          "name": "github.com/mosaic-media/sdk",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.26.0"
        },
        {
          "name": "github.com/mosaic-media/sdk/host",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.8.0"
        }
      ],
      "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": 0,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "Pickles2235",
          "commits": 50,
          "avatar_url": "https://avatars.githubusercontent.com/u/32930825?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "release.yml",
        "verify.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum"
      ],
      "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": 0,
            "reason": "branch protection not enabled on development/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": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not 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": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "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": 1,
            "reason": "9 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "fa9b18d38ce3f9185a23c22cd18bc59d4f45afb6",
        "ran_at": "2026-07-28T01:27:11Z",
        "aggregate_score": 2.1,
        "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-27T16:35:17Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/mosaic-media/module-stremio-addons",
    "host": "github.com",
    "name": "module-stremio-addons",
    "owner": "mosaic-media"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 42,
      "inputs": {
        "security": 21,
        "vitality": 68,
        "community": 24,
        "governance": 33,
        "engineering": 56
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 68,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 53,
            "inputs": {
              "commits_last_year": 50,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 2
            },
            "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": "2/52 weeks with commits",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 2
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "50 commits in the last year",
                "points": 15.3,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 50
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 9,
              "latest_release_tag": "v0.30.0",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 0.4
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "9 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~0.4 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 0.4
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "critical",
        "name": "Community & Adoption",
        "value": 24,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 0,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "0 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "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
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "at_risk",
        "name": "Sustainability & Governance",
        "value": 33,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 10,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "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 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "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": "critical",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution",
                    "pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "merged_prs": 0,
              "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": "no decided pull requests or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_decided_prs_or_data",
                    "params": {}
                  }
                ],
                "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": null,
            "notes": [],
            "value": 39,
            "inputs": {
              "followers": 0,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "mosaic-media",
              "public_repos": 16,
              "account_age_days": 15
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "0 followers of mosaic-media",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 0,
                      "login": "mosaic-media"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "16 public repos, account ~0 yr old",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 16
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/mosaic-media/module-stremio-addons"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on go",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "go"
                    }
                  }
                ],
                "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": "moderate",
        "name": "Engineering Quality",
        "value": 56,
        "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": 60,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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": 0,
                "status": "missed",
                "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": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "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": 0,
                "status": "missed",
                "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": "critical",
        "name": "Security",
        "value": 21,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Packaging. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "packaging"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 21,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 2.1
            },
            "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 not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "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": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "9 existing vulnerabilities detected",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          }
        ],
        "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": 79,
        "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": 1,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 8729
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "CLAUDE.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": "50 of 50 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 50,
                      "sampled": 50
                    }
                  }
                ],
                "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": [
                "go.sum"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.94,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "go.mod (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "go.mod"
                    }
                  }
                ],
                "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": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "47 of the last 50 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 47,
                      "sampled": 50
                    }
                  }
                ],
                "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": 100,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 34214,
              "source_files_sampled": 15,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Go (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/15 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 15,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "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": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-28T01:27:16.215745Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/m/mosaic-media/module-stremio-addons.svg",
  "full_name": "mosaic-media/module-stremio-addons",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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