Skip to content

feat(trust): E14 subprocessor list (DRAFT — do not merge) - #3707

Draft
PetrefiedThunder wants to merge 6 commits into
mainfrom
claude/e14-subprocessor-list
Draft

PetrefiedThunder wants to merge 6 commits into
mainfrom
claude/e14-subprocessor-list

Conversation

@PetrefiedThunder

@PetrefiedThunder PetrefiedThunder commented Oct 28, 2026 •

Copy link
Copy Markdown
Collaborator

DRAFT — do not merge

Diligence E14 (subprocessor list). This PR is DRAFT only.

Summary

  • Split inventory into in production use vs not enabled in production (OpenAI, Google Cloud Vertex AI, LlamaCloud).
  • Removed where_configured for vendors that are not in production; they use not_in_production with explicit availability labels.
  • Added region and transferMechanism on every row, filled only from each vendor's official DPA / regions pages. Blank when the page does not state it.
  • LlamaCloud row marked planned, not live with Lead-steered availability label (exact string).
  • Unit tests for inventory shape and label contracts.

Files:

  • frontend/src/lib/trust-subprocessors.ts
  • frontend/src/lib/__tests__/trust-subprocessors.test.ts

Trust / DPA pages already render availabilityLabel, purpose, dataProcessed, and location. They do not yet show region / transferMechanism columns; those fields are on the data model for Legal diligence and a follow-up UI pass if approved.

Availability split

Vendor availability availabilityLabel
Supabase, Railway, Vercel default Default platform processor
Sentry where_configured Where configured
Stripe where_configured Where billing is enabled
PostHog where_configured Where analytics is enabled
Resend where_configured Where email is configured
TypeSafe AI where_configured Where AI CSV suggestions are enabled
Cloudflare R2 where_configured Where object storage is configured
OpenAI not_in_production Not used in production; may be enabled only after notice
Google Cloud Vertex AI not_in_production Not used in production; may be enabled only after notice
LlamaCloud not_in_production Planned: document extraction for admin bulk PDF uploads; not enabled in production as of Oct 28, 2026; enablement pending legal review and customer notice

LlamaCloud label is the exact planned / not live string from VS Code Lead (Oct 28, 2026). Semicolon kept as given (no-dashes UI rule does not conflict). Nothing in this draft claims LlamaCloud is live or in production use.

Per-vendor region / transferMechanism (sources + supporting phrases)

Supabase (in use)

  • region: Customer directed project region
  • transferMechanism: EU Standard Contractual Clauses (Module 2 and Module 3); UK International Data Transfer Addendum; Swiss Addendum
  • Source: https://supabase.com/legal/customer-resources/data-processing-addendum
  • Phrases: "Where Customer directs Supabase to Process Covered Data in a specific geographical region, Supabase shall ensure that such Covered Data is stored and primarily Processed in that region"; SCCs / UK Addendum / Swiss Addendum incorporated in the DPA transfer sections.

Railway (in use)

  • region: United States
  • transferMechanism: EU U.S. Data Privacy Framework and/or EU Standard Contractual Clauses with UK International Data Transfer Addendum
  • Source: https://railway.com/legal/dpa
  • Phrases: "Company's primary processing operations take place in the United States"; transfers via "Data Privacy Framework and/or the Standard Contractual Clauses" (and UK Addendum).

Vercel (in use)

  • region: United States
  • transferMechanism: EU Standard Contractual Clauses with UK International Data Transfer Addendum
  • Source: https://vercel.com/legal/dpa
  • Phrases: "Vercel's primary processing facilities are in the United States"; Schedule 3: ""UK IDTA" means the UK international data transfer addendum (Schedule 5)"; "For data transfers from the United Kingdom, the UK IDTA will be deemed entered into (and incorporated into this Addendum by reference) together with the Standard Contractual Clauses".

Sentry (in use)

  • region: United States and other countries where Sentry or its subprocessors maintain operations
  • transferMechanism: EU U.S. Data Privacy Framework; EU Standard Contractual Clauses with UK International Data Transfer Addendum and Swiss adaptations
  • Source: https://sentry.io/legal/dpa/
  • Phrases: store/process "in the United States and any other country in which we or our Subprocessors maintain data processing operations"; Data Privacy Framework participation; SCCs as fallback with UK/Swiss adaptations.

