Skip to content

test(network-escape): serve the last probe from a double and retire the burn-down list (objectui#7307) - #8289

Merged
baozhoutao merged 1 commit into
mainfrom
claude/issue-7307-network-escapes-batch6
Sep 7, 2026
Merged

baozhoutao merged 1 commit into
mainfrom
claude/issue-7307-network-escapes-batch6

Conversation

@claude

@claude claude Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Fixes #7307

Batch 6 — the last row of the network-escape burn-down. The ledger reaches zero here, so the burn-down machinery is retired with it.

BEFORE (base fc32921aa)

pnpm exec vitest run packages/app-shell/src/views/metadata-admin/inspectors/FlowNodeInspector.specKeys.test.tsx — exit 0 (green while escaping, which is objectui#6640 exactly). Three attributed escapes, one per render:

[network-escape - known - objectui#6640] packages/app-shell/src/views/metadata-admin/inspectors/FlowNodeInspector.specKeys.test.tsx -> http://localhost:3000/api/v1/meta/object
  The ECONNREFUSED stack near this line belongs to that file. Serve the
  probe from a double, then delete its line from KNOWN_ESCAPES in
  vitest.setup.network-escape-guard.ts.

plus 3 × Error: connect ECONNREFUSED 127.0.0.1:3000.

pnpm exec vitest run scripts/__tests__/network-escape-ledger.test.ts on the base — exit 0, 3 tests, PINNED_LEDGER.length === 1.

Traced call path: FlowNodeInspector renders FlowReferenceField for every reference-kind key on the selected node; useMetadataListOptions (FlowReferenceField.tsx:638) resolves options through MetadataClient.list(type) — GET /api/v1/meta/object over the authenticated wrapper's bare global fetch (packages/auth/src/createAuthenticatedFetch.ts). Under happy-dom that global is a real HTTP client and the document URL defaults to http://localhost:3000, so the relative path resolved to a live socket. Same path the batch-5 sibling FlowNodeInspector.inactiveRetained.test.tsx fixed.

AFTER (e09bb3e50)

run exit result escapes ECONNREFUSED
target file alone 0 5 passed 0 0
inspectors/ + scripts/__tests__/ union, at final HEAD 0 183 files, 4194 passed / 1 skipped 0 0
record-details.hideEmptyRetired-7129.test.tsx 0 3 passed 0 0

The guard's afterEach is silent for the whole inspectors/ directory: 67 files, 770 tests, not one socket.

The double is the shape the sibling carries — a recording router, not a blanket stub. It answers /api/v1/meta/object with an empty { type, items: [] } registry (byte-identical to what the failed read already produced through the hook's .catch, so no assertion moves), records every URL, and its afterEach fails on any URL outside that route. Teardown order per objectui#7439: cleanup() before vi.unstubAllGlobals().

The retirement — decision (b), and why

The old pin's own non-vacuity floor prescribed this, verbatim: "If the ledger genuinely reached zero … delete the guard's KNOWN_ESCAPES machinery and this pin together, rather than leaving a pin that asserts nothing."

GONE from vitest.setup.network-escape-guard.ts: the KNOWN_ESCAPES set; the attributed-stderr branch that kept listed files green (with the now-dead writeStderr / StderrHost it existed for); the unknown = seen.filter(!KNOWN_ESCAPES.has) split; the Do NOT add this file to KNOWN_ESCAPES line of the Fix: text; and the header's burn-down section, rewritten to record that the list reached zero on this card.

KEPT, untouched: the recording fetch wrapper and the afterEach that fails ANY escape in ANY file — the standing guard of objectui#6640, which was never part of the burn-down. Its Fix: remedy (double + teardown order) stays, because it is still the remedy.

The pin: (b), replaced, not deleted — scripts/__tests__/network-escape-ledger.test.ts now pins that the machinery is gone and the standing guard is still installed. Four axes:

  • 实际业务需求 — measured, not speculative. The pressure the old pin resisted (its own docstring: "an author who hit the guard's red could make it green by adding a line") did not end with the list, it went up: every escape is now red on its first run with no list to join, so the cheapest wrong fix available to the next author is to re-create the list — one line, green on arrival. Option (a) leaves nothing resisting that.
  • 项目长远合理性 — contract-first. The standing guard is the contract "no test reaches a socket"; (b) pins that it has no escape hatch. This repo's own precedent argues for it directly: the guard's docstring said the list "may only shrink" and that was not true until a pin made it true. Same reasoning, one step later.
  • 防 AI 写代码犯错 — decisive. A re-added list is exactly 宽容-as-cover: an AI makes a red green by declaring an exception instead of fixing the escape, and the tolerated path applies repo-wide and silently. (b) makes re-introduction structurally loud; (a) makes it routine.
  • 创业阶段不扩散需求 — both options retire immediately; (b) is no staged window, it asserts ABSENCE. It is not capability expansion: zero product surface, zero published bytes, ~130 lines of test replacing a file that already existed in a directory of 116 such pins, and the file count stays flat. The mild line-count pull toward (a) is outweighed by axis 3, which this repo ranks higher.

Kept at the same path deliberately: an agent who greps network-escape-ledger — because the guard's old text told them the two move together — lands on the retirement pin and reads why there is no list.

The absence checks read the guard through scripts/js-comment-mask.mjs, the tree's one answer to "comment, or code?". That is load-bearing: the guard's header now explains at length that there is no KNOWN_ESCAPES, so a naive text search finds the name in prose and the pin could never go green. A PROSE_ONLY control asserts masking is actually working, so the negatives cannot pass over unmasked text.

Ablation — the retirement pin reds if the list comes back

Mutated the committed tree (git checkout HEAD -- restore, absolute paths, trap … EXIT INT TERM): re-added an export const KNOWN_ESCAPES = new Set([...]) to the guard.

On-disk proof, not an editor exit code — export const KNOWN_ESCAPES count 0 → 1; blob 94c4d099… → 19226b8c….

Result: exit 1, 2 failed | 3 passed — the namespace test (exports nothing) and the code test (declares no allowlist), which is the predicted direction and both halves.

Restore proven by bytes, not by an exit code: git hash-object back to 94c4d099bb946c65de342ebc0482e106ed17bbaa = the HEAD blob; git diff HEAD empty; git status clean.

Standing-guard proof (scratch, never committed)

A scratch test in a file no list ever named, fetching http://localhost:3000/api/v1/x, under the guard:

Error: Network escape: this test reached a REAL socket at http://localhost:3000/api/v1/x.
  file: scripts/__tests__/zz-standing-guard-scratch.test.ts
  test: scratch: an escape in a file no list ever named > reaches a real socket …

Exit 1, with the full Fix: text and no trailing "Do NOT add this file to KNOWN_ESCAPES" line. Scratch deleted; git status clean and git diff HEAD empty afterwards.

Mentions updated

  • packages/plugin-detail/src/renderers/__tests__/record-details.hideEmptyRetired-7129.test.tsx — its "⛔ Not KNOWN_ESCAPES: that list only shrinks" comment now says there is no list to join at all.
  • scripts/check-doc-example-shared-reader.mjs — its KNOWN_HAND_SPELLINGS header cited the ledger as "the same shape"; now cites it in the past tense and points at what the file pins today.

Deliberately not touched: .changeset/network-escape-batch{1,2,3,4}.md and .changeset/network-escapes-batch5.md name KNOWN_ESCAPES / PINNED_LEDGER. They are pending release notes describing what those PRs did, and they are accurate as written; rewriting four other PRs' unreleased changesets is the third-party touch check-changeset-overwrite.mjs exists to discourage. AGENTS.md does not name the list.

Gates (exit codes, at e09bb3e50)

gate exit
vitest run …/FlowNodeInspector.specKeys.test.tsx 0 (5 passed)
vitest run …/inspectors/ scripts/__tests__/ 0 (183 files, 4194 passed)
vitest run …/record-details.hideEmptyRetired-7129.test.tsx 0 (3 passed)
pnpm lint:root 0 (0 errors, 32 warnings — all pre-existing)
pnpm --filter @object-ui/app-shell --filter @object-ui/plugin-detail run type-check 0 (both tsc --noEmit and tsc -p tsconfig.test.json, so the test files are covered)
pnpm check:control-bytes 0 (6594 files scanned)
pnpm check:entry-guard 0
node scripts/check-changeset-presence.mjs 0 — 1 changeset, empty frontmatter
node scripts/check-changeset-overwrite.mjs 0 — no pre-existing changeset touched
node scripts/check-changeset-no-major.mjs 0
node scripts/check-governed-queue-guard.mjs --test (all 6 paths) 0 — NOT GOVERNED

Dependency closure built first (pnpm --filter '@object-ui/app-shell^...' --filter '@object-ui/plugin-detail^...' build) — without it type-check fails with 16 phantom TS2307s from stale/absent dist/*.d.ts, which would have read as "your change broke the imports".

Changeset: .changeset/network-escapes-batch6.md, empty frontmatter — test-only, no product source touched, nothing to release.


Generated by Claude Code

…he burn-down list (objectui#7307)

Batch 6, the last row of the network-escape burn-down.

`FlowNodeInspector.specKeys.test.tsx` reached a real socket at
`http://localhost:3000/api/v1/meta/object` three times per run — once per
render — because `FlowNodeInspector` renders `FlowReferenceField`, whose
`useMetadataListOptions` resolves options through `MetadataClient.list(type)`
over the authenticated wrapper's bare global `fetch`. It now serves that route
from the recording double the sibling `FlowNodeInspector.inactiveRetained.test.tsx`
carries: an empty `{ type, items: [] }` registry, which is byte-identical to what
the failed read already produced through the hook's `.catch`, so no assertion
moves. The double records every URL and its `afterEach` fails on any URL outside
the route, so an escape elsewhere reds here instead of vanishing.

That empties `KNOWN_ESCAPES`, so the burn-down machinery is retired with it,
which is what the ledger pin's own non-vacuity floor prescribed for reaching
zero. Gone: the set, the attributed-stderr branch that kept listed files green,
the known/unknown split, and the `Do NOT add this file to KNOWN_ESCAPES` line of
the `Fix:` text. Kept, untouched: the recording `fetch` wrapper and the
`afterEach` that fails ANY escape in ANY file — the standing guard of
objectui#6640, which was never part of the burn-down and now covers every file.

`scripts/__tests__/network-escape-ledger.test.ts` is replaced rather than
deleted: it now pins that the machinery is GONE (no export, no list in the
guard's code) and that the standing guard is still installed. The pressure the
old pin resisted went up, not away — every escape is now red with no list to
join, so re-creating the list is the cheapest wrong fix available to the next
author who meets that red. Its absence checks read the guard through
`scripts/js-comment-mask.mjs`, because the guard's header explains at length that
there is no list any more and a naive text search would find the name in prose.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr
@github-actions

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3472.1 KB 3512.7 KB
Main entry chunk (gzip) 143.9 KB 350 KB
Entry file index--2K1PeVY.js —
Status PASS —

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 15.67KB 5.75KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 5.13KB 2.35KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 497.99KB 113.90KB
core (index.js) 7.20KB 2.88KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 189.15KB 52.56KB
fields (index.js) 243.14KB 61.38KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 6.57KB 2.76KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.84KB 10.94KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 11.71KB 4.29KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 5.12KB 1.74KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 15.16KB 3.68KB
plugin-calendar (index.js) 48.03KB 13.29KB
plugin-charts (index.js) 71.39KB 19.92KB
plugin-chatbot (index.js) 193.54KB 46.04KB
plugin-dashboard (index.js) 131.43KB 34.43KB
plugin-designer (index.js) 213.21KB 43.63KB
plugin-detail (index.js) 248.56KB 63.89KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 131.01KB 32.32KB
plugin-gantt (index.js) 167.16KB 40.99KB
plugin-grid (index.js) 208.58KB 56.63KB
plugin-kanban (index.js) 52.83KB 14.63KB
plugin-list (index.js) 113.38KB 27.73KB
plugin-map (index.js) 20.49KB 6.83KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.42KB 11.92KB
plugin-timeline (index.js) 30.10KB 8.74KB
plugin-tree (index.js) 9.33KB 3.25KB
plugin-view (index.js) 84.46KB 20.80KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.55KB 2.45KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 13.64KB 4.59KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.74KB 1.41KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@claude

claude Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor Author

ACCEPT (#7307 batch 6 — the last row, and the burn-down list retired with it) — reviewed on the tree at head e09bb3e50 against origin/main 3c6394cb2, read 2026-09-07T08:47Z; domain:devx @ objectui seat, PM session session_01FhBNJcLRZLe8M87VcUgpKr. Merges clean.

Verified from the diff, not the report:

  • Six files, no product code: the target test gains a recording meta/object double (vi.stubGlobal('fetch'), records every URL, 404s anything off the route, afterEach asserts no other endpoint was reached, cleanup() BEFORE vi.unstubAllGlobals() per flaky(app-shell): RecordDetailView.approvalDeclaredActions trips the network-escape guard intermittently — the afterEach stub teardown races a still-pending effect #7439), answering an empty { type: 'object', items: [] } registry so no assertion changes subject.
  • vitest.setup.network-escape-guard.ts: KNOWN_ESCAPES, the attributed-stderr branch (writeStderr, StderrHost), the known/unknown split and the "Do NOT add this file to KNOWN_ESCAPES" line are gone; the guardedFetch wrapper, the afterEach that throws Network escape: for any file, and the Fix: remedy stay. The header records that the list reached zero on this card.
  • scripts/__tests__/network-escape-ledger.test.ts is now the retirement pin (option b): the guard exports nothing; no KNOWN_ESCAPES and no new Set([ in its CODE (read through maskComments, with a prose-only phrase as the masking control); globalThis.fetch.name === 'guardedFetch'; the afterEach + Fix: text still present. Ablation: re-adding the export reds two of five.
  • Two comment-only mentions updated (record-details.hideEmptyRetired-7129.test.tsx, check-doc-example-shared-reader.mjs); the five earlier batches' changesets deliberately left as written. No governed mention; AGENTS.md does not name the list.
  • Standing-guard proof: a scratch escape went RED with the Fix: text and no list line; scratch removed, tree clean.
  • Empty-frontmatter changeset on check-changeset-presence's verdict (two released packages' source files changed). Fixes #7307 on the first line.

Next: CI convergence → flip ready → post-flip guard → auto-merge SQUASH → queue confirmation → landing probe on re-fetched origin/main (KNOWN_ESCAPES absent from the guard's code, guardedFetch present; control: Network escape: throw text present) → LANDED here; the card closes on merge via Fixes.


Generated by Claude Code

@claude

claude Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor Author

Flip deferred: CI converged all green on e09bb3e50 (31 checks, read 2026-09-07T08:59:03Z), but the MCP write channel (identity baozhoutao) answered API rate limit already exceeded at 08:59Z, and REST cannot un-draft a pull request. Retry on the next wake or at patrol 27 (09:12Z); then post-flip guard → auto-merge SQUASH → queue confirmation. Nothing else changes: the ACCEPT above stands. — domain:devx @ objectui seat, PM session session_01FhBNJcLRZLe8M87VcUgpKr.


Generated by Claude Code

@baozhoutao
baozhoutao marked this pull request as ready for review September 7, 2026 09:32
@baozhoutao
baozhoutao added this pull request to the merge queue Sep 7, 2026
@claude

claude Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor Author

Armed: PR #8289 flipped ready at 2026-09-07T09:32:34Z on head e09bb3e50 (the MCP channel recovered at 09:32Z after the 08:59Z rate limit); post-flip Governed Surface Queue Guard completed/success at 09:32:56Z; auto-merge SQUASH enabled; added_to_merge_queue at 09:33:44Z (read 09:33:56Z); merge-group runs started 09:34:02Z. Landing stroke on merge: probe on re-fetched origin/main (KNOWN_ESCAPES absent from the guard's code, guardedFetch present; control: the Network escape: throw text present); the card closes via Fixes #7307. — domain:devx @ objectui seat, PM session session_01FhBNJcLRZLe8M87VcUgpKr.


Generated by Claude Code

Merged via the queue into main with commit 4b9fe98 Sep 7, 2026
34 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-7307-network-escapes-batch6 branch September 7, 2026 09:49
@claude

claude Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor Author

LANDED: merged at 2026-09-07T09:49:48Z as 4b9fe9819 (squash — one parent, via the merge queue). Content probe on re-fetched origin/main at 4b9fe9819 (read 09:50Z): no KNOWN_ESCAPES in the guard's code lines (0), function guardedFetch present (1), control Network escape: this test reached throw text present (1); the retirement pin (stays retired) is on main; installMetaObjectDouble present in the target test. Merge commit is an ancestor of origin/main. #7307 closed via Fixes; its pm:dispatched is stripped in the same stroke. — domain:devx @ objectui seat, PM session session_01FhBNJcLRZLe8M87VcUgpKr.


Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Burn down the 21 known network escapes: serve each probe from a double and empty KNOWN_ESCAPES in the network-escape guard

2 participants