Repository navigation
feat(checks): read Jenkins build stages and details for Jenkins checks - #39
Merged
Merged
Conversation
nplez1
added a commit
that referenced
this pull request
Sep 27, 2026
#39) * feat(checks): read Jenkins build stages and details for Jenkins checks A CI check that points at Jenkins reaches Orca as a GitHub legacy commit status: a name, a state and a target_url, with no check-run or workflow-run id. The only details fetch looked runs up by those ids, so it returned a valid but empty payload and expanding the check said "No inline details are available for this check" — while the check was the only place to see which stage was running or which one broke. Detect a Jenkins check from its own URL (src/shared/jenkins-urls.ts handles job prefixes, folders, multibranch, page suffixes, permalinks, and translates Blue Ocean links to their classic equivalent), then read the build in main through two GETs: `<build>/api/json?tree=…` for the build and `<build>/wfapi/describe` for the stage list, best-effort since a freestyle job has no stages. Stages map onto the existing provider-neutral `PRCheckJob.steps` (one job per build) and build metadata onto a new optional `PRCheckRunDetails.build`, so the four existing detail surfaces render it without a provider-specific path. `stepRendering: 'all'` marks a stage list: a stage list is the build's shape rather than a drill-down, so the sidebar lists every stage (including the one still running) instead of its compact failures-only list, and the editor stops collapsing stages behind its "N succeeded" toggle. The failures-only filter itself moved to src/shared/check-step-visibility.ts, where it was duplicated. Credentials are a list of user-configured servers (base URL, username, API token), because a user runs several: profiles in ~/.orca/jenkins-servers.json and one keychain-encrypted token per server. A build URL is matched to a server by longest configured prefix, not by origin, and a response whose final URL is outside that prefix is refused, since the Fetch standard only strips Authorization on a cross-origin hop. Parameter values are masked by kind and by name before reaching the renderer. The check-fix prompt now consumes failing stage names, which is what makes a Jenkins check useful there despite having no log tail. Endpoint behavior is covered by unit tests with a mocked HTTP client; no live Jenkins has been exercised, which docs/reference/jenkins-check-details.md (local-only, not tracked here) records along with the local-reachability and parameter-masking limits. * test(main): register the Jenkins fetch call site in the proxy audit The proxy-guarded fetch audit is stricter than a grep: it counts every non-`net` `.fetch(` call per main-process file and fails on a count it has not been told about. src/main/jenkins/jenkins-request.ts went through the injected HttpClient without being registered, so shard 5 failed on 'keeps every non-default-session fetcher audited with its expected count'. Same entry as main/jira/authenticated-request.ts: the injected client resolves to net.fetch on defaultSession on the desktop, and to the global-fetch-audited Node fallback elsewhere.
8 of 9 tasks
nplez1
added a commit
that referenced
this pull request
Sep 29, 2026
* feat(checks): make the Jenkins build tree readable at scale The Jenkins details from #39 read the build's stage list but listed every stage in the Checks pane, buried failures under it, kept an Output box that only repeated the build name, and stopped at a bare error when the account could not read the job. - Pane: list only the stages still running and the ones that failed, running first, capped at eight, with a "+N more stages" line — a pipeline can have hundreds. - Detail page: render the stages as a nested tree (stage -> its wfapi flow nodes) like Blue Ocean, with failed and running stages open by default. - Detail page: a Failures block under the run header names each failed stage and its error text, so "what broke" needs no scrolling. - Detail page: drop the Output box for a stage list; the build metadata is the run summary. - Settings: a Jenkins read failure the user can fix (no server, rejected token, no permission) now shows an "Open Jenkins settings" button that deep-links to the Jenkins card. Main reads each stage's own wfapi/describe (its _links.self.href, bounded to 40 requests at six concurrent, failed/running first under a four-second budget) for the steps and failure text, and carries the flow nodes on an optional PRCheckStep.children. The Jenkins node id is kept so repeated stage names (loops, parallel branches) cannot collide as React keys. * fix(lint): split files over the max-lines budget Five files exceed the oxlint max-lines budget on nplez1/main and have no suppression, so the whole-repo `pnpm exec oxlint` in the static-analysis job fails for every PR cut from it. They were pushed over by fork-only commits (`#34`, and three direct commits) that never ran PR CI. The repo's rule is to split rather than suppress, so this extracts cohesive pieces: - filesystem-watcher.test.ts: the local/WSL lifecycle tests move to filesystem-watcher-local-lifecycle.test.ts. - filesystem-watcher-local-subscription.ts: scheduleLocalWatcherTeardown moves to filesystem-watcher-local-teardown.ts. - ssh-target-cleanup.ts: the per-tab session helpers move to ssh-target-tab-sessions.ts. - ai-vault-session-refresh.ts: the session-ids key moves to ai-vault-session-ids.ts. - accounts-search.ts: the Grok and Cursor search entries move to accounts-search-extra-providers.ts and are re-exported. No behavior change; the affected suites pass.
nplez1
added a commit
that referenced
this pull request
Sep 29, 2026
#39) * feat(checks): read Jenkins build stages and details for Jenkins checks A CI check that points at Jenkins reaches Orca as a GitHub legacy commit status: a name, a state and a target_url, with no check-run or workflow-run id. The only details fetch looked runs up by those ids, so it returned a valid but empty payload and expanding the check said "No inline details are available for this check" — while the check was the only place to see which stage was running or which one broke. Detect a Jenkins check from its own URL (src/shared/jenkins-urls.ts handles job prefixes, folders, multibranch, page suffixes, permalinks, and translates Blue Ocean links to their classic equivalent), then read the build in main through two GETs: `<build>/api/json?tree=…` for the build and `<build>/wfapi/describe` for the stage list, best-effort since a freestyle job has no stages. Stages map onto the existing provider-neutral `PRCheckJob.steps` (one job per build) and build metadata onto a new optional `PRCheckRunDetails.build`, so the four existing detail surfaces render it without a provider-specific path. `stepRendering: 'all'` marks a stage list: a stage list is the build's shape rather than a drill-down, so the sidebar lists every stage (including the one still running) instead of its compact failures-only list, and the editor stops collapsing stages behind its "N succeeded" toggle. The failures-only filter itself moved to src/shared/check-step-visibility.ts, where it was duplicated. Credentials are a list of user-configured servers (base URL, username, API token), because a user runs several: profiles in ~/.orca/jenkins-servers.json and one keychain-encrypted token per server. A build URL is matched to a server by longest configured prefix, not by origin, and a response whose final URL is outside that prefix is refused, since the Fetch standard only strips Authorization on a cross-origin hop. Parameter values are masked by kind and by name before reaching the renderer. The check-fix prompt now consumes failing stage names, which is what makes a Jenkins check useful there despite having no log tail. Endpoint behavior is covered by unit tests with a mocked HTTP client; no live Jenkins has been exercised, which docs/reference/jenkins-check-details.md (local-only, not tracked here) records along with the local-reachability and parameter-masking limits. * test(main): register the Jenkins fetch call site in the proxy audit The proxy-guarded fetch audit is stricter than a grep: it counts every non-`net` `.fetch(` call per main-process file and fails on a count it has not been told about. src/main/jenkins/jenkins-request.ts went through the injected HttpClient without being registered, so shard 5 failed on 'keeps every non-default-session fetcher audited with its expected count'. Same entry as main/jira/authenticated-request.ts: the injected client resolves to net.fetch on defaultSession on the desktop, and to the global-fetch-audited Node fallback elsewhere.
nplez1
added a commit
that referenced
this pull request
Sep 29, 2026
* feat(checks): make the Jenkins build tree readable at scale The Jenkins details from #39 read the build's stage list but listed every stage in the Checks pane, buried failures under it, kept an Output box that only repeated the build name, and stopped at a bare error when the account could not read the job. - Pane: list only the stages still running and the ones that failed, running first, capped at eight, with a "+N more stages" line — a pipeline can have hundreds. - Detail page: render the stages as a nested tree (stage -> its wfapi flow nodes) like Blue Ocean, with failed and running stages open by default. - Detail page: a Failures block under the run header names each failed stage and its error text, so "what broke" needs no scrolling. - Detail page: drop the Output box for a stage list; the build metadata is the run summary. - Settings: a Jenkins read failure the user can fix (no server, rejected token, no permission) now shows an "Open Jenkins settings" button that deep-links to the Jenkins card. Main reads each stage's own wfapi/describe (its _links.self.href, bounded to 40 requests at six concurrent, failed/running first under a four-second budget) for the steps and failure text, and carries the flow nodes on an optional PRCheckStep.children. The Jenkins node id is kept so repeated stage names (loops, parallel branches) cannot collide as React keys. * fix(lint): split files over the max-lines budget Five files exceed the oxlint max-lines budget on nplez1/main and have no suppression, so the whole-repo `pnpm exec oxlint` in the static-analysis job fails for every PR cut from it. They were pushed over by fork-only commits (`#34`, and three direct commits) that never ran PR CI. The repo's rule is to split rather than suppress, so this extracts cohesive pieces: - filesystem-watcher.test.ts: the local/WSL lifecycle tests move to filesystem-watcher-local-lifecycle.test.ts. - filesystem-watcher-local-subscription.ts: scheduleLocalWatcherTeardown moves to filesystem-watcher-local-teardown.ts. - ssh-target-cleanup.ts: the per-tab session helpers move to ssh-target-tab-sessions.ts. - ai-vault-session-refresh.ts: the session-ids key moves to ai-vault-session-ids.ts. - accounts-search.ts: the Grok and Cursor search entries move to accounts-search-extra-providers.ts and are re-exported. No behavior change; the affected suites pass.
nplez1
added a commit
that referenced
this pull request
Oct 1, 2026
#39) * feat(checks): read Jenkins build stages and details for Jenkins checks A CI check that points at Jenkins reaches Orca as a GitHub legacy commit status: a name, a state and a target_url, with no check-run or workflow-run id. The only details fetch looked runs up by those ids, so it returned a valid but empty payload and expanding the check said "No inline details are available for this check" — while the check was the only place to see which stage was running or which one broke. Detect a Jenkins check from its own URL (src/shared/jenkins-urls.ts handles job prefixes, folders, multibranch, page suffixes, permalinks, and translates Blue Ocean links to their classic equivalent), then read the build in main through two GETs: `<build>/api/json?tree=…` for the build and `<build>/wfapi/describe` for the stage list, best-effort since a freestyle job has no stages. Stages map onto the existing provider-neutral `PRCheckJob.steps` (one job per build) and build metadata onto a new optional `PRCheckRunDetails.build`, so the four existing detail surfaces render it without a provider-specific path. `stepRendering: 'all'` marks a stage list: a stage list is the build's shape rather than a drill-down, so the sidebar lists every stage (including the one still running) instead of its compact failures-only list, and the editor stops collapsing stages behind its "N succeeded" toggle. The failures-only filter itself moved to src/shared/check-step-visibility.ts, where it was duplicated. Credentials are a list of user-configured servers (base URL, username, API token), because a user runs several: profiles in ~/.orca/jenkins-servers.json and one keychain-encrypted token per server. A build URL is matched to a server by longest configured prefix, not by origin, and a response whose final URL is outside that prefix is refused, since the Fetch standard only strips Authorization on a cross-origin hop. Parameter values are masked by kind and by name before reaching the renderer. The check-fix prompt now consumes failing stage names, which is what makes a Jenkins check useful there despite having no log tail. Endpoint behavior is covered by unit tests with a mocked HTTP client; no live Jenkins has been exercised, which docs/reference/jenkins-check-details.md (local-only, not tracked here) records along with the local-reachability and parameter-masking limits. * test(main): register the Jenkins fetch call site in the proxy audit The proxy-guarded fetch audit is stricter than a grep: it counts every non-`net` `.fetch(` call per main-process file and fails on a count it has not been told about. src/main/jenkins/jenkins-request.ts went through the injected HttpClient without being registered, so shard 5 failed on 'keeps every non-default-session fetcher audited with its expected count'. Same entry as main/jira/authenticated-request.ts: the injected client resolves to net.fetch on defaultSession on the desktop, and to the global-fetch-audited Node fallback elsewhere.
nplez1
added a commit
that referenced
this pull request
Oct 1, 2026
* feat(checks): make the Jenkins build tree readable at scale The Jenkins details from #39 read the build's stage list but listed every stage in the Checks pane, buried failures under it, kept an Output box that only repeated the build name, and stopped at a bare error when the account could not read the job. - Pane: list only the stages still running and the ones that failed, running first, capped at eight, with a "+N more stages" line — a pipeline can have hundreds. - Detail page: render the stages as a nested tree (stage -> its wfapi flow nodes) like Blue Ocean, with failed and running stages open by default. - Detail page: a Failures block under the run header names each failed stage and its error text, so "what broke" needs no scrolling. - Detail page: drop the Output box for a stage list; the build metadata is the run summary. - Settings: a Jenkins read failure the user can fix (no server, rejected token, no permission) now shows an "Open Jenkins settings" button that deep-links to the Jenkins card. Main reads each stage's own wfapi/describe (its _links.self.href, bounded to 40 requests at six concurrent, failed/running first under a four-second budget) for the steps and failure text, and carries the flow nodes on an optional PRCheckStep.children. The Jenkins node id is kept so repeated stage names (loops, parallel branches) cannot collide as React keys. * fix(lint): split files over the max-lines budget Five files exceed the oxlint max-lines budget on nplez1/main and have no suppression, so the whole-repo `pnpm exec oxlint` in the static-analysis job fails for every PR cut from it. They were pushed over by fork-only commits (`#34`, and three direct commits) that never ran PR CI. The repo's rule is to split rather than suppress, so this extracts cohesive pieces: - filesystem-watcher.test.ts: the local/WSL lifecycle tests move to filesystem-watcher-local-lifecycle.test.ts. - filesystem-watcher-local-subscription.ts: scheduleLocalWatcherTeardown moves to filesystem-watcher-local-teardown.ts. - ssh-target-cleanup.ts: the per-tab session helpers move to ssh-target-tab-sessions.ts. - ai-vault-session-refresh.ts: the session-ids key moves to ai-vault-session-ids.ts. - accounts-search.ts: the Grok and Cursor search entries move to accounts-search-extra-providers.ts and are re-exported. No behavior change; the affected suites pass.
nplez1
added a commit
that referenced
this pull request
Oct 6, 2026
#39) * feat(checks): read Jenkins build stages and details for Jenkins checks A CI check that points at Jenkins reaches Orca as a GitHub legacy commit status: a name, a state and a target_url, with no check-run or workflow-run id. The only details fetch looked runs up by those ids, so it returned a valid but empty payload and expanding the check said "No inline details are available for this check" — while the check was the only place to see which stage was running or which one broke. Detect a Jenkins check from its own URL (src/shared/jenkins-urls.ts handles job prefixes, folders, multibranch, page suffixes, permalinks, and translates Blue Ocean links to their classic equivalent), then read the build in main through two GETs: `<build>/api/json?tree=…` for the build and `<build>/wfapi/describe` for the stage list, best-effort since a freestyle job has no stages. Stages map onto the existing provider-neutral `PRCheckJob.steps` (one job per build) and build metadata onto a new optional `PRCheckRunDetails.build`, so the four existing detail surfaces render it without a provider-specific path. `stepRendering: 'all'` marks a stage list: a stage list is the build's shape rather than a drill-down, so the sidebar lists every stage (including the one still running) instead of its compact failures-only list, and the editor stops collapsing stages behind its "N succeeded" toggle. The failures-only filter itself moved to src/shared/check-step-visibility.ts, where it was duplicated. Credentials are a list of user-configured servers (base URL, username, API token), because a user runs several: profiles in ~/.orca/jenkins-servers.json and one keychain-encrypted token per server. A build URL is matched to a server by longest configured prefix, not by origin, and a response whose final URL is outside that prefix is refused, since the Fetch standard only strips Authorization on a cross-origin hop. Parameter values are masked by kind and by name before reaching the renderer. The check-fix prompt now consumes failing stage names, which is what makes a Jenkins check useful there despite having no log tail. Endpoint behavior is covered by unit tests with a mocked HTTP client; no live Jenkins has been exercised, which docs/reference/jenkins-check-details.md (local-only, not tracked here) records along with the local-reachability and parameter-masking limits. * test(main): register the Jenkins fetch call site in the proxy audit The proxy-guarded fetch audit is stricter than a grep: it counts every non-`net` `.fetch(` call per main-process file and fails on a count it has not been told about. src/main/jenkins/jenkins-request.ts went through the injected HttpClient without being registered, so shard 5 failed on 'keeps every non-default-session fetcher audited with its expected count'. Same entry as main/jira/authenticated-request.ts: the injected client resolves to net.fetch on defaultSession on the desktop, and to the global-fetch-audited Node fallback elsewhere.
nplez1
added a commit
that referenced
this pull request
Oct 6, 2026
* feat(checks): make the Jenkins build tree readable at scale The Jenkins details from #39 read the build's stage list but listed every stage in the Checks pane, buried failures under it, kept an Output box that only repeated the build name, and stopped at a bare error when the account could not read the job. - Pane: list only the stages still running and the ones that failed, running first, capped at eight, with a "+N more stages" line — a pipeline can have hundreds. - Detail page: render the stages as a nested tree (stage -> its wfapi flow nodes) like Blue Ocean, with failed and running stages open by default. - Detail page: a Failures block under the run header names each failed stage and its error text, so "what broke" needs no scrolling. - Detail page: drop the Output box for a stage list; the build metadata is the run summary. - Settings: a Jenkins read failure the user can fix (no server, rejected token, no permission) now shows an "Open Jenkins settings" button that deep-links to the Jenkins card. Main reads each stage's own wfapi/describe (its _links.self.href, bounded to 40 requests at six concurrent, failed/running first under a four-second budget) for the steps and failure text, and carries the flow nodes on an optional PRCheckStep.children. The Jenkins node id is kept so repeated stage names (loops, parallel branches) cannot collide as React keys. * fix(lint): split files over the max-lines budget Five files exceed the oxlint max-lines budget on nplez1/main and have no suppression, so the whole-repo `pnpm exec oxlint` in the static-analysis job fails for every PR cut from it. They were pushed over by fork-only commits (`#34`, and three direct commits) that never ran PR CI. The repo's rule is to split rather than suppress, so this extracts cohesive pieces: - filesystem-watcher.test.ts: the local/WSL lifecycle tests move to filesystem-watcher-local-lifecycle.test.ts. - filesystem-watcher-local-subscription.ts: scheduleLocalWatcherTeardown moves to filesystem-watcher-local-teardown.ts. - ssh-target-cleanup.ts: the per-tab session helpers move to ssh-target-tab-sessions.ts. - ai-vault-session-refresh.ts: the session-ids key moves to ai-vault-session-ids.ts. - accounts-search.ts: the Grok and Cursor search entries move to accounts-search-extra-providers.ts and are re-exported. No behavior change; the affected suites pass.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
ELI5
Some PR checks are Jenkins jobs. Orca showed the check's name and whether it failed, but when you
clicked it to see why, it said it had no details — so the only way to find out which stage broke was
to open Jenkins in a browser.
Now Orca reads the build from Jenkins and shows the stages, which one is still running, and the
build's facts (number, what started it, how long it queued and ran, its parameters and commits).
What Changed
Before: a Jenkins check is a GitHub legacy commit status — a name, a state and a link, with no
check-run or workflow-run id. Orca's only details lookup fetched check runs and workflow jobs by
those ids, so a Jenkins check came back as a valid but empty payload and the expanded pane read
"No inline details are available for this check."
After: expanding a Jenkins check lists its pipeline stages with a pass/fail/running glyph for
each, plus the build's number, trigger, queue time, estimate, duration, parameters and commits.
A stage still running is visible, and the failed stage is named.
The mechanism. Detection is by the check's own URL, because that is the only handle a status
context carries:
src/shared/jenkins-urls.tsreads the classic job path (prefixes, folders,multibranch,
display/redirect-style pages,lastBuildpermalinks) and translates Blue Ocean linksto their classic equivalent. Main then reads two endpoints on the classic build URL —
<build>/api/json?tree=…for the build and<build>/wfapi/describefor the stage list (best-effort;a freestyle job has no stages) — and maps them into the existing provider-neutral shape: stages onto
PRCheckJob.stepsas one job per build, and metadata onto a new optionalPRCheckRunDetails.build. All four existing detail surfaces therefore render it with noprovider-specific path.
Two supporting changes fall out of that:
stepRendering: 'all'marks a stage list. A stage list is the build's shape rather than adrill-down, so the sidebar lists every stage instead of its compact failures-only list, and the
editor stops collapsing stages behind its "N succeeded" toggle. The failures-only filter moved to
src/shared/check-step-visibility.ts, which is where it was duplicated.this the Jenkins fetch would have cost a request and been thrown away.
Credentials are a list of user-configured servers (base URL, username, API token) — Settings →
Integrations → CI providers — because a user runs several. Profiles live in
~/.orca/jenkins-servers.jsonand one API token per server in the existing encrypted credentialfile. A build URL matches a server by longest configured prefix rather than by origin.
Why
URL-driven detection, confirmed by fetching. There is no id to dispatch on, so the URL has to be
the first move. A parsed URL is only a candidate: main confirms by fetching and answers
not-jenkinswhen the host turns out not to be Jenkins, so a false positive costs one request andfalls back to the existing GitHub path rather than showing a wrong pane.
Mapping into the existing shape, not a new renderer path. Jenkins details had to reach four
surfaces (sidebar, editor tab, item dialog, PR page). Reusing
PRCheckJob.stepsand adding oneoptional structured field is far less churn than a Jenkins-specific renderer, and it is what makes
the fix land everywhere at once.
A structured metadata field, not provider prose.
title/summaryare markdown written by theprovider, which localizes itself. These labels are Orca's, so they have to cross IPC as data and go
out through
translate().Prefix matching, not origin. Jenkins is routinely served under a path, and two instances can
share a host.
Alternatives considered: a Jenkins-specific details component per surface (rejected as four copies
of the same layout); putting the fingerprint in the GitHub check mapper in main (rejected — it would
couple every check-list fetch to the Jenkins server list); reusing browser session cookies for auth
(rejected as fragile and tied to cookie import).
Linked Issue
None filed — nothing to link. Say the word if you want one opened and referenced here.
Visual Proof
No screenshots: this needs a live Jenkins (or a faked check pointing at one) plus a running app, and
the authoring environment has neither, so a capture would not have been honest. What follows is the
pane's rendered text, whitespace-normalized, taken from
jenkins-check-row-details.test.tsx(a real render of the component, not hand-written):
Before — the check row, expanded:
After — same row, same check:
Testing
pnpm tc(node, cli, web), all seven changed-code-quality scans, and the localization, anti-slop,dead-class, max-lines and ts-nocheck gates — green.
Targeted suites:
src/shared+src/main/jenkins+src/main/ipc→ 13,693 passing;right-sidebar+editor+settings+pull-request-page+github-item-dialog→ 5,292passing. 83 new test cases.
New coverage worth naming: URL shapes (18), status/secret mapping (9), server matching and
storage (6), request classification including a same-origin redirect that leaves the configured
server path (20), renderer dispatch (9), settings card (8), the rendered pane (3).
Platforms: macOS only. No live Jenkins was exercised — every endpoint interaction is mocked.
docs/reference/jenkins-check-details.mdrecords that gap and is deliberately not committed(
docs/**is local-only in this fork).I manually tested these changes locally
Automated tests added/updated, or explained why not below
AI Disclosure
Implemented by Pi (coding agent) with GPT-6 Sol at high reasoning performing an independent
review of the uncommitted diff. The review found a credential-scope hole (a same-origin redirect
could carry the
Authorizationheader outside the configured server prefix), a substring-basedparameter mask that let
PRIVATE_KEYthrough, and a stage-timing bug that gave a running stage acompletion time; all three are fixed and covered by regression tests.
Review
Worth a reviewer's eye:
prefix is refused, but with
redirect: 'follow'a same-origin intermediate hop still receives theheader before the final URL is judged. Per-hop control needs
redirect: 'manual', which returnsan opaque redirect under the Fetch standard (no readable
Location) and would break permalinkfollowing. Called out in the doc rather than silently claimed as closed.
is ever attached to one. Intranet/loopback targets are not fenced on purpose.
under an unremarkable name is shown, which is the exposure
api/jsonalready gives the samereader.
bounded console excerpt, which was left out of scope here.
Agent skill upstream boundary
docs/reference/agent-skill-sharing-upstream-boundary.mdand copies or mechanically translates no upstream skill-installer source, tests, fixtures, registry entries, path tables, comments, or documentation.Notes
masked in main before crossing IPC.
HTTP port rather than a shell), but only macOS was run.
only reachable from a remote host reports unreachable. No relay was added.
PRCheckRunDetails.buildandPRCheckJob.stepRenderingare optional,so an older client ignores them.
details are only auto-loaded for failed checks, as before.
small diff.
Checklist
N/Awith reasonpnpm lint,pnpm typecheck,pnpm test, andpnpm buildpass (or CI will cover; local preferred)— locally:
pnpm tcand every gate inpnpm lint's chain that this change can affect(localization ×4, anti-slop, dead classes, max-lines, ts-nocheck, changed-code-quality ×7) are
green, plus the targeted suites above. The full
pnpm testandpnpm buildwere left to CI.