Stripe (in use)

  • region: United States
  • transferMechanism: EU U.S. Data Privacy Framework; EEA Standard Contractual Clauses; UK International Data Transfer Addendum
  • Source: https://stripe.com/legal/dpa (and Stripe Data Transfers Addendum / DTA references)
  • Phrases: transfers "to Stripe, LLC in the United States"; Data Transfer Mechanism covering DPF, EEA SCCs, UK IDTA.

PostHog (in use)

  • region: Customer selected data center location
  • transferMechanism: EU U.S. Data Privacy Framework (including UK Extension and Swiss U.S.); EU Standard Contractual Clauses with UK International Data Transfer Addendum and Swiss adaptations
  • Source: https://posthog.com/dpa
  • Phrases: "Company Personal Data will be housed in data centers located in the Data Center Location set out in the Principal Agreement"; Processor participates in DPF; parties comply with Standard Contractual Clauses (EU / UK / Swiss).

Resend (in use)

  • region: United States
  • transferMechanism: EU Standard Contractual Clauses (Module 2 and Module 3) with UK Addendum; EU U.S. Data Privacy Framework and UK Extension
  • Source: https://www.resend.com/legal/dpa
  • Phrases: "Company's primary processing operations take place in the United States"; ex-EEA / ex-UK transfers via EU SCCs and UK SCCs/Addendum; DPF certification section.

TypeSafe AI (in use)

  • region: (blank)
  • transferMechanism: EU Standard Contractual Clauses (Module 2 and Module 3); UK International Data Transfer Addendum
  • Source: https://typesafe.ai/legal/data-processing
  • Phrases: Section 6 International Data Transfers concludes Module 2/3 EU SCCs and UK Addendum. No processing region / data center location is stated on the DPA page → region left blank.

Cloudflare R2 (in use)

  • region: (blank)
  • transferMechanism: EU U.S. Data Privacy Framework (including UK Extension and Swiss U.S.); EU Standard Contractual Clauses (Module 2 and Module 3) with UK International Data Transfer Addendum
  • Source: https://www.cloudflare.com/cloudflare-customer-dpa/
  • Phrases: Restricted Transfers use EU SCCs Module 2/3 + UK Addendum; "Cloudflare complies with the Data Privacy Framework". DPA does not state a single primary processing region for R2 → region left blank (existing location display string retained for the current UI).

OpenAI (not in production)

  • region: (blank)
  • transferMechanism: EU Standard Contractual Clauses for EEA and Swiss transfers; UK International Data Transfer Addendum for UK transfers
  • Source: https://openai.com/policies/data-processing-addendum/
  • Phrases: Section 4 International Data Transfers: EEA/Swiss via SCCs (or adequacy); UK Data via SCCs as amended by UK Addendum. DPA does not state a single primary processing region → region left blank.

Google Cloud Vertex AI (not in production)

  • region: Customer selected Google Cloud region
  • transferMechanism: EU Standard Contractual Clauses or an Alternative Transfer Solution adopted by Google
  • Source: https://cloud.google.com/terms/data-processing-addendum
  • Phrases: §10.1 "Customer Data may be processed in any country where Google or its Subprocessors maintain facilities" subject to Service Specific Terms / data location commitments; Appendix 3 Restricted Transfers via SCCs or Alternative Transfer Solution. (Existing UI location still shows United States (us-central1) from prior inventory; that specific region code is not asserted by the CDPA as a default.)

LlamaCloud (not in production)

  • region: United States (AWS us-east-1) by default; European Union Frankfurt (AWS eu-central-1) when using the EU endpoint
  • transferMechanism: EU Standard Contractual Clauses (Module 2 and Module 3) and UK International Data Transfer Addendum (self serve DPA incorporated via Terms of Service)
  • Sources:
    • https://developers.llamaindex.ai/llamaparse/general/regions/ (NA us-east-1 / EU eu-central-1; "Data will be stored within the region it is uploaded to.")
    • https://www.llamaindex.ai/legal/terms-of-service §8.2–8.3 (DPA at security.llamaindex.ai incorporated; "includes the EU Standard Contractual Clauses and the UK Addendum"; User Content stored United States for cloud.llamaindex.ai / EU Frankfurt for cloud.eu.llamaindex.ai)
    • Security review: /workspace/security/e14-llamacloud-security-review-2026-10-28.md (Railway/Vercel prod: LLAMA_CLOUD_API_KEY absent → extraction off)
  • availabilityLabel (exact): Planned: document extraction for admin bulk PDF uploads; not enabled in production as of Oct 28, 2026; enablement pending legal review and customer notice

