Skip to content

metrics(ledger): weekly automation-rate series, published on /fairness - #9938

Merged
JSONbored merged 2 commits into
mainfrom
feat/automation-rate-9727
Jul 30, 2026
Merged

metrics(ledger): weekly automation-rate series, published on /fairness#9938
JSONbored merged 2 commits into
mainfrom
feat/automation-rate-9727

Conversation

@JSONbored

Copy link
Copy Markdown
Owner

Closes #9727. Closes #9728. Completes epic #9726.

Problem

"How much of this is actually automated?" underwrites every other claim the gate makes, and it was only answerable by ad-hoc query. The ledger records every disposition and whether a human touched the decision path, but nothing rolled it up.

The definition is the load-bearing part

Computed from decision_records alone, so an outsider holding the export recomputes the same numbers. A PR is automated only if every verdict for it was a merge or close with no human in the path. Three things mark a human:

So a PR that was held and later merged is manual, not automated. Counting the final disposition instead would let the rate be inflated by holding everything and then merging it by hand — precisely the failure mode this number exists to expose. There is a test named for that.

Machine-paced re-evaluation causes (scheduled_recheck, pipeline_error, upstream_state_change, config_change) explicitly do not count as human action: that is the automation working, not someone intervening.

PRs are counted once, bucketed by their first verdict, so a PR does not migrate between weeks as it accrues re-evaluations.

Backfill horizon, stated rather than hidden

#9727 asks for the horizon to be stated. The re-evaluation provenance fields arrived with migration 0204, so earlier weeks can only detect manual work that took the form of a hold — they under-count manual work. Those weeks are published as basis: "holds_only" rather than silently mixed in with complete ones.

A week straddling the horizon is labelled holds_only too: understating confidence rather than overstating it, which is the direction of error a fairness figure has to take. That is a test, not a comment.

The horizon is a single dated constant rather than something inferred — "the column did not exist yet" and "this was a first evaluation" both read as NULL, so the data genuinely cannot tell them apart. Stating the date is honest; deriving it from the rows would be a guess dressed as a computation.

