fix(review): let bug/feature labels propagate from maintainer-authored linked issues - #3938
Conversation
Deploying with
|
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs |
gittensory-ui | b8607bd | Commit Preview URL Branch Preview URL |
Jul 07 2026, 07:55 AM |
|
Superagent didn't find any vulnerabilities or security issues in this PR. |
|
Warning 🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨 ⏸️ Gittensory review result - manual review recommendedReview updated: 2026-07-07 07:47:14 UTC
⏸️ Suggested Action - Manual Review
Review summary Nits — 6 non-blocking
Concerns raised — review before merging
Review context
Contributor next steps
Signal definitions
🟩 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 Gittensory, a quiet PR intelligence layer for OSS maintainers.
|
❌ 5 Tests Failed:
View the full list of 5 ❄️ flaky test(s)
To view more test analytics, go to the Test Analytics Dashboard |
713fee5 to
69ac7c5
Compare
…d linked issues (#3903) Linked-issue label propagation only ever fired when the PR author had directly opened or been assigned the linked issue, so gittensor:bug/gittensor:feature almost never mirrored the issue's label in practice -- our issues are nearly always maintainer-authored for open community pickup, and rarely formally assigned. Split the ownership check by label sensitivity: a mapping can opt into trustMaintainerAuthoredIssue so it also unlocks for an issue authored by the repo owner/admin/write-collaborator, while gittensor:priority (the scarce, maintainer-hand-picked reward label) keeps the strict direct-ownership requirement. Also logs a structured event whenever a linked issue's labels get filtered, so a future "why didn't my PR inherit the label" report doesn't need a source read. Enables propagation on this repo's own .gittensory.yml (bug/feature relaxed, priority strict) as a live example for other gated repos to copy.
…ngine package Rebasing onto #3891 (extract focus-manifest parse/compile core) surfaced that packages/gittensory-engine keeps its own hand-synced copies of LinkedIssueLabelPropagationMapping and its normalizer, predating this PR's new field. Without this, the engine package's manifest parser would silently drop trustMaintainerAuthoredIssue from any .gittensory.yml it parses, including this repo's own.
…e normalizer mirror codecov/patch flagged 2 missing lines in packages/gittensory-engine's copy of normalizeMapping -- test/unit/linked-issue-label-propagation-engine.test.ts mirrors the app-side suite but predates this PR's new field. Adds the same 3 cases (true passthrough, omitted stays undefined, malformed warns without defaulting to true) already covered on the src/ side.
…the ephemeral test PEM helper generatePrivateKeyPem() builds a valid PEM string from a freshly-generated in-memory key for test-only JWT signing -- no real credential is ever embedded. The literal "-----BEGIN PRIVATE KEY-----" marker text still matched the review-safety secrets scanner's private_key_block pattern (a pure text match with no awareness the bytes between the markers are generated per test run), hard-blocking the gate. Splits the marker text across a join() so it never appears contiguous in source; the produced PEM string (and all runtime behavior) is byte-identical.
…#3939) #3939 lowered the live .gittensory.yml readiness minScore from 60 to 40 but didn't update this bundled fallback copy, leaving the two byte-mismatched -- already broken on main independent of this branch, just first surfaced here because this PR also touches this file. Incidental fix, bundled in since a separate branch/rebase cycle for a one-line sync isn't worth the overhead.
69ac7c5 to
b8607bd
Compare
Rebasing onto #3938's own new settings: block (linkedIssueLabelPropagation) left two top-level settings: keys in .gittensory.yml and its bundled fallback -- invalid YAML that would have silently dropped one of the two setting groups depending on parser behavior. Merge into one block.
…3962) * fix(review): close repeated ready<->draft cycling as review evasion Enable reviewEvasionProtection for our own repos and add a new guard that fires on the second (and every later) draft conversion for a PR, independent of whether an active review or a recorded gate failure is present. The two existing draft guards only catch dodging DURING a still-running review or AFTER a stored gate block — a contributor who drafts before either fires (e.g. immediately on open, or before CI settles) can otherwise cycle ready<->draft indefinitely to harvest free AI-review/CI feedback while sidestepping the one-shot disposition. * test(slop): update golden fixtures for the #3939 band recalibration #3939 raised the elevated-band floor from 25 to 31, so two stacked weak signals (30) now land in low, not elevated. Five fixtures still asserted the pre-recalibration boundary; adjust the genuine multi- signal cases to a real 3-signal stack (45) and the single-signal cases to their now-correct low band, per the recalibration's own stated design (elevated requires >=45 or 3x weak). * fix(config): merge the duplicate settings: block the rebase produced Rebasing onto #3938's own new settings: block (linkedIssueLabelPropagation) left two top-level settings: keys in .gittensory.yml and its bundled fallback -- invalid YAML that would have silently dropped one of the two setting groups depending on parser behavior. Merge into one block.
Summary
linkedIssueLabelPropagation(the feature that lets a PR inherit its linked issue'sgittensor:*label) only fired when the PR author had directly opened or been assigned the linked issue. In practice our issues are almost always maintainer-authored for open community pickup and rarely formally assigned, sogittensor:bug/gittensor:featuremirroring effectively never worked — PR labels came from title-classification alone, independent of the linked issue.trustMaintainerAuthoredIssueto also unlock for an issue authored by the repo owner/admin/write-collaborator (generic permission check, not a hardcoded login — mirrors the existinghasMaintainerOrOwnerPermissionpattern).gittensor:priority(the scarce, maintainer-hand-picked reward label) intentionally keeps the strict direct-author-or-assignee requirement, since the title-classification fallback provides zero equivalent verification forbug/featurebut there's no such fallback forpriority..gittensory.yml(bug/featurerelaxed,prioritystrict) as a live, working example.packages/gittensory-engine's hand-synced copy of these types/normalizer (surfaced by rebasing onto feat(engine): extract focus-manifest parse/compile core (#2280) #3891's focus-manifest extraction mid-PR).Closes #3903.
Scope
type(scope): short summaryConventional Commit format.CONTRIBUTING.mdand does not reintroduce GitHub Pages, VitePress,site/, orCNAME.Closes #3903).Validation
git diff --checknpm run actionlint(vianpm run test:ci)npm run typechecknpm run test:coveragelocally — 100% line/branch coverage on every new line insrc/review/linked-issue-label-propagation-fetch.tsandsrc/review/linked-issue-label-propagation.ts's new normalizer blocknpm run test:workers(vianpm run test:ci)npm run build:mcp(vianpm run test:ci)npm run test:mcp-pack(vianpm run test:ci)npm run ui:openapi:check(regenerated after thetrustMaintainerAuthoredIssueschema addition)npm run ui:lint(vianpm run test:ci)npm run ui:typecheck(vianpm run test:ci)npm run ui:build(vianpm run test:ci)npm audit --audit-level=moderateADMIN_GITHUB_LOGINSmatch, live write-collaborator match, read-only/denied collaborator, collaborator-permission-check error (fails closed), null/ghost issue author, no-mapping-opted-in default (byte-identical to pre-fix behavior), and the manifest-level end-to-end resolution of this repo's own new config.Full
npm run test:cirun locally green end-to-end (twice, across two rebases onto a fast-movingmain).Safety
trustMaintainerAuthoredIssueadded to thelinkedIssueLabelPropagationOpenAPI schema).Notes