Blank fields (and why)

Vendor Blank field Why
TypeSafe AI region Official DPA does not state a processing region or data center location.
Cloudflare R2 region Customer DPA states transfer mechanisms (DPF / SCCs) but does not state a single primary R2 processing region.
OpenAI region Official DPA states transfer mechanisms (SCCs / UK Addendum) but does not state a single primary processing region.

Verification (local Mac worktree)

  • npx tsc --noEmit -p tsconfig.json (frontend): pass
  • npx eslint on changed files: pass
  • npx vitest run src/lib/__tests__/trust-subprocessors.test.ts: 8/8 pass
  • Pre-commit hooks: pass (signed-off)

Out of scope / follow-ups

  • Lawyer + C.Lee Approvals before ready/merge.
  • Optional UI columns for region / transferMechanism on Trust and DPA pages (not in this PR; data only).
  • No production deploy from this PR.

Codex FAIL follow-up (Oct 28, 2026)

  • Fixed Vercel transferMechanism: Agreement → Addendum per https://vercel.com/legal/dpa Schedule 3 definition of UK IDTA.
  • Re-fetched cited DPAs for all other vendors; no other Agreement/Addendum (or same-class) mismatches found.
  • Vitest: 9/8→9/9 (added regression assertion for Vercel Addendum wording).
  • Still DRAFT — do not merge; lawyer + C.Lee Approvals required.

Update the public Trust inventory for diligence E14: keep in-production
vendors separate from OpenAI, Vertex, and LlamaCloud (not enabled in
production); add region and transferMechanism filled only from each
vendor's official DPA or regions pages; leave blank when unstated.
LlamaCloud availabilityLabel matches Security/Lead draft wording.

Signed-off-by: Christopher Sellers <1@christophersellers.com>
@vercel

vercel Bot commented Oct 28, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
regengine Ready Ready Preview Oct 28, 2026 2:45pm UTC

Request Review

@coderabbitai

coderabbitai Bot commented Oct 28, 2026

Copy link
Copy Markdown

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
  auto_review:
    drafts: true
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Comment @coderabbitai help to get the list of available commands.

Update the LlamaCloud availability label to the planned wording and
reword purpose so the draft does not claim the vendor is live.

Signed-off-by: Christopher Sellers <1@christophersellers.com>

