Commit Graph

4747 Commits

Author SHA1 Message Date
Émile Ré
505f7a53ff Add base text-rendering layer to v2 theme
Apply font smoothing (antialiased / grayscale) and overflow-wrap on
the document base, mirroring the root defaults Radix Themes sets.
Placed in @layer base so any utility can override it. The body font
is left to Tailwind's preflight, which already applies --font-sans.

Signed-off-by: Émile Ré <emile@probo.com>
2026-06-18 11:44:14 +02:00
Émile Ré
e5fc522f61 Split v2 theme into per-layer files
Move each token layer of the v2 theme into its own file under
packages/ui/src/v2/theme (colors, typography, radius, shadows) and
reduce theme.css to an entry that imports them. The public import
path (@probo/ui/src/v2/theme.css) is unchanged, so adopters and the
docs keep working; this only improves navigability as the theme
grows. No token values change.

Signed-off-by: Émile Ré <emile@probo.com>
2026-06-18 11:44:14 +02:00
Émile Ré
48ff1b6ea7 Register sand alpha color utilities
Expose the translucent neutral scale as bg-/text-/border-sand-a1
... sand-a12, mapped to the imported --sand-a* variables so they
switch light/dark like the solid steps. Enables overlays, scrims,
and layered tints without hardcoded rgba. Limited to sand; the
other hues keep only their solid steps for now.

Signed-off-by: Émile Ré <emile@probo.com>
2026-06-18 11:44:13 +02:00
Émile Ré
d7d6ddda2b Load Inter via Fontsource and set mono stack
Self-host the Inter variable font through @fontsource-variable/inter
rather than a CDN, so the v2 type scale renders in Inter with no
third-party request. Import it from the theme and point --font-sans
at the "Inter Variable" family the package registers.

Add --font-mono as a Radix-style system stack: the design specifies
Menlo, an Apple system font that cannot be self-hosted, so it falls
back per OS (Consolas, Liberation Mono, Monaco, monospace).

Signed-off-by: Émile Ré <emile@probo.com>
2026-06-18 11:44:13 +02:00
Émile Ré
87d6d9d0d6 Add Radix radius and shadow scales to v2 theme
Source both token scales from Radix: rounded-1 ... rounded-6 (the
Radix "Medium" radius set, 3-16px) and shadow-1 ... shadow-6
(ported from @radix-ui/themes tokens/shadow.css with the gray
neutral mapped to sand).

Import the sand/black alpha color scales that the shadow layers
reference, and register the shadows via @theme inline so those
alpha tokens carry light/dark switching automatically, the same
way the color scale works. Each scale resets its Tailwind
namespace (--radius-* / --shadow-*) to initial so a v2 build
exposes only the numeric Radix scale.

Signed-off-by: Émile Ré <emile@probo.com>
2026-06-18 11:44:13 +02:00
Émile Ré
591ac52cb5 Add Radix typography scale to v2 theme
Define the v2 typography tokens sourced from the Probo Radix UI
Figma file: font sizes 1-9 with paired line-height and
letter-spacing, the Inter sans family, and the light/regular/
medium/bold weights, exposed as text-1 ... text-9 utilities.

Reset Tailwind's default t-shirt type scale (--text-*: initial)
so a v2 build exposes only the numeric Radix scale, mirroring how
the color block wipes --color-*. Letter-spacing is kept in em so
tracking scales with font size, per the Radix specification.

Signed-off-by: Émile Ré <emile@probo.com>
2026-06-18 11:44:13 +02:00
Émile Ré
f49d7846e4 Make v2 theme a standalone colors config
Turn the v2 theme into a build-level standalone color system instead
of a runtime-scoped add-on. Reset Tailwind's default palette and keep
only transparent, black, white, and the Radix scales, so an app opts
into v2 by importing it in place of the v1 theme.

Drop the redundant [data-theme="v2"] block: isolation now comes from
the separate import, and the inline utilities never read those tokens.
Update the v2 color guide to describe build-level isolation.

Signed-off-by: Émile Ré <emile@probo.com>
2026-06-18 11:44:13 +02:00
Émile Ré
5a5c853346 Add v2 color theme with Radix 12-step scales
Introduce a new v2 theme system in packages/ui/src/v2/ using
@radix-ui/colors for sand, gold, red, green, amber, and sky scales.
Colors are imported from the library (with P3 wide-gamut support),
mapped to Tailwind via @theme inline, and scoped under
[data-theme="v2"] for isolation from the existing v1 theme. Dark mode
activates via the .dark class on <html>.

