Public record
Software health reportschema 0.27.0 · metrics 1.13.0 · 2026-07-25 22:26 UTC

DavideCarvalho / adonis-agent

Governed, durable-ready AI agent (chat + tool-calling + governance + HITL) for AdonisJS — part of the Agora ecosystem

TypeScript · MDXMIT★ 1 star⑂ 0 forkssince Jul 2026View on GitHub ↗

DavideCarvalho/adonis-agent holds a health index of 58 out of 100, placing it in the Moderate band. It scores highest on Vitality (74/100) and lowest on Community & Adoption (33/100). It was last updated 4 days ago. A single contributor accounts for most of its recent work.

58
overall / 100
Moderate

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

58
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

Davi de CarvalhoPersonal account
66 followers112 public repossince Nov 2015Mobly

This repository is owned by a personal account. A single-owner project carries more continuity risk than an organization-backed one.

Package ecosystems

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

74Good · 22% of overall
How it's scored
36/36Push recency — last push 4 days ago
2.1/36Commit cadence — 3/52 weeks with commits
17.6/18Commit volume — 91 commits in the last year
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Inputs used
commits_last_year91
human_commit_share0.791
days_since_last_push4
active_weeks_last_year3

Release discipline

100Excellent
How it's scored
27/27Ships releases — 29 releases published
36/36Release recency — latest release 6 days ago
27/27Release cadence — a release every ~0.2 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count29
latest_release_tag@adonis-agora/agent@0.17.0
releases_from_tagsno
days_since_latest_release6
mean_days_between_releases0.2
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

33At risk · 18% of overall
How it's scored
0/60Stars — 1 stars
0/25Forks — 0 forks
0/15Watchers — 0 watchers
Inputs used
forks0
stars1
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (MIT)
0/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
How it's scored
49.3/80Monthly downloads — 4,986 downloads/month across npm
0/20Registry dependents — not reported by this ecosystem
Inputs used
packages@adonis-agora/agent, @adonis-agora/agent-dashboard
dependents
ecosystemsnpm
total_downloads
monthly_downloads4,986
Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

57Moderate · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
0/22.5Commit distribution — top contributor authored 100% of commits
1.4/13.5Contributor breadth — 1 contributors
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Inputs used
bus_factor1
contributors_sampled1
top_contributor_share1
How it's scored
0/46.8Issue resolution — no issues or no data
38.2/38.3PR acceptance — 39/39 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 0/27 approved changesets -- score normalized to 0
Inputs used
merged_prs39
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.
How it's scored
10/30Ownership backing — personal (user) account
0/20Verified domain — not applicable to user accounts
13.1/25Owner reach — 66 followers of DavideCarvalho
25/25Track record — 112 public repos, account ~10 yr old
Inputs used
followers66
owner_typeUser
is_verified
owner_loginDavideCarvalho
public_repos112
account_age_days3,917
Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.
How it's scored
25/25Published & resolvable — 2 package(s) on npm
35/35Publish recency — latest publish 6 days ago
20/20Version history — 24 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packages@adonis-agora/agent, @adonis-agora/agent-dashboard
ecosystemsnpm
any_deprecatedno
min_days_since_publish6

Engineering Quality

Are baseline engineering and documentation practices in place?

74Good · 20% of overall
How it's scored
24/24CI workflows — 2 workflow(s)
24/24Tests present
16/16Linter config — biome.json
0/9.6Pre-commit hooks
0/6.4.editorconfig
10/20OpenSSF Scorecard: CI-Tests — 4 out of 7 merged PRs checked by a CI test -- score normalized to 5
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configyes
has_precommit_configno
How it's scored
30/30README
25/25Documentation directory
0/15Documentation / homepage site
10/10Repository description
0/10Topics
10/10Wiki
Inputs used
topics
has_wikiyes
homepage
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

44At risk · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
1.2/2.5CI-Tests — 4 out of 7 merged PRs checked by a CI test -- score normalized to 5
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/27 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
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.5License — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — no data
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — no data
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
6/7.5Vulnerabilities — 2 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate3
Excluded from scoring (no data or not applicable): packaging, signed_releases. Remaining weights renormalized.
How it's scored
35/35Direct dependencies free of known advisories — no direct dependency carries a known advisory
25/25Indirect dependencies free of known advisories — no indirect dependency carries a known advisory
0/40No advisories left outstanding — no advisory carries a publication date
Inputs used
sourceosv
advisories0
affected_packages0
assessed_packages1
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the npm:@adonis-agora/agent@0.17.0 runtime dependency closure — what installing the published package pulls in — 1 packages. Reachability is not analyzed.

AI Readiness

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.

62Moderate · 0% of overall
How it's scored
0/45Agent instructions — no CLAUDE.md / AGENTS.md / editor rules
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 71 of 72 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.986
agent_instruction_files
agent_instruction_max_bytes
How it's scored
0/18One-command bootstrap
22/22Automated tests
11/11Lint / format config — biome.json
11/11Static type checking — packages/adonis/tsconfig.json, packages/dashboard/tsconfig.json
10/10Reproducible environment — lockfile
10/10Demonstrated agent practice — 61 of the last 91 commits agent-authored or agent-credited
0/8Automated maintenance — no automated dependency updates observed
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Inputs used
has_nixno
has_testsyes
lockfilespnpm-lock.yaml
has_dockerfileno
typed_languageyes
bootstrap_files
has_devcontainerno
has_linter_configyes
typecheck_configspackages/adonis/tsconfig.json, packages/dashboard/tsconfig.json
agent_commit_share0.67
toolchain_manifests
dependency_bot_commit_share0
How it's scored
45/45Type-checkable code — TypeScript (statically typed)
55/55Manageable file sizes — 0/198 source files over 60KB
Inputs used
primary_languageTypeScript
largest_source_bytes39,439
source_files_sampled198
oversized_source_files0

Key facts

1GitHub stars
1contributors
91commits, last 12 months
4days since last push
29releases
1bus factor
0open issues
npmpackage ecosystems

Data collection warnings

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

More detail

OpenSSF Scorecard 3.0 / 10
3.0aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).Scorecard v5.5.0 · 2026-07-25 22:25 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
5CI-Tests4 out of 7 merged PRs checked by a CI test -- score normalized to 5
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/27 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
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
n/aPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
n/aSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
8Vulnerabilities2 existing vulnerabilities detected
Direct dependencies 1
RegistryPackageVersion constraintManifest
npm@standard-schema/spec^1.0.0packages/adonis/package.json
All dependencies not collected

The resolved dependency set could not be collected for this report: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Dependency advisories 0

Installing npm:@adonis-agora/agent@0.17.0 pulls in 1 packages, direct and transitive: 0 carry known advisories, of which 0 are direct dependencies.

No known advisories affect the assessed dependencies.

An advisory means the version recorded in the dependency graph falls inside an advisory’s affected range. Reachability is not analysed, and the graph includes development and test pins — a finding may concern tooling rather than shipped software.

Raw JSON report machine-readable
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 955,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "CSS": 9569,
        "MDX": 166495,
        "HTML": 316,
        "JavaScript": 2166,
        "TypeScript": 916381
      },
      "pushed_at": "2026-07-21T17:21:33Z",
      "created_at": "2026-07-07T07:24:46Z",
      "owner_type": "User",
      "updated_at": "2026-07-21T17:21:51Z",
      "description": "Governed, durable-ready AI agent (chat + tool-calling + governance + HITL) for AdonisJS — part of the Agora ecosystem",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "master",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript",
        "MDX"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Davi de Carvalho",
      "type": "User",
      "login": "DavideCarvalho",
      "company": "Mobly",
      "location": "Santos, São Paulo",
      "followers": 66,
      "avatar_url": "https://avatars.githubusercontent.com/u/15630886?v=4",
      "created_at": "2015-11-03T12:54:23Z",
      "is_verified": null,
      "public_repos": 112,
      "account_age_days": 3917
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "@adonis-agora/agent@0.17.0",
          "kind": "other",
          "published_at": "2026-07-19T22:19:26Z"
        },
        {
          "tag": "@adonis-agora/agent@0.16.0",
          "kind": "other",
          "published_at": "2026-07-19T20:39:13Z"
        },
        {
          "tag": "@adonis-agora/agent@0.15.0",
          "kind": "other",
          "published_at": "2026-07-19T15:17:16Z"
        },
        {
          "tag": "@adonis-agora/agent@0.14.0",
          "kind": "other",
          "published_at": "2026-07-19T13:57:05Z"
        },
        {
          "tag": "@adonis-agora/agent@0.13.3",
          "kind": "other",
          "published_at": "2026-07-19T00:23:43Z"
        },
        {
          "tag": "@adonis-agora/agent@0.13.2",
          "kind": "other",
          "published_at": "2026-07-18T22:57:07Z"
        },
        {
          "tag": "@adonis-agora/agent@0.13.1",
          "kind": "other",
          "published_at": "2026-07-18T21:40:01Z"
        },
        {
          "tag": "@adonis-agora/agent@0.13.0",
          "kind": "other",
          "published_at": "2026-07-18T20:58:02Z"
        },
        {
          "tag": "@adonis-agora/agent@0.12.0",
          "kind": "other",
          "published_at": "2026-07-18T14:07:12Z"
        },
        {
          "tag": "@adonis-agora/agent@0.11.0",
          "kind": "other",
          "published_at": "2026-07-18T11:48:22Z"
        },
        {
          "tag": "@adonis-agora/agent@0.10.1",
          "kind": "other",
          "published_at": "2026-07-17T23:44:57Z"
        },
        {
          "tag": "@adonis-agora/agent@0.10.0",
          "kind": "other",
          "published_at": "2026-07-17T21:21:21Z"
        },
        {
          "tag": "@adonis-agora/agent@0.9.0",
          "kind": "other",
          "published_at": "2026-07-17T20:51:21Z"
        },
        {
          "tag": "@adonis-agora/agent@0.8.0",
          "kind": "other",
          "published_at": "2026-07-17T18:47:21Z"
        },
        {
          "tag": "@adonis-agora/agent@0.7.1",
          "kind": "other",
          "published_at": "2026-07-17T01:32:09Z"
        },
        {
          "tag": "@adonis-agora/agent@0.7.0",
          "kind": "other",
          "published_at": "2026-07-16T23:49:55Z"
        },
        {
          "tag": "@adonis-agora/agent@0.6.0",
          "kind": "other",
          "published_at": "2026-07-16T21:56:09Z"
        },
        {
          "tag": "@adonis-agora/agent@0.5.0",
          "kind": "other",
          "published_at": "2026-07-16T21:21:29Z"
        },
        {
          "tag": "@adonis-agora/agent-dashboard@0.3.2",
          "kind": "other",
          "published_at": "2026-07-16T21:21:26Z"
        },
        {
          "tag": "@adonis-agora/agent-dashboard@0.3.1",
          "kind": "other",
          "published_at": "2026-07-16T20:27:33Z"
        },
        {
          "tag": "@adonis-agora/agent-dashboard@0.3.0",
          "kind": "other",
          "published_at": "2026-07-16T19:21:01Z"
        },
        {
          "tag": "@adonis-agora/agent@0.4.1",
          "kind": "other",
          "published_at": "2026-07-16T18:37:27Z"
        },
        {
          "tag": "@adonis-agora/agent-dashboard@0.2.2",
          "kind": "other",
          "published_at": "2026-07-16T17:42:35Z"
        },
        {
          "tag": "@adonis-agora/agent@0.4.0",
          "kind": "other",
          "published_at": "2026-07-16T17:42:32Z"
        },
        {
          "tag": "@adonis-agora/agent@0.3.1",
          "kind": "other",
          "published_at": "2026-07-16T16:54:41Z"
        },
        {
          "tag": "@adonis-agora/agent@0.3.0",
          "kind": "other",
          "published_at": "2026-07-16T12:24:08Z"
        },
        {
          "tag": "@adonis-agora/agent-dashboard@0.2.1",
          "kind": "other",
          "published_at": "2026-07-16T12:24:05Z"
        },
        {
          "tag": "@adonis-agora/agent@0.2.0",
          "kind": "other",
          "published_at": "2026-07-15T23:46:47Z"
        },
        {
          "tag": "@adonis-agora/agent-dashboard@0.2.0",
          "kind": "other",
          "published_at": "2026-07-15T23:46:44Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "f984b3622275bb7bb4c24818f69a0367530988cf",
          "body": "Co-authored-by: Davi de Carvalho <davi.carvalho96@gmail.com>",
          "is_bot": false,
          "headline": "docs: README do pacote @adonis-agora/agent (#39)",
          "author_name": "Davi de Carvalho",
          "author_login": "DavideCarvalho",
          "committed_at": "2026-07-21T17:21:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce45ee28f5108971d424996415bd498e1b8d3978",
          "body": "Adiciona \"prepack\" espelhando o build de release em cada pacote\n(@adonis-agora/agent e @adonis-agora/agent-dashboard). Sem isso, um\nchangeset publish manual pode publicar artefato stale.\n\nFormato (biome check) já estava limpo neste repo, nenhuma correção\nnecessária.\n\nCo-authored-by: Davi de Carvalho <davi.carvalho96@gmail.com>",
          "is_bot": false,
          "headline": "chore: guarda de prepack nos pacotes publicáveis (#38)",
          "author_name": "Davi de Carvalho",
          "author_login": "DavideCarvalho",
          "committed_at": "2026-07-21T17:13:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "19a6309ca9af69c3c21f8ea12433f4c712002fd1",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: version packages (#37)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-19T22:18:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0c3c1c01e52d588c9aaaae8d2467999937233687",
          "body": "… do client (#36)\n\nFontes grandes (ex.: PDF de 236 pgs -> 676 chunks) viravam um único upsert de\nvários MB que estolava e abortava no timeout default de 300s do\n@qdrant/js-client-rest. Fatiar em lotes (upsertBatchSize, default 100) resolve.\n\nCo-authored-by: Davi de Carvalho <davi.carvalho96@gmail.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(rag): batcha QdrantStore.upsert p/ não estourar o timeout de 300s…",
          "author_name": "Davi de Carvalho",
          "author_login": "DavideCarvalho",
          "committed_at": "2026-07-19T22:17:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ee76688598bb7bcd7be7ad3b32b63725007f9f4b",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: version packages (#35)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-19T20:38:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5afc7e5cab6de57abc8662e70fc4c72476015c96",
          "body": "* feat(rag): QdrantStore — ensureCollection, upsert, id UUIDv5\n\n* feat(rag): QdrantStore.search + tradução de filtro (ACL por token)\n\n* feat(rag): QdrantStore.remove + listDocuments (scroll+dedupe)\n\n* feat(rag): retrievers.qdrant factory + exports + @qdrant/js-client-rest peer opcional\n\n* fix(rag): \n[…]\npáginas) em vez do fake estático que ignorava args.offset.\n\n---------\n\nCo-authored-by: Davi de Carvalho <davi.carvalho96@gmail.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(rag): backend Qdrant (QdrantStore) ao lado do pgvector (#34)",
          "author_name": "Davi de Carvalho",
          "author_login": "DavideCarvalho",
          "committed_at": "2026-07-19T20:20:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "440fb011d22184cf049710df873afa416aa32d19",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): version @adonis-agora/agent 0.15.0",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-19T15:16:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fbca2a9da0e85efeaa6c40c5bdd7fb40194c6c8f",
          "body": "…evel imports\n\nA tool file that imports an Adonis service singleton at module top (e.g.\n@adonisjs/lucid/services/db) evaluated it during the provider's boot(), where the\nsingleton's app can still be uninitialized (pruned prod build → 'Cannot read\nproperties of undefined (reading booted)'), throwing \n[…]\nry is a container singleton read per-request by the deps factory, and booted\ncallbacks run before the HTTP server accepts traffic.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(agent): defer tool discovery to app.booted so tools may use top-l…",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-19T15:16:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ae770e1f027c3ea8800d57975f10322ab25fc6f1",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): version @adonis-agora/agent 0.14.0",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-19T13:54:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "72c2ae8a80e6b18b08f93a28e07d7063c324532e",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(authz): corrige exemplo de import do authz no authorizer",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-19T13:53:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "50d68ddd4cd1056d0ceff98447385e43a2e4c885",
          "body": "Add an optional actorResolver to AgentDefinition (same ActorResolver\ntype as the global config.actorResolver). When an agent declares its own\nresolver, the request's actor is resolved with it instead of the\nmodule-global one — letting different agents read the caller from\ndifferent places (e.g. from\n[…]\nrefers the\nagent's resolver over the global, falling back to the global when the\nagent declares none, preserving today's behavior.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): per-agent actorResolver",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-19T13:46:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2ae2efb7aed69b9186595578c6028f885ffd7a2c",
          "body": "Add an optional relevance floor to retrieval. Passages whose score is\nbelow minScore are dropped before the top-K cut, so strict-grounding RAG\nnever cites weakly-related sources. score is higher-is-more-relevant\nacross the lib (cosine similarity, or a negated L2/inner distance), so\nthe floor is a si\n[…]\nearch (memory in\nJS, pgvector in SQL before LIMIT) and the EmbeddingRetriever. Undefined\nminScore is behavior-identical to before.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(rag): RetrieveOptions.minScore",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-19T13:45:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "06015a041274438a9a8cbcf92878f8a021ccb141",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): version @adonis-agora/agent",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-19T00:23:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "22b207ed263192e8a34922b08d04821f3fa61d8d",
          "body": "… import\n\nThe readdir scan had no per-file try/catch, so one tool throwing at import (e.g. a top-level service\nsingleton with undefined app during boot) aborted the whole scan -> ZERO tools registered -> the model\nnarrates tool calls it was never given, with no visible error. Each import is now guarded: log loudly\nand skip, so the rest register and the failure is diagnosable.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(agent): tool discovery skips (and logs) a tool file that fails to…",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-19T00:22:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f49d1b5eb972d1f60c17abb492e0451179f69149",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): version @adonis-agora/agent 0.13.2",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-18T22:56:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "88f70d851070767a70b1b1c7278a1a1e01f578f2",
          "body": "…singleton\n\ntokenSinks.redis() built its client via import('@adonisjs/redis/services/main'), whose module-level\napp is undefined when the sink is resolved during AgentProvider.boot → \"Cannot read properties of\nundefined (reading 'booted')\". The sink threw at boot and, under durable:true, the first f\n[…]\nresolves redis via app.container.make\n('redis') with the live app. No-arg factories stay assignable, so custom sinks keep working.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(agent): resolve Redis sink from app container, not services/main …",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-18T22:56:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8afe0238913de859dee4fc5c18f4007a9b8d1757",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): version @adonis-agora/agent 0.13.1",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-18T21:39:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "293843c7fc6082453b80ab4b5272ca3cd31da887",
          "body": "The framework never calls the sink's close(), so the Redis sink's per-run chunks/state keys\naccumulated in Redis forever. Add a sliding TTL (default 1h, refreshed on every write) so a long run\nstays alive and a crashed run still expires. Configurable via tokenSinks.redis({ ttlSeconds }); 0\ndisables.\n[…]\n optional expire() to RedisStreamClient (adonis adapter implements it; BYO clients\nwithout it keep working, just without the TTL).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(agent): expire Redis token-stream keys instead of leaking them",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-18T21:39:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3f9923ee65647182377005800b9c001cde54a4a2",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): version @adonis-agora/agent 0.13.0",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-18T20:57:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b68498606a02e82dc92d01a7aa139eb6ba752bee",
          "body": "New entry points that move the SSE-consumption + reconnection logic out of every consuming app\nand next to the server that emits the envelope:\n\n- @adonis-agora/agent/client: zero-dep, isomorphic. createAgentChatClient({basePath,fetch,getHeaders,\n  resume}) with send()/resume() — posts a turn, parses\n[…]\nadded as an optional peer dependency.\n\n13 new tests (envelope parsing + reconnect/replay/give-up/headers); full suite green (336).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): browser client + React hook for the chat SSE endpoints",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-18T20:42:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d3545d1238cc4424176764f636cf657a979f0608",
          "body": "…ke YAML frontmatter\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(agent): quote generative-ui description — 'event: component' bro…",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-18T19:14:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6c2b48503a01999e5a65ebe70be2030527227fd9",
          "body": "Rewrite the owner-scoped route authorization narration to describe the\nobservable behavior instead of the private `#assertOwner` helper and\ninternal service lookups. Attribute `frameToSse` as the exported helper\nrather than living on the provider.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: remove implementation detail from user docs",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-18T16:39:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5a99d467ccdf382468fafd51dd41f532f923ec10",
          "body": "…ent behavior\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(agent): drop 'since 0.x' version-history framing — describe curr…",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-18T16:16:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a771cb62850cf7c0743a5d9c2d2b14672c2b05f8",
          "body": "New guide page covering ctx.emitComponent, the typed text|component\nstream frame, and the event: component SSE envelope, with server-side\ntool examples (weather card, chart), client-side registry + SSE reader,\ninterleaving, and testing. Wired into meta.json and cross-linked from\nthe tools authoring page and the streaming/HTTP page.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(agent): document Generative UI (0.12.0)",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-18T15:42:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "41a1b54dc0fa7dad98dbc551e0fd5260da80e423",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(agent): bump alpha callout to 0.12.0",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-18T15:19:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4f3e2a7e9e1fef6c40738f46a3d0399e79f42c17",
          "body": "Fill the undocumented shipped surface of @adonis-agora/agent 0.11.0 and\ngive every docs page + subfolder a lucide icon.\n\n- Object-level ownership / IDOR protection: evaluateOwnership + the\n  provider #assertOwner enforcement, added to authorization.mdx (new\n  \"Object-level ownership\" section) and cr\n[…]\nrnance.\n- Every page gains icon: frontmatter and every subfolder meta.json an\n  icon (lucide names verified against lucide-react).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(agent): document security/authoring/RAG surface + icon sweep",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-18T15:18:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "050a4fdfa038828dce3cedfabacb02bfc39f88c3",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: version packages (#33)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-18T14:06:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "03092d46363200b541b0e7a2f418eac2b12bdef9",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'fix/toolresults-user-role'",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-18T12:31:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0998975ca76b88c84b5e428139af0f363f28abbb",
          "body": null,
          "is_bot": false,
          "headline": "chore(agent): release 0.11.0 (generative UI frames)",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-18T12:26:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cc0f809030b7f648129eda1eff433b5b961be121",
          "body": null,
          "is_bot": false,
          "headline": "feat(agent): provider emits event: component for component frames",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-18T12:21:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8baf37c4f64d4e4a879f2a24b0b26da818df386d",
          "body": "…sink",
          "is_bot": false,
          "headline": "feat(agent): AiToolCtx.emitComponent routes a component frame to the …",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-18T12:17:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aa2b197b998bcef838362e161cc97794a2d85823",
          "body": "Swaps the token stream sink from raw Uint8Array chunks to a typed\nStreamFrame union (`{t:'text',v}` | `{t:'component',name,data}`) across\nevery producer/consumer: the SPI, both in-process sinks, the Redis sink\n(now JSON-encoded instead of base64), the two model providers, the\ninline/durable runners' error-surfacing writes, agent-service's\nsubscribe(), and the SSE pipe in the Adonis provider (text frames only\nfor now, unchanged wire format).",
          "is_bot": false,
          "headline": "feat(agent): typed stream frames (text|component) in token sink",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-18T12:10:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4281c7445a2d3e02df98f25bddb246bc775501b8",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: version packages (#32)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-18T11:47:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "315eb41839bff2903e96481e7ca98881accdd8cd",
          "body": "…upport) (#31)\n\nTools de classe passam a ser instanciados via container do Adonis, então injeção\nde construtor (@inject) funciona — o app não precisa mais de service-locator\n(app.container.make) dentro do execute(). Resolução lazy no 1º execute e cacheada\n(a descoberta roda no boot() antes do app es\n[…]\ner (lazy +\ncacheado, prove-by-mutation); 12 tests no discovery, 61 nos não-sqlite.\n\nCo-authored-by: Davi de Carvalho <davi.carvalho96@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): resolve class tools through the IoC container (@inject s…",
          "author_name": "Davi de Carvalho",
          "author_login": "DavideCarvalho",
          "committed_at": "2026-07-18T11:46:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "131bb8686e5a87ec699dfc8d06a602256fefdc94",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: version packages (#30)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-17T23:44:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6f0465d0fcedd3f826687154f60317d180e56651",
          "body": "…p MissingToolResultsError) (#29)\n\n* fix(adonis): stop dropping toolResults on the user-role message branch\n\nmapMessages() in ai-sdk-model.ts handled `role === 'user'` with an early\ncontinue that ran before the toolResults -> tool message mapping, so the\nagent loop's `{ role: 'user', content: '', to\n[…]\ne(agent): biome format for the toolResults regression test\n\n---------\n\nCo-authored-by: Davi de Carvalho <davi.carvalho96@gmail.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(agent): stop dropping toolResults on user-role messages (tool-loo…",
          "author_name": "Davi de Carvalho",
          "author_login": "DavideCarvalho",
          "committed_at": "2026-07-17T23:43:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ba7c8e151fb3fb479b3534186c451e25090745ff",
          "body": null,
          "is_bot": false,
          "headline": "style(agent): biome format for the toolResults regression test",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-17T23:42:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fd77544040bdf8d95c532f3f70c6bd7673cec4ca",
          "body": null,
          "is_bot": false,
          "headline": "chore(changeset): patch for agent tool-loop toolResults fix",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-17T23:40:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ae695fdb359e495ba7e8a4eb8a5fb83207b2c32f",
          "body": "mapMessages() in ai-sdk-model.ts handled `role === 'user'` with an early\ncontinue that ran before the toolResults -> tool message mapping, so the\nagent loop's `{ role: 'user', content: '', toolResults }` feedback carrier\n(agent-loop.ts:582) silently lost its tool results. The AI SDK then saw an\nassi\n[…]\nen there is no\ntool-result payload, since the SDK requires the tool message to immediately\nfollow the assistant tool-call message.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(adonis): stop dropping toolResults on the user-role message branch",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-17T23:40:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4b19c1e92abb7d159f3c12a19198ca803769f6b3",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: version packages (#28)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-17T21:19:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "426b5040203fae41bb6a6fcc79ac5dbc0e9bc0ad",
          "body": "…fies) (#27)\n\n* feat(agent): run-tracing spans (traceId = runId) over the ctx.step/localStep points\n\nPort of nestjs-agent 6263338 (core-half), re-mapped onto Adonis's single-surface\ndurable model. Point events told you WHAT happened; spans give a turn its SHAPE —\na start/end pair per genuinely-execu\n[…]\n.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Davi de Carvalho <davi.carvalho96@gmail.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): ReadTool/ActionTool — static tool truly bare (mata satis…",
          "author_name": "Davi de Carvalho",
          "author_login": "DavideCarvalho",
          "committed_at": "2026-07-17T21:18:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "11117a77f94bbb2aa341a3518a22ecc71fd5fa2a",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: version packages (#26)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-17T20:49:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e726f1fdcc13e479ffc10c150dc4148bc18efdfb",
          "body": "* feat(ai-sdk): attachment download override + attachmentFetchDownloader\n\nPort of nestjs-agent 6263338 (ai-sdk half) + 3d256d4. The Vercel AI SDK's\nDEFAULT file downloader refuses localhost/private hostnames (SSRF guard),\nwhich kills multimodal attachment parts whose staging presigns against a\nlocal\n[…]\n.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Davi de Carvalho <davi.carvalho96@gmail.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): BaseTool (mata o satisfies) + ToolHandler<I, O> (#25)",
          "author_name": "Davi de Carvalho",
          "author_login": "DavideCarvalho",
          "committed_at": "2026-07-17T20:48:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6ca43990d0069734a0162a87511a35f10f595152",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: version packages (#24)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-17T18:45:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "19c9ffd9c285c7cab4e487c8bda73f7ce668be9e",
          "body": "…#23)\n\n* docs: spec do authzActorResolver (actor via @agora/context + authz)\n\nDesign de um ActorResolver structural em @adonis-agora/agent/authz que resolve o\nActor a partir do contexto que o authkit já popula (userRef/tenantId) + os papéis\ndo authz (effectiveRoles: união global∪app∪store). Fecha o \n[…]\nzActorResolver\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Davi de Carvalho <davi.carvalho96@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): authzActorResolver — actor from @agora/context + authz (…",
          "author_name": "Davi de Carvalho",
          "author_login": "DavideCarvalho",
          "committed_at": "2026-07-17T18:44:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "747cb8dd4d64b23e5e242918f840077f59f6b5bf",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: version packages (#22)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-17T01:31:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d02b26bea2acd8d6f7daac166116a6813d321a02",
          "body": "…tor) (#21)\n\nReplace the flat four-way fallback (decorator-on-target, decorator-on-ctor,\nstatic-on-target, static-on-ctor) with two small helpers: `decoratorMeta`\n(reads the @AiTool symbol) and `metaOn` (either mechanism on one value). The\nresolver becomes `metaOn(target) ?? metaOn(ctor)`, making th\n[…]\nven (dropping staticToolMeta from metaOn fails exactly the two\nstatic-tool tests).\n\nCo-authored-by: Davi de Carvalho <davi.carvalho96@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(agent): compose readAiToolMeta as metaOn(target) ?? metaOn(c…",
          "author_name": "Davi de Carvalho",
          "author_login": "DavideCarvalho",
          "committed_at": "2026-07-17T01:22:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f1a43e8fc983014a3a1ddd009f1e26c83a169778",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: version packages (#20)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-16T23:49:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c3d7b140cdf32ef4324e18d84a13860ff0eb1a7c",
          "body": "…ols (#19)\n\nA tool class can declare its metadata via `static tool = { name, kind, description,\ninput, … }` instead of the `@AiTool` decorator — same shape, mirroring durable's\n`static workflow`. `readAiToolMeta` reads the static config when no decorator is\npresent; discovery/registration/execution \n[…]\nrk.\n\nUnit tests (mutation-proven) for reading + registering a `static tool` class.\n\nCo-authored-by: Davi de Carvalho <davi.carvalho96@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): decorator-free `static tool` authoring form for class to…",
          "author_name": "Davi de Carvalho",
          "author_login": "DavideCarvalho",
          "committed_at": "2026-07-16T22:53:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a26d0953b26b50cb6bd23c864f787c151bf14d59",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: version packages (#18)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-16T21:55:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ea6122f468f5308d3506461fb2bd2d7fc3159ef5",
          "body": "… authz) (#17)\n\nFollows up 0.5.0 (which authenticated these routes). Authentication alone still\nlet any authenticated caller act on ANOTHER actor's run/thread by id. Now a caller\nmay act only on runs/threads it OWNS, unless it is governance-privileged.\n\n- Run routes (stream/cancel/tool-call approve+\n[…]\nroven (deny/404 paths). Independently reviewed (found +\nfixed the POST /chat gap).\n\nCo-authored-by: Davi de Carvalho <davi.carvalho96@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(agent): owner-scope the per-actor run/thread routes (object-level…",
          "author_name": "Davi de Carvalho",
          "author_login": "DavideCarvalho",
          "committed_at": "2026-07-16T21:54:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "01e508757fec1a7274a52a1c777a542031fb599e",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: version packages (#15)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-16T21:20:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "07a46bd3d7efcc6861dee6c977ab0b19b6d4575b",
          "body": "… <1.0.0 (#16)\n\nPinning the peer to ^0.4.0 was too tight — every agent minor pushed the\ninstalled agent out of range, forcing a spurious dashboard major and a peer\nwarning in consumers. The dashboard only uses the agent's stable routes/types,\ncompatible across pre-1.0 minors.\n\nCo-authored-by: Davi de Carvalho <davi.carvalho96@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(agent-dashboard): widen @adonis-agora/agent peer range to >=0.4.0…",
          "author_name": "Davi de Carvalho",
          "author_login": "DavideCarvalho",
          "committed_at": "2026-07-16T21:18:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5de6247c95a1f92fc92ba89bd1eaa2e89d0ba4ba",
          "body": "… governance (#14)\n\nSeveral /agent/* routes were reachable with no actor resolution (anonymous), and\n/agent/governance/* was readable by any authenticated actor regardless of role —\nsurfaced the first time the routes were mounted behind a real app's auth.\n\n- Every /agent/* route now resolves the act\n[…]\nship on\napprove/reject/cancel/stream/threads (authenticated but not owner-scoped).\n\nCo-authored-by: Davi de Carvalho <davi.carvalho96@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(agent): authenticate mutation/lifecycle routes + gate cross-actor…",
          "author_name": "Davi de Carvalho",
          "author_login": "DavideCarvalho",
          "committed_at": "2026-07-16T21:13:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b50f8ee708189d8fac86d3799bb0b511154fda77",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: version packages (#13)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-16T20:26:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4021b6b5355ec7679f44f035a2c1dfafeb3c5e61",
          "body": "…er) + duplicate route (#12)\n\nRegistering the dashboard provider in a real app (entre-textos, the first consumer)\ncrashed boot two ways:\n\n- It imported `router` from `@adonisjs/core/services/router` and called it in\n  `boot()`, but that service's default is only assigned inside an `app.booted()`\n  h\n[…]\nT /agent/dashboard and\nGET /agent/dashboard/* with no duplicate and no boot crash.\n\nCo-authored-by: Davi de Carvalho <davi.carvalho96@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(agent-dashboard): provider crashed every app boot (undefined rout…",
          "author_name": "Davi de Carvalho",
          "author_login": "DavideCarvalho",
          "committed_at": "2026-07-16T20:25:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0b8e17572ff825251712155ccf5422935e5eb543",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: version packages (#11)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-16T19:20:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c2ddde3d4fdb5f87f3c49984c5cbbe145fbd1038",
          "body": "…e beyond authentication (#10)\n\nThe dashboard serves the governance read-model, which spans every actor's spend\nand usage, so authenticating the caller (the default gate) is often not enough.\nAdds `config('agent').dashboard.authorize: (actor, ctx) => boolean | Promise<boolean>`,\nrun after the actor \n[…]\nested, mutation-verified); the provider only\ntranslates the verdict to a response.\n\nCo-authored-by: Davi de Carvalho <davi.carvalho96@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent-dashboard): optional authorize gate to restrict the consol…",
          "author_name": "Davi de Carvalho",
          "author_login": "DavideCarvalho",
          "committed_at": "2026-07-16T19:18:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5df9b913834a1ba6a114f8d926c8629fb7c7e372",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: version packages (#9)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-16T18:36:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8763c29c43c4f766bc3f80e25d6e19f4e0c8aa6e",
          "body": "… not the lib's own file (#8)\n\nThe scanner chose `.ts` vs `.js` from `extname(import.meta.url)` — its OWN file,\nwhich ships compiled (`.js`). So a dev/TypeScript app (app/agent_tools/*.ts, no\nbuild barrel) had its directory scanned for `.js`, matched nothing, and ran with\nan empty ToolRegistry. The \n[…]\novered\n(mutation-verified against the compiled-lib behavior) and .d.ts is skipped.\n\nCo-authored-by: Davi de Carvalho <davi.carvalho96@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(agent): derive app/agent_tools scan extension from the directory,…",
          "author_name": "Davi de Carvalho",
          "author_login": "DavideCarvalho",
          "committed_at": "2026-07-16T18:35:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a359cecb1adc0f7e04cd36a757f7045e9650cb65",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: version packages (#7)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-16T17:41:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "363382b5bd182f8de6184cd1c509209113710111",
          "body": "…n store (#6)\n\nWhen store is a stores.lucid() store, pricing and governance now default to a\nLucid store on the SAME connection (tables auto-created) with no config needed,\nso cost tracking and the /agent/governance/* routes work out of the box. Set\npricingStore/governanceQueries to false to disable\n[…]\nnnection to mirror it. Widens the dashboard's agent peer to ^0.4.0 (anti-cascade).\n\nCo-authored-by: Davi de Carvalho <davi.carvalho96@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): default pricingStore/governanceQueries to mirror the mai…",
          "author_name": "Davi de Carvalho",
          "author_login": "DavideCarvalho",
          "committed_at": "2026-07-16T17:40:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a75fecd0b80e3468ef12fd3f773c041674da6c01",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: version packages (#5)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-16T16:53:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "487ad7265d512ab27b67a5b25802591f8719923c",
          "body": "…b default (#4)\n\nThe lucid store/pricing/governance factory thunks (and the pgvector retriever)\nderefed @adonisjs/lucid/services/db's default export, which AdonisJS assigns only\ninside app.booted() -- after every provider's boot(). The agent provider builds\nthese stores eagerly in its own boot(), so\n[…]\n.lucid to the services/db default deref makes the\nnew boot-safe factory test fail.\n\nCo-authored-by: Davi de Carvalho <davi.carvalho96@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(agent): resolve Lucid Database from the container, not services/d…",
          "author_name": "Davi de Carvalho",
          "author_login": "DavideCarvalho",
          "committed_at": "2026-07-16T16:53:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f208b3d1d683a4dbc421cea2db0930dc537fe4e1",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: version packages (#3)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-16T12:23:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3ed796f5106416726526651088fb98c1d2495172",
          "body": "…ovision too (#2)\n\nA lib passa a gerenciar as proprias tabelas por padrao (autoCreateTables: true),\nfechando a convencao do ecossistema (durable/authz ja fazem). E nao e mais so o\nstore principal: o pricing store e o governance read-model tambem auto-provisionam\nno primeiro uso, compartilhando UMA p\n[…]\n typecheck e biome limpos. Peer do\ndashboard pre-setado pra ^0.3.0 (anti-cascata).\n\nCo-authored-by: Davi de Carvalho <davi.carvalho96@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): autoCreateTables defaults to true; pricing/governance pr…",
          "author_name": "Davi de Carvalho",
          "author_login": "DavideCarvalho",
          "committed_at": "2026-07-16T12:22:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6e9d11dbd935c3f2a30a0f434655d21170df74af",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: version packages (#1)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-15T23:44:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f1fea00e165ef6d106fa67ed9ceda6e03ddbca3b",
          "body": "…eWorkflow\n\nO durable 0.8.0 removeu o decorator `@Workflow` em favor de `BaseWorkflow` +\n`static workflow = { name, version }`. O AgentRunWorkflow ainda usava o decorator,\nentao agent 0.1.0 + durable 0.8.0 derrubava o modo durable inteiro com\n`TypeError: (0 , Workflow) is not a function`, e o provid\n[…]\nria fora de range e o changesets bumparia o dashboard pra\nMAJOR (1.0.0) -- confirmado rodando `changeset status`, e um changeset minor\nexplicito NAO vence a cascata, porque ela toma o maximo dos dois.",
          "is_bot": false,
          "headline": "fix(durable): suporta durable 0.8.x migrando AgentRunWorkflow pra Bas…",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-15T23:42:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0d253448eab8533c407860ac621132415122c848",
          "body": "O `workspace:^` so vira range de verdade se quem publica for o pnpm, que o\nreescreve no pack. Publicar com `npm publish` sobe o literal `workspace:^` no\npeerDependencies -- semver invalido, pacote ininstalavel -- e o\n`npm publish --dry-run` passa verde nesse caso porque nao chega no servidor.\nO rang\n[…]\na dependencia de qual comando publica.\n\nEscolhido `^0.1.0` (piso de minor) pelo mesmo criterio do @adonis-agora/media-dashboard,\nque ja usava peer literal. O tarball sai identico ao que o pnpm gerava.",
          "is_bot": false,
          "headline": "fix(dashboard): fixa o peer do agent em ^0.1.0 em vez de workspace:^",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-15T22:32:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "76b9087429b872e1091cf61fc8e7be49f0bdbf35",
          "body": "O trabalho anterior estava so local, entao o lint quebrado so apareceu ao subir.\nMaioria e biome format. Os dois achados reais:\n\n- noUselessConstructor no PgVectorRetriever: NAO e inutil -- estreita `store` de\n  VectorStore (da base) pra PgVectorStore, que e o proposito da subclasse.\n  Aplicar o \"fi\n[…]\neTemplate no agent_provider: a concatenacao era so pra quebrar linha;\n  unificado num template, mensagem preservada.\n\ntypecheck e build verdes.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(lint): corrige o lint que ja estava vermelho antes do push",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-15T17:05:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a5d4defef29b735b39b3264b2e6530873185dbba",
          "body": "O Trusted Publisher ja esta registrado por pacote no npmjs.com, entao da pra\nparar de usar o token.\n\nNao bastava ter id-token: write. O setup-node escreve o .npmrc com\n_authToken=${NODE_AUTH_TOKEN}, e um token de verdade ali GANHA do OIDC: o npm\nautentica com ele e nunca troca o id-token por credenc\n[…]\ndo em publish\nreal (0.3.0 e 0.3.1). Reversivel numa linha: o secret NPM_TOKEN continua\nexistindo, basta devolver ${{ secrets.NPM_TOKEN }} aqui.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: passa o publish pro OIDC (NODE_AUTH_TOKEN vazio)",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-15T16:59:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d7b6f7571f3e33ce8f51f4557f78e5f5d31fefff",
          "body": "O pnpm >= 10 nao roda build script de dependencia sem permissao explicita, e em\nCI ele ERRA (ERR_PNPM_IGNORED_BUILDS) em vez de so avisar, entao o release\nmorreria no pnpm install --frozen-lockfile antes de chegar no changesets. Todos\nos liberados aqui ja rodavam sob o pnpm 9 -- liberar preserva o c\n[…]\no em todos os repos. Testar com a arvore\nquente esconde o erro: foi exatamente assim que ele passou local e so apareceu\nna CI do adonis-filter.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: libera os build scripts (allowBuilds) pro pnpm 11",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-15T16:21:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e1f8f2f933182674f802212cd2521d578435d536",
          "body": "Alinha o release com o adonis-filter, unico repo onde o OIDC estava provado.\n\n- permissions: id-token: write -- sem isso o changesets/action nem tenta OIDC,\n  so loga \"No NPM_TOKEN or OIDC available\"\n- npm@^11.5.1 fixado: o trusted publishing exige npm >= 11.5.1 e o node 22 traz\n  o 10.x, mas @lates\n[…]\nsecret NPM_TOKEN existir o token continua\nganhando do OIDC. A troca so acontece depois do Trusted Publisher registrado\npor pacote no npmjs.com.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: liga OIDC trusted publishing e sobe pnpm 11 + action-setup v6",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-15T16:15:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9a87f754d59686cb0c53e20945613c6bb4ce3245",
          "body": "…ta/authz/etc.)\n\nDocument the capabilities added on feat/nestjs-parity-sync, matching the\nexisting MDX/frontmatter/meta.json conventions and grounded in the shipped\nexports, routes, and config:\n\n- Durability: the durable runner (durable: true, DurableAgentRunner, HITL\n  waitForSignal, delegation chi\n[…]\nap (deferred -> shipped), and correct the now-stale\n\"deferred\" claims across index/agent-loop/quota/authorization/streaming/lucid.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(agent): document parity-sync features (durable/RAG/governance/da…",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-13T22:38:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "707698afdc1ba20dbd6cb4286156b0dec91a59c8",
          "body": "Bridge media uploads into the agent's RAG stack. `mediaRagIngestion(config)`\n(idiomatic factory) resolves a media reference's bytes via a structural,\noptional `@adonis-agora/media` handle, extracts text with a pluggable\ncontent-type extractor (default text/plain, text/csv, application/json,\ntext/mar\n[…]\nfExtractor, and inMemoryMediaRagIngestion. Exported\nfrom src/index.ts and the ./rag-media subpath. 15 new tests, zero regressions.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): RAG media auto-ingestion",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-13T22:22:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5b7e62bbdff6d8f55b9f32e49386526ba1f847ac",
          "body": "…y views\n\nExtend the @adonis-agora/agent-dashboard SPA to consume the new rich\ngovernance read-model. Adds five client endpoints (listRuns, runDetail,\npendingApprovals, perToolStats, runReliability) plus approve/reject wired\nto the existing POST /agent/tool-call/{approve,reject} routes, hooks\nmirror\n[…]\nolled SVG outcome donut + rate\nbars). Additive: existing views/tests untouched. New wire types mirror\nthe core SPI shapes exactly.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): dashboard runs, approvals inbox, tool-stats & reliabilit…",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-13T22:13:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "112ef76c077666d25decf53ec27d1a58ca729539",
          "body": "Add first-class run (turn) tracking to @adonis-agora/agent: an `agent_run`\ntable (status running/completed/failed/cancelled, started/finished, step +\ntoken + cost rollups, durable flag) plus a nullable `run_id` correlation\ncolumn on agent_message / agent_tool_call / agent_token_usage.\n\n- Schema: ext\n[…]\nvals awaiting-only, perToolStats + runReliability aggregates.\n\n230 agent tests + 47 dashboard tests pass; build + typecheck clean.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): agent_run lifecycle tracking + rich governance read-model",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-13T22:00:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a14909a5a1182b5a123ff784649cdd30f682c753",
          "body": "Add an optional `@adonis-agora/telescope` \"Agent\" tab to `@adonis-agora/agent`,\nmirroring the pattern `@adonis-agora/media` ships: a `./telescope` subpath\n(the load boundary) with a local structural SDK mirror, entry-backed data\nproviders reading `ctx.store.list({ type: 'diagnostic', tag: 'lib:agent\n[…]\npe` stays an OPTIONAL, never-imported lazy peer. A host\nwith both libs registers it via `extensions: [agentTelescopeExtension()]`.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): Telescope integration (agent tab extension)",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-13T20:35:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d27d7b45a806d10d3fa6073a5877c6d00436736e",
          "body": "Add a pgvector-backed VectorStore/Retriever completing the production RAG\nstack for @adonis-agora/agent, alongside the in-memory cosine store.\n\n- PgVectorStore implements the existing VectorStore SPI over the structural\n  LucidDatabaseLike (optional @adonisjs/lucid peer; no Lucid types imported),\n  \n[…]\ner rejection, and ingestion inserts against a recording DB\n  (no real Postgres required). Real-pgvector integration test deferred.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): pgvector retriever store",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-13T20:26:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cbebdc9ad7f1c6b9f6ca1e3b2aaa8d2b76141adc",
          "body": "Port the Redis multi-replica token-stream sink and the actor-directory read\nseam from @dudousxd/nestjs-agent into @adonis-agora/agent, idiomatic to Adonis.\n\n- RedisTokenStreamSink implements the existing token-stream-sink SPI over a\n  replayable Redis LIST (`agent:stream:<runId>:chunks`) + per-run p\n[…]\n with the in-process sink, end-terminates-stream, close cleanup,\n  keyPrefix; plus actor-directory resolve + missing-ref handling.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): Redis multi-replica token transport + actor-directory SPI",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-13T20:17:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "00d4ceca2018d13d947f35ff477da2f4e916f5f5",
          "body": "Add `AuthzToolAuthorizer` (`@adonis-agora/agent/authz` subpath), a\n`ToolAuthorizer`/`RolesPolicy` backed by `@adonis-agora/authz` (AdonisJS\nBouncer). For each tool it checks the actor against the tool's declared\n`ability` via `AuthzService.can`, replacing the ADMIN-only default.\n\n- Fail-closed: a to\n[…]\n existing `authorizer`/`rolesPolicy` config seam; the\n  offer-filter and invoke-time re-check both run through `can(actor, tool)`.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): authz (Bouncer) tool authorizer",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-13T20:02:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "197fa0b3f6d7c738205afd3c531ea79fd8400586",
          "body": "Port the NestJS @dudousxd/nestjs-agent-data satellite into @adonis-agora/agent\nas an idiomatic AdonisJS agent tool. Adds a governed read-only SQL tool with\nfaithfully-replicated guardrails:\n\n- Single-statement SELECT-only enforcement (node-sql-parser AST validation)\n- Fail-closed table allow-list (r\n[…]\nd vitest tests (validator, allow-list, tenant undefined-vs-null,\nrow limit, real SQLite Lucid roundtrip). Full suite: 157 passing.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): governed read-only SQL tool (data satellite)",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-13T19:38:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c36ddd8ab0bdf16d42398dfdc0105de5b9ae78c3",
          "body": "Add a new monorepo package that renders the agent's read-only governance\nread-model as a dependency-light React SPA, served by a thin AdonisJS\nstatic-serving provider behind the same actor gating as the governance routes.\n\nThe SPA is a pure consumer of the target's real endpoints:\n- Overview: spend \n[…]\n-base, fetch client),\nthe server path/asset/inject helpers, the data hooks, and the key views\nrendering from mocked API responses.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): governance dashboard SPA (@adonis-agora/agent-dashboard)",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-13T19:20:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e235ab0775f62aa84153bcd62f9875b3328fd153",
          "body": "Port a Lucid-backed governance read-model implementing the existing\n`AgentGovernanceQueries` SPI over the five agent tables, so the governance\ndashboard (next wave) can serve real data.\n\n- `LucidGovernanceQueries` (stores/lucid-governance-queries.ts): read-only\n  aggregations over token-usage/tool-c\n[…]\n  usage trend, recent tool-calls/threads, cache pricing, provider-cost override,\n  out-of-range). In-memory contract kept passing.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): Lucid governance read-model",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-13T18:55:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "78e5fe57b9e8ba9af079754189376d46b6ff6e49",
          "body": "Port the two loop-level pieces from the NestJS reference.\n\ntool-retry: new `src/tool-retry.ts` classifies tool-execution errors as\ntransient (MySQL/Postgres/SQLite lock-contention shapes, by code/errno/\nsqlState/message, walking one level of `cause`) vs permanent, and retries\ntransient failures in p\n[…]\nety (a\nmemoized step re-run never re-invokes the tool); tool-filters visibility\nvia a capturing FakeModel. Full suite green (119).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): tool-retry (transient) + tool-filters",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-13T18:42:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3f0a4e08ec4a3ea2c021c5ab348368f0c2c64827",
          "body": "Port the NestJS attachments/multimodal parity: an attachment-staging SPI,\nmultimodal content-part handling in the shared loop + AI-SDK adapter, an\noptional provider upload route, an idiomatic factory namespace with a lazy\nin-memory driver, and Lucid/in-memory persistence for message attachments.\n\n- \n[…]\ning kit\n- tests: stage->resolve, multimodal run, text-only unchanged, durable replay,\n  adapter image/file parts, Lucid round-trip\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): attachments + multimodal message support",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-13T18:29:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "662e9308503864f604d0196b245aa4f09c0957d1",
          "body": "NestJS-parity sync porting three interdependent features into\n@adonis-agora/agent. They interleave across agent-loop.ts, index.ts,\ndefine_config.ts, stores/factory.ts and providers/agent_provider.ts, so\nthey land as one buildable commit rather than broken partial states.\n\n- Durable runner: run each \n[…]\nrieve` tool call for citations.\n  Adds the `retrievers` factory namespace, a `retrieved` diagnostic, and\n  in-memory test doubles.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): durable runner + cost/pricing + RAG stack",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-13T18:07:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "05cb4f5a91ff83ba4dcf62baaf4451fdb7b37877",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "style: biome format wave-2/3 files (fixes CI lint gate)",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-07T07:26:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4db317df9a0875d87350235fff1991c3e25bdbc9",
          "body": "Add the full MDX docs set under packages/adonis/docs — index, getting\nstarted, the agent-loop concept, tool + persona/agent authoring,\nauthorization and quota/cost governance, the Lucid store, streaming &\nHTTP (the eleven routes + SSE envelope + HITL + React consumption),\ntesting, a complete config \n[…]\n and\nAgora-scoped React package. Mirrors the adonis-durable/adonis-media docs\nstyle; every snippet is grounded in the shipped API.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(agent): author @adonis-agora/agent documentation",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-07T07:18:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ab53e9742024d624020f34ebda41d340c53b33f1",
          "body": "…is-agora/agent)\n\nMake the lib installable + runnable on top of the wave-1 framework-agnostic core:\n\n- config: src/define_config.ts (defineConfig + AgentConfig; lazy model thunk;\n  store map with stores.lucid + stores.memory; fail-closed authorizer/actor defaults)\n- provider: providers/agent_provide\n[…]\n, chat streaming+persist over Lucid/sqlite, approve/reject\n  status flip, quota, throwing actor resolver (66 tests green, node 22)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): wave 2 — Adonis shell, Lucid store, /agent routes (@adon…",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-07T07:06:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b9053de4c597195f8031cf5ab9440ca3ecd10d5f",
          "body": "…nis-agora/agent)\n\nWave 1: turborepo skeleton (copied from adonis-media) + the framework-agnostic\nagent core ported from nestjs-agent (packages/core + ai-sdk + testing) into\n@adonis-agora/agent. No Adonis provider/routes/Lucid yet (wave 2).\n\n- Core ported verbatim (import specifiers only): agent-loo\n[…]\ny, quota, governance queries, diagnostics,\n  ai-sdk (mocked + real-SDK). Node 22: typecheck + test (45 passing) + build all green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: scaffold adonis-agent repo + port framework-agnostic core (@ado…",
          "author_name": "Davi de Carvalho",
          "author_login": null,
          "committed_at": "2026-07-07T06:41:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        }
      ],
      "releases_count": 29,
      "commits_last_year": 91,
      "latest_release_at": "2026-07-19T22:19:26Z",
      "latest_release_tag": "@adonis-agora/agent@0.17.0",
      "releases_from_tags": false,
      "days_since_last_push": 4,
      "active_weeks_last_year": 3,
      "days_since_latest_release": 6,
      "mean_days_between_releases": 0.2
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "@adonis-agora/agent",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "adonisjs",
            "adonis",
            "ai",
            "agent",
            "llm",
            "tool-calling",
            "governance",
            "ai-sdk",
            "durable",
            "agora"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@adonis-agora/agent",
          "is_deprecated": false,
          "latest_version": "0.17.0",
          "repository_url": "https://github.com/DavideCarvalho/adonis-agent",
          "versions_count": 24,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 3922,
          "first_published_at": "2026-07-15T22:18:14.499000Z",
          "latest_published_at": "2026-07-19T22:19:24.260000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 6
        },
        {
          "name": "@adonis-agora/agent-dashboard",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "adonisjs",
            "adonis",
            "ai",
            "agent",
            "governance",
            "dashboard",
            "spa",
            "react",
            "spend",
            "usage",
            "agora"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@adonis-agora/agent-dashboard",
          "is_deprecated": false,
          "latest_version": "0.3.2",
          "repository_url": "https://github.com/DavideCarvalho/adonis-agent",
          "versions_count": 7,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 1064,
          "first_published_at": "2026-07-15T22:22:06.826000Z",
          "latest_published_at": "2026-07-16T21:21:23.934000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 9
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 1,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": 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": [
        "packages/adonis/tsconfig.json",
        "packages/dashboard/tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 39439,
      "source_files_sampled": 198,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 1,
        "malicious_count": 0,
        "assessed_package": "npm:@adonis-agora/agent@0.17.0",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "@standard-schema/spec",
          "manifest": "packages/adonis/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.0.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": 39,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "DavideCarvalho",
          "commits": 20,
          "avatar_url": "https://avatars.githubusercontent.com/u/15630886?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        "biome.json"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "pnpm-lock.yaml"
      ],
      "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": 5,
            "reason": "4 out of 7 merged PRs checked by a CI test -- score normalized to 5",
            "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/27 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "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": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 8,
            "reason": "2 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "f984b3622275bb7bb4c24818f69a0367530988cf",
        "ran_at": "2026-07-25T22:25:57Z",
        "aggregate_score": 3,
        "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-21T17:22:27Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-21T17:21:32Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/DavideCarvalho/adonis-agent",
    "host": "github.com",
    "name": "adonis-agent",
    "owner": "DavideCarvalho"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 58,
      "inputs": {
        "security": 44,
        "vitality": 74,
        "community": 33,
        "governance": 57,
        "engineering": 74
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 74,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 56,
            "inputs": {
              "commits_last_year": 91,
              "human_commit_share": 0.791,
              "days_since_last_push": 4,
              "active_weeks_last_year": 3
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 4 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "3/52 weeks with commits",
                "points": 2.1,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 3
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "91 commits in the last year",
                "points": 17.6,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 91
                    }
                  }
                ],
                "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": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 29,
              "latest_release_tag": "@adonis-agora/agent@0.17.0",
              "releases_from_tags": false,
              "days_since_latest_release": 6,
              "mean_days_between_releases": 0.2
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "29 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 29
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 6 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~0.2 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 0.2
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 33,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 1,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "1 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "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
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 62,
            "inputs": {
              "packages": [
                "@adonis-agora/agent",
                "@adonis-agora/agent-dashboard"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 4986
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "4,986 downloads/month across npm",
                "points": 49.3,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 4986,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 57,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 13,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 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 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 72,
            "inputs": {
              "merged_prs": 39,
              "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": "39/39 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 39,
                      "decided": 39
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/27 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 60,
            "inputs": {
              "followers": 66,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "DavideCarvalho",
              "public_repos": 112,
              "account_age_days": 3917
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "66 followers of DavideCarvalho",
                "points": 13.1,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 66,
                      "login": "DavideCarvalho"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "112 public repos, account ~10 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 112
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 10
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "@adonis-agora/agent",
                "@adonis-agora/agent-dashboard"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 6
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "2 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 2,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 6 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "24 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 24
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 74,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 74,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "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": "biome.json",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "biome.json"
                    }
                  }
                ],
                "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": "4 out of 7 merged PRs checked by a CI test -- score normalized to 5",
                "points": 10,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 44,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 30,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 3
            },
            "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": "4 out of 7 merged PRs checked by a CI test -- score normalized to 5",
                "points": 1.2,
                "status": "partial",
                "details": [],
                "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/27 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "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": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "2 existing vulnerabilities detected",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the npm:@adonis-agora/agent@0.17.0 runtime dependency closure — what installing the published package pulls in — 1 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "npm:@adonis-agora/agent@0.17.0",
                  "assessed": 1
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 1,
              "unassessed_packages": 0,
              "affected_by_severity": "none",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "no indirect dependency carries a known advisory",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "no_indirect_advisories",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 1,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 2
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 62,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.986,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "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": "71 of 72 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 71,
                      "sampled": 72
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 64,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "pnpm-lock.yaml"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "packages/adonis/tsconfig.json",
                "packages/dashboard/tsconfig.json"
              ],
              "agent_commit_share": 0.67,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "biome.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "biome.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "packages/adonis/tsconfig.json, packages/dashboard/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "packages/adonis/tsconfig.json, packages/dashboard/tsconfig.json"
                    }
                  }
                ],
                "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": "61 of the last 91 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 61,
                      "sampled": 91
                    }
                  }
                ],
                "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": "TypeScript",
              "largest_source_bytes": 39439,
              "source_files_sampled": 198,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "TypeScript (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "TypeScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/198 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 198,
                      "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": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-25T22:26:05.609192Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/d/DavideCarvalho/adonis-agent.svg",
  "full_name": "DavideCarvalho/adonis-agent",
  "license_state": "standard",
  "license_spdx": "MIT"
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.27.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statisticsnpm.