@PetrefiedThunder PetrefiedThunder left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Findings

  1. Blocking — Vercel transferMechanism misnames the UK instrument. Row currently says UK International Data Transfer Agreement. Vercel's own DPA (https://vercel.com/legal/dpa, Schedule 3) defines "UK IDTA" as the UK international data transfer addendum (Schedule 5). Every other inventory row correctly uses Addendum. Fix to UK International Data Transfer Addendum (or quote Vercel's exact DPA phrasing) before PASS.

  2. LlamaCloud planned / not live — OK and consistent with sources. On this head:

    • availability: 'not_in_production' (not where_configured, not live)
    • availabilityLabel: Planned: document extraction for admin bulk PDF uploads; not enabled in production as of Oct 28, 2026; enablement pending legal review and customer notice (exact string locked by unit test)
    • purpose also states planned / not enabled in production
      Aligns with product diligence E14 (split list; keep LlamaCloud off; don't claim where_configured when unset) and security E14 (production extraction OFF; Oct 28 Railway key-absent evidence; add inventory row with honest availability). Lead-steered "planned not live" correctly supersedes the older security draft label Where configured. Not enabled.... Region (us-east-1 / eu-central-1) and SCC Module 2/3 + UK Addendum via ToS-incorporated DPA match LlamaIndex regions docs and Terms §8.2–8.3.
  3. Non-blocking — rest of inventory checks. OpenAI / Vertex use not_in_production with the Legal not-in-production label. In-production vendors use default / where_configured as steered. TypeSafe AI and Cloudflare R2 / OpenAI region blanks are acceptable where the DPA does not state a single primary region. No en/em dashes in labels. Scope limited to trust-subprocessors.ts + test. Did not mark ready or merge (DRAFT; lawyer + C.Lee Approvals still required).

Verdict

FAIL on the Vercel UK transfer-mechanism wording only. LlamaCloud planned/not-live check passes. Re-request review after the one-word (Agreement → Addendum) fix on Vercel.

REVIEW: FAIL codex 5110012

Codex FAIL on #3707: Vercel DPA Schedule 3 defines UK IDTA as the
UK international data transfer addendum, not Agreement. Re-verified
other vendors; no other Agreement/Addendum mismatches.

Signed-off-by: Christopher Sellers <1@christophersellers.com>

@PetrefiedThunder PetrefiedThunder left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Delta re-review vs FAIL 5110012

Scope

511001238..690aa4c71: only frontend/src/lib/trust-subprocessors.ts and frontend/src/lib/__tests__/trust-subprocessors.test.ts (1 line inventory fix + 8-line regression test). Still DRAFT; not marked ready; not merged.

Findings

  1. Resolved — Vercel UK transfer mechanism. transferMechanism is now EU Standard Contractual Clauses with UK International Data Transfer Addendum. Re-checked https://vercel.com/legal/dpa Schedule 3: "UK IDTA" means the UK international data transfer addendum (Schedule 5) and UK transfers incorporate that IDTA together with the 2021 SCCs. No residual Agreement in the inventory file.
  2. Regression test — sound and data-free. Asserts the exact Vercel string and not.toMatch(/Agreement/i). No fixtures, secrets, tenant data, or network I/O.
  3. No new defects. LlamaCloud remains not_in_production with the planned / not-live label from the prior head. No other inventory fields changed in this delta.

Verdict

PASS on this head. Keep DRAFT pending lawyer + C.Lee Approvals; do not merge from this review.

REVIEW: PASS codex 690aa4c

@github-actions

github-actions Bot commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

✅ Bundle Size Report

Metric Size
Total JS 5581.1KB (5.45MB)
Total CSS 131.9KB
Limit 10.0MB

Bundle is within the 10.0MB limit.

@github-actions

github-actions Bot commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

PR Blocker Checklist

Head SHA: 8bcb95a7fb4a43a712d465f8fc009a541bbd8c67

Status: Ready

  • All review threads resolved
  • No reviews requesting changes
  • No blocked review engines

@github-actions

github-actions Bot commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

Vercel preview: https://regengine-mzh30e9lt-petrefiedthunders-projects.vercel.app

Access is via Vercel login (Deployment Protection).

…or-list

Signed-off-by: Christopher Sellers <1@christophersellers.com>
…claim

The Preview status detail on /trust said "but is not GA" in the same line
as GS1 EPCIS 2.0, which the copy gate's live-claim rule (correctly) treats
as labeling a non-live capability with GA. It fails on main too (f8d7cdf).
Reword to "has not reached general release" with the same meaning.

Also ratchet scripts/copy-lint/baseline.json down for the 10 file/rule
entries that #3641 already fixed on main (counts only decrease to 0;
nothing is added or raised).

Signed-off-by: Christopher Sellers <1@christophersellers.com>
The invite journey passed its assertions (the invitee is listed on
/settings/users) but then failed in cleanupInviteFixture with
"database is locked" on both attempts. The spec opened the admin SQLite
file with node:sqlite and no busy timeout, so any in-flight write from the
admin service made SQLite return SQLITE_BUSY immediately.

Open the database through one helper that sets PRAGMA busy_timeout=5000 so
the fixture waits for the concurrent write to commit. No assertion, skip or
retry setting changes.

Signed-off-by: Christopher Sellers <1@christophersellers.com>

@PetrefiedThunder PetrefiedThunder left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Delta review vs prior PASS 690aa4c (re-verified head 8bcb95a).

Authored non-merge commits after prior PASS: cc86948 (copy reword + baseline ratchet), 8bcb95a (e2e busy_timeout). Remerge onto current origin/main is clean and leaves the same three-file delta plus the already-reviewed E14 trust-subprocessors work.