Includes contributor docs (contrib/claude/v2-colors.md) and a Cursor
rule (.cursor/rules/v2-color-scale.mdc) for the color system.

Signed-off-by: Émile Ré <emile@probo.com>
2026-06-18 11:44:13 +02:00
Bryan Frimin
4535cd47fd Style
Signed-off-by: Bryan Frimin <bryan@probo.com>
2026-06-18 11:42:12 +02:00
Bryan Frimin
5495f8e86b Release probod/v0.211.2
Signed-off-by: Bryan Frimin <bryan@probo.com>
2026-06-18 11:39:19 +02:00
Bryan Frimin
7e4b060c12 Fix exit codes
Signed-off-by: Bryan Frimin <bryan@probo.com>
2026-06-18 11:36:49 +02:00
Bryan Frimin
f40be113cf Release probod/v0.211.1 2026-06-18 11:09:11 +02:00
Bryan Frimin
44cb00a1a1 Fix missing os exit code on error
Signed-off-by: Bryan Frimin <bryan@probo.com>
2026-06-18 11:06:59 +02:00
Bryan Frimin
9678afac6a Release proboctl/v0.5.0
Signed-off-by: Bryan Frimin <bryan@probo.com>
2026-06-18 11:04:22 +02:00
Bryan Frimin
b1c8e56b58 Release probod/v0.211.0
Signed-off-by: Bryan Frimin <bryan@probo.com>
2026-06-18 11:03:08 +02:00
Bryan Frimin
40afa2b377 Update kit version
Signed-off-by: Bryan Frimin <bryan@probo.com>
2026-06-18 10:55:35 +02:00
Bryan Frimin
91945442b3 Always output error as json when panic
Signed-off-by: Bryan Frimin <bryan@probo.com>
2026-06-18 10:39:52 +02:00
Sacha Al Himdani
127b78cace Migrate emails to the unified react-email package
Replace the deprecated @react-email/components dependency (and its
deprecated sub-packages) with the unified react-email package per the
React Email 6 migration, updating all component and render imports across
the email templates from "@react-email/components" to "react-email".

