fix(orb): canonicalize issue-body path tokens in checkContentLaneDeliverable (#9667) - #9926
fix(orb): canonicalize issue-body path tokens in checkContentLaneDeliverable (#9667)#9926kai392 wants to merge 1 commit into
Conversation
|
Caution 🛑 LoopOver review result - reject/close recommendedReview updated: 2026-07-30 16:02:13 UTC
Review summary Nits — 3 non-blocking
Why this is blocked
📋 Copy for AI agents — paste into your coding agentDecision drivers
Context & advisory signals — never blocks the verdict
Linked issue satisfactionAddressed Review context
Contributor next steps
Signal definitions
🧪 Chat with LoopOverAsk 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.
Full command reference: https://loopover.ai/docs/loopover-commands 🧪 Experimental — new and may change. Decision record
🟩 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.
|
|
Superagent did not find any vulnerabilities or security issues in this PR. |
…verable (JSONbored#9667) checkContentLaneDeliverable compares an issue-body path against the spec's entryFilePattern/providerFilePattern, which globToRegExp compiles against a CANONICALIZED (lowercased) path with no `i` flag -- so they only match lowercase input. The changedFiles side already canonicalizes each path before testing; the issue-body side did not. An issue naming the path with any capitalization (`Registry/Subnets/Foo.json`) produced no mentionedPath, so with no issueTitleImpliesEntryPattern the check returned "not-applicable" and the deliverable gate silently did not run -- the exact "test-only PR closes a content issue without delivering the content" gap the function exists to close (classifyRegistryPrScope in the same file already documents this canonicalization hazard). - Canonicalize each token from extractPathTokens before matchesSpec, exactly as the changedFiles side does. `.find` still returns the ORIGINAL token, so the "missing" verdict's mentionedPath stays the path as written in the issue body (rendered verbatim into the public PR comment). Tests: a mixed-case issue path is "missing" (original case preserved in mentionedPath) and "delivered" when the real lowercase file is changed; the all-lowercase behaviour is unchanged; a path matching no spec pattern still returns not-applicable (no over-broadening). The mixed-case cases fail against the current code. Closes JSONbored#9667 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #9926 +/- ##
==========================================
+ Coverage 79.52% 79.61% +0.09%
==========================================
Files 281 282 +1
Lines 58577 58853 +276
Branches 6833 6951 +118
==========================================
+ Hits 46581 46857 +276
Misses 11706 11706
Partials 290 290
Flags with carried forward coverage won't be shown. Click here to find out more.
|
What
checkContentLaneDeliverablecompares an issue-body path against the spec'sentryFilePattern/providerFilePattern, whichglobToRegExpcompiles against a canonicalized (lowercased) path with noiflag — so they only match lowercase input. ThechangedFilesside already canonicalizes each path before testing; the issue-body side did not. An issue naming the path with any capitalization (Registry/Subnets/Foo.json) produced nomentionedPath, so with noissueTitleImpliesEntryPatternthe check returnednot-applicableand the deliverable gate silently did not run — the exact "test-only PR closes a content issue without delivering the content" gap the function exists to close.classifyRegistryPrScopein the same file already documents this canonicalization hazard; the issue-body side never got the treatment.How
Canonicalize each token from
extractPathTokensbeforematchesSpec, exactly as thechangedFilesside does..findstill returns the original token, so the"missing"verdict'smentionedPathstays the path as written in the issue body (rendered verbatim into the public PR comment).Tests (
content-lane-registry-logic.test.ts)Registry/Subnets/Foo.json) with no matching changed file →{ verdict: "missing", mentionedPath: "Registry/Subnets/Foo.json" }(original case preserved).deliveredwhen the PR changesregistry/subnets/foo.json.not-applicable(no over-broadening).The mixed-case cases fail against the current code.
Closes #9667