Findings:

  1. frontend/src/app/trust/page.tsx: Preview detail "but is not GA" -> "but has not reached general release". EPCIS stays labeled Preview on the same line. No new compliance/FDA claims, no dashes, no live-claim hit (copy-lint live-claim: 0; full check and --gate vs main baseline exit 0).
  2. scripts/copy-lint/baseline.json: exactly 10 stale rule entries removed, zero additions, zero raises. Removed rules no longer fire on those paths at this head (spot-checked via check-copy.mjs).
  3. frontend/tests/e2e/authenticated-core-journeys.spec.ts: adds openAdminDatabase() with PRAGMA busy_timeout=5000 and routes expectAdminAuditLog + cleanupInviteFixture through it. No assertion, skip, or retry setting changes.

Conflict note (not a FAIL of this delta): trial merge with #3706 (7a894f0) on current main conflicts in both orders on trust/page.tsx Preview detail only. baseline.json does not conflict (identical 10-entry ratchet). Recommended resolution: keep #3706 wording ("supported workspaces only...") since that is the SEL-607 directed rewrite of this line; keep #3707 e2e busy_timeout and either PR's identical baseline ratchet.

DRAFT PR: still lawyer + C.Lee yes before merge.

REVIEW: PASS codex 8bcb95a

PetrefiedThunder added a commit that referenced this pull request Oct 29, 2026
Match #3707 wording: Preview stays evaluation-only without saying GA.
Refresh copy-lint baseline so the gate matches the scan.

Signed-off-by: Christopher Sellers <1@christophersellers.com>
PetrefiedThunder added a commit that referenced this pull request Oct 29, 2026
Match #3707 wording: Preview stays evaluation-only without saying GA.
Refresh copy-lint baseline so the gate matches the scan.

Signed-off-by: Christopher Sellers <1@christophersellers.com>
PetrefiedThunder added a commit that referenced this pull request Oct 29, 2026
Match #3707 wording: Preview stays evaluation-only without saying GA.
Refresh copy-lint baseline so the gate matches the scan.