This removes the npm deprecation warnings emitted by the old
@react-email/* packages while keeping the template build output
unchanged.

Signed-off-by: Sacha Al Himdani <sacha@probo.com>
2026-06-17 17:41:46 +02:00
Cursor Agent
c195320649 Add document delete confirmation
Route document deletion through explicit confirmation dialogs so single and bulk delete actions require users to acknowledge the destructive operation before the mutation runs.

Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Sacha Al Himdani <SachaProbo@users.noreply.github.com>
2026-06-17 07:55:00 +00:00
Émile Ré
a37dd4d332 Fix lint issues
Signed-off-by: Émile Ré <emile@probo.com>
2026-06-16 18:11:14 +02:00
Émile Ré
ec4e142df2 Show enrichment provenance in proboctl catalog views
The common tracker pattern "show" only printed attempt counters, so the
enrichment payload — run status, model, agent attribution, and per-field
outcomes — was invisible, and a partial run was indistinguishable from a
complete one. Render that payload the same way the common third party
"show" already does.

Surface the last enrichment attempt timestamp in both catalog list views
so an operator can spot stale or never-attempted rows at a glance.

Signed-off-by: Émile Ré <emile@probo.com>
2026-06-16 17:44:58 +02:00
Émile Ré
829771b7cc Supply enrichment_attempts in tracker pattern seed
The migration dropped the DEFAULT on
common_tracker_patterns.enrichment_attempts, so the column is now
NOT NULL with no default and inserts must set it explicitly. The e2e
seedCommonTrackerPattern helper still did a raw insert without it,
which broke TestThirdParty_ImportFromCommon and
TestTrackerPattern_CommonTrackerPatternID with a 23502 violation. Pass
0 for the seeded rows.

Signed-off-by: Émile Ré <emile@probo.com>
2026-06-16 17:44:57 +02:00
Émile Ré
46fc755b6e Fix enrichment re-arm and migration backfill gaps
Three crash- and migration-recovery gaps in the unified enrichment
model left rows stuck or misclassified:

- Upsert re-armed a blank, newly-linked tracker pattern without
  clearing its prior enrichment payload. A crash between the worker's
  claim and persist then left the row with a stale payload, so the
  stale-recovery sweep (which only catches rows with a null payload)
  skipped it forever. Clear enrichment on re-arm so the row reads as
  not-yet-completed again, and pin the behavior with a test.

- The migration added last_enrichment_attempt_at to
  common_third_parties without seeding it. Rows with prior attempts
  kept a NULL clock and could never satisfy the stale-reset predicate.
  Backfill from updated_at, the historical claim-time proxy.

- The migration switched the tracker-pattern enriched-state source to
  the enrichment payload without backfilling rows previously marked by
  enriched_at, making already-enriched rows read as unenriched.
  Seed a provenance sentinel for rows that carried the old done-flag.

Signed-off-by: Émile Ré <emile@probo.com>
2026-06-16 17:44:57 +02:00
Émile Ré
1eed89606c Add --enrich flag to common third party upsert
Let an operator create or update a catalog third party and queue it for
the async enrichment worker in one step, so a minimal name/category row
gets its profile, compliance documents, owned domains, and logo filled
in without a separate reenrich call.

Enrichment is armed explicitly via RequestEnrichmentByIDs rather than
through the receiver: the coredata Upsert sets enrichment_requested_at
from the receiver only on insert and leaves it untouched on conflict,
so this is the only path that re-arms an existing row uniformly while
also resetting the attempt budget for a fresh run.

Signed-off-by: Émile Ré <emile@probo.com>
2026-06-16 17:44:57 +02:00
Émile Ré
ef6cead482 Unify enrichment tracking and outcome-based status
Make common_tracker_patterns and common_third_parties share one
enrichment-tracking model and fix the misleading proboctl status.

Both tables now carry the enrichment JSONB provenance payload, an
enrichment_attempts counter, and a last_enrichment_attempt_at clock.
On common_tracker_patterns the enriched_at done-flag is renamed to
last_enrichment_attempt_at and stamped at claim time, so it is truthful
to "attempt" rather than "success". A row is considered to have been
through the workflow when it carries an enrichment payload, not when a
timestamp is set, which lets stale recovery key off the payload being
absent with budget remaining, exactly like common_third_parties.

The claim path reads the attempt counter and timestamp back via
RETURNING so the in-memory receiver matches the database clock instead
of a separate app-side time.Now.

The enricher builds a per-field provenance payload (description and
third-party outcomes plus the mapping attribution) and persists it via
UpdateEnrichment, named to mirror the common-third-party sibling. The
common pattern enrichment worker gains a max-attempts ceiling so a
permanently failing row stops looping.

proboctl now shows "enriched" only when every field the last run
recorded an outcome for resolved a value, otherwise "partial (X/Y)",
replacing the misleading "enriched (no description)" label.

Signed-off-by: Émile Ré <emile@probo.com>
2026-06-16 17:44:57 +02:00
Bryan Frimin
a6ed64caaf Stop source-name loop on Google 403
A token without admin.directory.customer.readonly makes
Customers.Get return 403 forever. Treat that as terminal so
the source-name worker keeps the generic name and stops
retrying.

Signed-off-by: Bryan Frimin <bryan@probo.com>
2026-06-16 17:13:25 +02:00
dependabot[bot]
18be2b5772 Bump the github-actions group across 1 directory with 10 updates
Bumps the github-actions group with 10 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [runs-on/action](https://github.com/runs-on/action) | `2.1.0` | `2.1.2` |
| [actions/upload-artifact](https://github.com/actions/upload-artifact) | `7.0.0` | `7.0.1` |
| [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) | `4.0.0` | `4.1.0` |
| [docker/login-action](https://github.com/docker/login-action) | `4.0.0` | `4.2.0` |
| [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) | `db582008a42febd596419635a5abc9d9815daa9c` | `82606bf257cbaff209d206a39f5134f0cfbfd2ee` |
| [docker/setup-compose-action](https://github.com/docker/setup-compose-action) | `2.1.0` | `2.2.0` |
| [azure/setup-helm](https://github.com/azure/setup-helm) | `4.3.0` | `5.0.0` |
| [actions/setup-node](https://github.com/actions/setup-node) | `6.3.0` | `6.4.0` |
| [sigstore/cosign-installer](https://github.com/sigstore/cosign-installer) | `4.0.0` | `4.1.2` |
| [trufflesecurity/trufflehog](https://github.com/trufflesecurity/trufflehog) | `5f47aad1c2df34f7c6230784ce9a5a659922f479` | `d411fff7b8879a62509f3fa98c07f247ac089a51` |



Updates `runs-on/action` from 2.1.0 to 2.1.2
- [Release notes](https://github.com/runs-on/action/releases)
- [Commits](742bf56072...d141ef83eb)

Updates `actions/upload-artifact` from 7.0.0 to 7.0.1
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v7...043fb46d1a93c77aae656e7c1c64a875d1fc6a0a)

Updates `docker/setup-buildx-action` from 4.0.0 to 4.1.0
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](4d04d5d948...d7f5e7f509)

Updates `docker/login-action` from 4.0.0 to 4.2.0
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](https://github.com/docker/login-action/compare/v4...650006c6eb7dba73a995cc03b0b2d7f5ca915bee)

Updates `golangci/golangci-lint-action` from db582008a42febd596419635a5abc9d9815daa9c to 82606bf257cbaff209d206a39f5134f0cfbfd2ee
- [Release notes](https://github.com/golangci/golangci-lint-action/releases)
- [Commits](db582008a4...82606bf257)

Updates `docker/setup-compose-action` from 2.1.0 to 2.2.0
- [Release notes](https://github.com/docker/setup-compose-action/releases)
- [Commits](8cccb8c14b...16feee727c)

Updates `azure/setup-helm` from 4.3.0 to 5.0.0
- [Release notes](https://github.com/azure/setup-helm/releases)
- [Changelog](https://github.com/Azure/setup-helm/blob/main/CHANGELOG.md)
- [Commits](b9e51907a0...dda3372f75)

Updates `actions/setup-node` from 6.3.0 to 6.4.0
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](53b83947a5...48b55a011b)

Updates `sigstore/cosign-installer` from 4.0.0 to 4.1.2
- [Release notes](https://github.com/sigstore/cosign-installer/releases)
- [Commits](faadad0cce...6f9f177880)

Updates `trufflesecurity/trufflehog` from 5f47aad1c2df34f7c6230784ce9a5a659922f479 to d411fff7b8879a62509f3fa98c07f247ac089a51
- [Release notes](https://github.com/trufflesecurity/trufflehog/releases)
- [Commits](5f47aad1c2...d411fff7b8)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: 6.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: actions/upload-artifact
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: azure/setup-helm
  dependency-version: 5.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: docker/login-action
  dependency-version: 4.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: docker/setup-buildx-action
  dependency-version: 4.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: docker/setup-compose-action
  dependency-version: 2.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: golangci/golangci-lint-action
  dependency-version: 82606bf257cbaff209d206a39f5134f0cfbfd2ee
  dependency-type: direct:production
  dependency-group: github-actions
- dependency-name: runs-on/action
  dependency-version: 2.1.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: sigstore/cosign-installer
  dependency-version: 4.1.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: trufflesecurity/trufflehog
  dependency-version: d411fff7b8879a62509f3fa98c07f247ac089a51
  dependency-type: direct:production
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-16 16:18:49 +02:00
dependabot[bot]
3b7d076e9d Bump dompurify from 3.4.0 to 3.4.10
Bumps [dompurify](https://github.com/cure53/DOMPurify) from 3.4.0 to 3.4.10.
- [Release notes](https://github.com/cure53/DOMPurify/releases)
- [Commits](https://github.com/cure53/DOMPurify/compare/3.4.0...3.4.10)

---
updated-dependencies:
- dependency-name: dompurify
  dependency-version: 3.4.10
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-16 15:47:52 +02:00
dependabot[bot]
bbce8cd4f4 Bump markdown-it from 14.1.1 to 14.2.0
Bumps [markdown-it](https://github.com/markdown-it/markdown-it) from 14.1.1 to 14.2.0.
- [Changelog](https://github.com/markdown-it/markdown-it/blob/master/CHANGELOG.md)
- [Commits](https://github.com/markdown-it/markdown-it/compare/14.1.1...14.2.0)

---
updated-dependencies:
- dependency-name: markdown-it
  dependency-version: 14.2.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-16 15:37:17 +02:00
dependabot[bot]
695e2d1118 Bump protobufjs from 7.6.1 to 7.6.4
Bumps [protobufjs](https://github.com/protobufjs/protobuf.js) from 7.6.1 to 7.6.4.
- [Release notes](https://github.com/protobufjs/protobuf.js/releases)
- [Changelog](https://github.com/protobufjs/protobuf.js/blob/protobufjs-v7.6.4/CHANGELOG.md)
- [Commits](https://github.com/protobufjs/protobuf.js/compare/protobufjs-v7.6.1...protobufjs-v7.6.4)

---
updated-dependencies:
- dependency-name: protobufjs
  dependency-version: 7.6.4
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-16 15:24:27 +02:00
Sacha Al Himdani
9ab8ea2085 Refacto load all functions
Unbounded LoadAll* loaders materialised an entire result set in one
query with no ceiling. A table that is small in development can grow
without bound in production, so these loaders were a latent memory
and query-time hazard.

Remove the LoadAll* methods from pkg/coredata and walk the cursor-
paginated LoadBy* siblings instead through a shared page.LoadAll
helper. The helper advances a MaxCursorSize forward cursor until the
result set is exhausted and concatenates the pages. It caps a single
call at MaxLoadAllPages (20) batches of 500 rows and errors past that
rather than materialising an unbounded set, so a runaway caller fails
loudly instead of exhausting memory.

Callers that genuinely need every row now express that explicitly,
and the coredata load-naming rule and docs are updated to discourage
new unbounded loaders.

Signed-off-by: Sacha Al Himdani <sacha@probo.com>
2026-06-16 14:35:16 +02:00
dependabot[bot]
853f2404a6 Bump esbuild from 0.27.7 to 0.28.1
Bumps [esbuild](https://github.com/evanw/esbuild) from 0.27.7 to 0.28.1.
- [Release notes](https://github.com/evanw/esbuild/releases)
- [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md)
- [Commits](https://github.com/evanw/esbuild/compare/v0.27.7...v0.28.1)

---
updated-dependencies:
- dependency-name: esbuild
  dependency-version: 0.28.1
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-16 13:37:43 +02:00
Sacha Al Himdani
29be61acbc Release probod/v0.210.0
Signed-off-by: Sacha Al Himdani <sacha@probo.com>
2026-06-16 13:30:23 +02:00
Sacha Al Himdani
e189190a77 Release prb/v0.195.0
Signed-off-by: Sacha Al Himdani <sacha@probo.com>
2026-06-16 13:28:15 +02:00
Sacha Al Himdani
50658a42a4 Fix dangling release guide link in AGENTS.md
The release guide was refactored from a single contrib/claude/release.md
into a contrib/claude/release/ directory with a README index and per-track
guides, but the AGENTS.md link was never updated and pointed at a missing
file. Repoint it to release/README.md. CLAUDE.md is a symlink to AGENTS.md,
so it inherits the fix.

Signed-off-by: Sacha Al Himdani <sacha@probo.com>
2026-06-16 13:23:03 +02:00
Sacha Al Himdani
de26b889ff Coalesce nil additional emails to empty array
The MCP Profile schema declares additional_email_addresses as a
required, non-nullable array, but NewProfile passed the mail.Addrs
value through unchanged. A profile with no extra emails has a nil
slice, which marshals to JSON null and fails tool output validation
with "type: null, want array".

Default the nil slice to an empty mail.Addrs so the marshalled output
always honors the strict array schema.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-06-16 12:47:28 +02:00
Ludovic Vielle
8094e7cfd0 Truncate access review roles with badge list
Long role strings in the access review table broke row layout when
drivers joined many roles into one comma-separated value. Expose
roles as a string array in GraphQL by splitting the stored role at
the API layer, and render the first three roles as badges with a
"+X more" popover for the rest.

Closes ENG-459.

Signed-off-by: Ludovic Vielle <ludovic@probo.com>
2026-06-16 11:25:31 +02:00
Sacha Al Himdani
bf20ca1a90 Add esign to document signatures
Employee document signatures recorded an acknowledgment with no
cryptographic proof, unlike document approvals which already create
and accept an electronic signature on every decision.

Mirror the approval flow on the sign path: generate the signed
document PDF, create-and-accept an esign record, and persist its id
on the document_version_signatures row through a new
electronic_signature_id column. Capture the signer IP and user agent
in the resolver, and re-check the published/archived preconditions
inside the transaction so the seal cannot race document state.

Make the consent wording a single backend source of truth shared by
the text that is sealed and the text shown in the UI. Define
DocumentSignatureConsentText and DocumentApprovalConsentText in the
probo service package and the NDA copy in the trust service, each
owned by the flow that uses it, and stop esign from appending the
generic clause to caller-provided consent text so approvals no
longer seal a duplicated sentence.

Expose the resolved consent text through GraphQL on
EmployeeDocumentVersion and DocumentVersionApprovalDecision, and have
the signing, approval, and NDA pages render it from the API instead
of hard-coded strings, mirroring how the NDA page already worked.

Align the wording with the actual interaction: the buttons read
"Review and sign" and "Review and approve", the clauses reference
those actions, and the inaccurate "typing my full name" phrasing is
removed everywhere.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-06-15 19:18:42 +02:00
Ludovic Vielle
71e8d662bc Log every authorization decision from the authorizer
Denials were invisible in the audit trail and evaluator explainability
(policy_id, reason) was discarded before reaching logs. Emit a structured
authz decision line on every evaluation in evaluateMultiInTx — allow,
deny, no_match, and assumption errors — using the existing authorizer
logger with opaque IDs only.

Add decision_log.go with DecisionRecord and logDecision. Surface
PolicyID and Reason on EvaluationResult for logging. Audit log
behavior is unchanged (allow-only). Document the convention in
authorization.md.

Signed-off-by: Ludovic Vielle <ludovic@probo.com>
2026-06-15 17:53:34 +02:00
Bryan Frimin
c8de75cc03 Remove deadcode
Signed-off-by: Bryan Frimin <bryan@probo.com>
2026-06-15 16:49:09 +02:00
Bryan Frimin
2dc34df4e1 Fix access review e2e tests after API refactor
The campaign source node test queried entries before starting the
campaign, and the lifecycle test used the old accessEntry field name
instead of accessReviewEntry.

Signed-off-by: Bryan Frimin <bryan@probo.com>
2026-06-15 16:49:08 +02:00
Bryan Frimin
67a68da371 Fix missing organization id
Signed-off-by: Bryan Frimin <bryan@probo.com>
2026-06-15 16:49:08 +02:00
Bryan Frimin
35910d1e6e Style
Signed-off-by: Bryan Frimin <bryan@probo.com>
2026-06-15 16:49:08 +02:00
Bryan Frimin
eed6bf579d Refactor access review campaign source API
Expose campaign sources as first-class nodes, paginate fetch attempts
instead of denormalized status fields, and bind entries to their
campaign snapshot. Update GraphQL, MCP, CLI, console, and e2e coverage
to match.

Signed-off-by: Bryan Frimin <bryan@probo.com>
2026-06-15 16:49:08 +02:00
Bryan Frimin
82c9800677 Drop unused access review source category
Source category was never surfaced in the product and added noise to
snapshots and APIs. Remove the enum, columns, and service fields so
campaign sources track only the identity fields reviewers need.

Signed-off-by: Bryan Frimin <bryan@probo.com>
2026-06-15 16:49:07 +02:00
Bryan Frimin
7138ae2273 Backfill csv_data on campaign sources
Fresh installs already had csv_data on campaign sources from the
initial migration; add a follow-up migration to backfill existing
rows from the live source snapshot.

Signed-off-by: Bryan Frimin <bryan@probo.com>
2026-06-15 16:49:07 +02:00
Bryan Frimin
8d8a5ebb26 Probe every access review connector on status check
Bad API keys and expired OAuth tokens showed Connected because
probes ran only for OAuth2 and many providers had no ProbeURL.
Add a registry ProbeConnection dispatcher with static, dynamic,
and custom probes so all 41 providers are checked on demand.

Signed-off-by: Bryan Frimin <bryan@probo.com>
2026-06-15 16:49:07 +02:00
Bryan Frimin
26d64a970f Remove deleted source badge from campaign detail
The badge did not help reviewers act on campaign entries once a
source snapshot is attached.

Signed-off-by: Bryan Frimin <bryan@probo.com>
2026-06-15 16:49:07 +02:00
Bryan Frimin
a30a714fcd Style
Signed-off-by: Bryan Frimin <bryan@probo.com>
2026-06-15 16:48:54 +02:00
Bryan Frimin
aba0ae71ba Style
Signed-off-by: Bryan Frimin <bryan@probo.com>
2026-06-15 16:47:54 +02:00