/fairness (#9728)

The rate, the weekly table, and the definition, readable without opening source — that is #9728's acceptance. Reduced-basis weeks are labelled inline and explained underneath. Same zero-state conventions as the sibling series: an empty window is a measured zero with its dates, never a blank. Added to the verifier walkthrough's cross-checks.

The payload shape went into the contract's zod schema, so the UI type is derived — and adding it made both existing UI fixtures fail to compile, which is the #9282/#9521 guard doing its job again.

Validation

  • 21 unit tests on the series: 100% statements, 100% branches on automation-rate.ts. Includes the Sunday off-by-one in week bucketing, the truncation of a fractional window, and the outer .catch that protects an injected reader (safeAll swallows the real query's own failures, so that guard was the one genuinely unprotected path).
  • 3 UI tests for the surface, including both zero states.
  • 1,091 UI tests pass; tsc --noEmit, ui:build, ui:openapi:check, contract:api-schemas:check, ui-derived-types:check, dead-exports:check, maintainer-associations:check, docs:drift-check, git diff --check all clean.

One note: mid-work I hit contract:api-schemas:check failing and a contract build error on MAX_PRIORITY_ELIGIBILITY_WINDOW_MINUTES. I confirmed it reproduced on clean main and left it alone rather than carrying a regenerated-but-broken artifact; #9936 has since landed and fixed it, and this branch is rebased on top.

#9727, #9728)

"How much of this is actually automated?" underwrites every other claim the gate
makes, and it was only answerable by ad-hoc query. It is a standing series now,
computed from decision_records alone so an outsider holding the export recomputes the
same numbers.

The definition is the load-bearing part. A PR is automated only if EVERY verdict for
it was a merge or close with no human in the path -- a hold, a named reevaluation
actor, or a maintainer_request all make it manual. So a PR that was held and later
merged is manual, not automated: counting the final disposition would let the rate be
inflated by holding everything and merging it by hand, which is precisely the failure
this number exists to expose.

Weeks are bucketed by a PR's FIRST verdict, so a PR does not migrate between weeks as
it accrues re-evaluations, and it is counted once however many verdicts it has.

BACKFILL HORIZON, stated rather than hidden: the re-evaluation provenance fields
arrived with migration 0204, so earlier weeks can only detect manual work that took
the form of a hold and are published as basis "holds_only". A week straddling that
date is labelled holds_only too -- understating confidence rather than overstating it,
which is the direction of error a fairness figure has to take.

/fairness renders the rate, the weekly table and the definition, with the same
zero-state conventions as the sibling series: an empty window is a MEASURED zero with
its dates, never a blank.
@loopover-orb

loopover-orb Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Warning

⏸️ LoopOver review result - manual review recommended

Review updated: 2026-07-30 19:01:01 UTC

9 files · 1 AI reviewer · 1 blocker · CI green · clean

⏸️ Suggested Action - Manual Review

Review summary
Adds a weekly automation-rate series (share of PRs decided with no human in the decision path) computed purely from decision_records, wired end-to-end through the Worker route, contract schema, OpenAPI doc, and a new fairness-report UI section, backed by a strong test suite that specifically pins the hold-then-merge='manual' rule and the horizon/basis labeling. The core aggregation logic (fold-by-PR, bucket-by-first-verdict-week, OR human-flag across verdicts) is correct and well-tested, but the SQL powering it has no filter on `action`, which is broader than the stated 'merge or close' definition.

Blockers

  • The query in queryAutomationRows selects every decision_records row in the window with no filter on `action`, so a PR whose only verdict was e.g. 'commented', 'ignored', 'manual', or 'error' (none of which are 'hold') gets folded in and, absent a reevaluation_actor/maintainer_request, is counted as 'automated' — contradicting the published definition that automated means 'every verdict...was a merge or close'.
Nits — 6 non-blocking
  • src/review/automation-rate.ts:172 and packages/loopover-contract/src/public-api.ts:78 use unexplained magic numbers (86_400_000, week counts, metrics(ledger): weekly automation-rate series — share of PRs decided with no human touch #9727) that could be named constants per the external brief.
  • AUTOMATION_RATE_PROVENANCE_HORIZON_ISO is set to 2026-07-29T00:00:00.000Z, one day before 'now' in this environment — worth double-checking this actually matches migration 0204's real ship date rather than a placeholder, since almost every historical week will render as holds_only until real data accrues past it.
  • apps/loopover-ui/src/components/site/fairness-report-page.tsx and src/api/routes.ts are already long files per the size-smell scan; this PR adds to them rather than extracting, though that matches the existing pattern for sibling sections (reviewParity, fleetAccuracyTrend) already in the file.
  • Either filter the SQL to action IN ('merge','close','hold') (plus the reeval columns) to match the documented definition, or explicitly document in the code comment why all action types are folded in and add a test with a non-merge/close/hold action to lock in the intended behavior.
  • Extract the day/week-in-ms constants in automation-rate.ts into named constants alongside AUTOMATION_RATE_WEEKS for consistency with the file's own style of naming its other magic values.
  • PR author also opened the linked issue — Link an issue that was opened by a different contributor, or provide a rationale for why this self-authored issue represents genuine discovery work.

Concerns raised — review before merging

  • The query in queryAutomationRows selects every decision_records row in the window with no filter on `action`, so a PR whose only verdict was e.g. 'commented', 'ignored', 'manual', or 'error' (none of which are 'hold') gets folded in and, absent a reevaluation_actor/maintainer_request, is counted as 'automated' — contradicting the published definition that automated means 'every verdict...was a merge or close'.
📋 Copy for AI agents — paste into your coding agent
Fix the following blocker(s) from this PR review:

1. The query in queryAutomationRows selects every decision\_records row in the window with no filter on \`action\`, so a PR whose only verdict was e.g. 'commented', 'ignored', 'manual', or 'error' \(none of which are 'hold'\) gets folded in and, absent a reevaluation\_actor/maintainer\_request, is counted as 'automated' — contradicting the published definition that automated means 'every verdict...was a merge or close'.

Decision drivers

  • ❌ Code review — 1 blocker (1 reviewer)
  • ❌ Gate result — Blocking (Repo-configured hard blocker found.)
Context & advisory signals — never blocks the verdict
Signal Result Evidence
Linked issue ✅ Linked #9727, #9728
Related work ✅ No active overlap found No same-issue or scoped active PR overlap found.
Change scope ✅ 20/20 Low review scope from cached public metadata (2 linked issues).
Validation posture ✅ 25/25 PR body includes validation/test evidence.
Contributor workload ✅ 10/10 Author activity: 9 registered-repo PR(s), 8 merged, 303 issue(s).
Contributor context ✅ Confirmed Gittensor contributor JSONbored; Gittensor profile; 9 PR(s), 303 issue(s).
Improvement ✅ Minor risk: clean · value: minor
Linked issue satisfaction

Addressed
The PR implements the automated/manual definition exactly as specified (hold, reevaluation_actor, maintainer_request as human markers, excluding machine-paced causes), persists a weekly rollup with a stated holds_only backfill horizon, exposes it on the /fairness public stats endpoint alongside reviewParity, and documents the reproducible definition in verify-this-review.mdx with tests covering th

Review context
  • Author: JSONbored
  • Role context: owner (maintainer lane)
  • Public audience mode: oss maintainer
  • Lane context: Repository is configured for direct PR review.
  • Public profile languages: not available
  • Official Gittensor activity: 9 PR(s), 303 issue(s).
  • PR-specific overlap: none found.
Contributor next steps
  • Start here: Treat this as maintainer-lane context rather than normal contributor-lane activity.
Signal definitions
  • Related work = same linked issue, overlapping active PRs, or title/path similarity.
  • Change scope = cached public metadata such as size labels, draft state, and review-burden hints.
  • Validation posture = whether the PR provides enough public validation/test evidence for maintainer review.
  • Contributor workload = public contributor activity and cleanup pressure, not a repo-wide quality failure.
  • Contributor context = public GitHub/Gittensor identity context; non-Gittensor status is not a blocker.
🧪 Chat with LoopOver

Ask LoopOver a question about this PR directly in a comment — grounded only in the same cached, public-safe facts shown above, never a new claim.

  • @loopover ask <question> answers contribution-quality Q&A with source citations and freshness.
  • @loopover chat <question> answers in natural prose from cached decision-pack facts via local inference (maintainer/collaborator; read-only).
  • A plain-language @loopover mention with a real question is routed to the closest matching read-only command automatically — no exact syntax required.

Full command reference: https://loopover.ai/docs/loopover-commands

🧪 Experimental — new and may change.

Decision record
  • action: hold · clause: ai_consensus_defect
  • config: 186d56ab98725cd775b099f1b9bb41f8552958d8fc782da9f8604794bcc9584a · pack: oss-anti-slop · ci: passed
  • model: claude-code · prompt: 63a85ceb2d21c2dd9f7a1bab6ab8bee9abc6da7ccc9907f9053d1b4e747321d9 · confidence: 0.55
  • record: 4e64ca369e18be4871034f30552b58fea7974af21be118fcd0eaed5aeaad6a71 (schema v6, head be8dbbe)
Visual preview
Route Viewport Before (production) After (this PR's preview) Diff
/ desktop before /
before /
after /
after /
/ mobile before / (mobile)
before / (mobile)
after / (mobile)
after / (mobile)

Click any thumbnail to open the full-size screenshot. Before = production · After = this PR's preview deploy.

Scroll preview
Route Before (production) After (this PR's preview)
/ before / (scroll)
before / (scroll)
after / (scroll)
after / (scroll)

A short scroll-through clip (desktop) — click either thumbnail to open the full animation. Evidence for scroll-linked behavior a single screenshot can't show.

🟩 Safe / merged · 🟦 Advisory · 🟨 Held for review · 🟥 Blocked / closed


💰 Earn for open-source contributions like this. Gittensor lets GitHub contributors earn for the work they already do — register to start earning →.

Checked by LoopOver, a quiet PR intelligence layer for OSS maintainers.

  • Re-run LoopOver review

@superagent-security

Copy link
Copy Markdown
Contributor

Superagent didn't find any vulnerabilities or security issues in this PR.

@cloudflare-workers-and-pages

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
loopover-ui e429fd9 Commit Preview URL

Branch Preview URL
Jul 30 2026, 06:09 PM

@codecov

codecov Bot commented Jul 30, 2026

Copy link
Copy Markdown

Bundle Report

Changes will increase total bundle size by 10.1kB (0.13%) ⬆️. This is within the configured threshold ✅

Detailed changes
Bundle name Size Change
loopover-ui 7.85MB 10.1kB (0.13%) ⬆️

Affected Assets, Files, and Routes:

view changes for bundle: loopover-ui

Assets Changed:

Asset Name Size Change Total Size Change (%)
assets/add-scalar-classes-CiNJuRex.js (New) 2.16MB 2.16MB 100.0% 🚀
assets/tanstack-vendor-CfwvX9Wu.js (New) 954.37kB 954.37kB 100.0% 🚀
openapi.json 1.9kB 759.63kB 0.25%
assets/docs.fumadocs-spike-api-reference-BAY_sNXA.js (New) 443.45kB 443.45kB 100.0% 🚀
assets/AgentScalarChatInterface.vue-BLpNiphI.js (New) 201.69kB 201.69kB 100.0% 🚀
assets/modal-C_VMUsWJ.js (New) 184.5kB 184.5kB 100.0% 🚀
assets/client-Kj4xEX8m.js (New) 151.47kB 151.47kB 100.0% 🚀
assets/styles-DumG2bhJ.css (New) 130.03kB 130.03kB 100.0% 🚀
assets/maintainer-panel-BN1wwloz.js (New) 78.97kB 78.97kB 100.0% 🚀
assets/verify-this-review-gVg7LPCR.js (New) 60.95kB 60.95kB 100.0% 🚀
assets/routes-CCGn0mA1.js (New) 35.88kB 35.88kB 100.0% 🚀
assets/owner-panel-CMPf0_Ba.js (New) 28.26kB 28.26kB 100.0% 🚀
assets/app--2Cgq2Ri.js (New) 25.82kB 25.82kB 100.0% 🚀
assets/ui-vendor-DNIddmsI.js (New) 24.57kB 24.57kB 100.0% 🚀
assets/fairness-C5fH4mue.js (New) 22.62kB 22.62kB 100.0% 🚀
assets/miner-panel-CNBJz-QD.js (New) 20.49kB 20.49kB 100.0% 🚀
assets/api._op-BKlZaf2m.js (New) 17.51kB 17.51kB 100.0% 🚀
assets/self-hosting-docs-audit-BOwyuLtF.js (New) 16.6kB 16.6kB 100.0% 🚀
assets/docs._slug-FqDEC61_.js (New) 15.63kB 15.63kB 100.0% 🚀
assets/playground-panel-OVJl42Qg.js (New) 14.35kB 14.35kB 100.0% 🚀
assets/app.audit-CtrvB_gH.js (New) 10.22kB 10.22kB 100.0% 🚀
assets/app.config-generator-Dyt7nvID.js (New) 10.06kB 10.06kB 100.0% 🚀
assets/maintainers-LImRrl4P.js (New) 8.06kB 8.06kB 100.0% 🚀
assets/miners-Cs0QY1Gn.js (New) 7.91kB 7.91kB 100.0% 🚀
assets/agents-BR_KLXXx.js (New) 7.74kB 7.74kB 100.0% 🚀
assets/commands-panel-CacJB70i.js (New) 6.74kB 6.74kB 100.0% 🚀
assets/maintainer-workflow-CvL0iRAK.js (New) 6.52kB 6.52kB 100.0% 🚀
assets/digest-panel-CRi_-GiT.js (New) 6.15kB 6.15kB 100.0% 🚀
assets/repos._owner._repo.quality-0BbVC04C.js (New) 6.14kB 6.14kB 100.0% 🚀
assets/docs-nav-uTYw7A5v.js (New) 6.06kB 6.06kB 100.0% 🚀
assets/docs.index-DZj2DHKj.js (New) 5.95kB 5.95kB 100.0% 🚀
assets/api.index-N0Y-hof3.js (New) 4.7kB 4.7kB 100.0% 🚀
assets/docs-Dig0GtG9.js (New) 2.93kB 2.93kB 100.0% 🚀
assets/api-iQRb-fBj.js (New) 2.66kB 2.66kB 100.0% 🚀
assets/docs-page-CxGCW4NG.js (New) 2.1kB 2.1kB 100.0% 🚀
assets/table-B7ftUGfE.js (New) 1.75kB 1.75kB 100.0% 🚀
assets/app.workbench-e95c6GqI.js (New) 1.58kB 1.58kB 100.0% 🚀
assets/tabs-CxnI-ccO.js (New) 1.39kB 1.39kB 100.0% 🚀
assets/app.repos-CfdP-0HJ.js (New) 1.07kB 1.07kB 100.0% 🚀
assets/input-BZ4XXle2.js (New) 796 bytes 796 bytes 100.0% 🚀
assets/file-cog-BfhFhVmM.js (New) 758 bytes 758 bytes 100.0% 🚀
assets/app.maintainer-DgbS177i.js (New) 502 bytes 502 bytes 100.0% 🚀
assets/app.owner-C_1oPvYW.js (New) 474 bytes 474 bytes 100.0% 🚀
assets/app.commands-Ckmt7l1E.js (New) 455 bytes 455 bytes 100.0% 🚀
assets/app.playground-DdE83ZIK.js (New) 442 bytes 442 bytes 100.0% 🚀
assets/index-XFZ35IZh.js (New) 438 bytes 438 bytes 100.0% 🚀
assets/app.digest-DaX_1N0k.js (New) 430 bytes 430 bytes 100.0% 🚀
assets/eye-off-DgBSl9Jf.js (New) 430 bytes 430 bytes 100.0% 🚀
assets/app.miner-rJYSNaaH.js (New) 422 bytes 422 bytes 100.0% 🚀
assets/key-round-DDDtWpGo.js (New) 355 bytes 355 bytes 100.0% 🚀
assets/bot-C9bGI4ue.js (New) 328 bytes 328 bytes 100.0% 🚀
assets/git-pull-request-arrow-D8sp2l89.js (New) 321 bytes 321 bytes 100.0% 🚀
assets/list-checks-Ct8eJM-E.js (New) 279 bytes 279 bytes 100.0% 🚀
assets/compass-Dpkid4li.js (New) 251 bytes 251 bytes 100.0% 🚀
assets/history-DL0z0KIU.js (New) 237 bytes 237 bytes 100.0% 🚀
assets/message-square-DIsDLGV5.js (New) 233 bytes 233 bytes 100.0% 🚀
assets/lock-Dt4tiA_C.js (New) 206 bytes 206 bytes 100.0% 🚀
assets/play-CzphoTQS.js (New) 190 bytes 190 bytes 100.0% 🚀
assets/circle-check-DN-yavnT.js (New) 178 bytes 178 bytes 100.0% 🚀
assets/add-scalar-classes-CrnBCxCL.js (Deleted) -2.16MB 0 bytes -100.0% 🗑️
assets/tanstack-vendor-D7fsyBSA.js (Deleted) -953.69kB 0 bytes -100.0% 🗑️
assets/docs.fumadocs-spike-api-reference-DmHkklDD.js (Deleted) -443.45kB 0 bytes -100.0% 🗑️
assets/AgentScalarChatInterface.vue-BsmReu79.js (Deleted) -201.69kB 0 bytes -100.0% 🗑️
assets/modal-Bz6LZpR4.js (Deleted) -184.5kB 0 bytes -100.0% 🗑️
assets/client-KQauf23M.js (Deleted) -151.47kB 0 bytes -100.0% 🗑️
assets/styles-B726qH-1.css (Deleted) -130.0kB 0 bytes -100.0% 🗑️
assets/maintainer-panel-DoMMdhmN.js (Deleted) -78.97kB 0 bytes -100.0% 🗑️
assets/verify-this-review-BWmJVV0m.js (Deleted) -56.7kB 0 bytes -100.0% 🗑️
assets/routes-BNAoA6Dw.js (Deleted) -35.88kB 0 bytes -100.0% 🗑️
assets/owner-panel-_N9sxAE7.js (Deleted) -28.26kB 0 bytes -100.0% 🗑️
assets/app-B2_J5-dK.js (Deleted) -25.82kB 0 bytes -100.0% 🗑️
assets/ui-vendor-BILpQtaj.js (Deleted) -24.57kB 0 bytes -100.0% 🗑️
assets/miner-panel-DCFuyYaj.js (Deleted) -20.49kB 0 bytes -100.0% 🗑️
assets/fairness-DTSShFPs.js (Deleted) -19.37kB 0 bytes -100.0% 🗑️
assets/api._op-CEIS-ove.js (Deleted) -17.51kB 0 bytes -100.0% 🗑️
assets/self-hosting-docs-audit-DjzxbOcC.js (Deleted) -16.6kB 0 bytes -100.0% 🗑️
assets/docs._slug-DBc8EQku.js (Deleted) -15.63kB 0 bytes -100.0% 🗑️
assets/playground-panel-CSzjWglB.js (Deleted) -14.35kB 0 bytes -100.0% 🗑️
assets/app.audit-DrzNqLgM.js (Deleted) -10.22kB 0 bytes -100.0% 🗑️
assets/app.config-generator-wRjl3vQC.js (Deleted) -10.06kB 0 bytes -100.0% 🗑️
assets/maintainers-B_gsljqC.js (Deleted) -8.06kB 0 bytes -100.0% 🗑️
assets/miners-BnanHzHx.js (Deleted) -7.91kB 0 bytes -100.0% 🗑️
assets/agents-CpYZdhgk.js (Deleted) -7.74kB 0 bytes -100.0% 🗑️
assets/commands-panel-XztetXDd.js (Deleted) -6.74kB 0 bytes -100.0% 🗑️
assets/maintainer-workflow-CXNgr2za.js (Deleted) -6.52kB 0 bytes -100.0% 🗑️
assets/digest-panel-CcUs8S-F.js (Deleted) -6.15kB 0 bytes -100.0% 🗑️
assets/repos._owner._repo.quality-GszCvJV_.js (Deleted) -6.14kB 0 bytes -100.0% 🗑️
assets/docs-nav-Lhew49gS.js (Deleted) -6.06kB 0 bytes -100.0% 🗑️
assets/docs.index-BBRcPaqy.js (Deleted) -5.95kB 0 bytes -100.0% 🗑️
assets/api.index-ZP3Ep2wW.js (Deleted) -4.7kB 0 bytes -100.0% 🗑️
assets/docs-D0Xf2uwB.js (Deleted) -2.93kB 0 bytes -100.0% 🗑️
assets/api-CxYbEv4_.js (Deleted) -2.66kB 0 bytes -100.0% 🗑️
assets/docs-page-DQOt8yJX.js (Deleted) -2.1kB 0 bytes -100.0% 🗑️
assets/table-C8Ne4qwj.js (Deleted) -1.75kB 0 bytes -100.0% 🗑️
assets/app.workbench-BDWN2ee_.js (Deleted) -1.58kB 0 bytes -100.0% 🗑️
assets/tabs-QigYkRIo.js (Deleted) -1.39kB 0 bytes -100.0% 🗑️
assets/app.repos-A1bmwbyt.js (Deleted) -1.07kB 0 bytes -100.0% 🗑️
assets/input-lP3QZYrs.js (Deleted) -796 bytes 0 bytes -100.0% 🗑️
assets/file-cog-5Mk5992K.js (Deleted) -758 bytes 0 bytes -100.0% 🗑️
assets/app.maintainer-v3g1kERL.js (Deleted) -502 bytes 0 bytes -100.0% 🗑️
assets/app.owner-CzCbCNep.js (Deleted) -474 bytes 0 bytes -100.0% 🗑️
assets/app.commands-DmeH3qMx.js (Deleted) -455 bytes 0 bytes -100.0% 🗑️
assets/app.playground-xm_WO6pW.js (Deleted) -442 bytes 0 bytes -100.0% 🗑️
assets/index-C6fasRh7.js (Deleted) -438 bytes 0 bytes -100.0% 🗑️
assets/app.digest-D9_CGGKw.js (Deleted) -430 bytes 0 bytes -100.0% 🗑️
assets/eye-off-CLuSTWea.js (Deleted) -430 bytes 0 bytes -100.0% 🗑️
assets/app.miner-DJPwKwt9.js (Deleted) -422 bytes 0 bytes -100.0% 🗑️
assets/key-round--HXUT99k.js (Deleted) -355 bytes 0 bytes -100.0% 🗑️
assets/bot-B8av5H6a.js (Deleted) -328 bytes 0 bytes -100.0% 🗑️
assets/git-pull-request-arrow-DTbixhYU.js (Deleted) -321 bytes 0 bytes -100.0% 🗑️
assets/list-checks-BcXT25G1.js (Deleted) -279 bytes 0 bytes -100.0% 🗑️
assets/compass-M5YjrKDr.js (Deleted) -251 bytes 0 bytes -100.0% 🗑️
assets/history-B793qYPB.js (Deleted) -237 bytes 0 bytes -100.0% 🗑️
assets/message-square-B3sKB7cf.js (Deleted) -233 bytes 0 bytes -100.0% 🗑️
assets/lock-DKypXJhU.js (Deleted) -206 bytes 0 bytes -100.0% 🗑️
assets/play-CdFqq3Up.js (Deleted) -190 bytes 0 bytes -100.0% 🗑️
assets/circle-check-CEK7ta-G.js (Deleted) -178 bytes 0 bytes -100.0% 🗑️

@JSONbored JSONbored self-assigned this Jul 30, 2026
@codecov

codecov Bot commented Jul 30, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 91.00%. Comparing base (edf7b37) to head (be8dbbe).
⚠️ Report is 1 commits behind head on main.
✅ All tests successful. No failed tests found.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #9938      +/-   ##
==========================================
- Coverage   91.87%   91.00%   -0.87%     
==========================================
  Files         923      924       +1     
  Lines      113436   113496      +60     
  Branches    27331    27348      +17     
==========================================
- Hits       104219   103287     -932     
- Misses       7928     9117    +1189     
+ Partials     1289     1092     -197     
Flag Coverage Δ
backend 94.12% <100.00%> (-1.56%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
packages/loopover-contract/src/public-api.ts 100.00% <100.00%> (ø)
src/api/routes.ts 95.61% <100.00%> (ø)
src/review/automation-rate.ts 100.00% <100.00%> (ø)

... and 3 files with indirect coverage changes

@loopover-orb loopover-orb Bot added the manual-review Gittensor contributor context label Jul 30, 2026
The series folded EVERY decision_records row in the window, with no filter on
action. `action` also carries non-deciding classes -- `label`, `update_branch`,
`approve`, and the error/no-op classes -- none of which is `hold`, so a pull
request that only ever drew those carried no human signal and was counted as an
AUTOMATED decision. That inflated the published rate with pull requests the gate
never decided at all, contradicting the definition published alongside it.

A PR now enters the series only when it reached an enacting disposition
(`merge`/`close`) or a hold, and is automated only when it enacted one with no
human signal. A non-deciding verdict alongside a real one does not flip the PR to
manual -- that is the bot acting, not a person, and treating it as manual would
under-count automation just as wrongly.

The read filters on the same exported constant the fold classifies on, so the
WHERE clause and the predicate cannot drift apart.
@JSONbored
JSONbored merged commit b5f74fa into main Jul 30, 2026
11 checks passed
@JSONbored
JSONbored deleted the feat/automation-rate-9727 branch July 30, 2026 19:02
JSONbored added a commit that referenced this pull request Jul 30, 2026
…n tree (#9944)

* fix(ci): drop two unreferenced exports that turned main red

#9938 exported AUTOMATION_ENACTING_ACTIONS and AUTOMATION_HOLD_ACTION, but
AUTOMATION_COUNTED_ACTIONS is the surface both the fold and the read actually
consume, so the other two are referenced only inside their own module.
dead-exports:check runs in test:ci and fails on them.

Module-private now; the exported vocabulary and every behaviour are unchanged.

* fix(ci): re-derive the replay-runner image manifest after a lockfile change

A merge changed package-lock.json without re-running replay-runner-manifest:write,
so the committed packageLockSha256 no longer matched the committed lockfile and
replay-runner-manifest:check -- which runs in test:ci -- failed on clean main.

Regenerated; only the lockfile hash and the rolled-up digest move.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

manual-review Gittensor contributor context

Projects

None yet

1 participant