Signed-off-by: Christopher Sellers <1@christophersellers.com>
PetrefiedThunder added a commit that referenced this pull request Oct 30, 2026
… direction (#3713)

* feat(trace): report depth exhaustion and walk transformation links by direction

Stories S1 and S2 of docs/product/FSMA_204_READINESS_GAP_ANALYSIS_2026-10-28
(PR #3701). Both close a silent-truncation path the external readiness PRD
excludes: a trace that stopped at its depth limit read as complete, and the
FDA export lineage walk followed transformation links in either direction,
so a backward step to a parent lot followed by a forward step pulled in
sibling lots that never touched the seed.

S1, records trace (`/api/v1/records/trace/forward|backward/{tlc}`):
- CanonicalEventStore.trace_walk returns a TraceWalk with `truncated`
  (result cap, #1282) and a new `depth_exhausted` flag, set when a lot was
  reached at max_depth and never expanded. Conservative, no extra query.
- trace_forward / trace_backward keep the (links, truncated) contract by
  delegating to trace_walk.
- TraceResponse gains `depth_exhausted` and `max_depth`.

S2, export lineage (`_expand_tlcs_via_transformation_links`, batch twin,
`/api/v1/fda/trace/{tlc}`):
- Direction travels as a column in the single recursive branch: forward
  rows only join input_tlc, backward rows only output_tlc. `both` is now
  the union of a pure forward and a pure backward walk (21 CFR 1.1350(c)),
  not an undirected walk, so sibling lots are excluded.
- New `_expand_tlcs_detailed` returns TlcExpansion with `depth_exhausted`
  and per-lot reach data; the list-returning functions wrap it.
- fetch_trace_graph_data labels nodes by the walk that reached them (a lot
  two hops downstream was labelled upstream before), adds per-node depth,
  and returns `direction` and `depth_exhausted`. The route accepts
  `direction=forward|backward|both` (default both).

Export and /export/verify share the same walk, so they stay consistent.
Bundles produced before this change will not reproduce byte-for-byte when
sibling lots were present; no customer bundles exist (pre-production).

Tests: depth flags on the writer walk, router response fields, direction
SQL shape on the recursive CTE, a live PostgreSQL sibling-exclusion case,
and a new route test for /api/v1/fda/trace. Verified locally against a
scratch PostgreSQL 16 at alembic head plus the tenant-scope query gate.

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

* fix(scripts): spell the key-dir mode as stat.S_IRWXU for the Semgrep gate

Ported from #3736. The Semgrep OWASP hard gate on main has flagged
scripts/create_test_api_key.py:140 (insecure-file-permissions) since
#3625 and the main merge carried the finding into this branch. The
directory mode is unchanged (owner read, write and execute only; the
key file itself stays 0600). This no-ops once main carries the fix.

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

* fix(trace): judge the depth limit per direction and keep graph edges inside the returned lots

Two review findings on the S2 walk.

depth_exhausted collapsed both walks to MIN(depth) per lot before
checking the limit, so a lot the backward walk found early hid a forward
frontier: with S -> A -> X -> S and X -> Y, a both-direction trace from S
at depth 2 omits Y (X sits at depth 2 forward, never expanded) yet read
depth_exhausted=false because X is at depth 1 backward. The CTE's final
select now takes MIN(depth) per (lot, direction) first and reports
whether any walk only reached a lot at the limit; the display depth is
still the shallowest reach. Rows without the new column fall back to
the collapsed depth.

fetch_trace_graph_data selected every link touching any returned lot,
so a sibling branch (A -> S when tracing B in A -> B, A -> S) and
opposite-direction neighbours leaked into edges and named lots absent
from nodes. Both ends must now be returned lots, in SQL and again on
the rows for persistence stubs.

Tests: unit cases for the per-direction limit (fake rows carrying the
fifth column, SQL shape) and for edge restriction; a live PostgreSQL
case for the cycle graph at depths 2, 3 and 4. All three failed before
the change. Tenant-scope query gate passes.

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

* fix(copy): Trust Preview detail avoids GA live-claim next to EPCIS

Match #3707 wording: Preview stays evaluation-only without saying GA.
Refresh copy-lint baseline so the gate matches the scan.

Signed-off-by: Christopher Sellers <1@christophersellers.com>

---------

Signed-off-by: Christopher Sellers <1@christophersellers.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
PetrefiedThunder added a commit that referenced this pull request Nov 3, 2026
…ifications (#3739)

* fix(SEL-615): show beta unavailable for SEL-614 frontend loads

* fix(copy): Trust Preview detail avoids GA live-claim next to EPCIS

Match #3707 wording: Preview stays evaluation-only without saying GA.
Refresh copy-lint baseline so the gate matches the scan.

Signed-off-by: Christopher Sellers <1@christophersellers.com>

---------

Signed-off-by: Christopher Sellers <1@christophersellers.com>
Co-authored-by: CS <cs@CSs-MacBook-Pro.local>
PetrefiedThunder added a commit that referenced this pull request Nov 4, 2026
* fix(SEL-616): degrade Compliance when readiness/summary is unavailable

Root cause of the prod 503 is outside this PR (regengine lacks SELECT
on tenants.status for the bridge-key auth path). Soften the Compliance
Dashboard so a score or workbench readiness failure stays sectional
instead of blanking the page, and document the DevOps grant in the PR.

* fix(copy): Trust Preview detail avoids GA live-claim next to EPCIS

Match #3707 wording: Preview stays evaluation-only without saying GA.
Refresh copy-lint baseline so the gate matches the scan.

Signed-off-by: Christopher Sellers <1@christophersellers.com>

* test(frontend): cover 401 on workbench readiness (SEL-616)

Readiness 401 rejects once with a machine-readable auth status, and the
Compliance page shows the unavailable state instead of placeholder
readiness data when only readiness is unauthorized.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(compliance-ui): readiness card shows loading, and survives a failed score refetch (SEL-616)

- Both Import readiness cards render a loading line while the readiness
  request is in flight, instead of placeholder 'No saved preflight run
  yet' / '0 open fixes' data.
- The score-down readiness strip now shows whenever the score errors,
  including when react-query still holds a cached score from an earlier
  good load. Previously both readiness cards were hidden in that case.

Display-only; no scoring or compliance logic changed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Signed-off-by: Christopher Sellers <1@christophersellers.com>
Co-authored-by: CS <cs@CSs-MacBook-Pro.local>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

This branch was successfully deployed

1 active deployment
Preview — 8bcb95a7 Deployed Oct 28, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant