Skip to content

UN-4399 [FEAT] Organisation capability permissions API - #2344

Merged
ritwik-g merged 1 commit into
feat/UN-4398-platform-auditfrom
feat/UN-4399-capability-permissions
Oct 22, 2026
Merged

ritwik-g merged 1 commit into
feat/UN-4398-platform-auditfrom
feat/UN-4399-capability-permissions

Conversation

@ritwik-g

Copy link
Copy Markdown
Contributor

What

PR-1 of UN-4399 (Frontend v1 PB-T04): organisation capability permissions. An org admin chooses, per capability, whether any member or only admins may use it.

  • Storage. Seven capabilities, each a restrict_* boolean on Organization.
    • The two existing fields, restrict_llm_adapter_creation and restrict_connector_creation, are the storage for the first two capabilities.
    • Five new fields are added (migration account_v2/0008), with defaults that match today's behaviour.
  • Read and write API. GET/PATCH /api/v1/unstract/{org}/organization/capabilities/.
    • GET returns every capability with its setting and allowed_for_me. Any member may call it.
    • PATCH accepts any subset of keys and validates everything before saving. Organisation admins only.
  • Legacy sync. organization/settings is unchanged and stays in step by construction, because both endpoints read and write the same fields.
  • Audit. Each changed capability records one capability.changed event through the PB-T01 recorder, whichever endpoint made the change.
  • Enforcement (the capabilities that need no product decision):
    • LLM adapter creation, connector creation and other-adapter creation (all non-LLM types).
    • Deleting workflows, API deployments and pipelines. This adds a check next to IsOwner, so with any_member nothing changes, and with admins_only owners who are not admins are refused.
  • Contract. backend/tenant_account_v2/CAPABILITIES.md (endpoint, payloads, errors, TypeScript interfaces, what allowed_for_me means) plus @extend_schema, following the PB convention.

Stacked on #2342 (PB-T01). This PR's base is that branch, so the diff shows only PB-T04.

Why

  • Frontend v1 PB-T04 (gap G-04). The Platform › Permissions tab (P3-T12) consumes this contract.

How

  • tenant_account_v2/capabilities.py holds the registry: Capability, CapabilitySetting, a spec per capability, is_allowed, enforce_capability and the RequiresCapability DRF permission.
  • Service accounts are never subject to a capability check, so every endpoint keeps its existing exemptions.
  • "Admin" uses the existing OrganizationMemberService.is_user_organization_admin.

Decide-and-flag choices (tracker decisions/D-PB-T04-*; UN-4399 comment 47083)

  • Unenforced capabilities refuse any_member. Until PR-2 lands, PATCH refuses any_member for manage_api_keys, manage_members and change_platform_defaults. Their endpoints are still admin-only, so storing that value would make allowed_for_me misleading.
  • Labels and descriptions are my wording, not the design's. Labels use the spec's capability names; I wrote the short descriptions. Figma P12 was not accessible, so all the copy lives in capabilities.py and is a one-place swap.
  • One audit event, with PB-T01's action key. Changes are recorded as capability.changed, the key PB-T01 already registered. The legacy organization/settings PATCH now records capability.changed instead of platform_setting.changed. PB-T01's README and its test are updated in this branch to match.
  • Per-user default adapters are not governed. The per-user adapter/default_triad stays open to members, as in the dossier's default.

Can this PR break any existing features. If yes, please list possible items. If no, please explain why. (PS: Admins do not merge the PR without this section filled)

  • With default settings there is no change in behaviour: every new field defaults to what the code does today.
  • The two legacy refusals keep their exact messages. The LLM and connector checks were moved onto the registry with the same logic.
  • Deletion gains an extra check, but it is a no-op unless an admin sets delete_workflows_and_deployments to admins_only.
  • Behaviour change: organization/settings PATCH now records capability.changed in the audit log, not platform_setting.changed. That only matters if UN-4398 [FEAT] Platform audit log: event store and admin read API #2342 is merged first.

Database Migrations

  • account_v2/0008_organization_capability_settings adds five boolean columns to organization, each with a default.

Env Config

  • None.

Relevant Docs

  • backend/tenant_account_v2/CAPABILITIES.md
  • The spec is in PT 1637187626 (PB-T04).

Related Issues or PRs

Dependencies Versions

  • None.

Notes on Testing

  • backend/tenant_account_v2/test_capabilities.py covers:
    • the registry;
    • GET defaults and allowed_for_me for admin, member and service account;
    • PATCH permissions, validation and saving nothing on bad input;
    • unenforced capabilities;
    • legacy sync in both directions;
    • the audit events;
    • the full enforcement matrix: four enforced capabilities × both settings × {admin, member, service account}, through the real connector and workflow views;
    • deletion gating for API deployments and pipelines.
  • makemigrations --check is clean.
  • The unit-backend and integration-backend rig tiers were run locally, because CI skips draft PRs. Results are in a comment below.

Screenshots

  • None; this is backend only.

Checklist

I have read and understood the Contribution Guidelines.

🤖 Generated with Claude Code

@sonarqubecloud

Copy link
Copy Markdown

@ritwik-g ritwik-g left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Self-review round 1 — unstract:review-deep (INITIAL) at tip 5b1da17de

Review: review-deep. The PR adds a migration, a permission class and a new endpoint. It is stacked on #2342, so the base is feat/UN-4398-platform-audit (merge base b0fa57faa). Scope is 15 files, 909 lines; the file count matches GitHub's.

Signals: lenses 4, 5, 7, 13 and 16 raised, from account_v2/0008, RequiresCapability and the destroy permission lists, the new endpoint and serializers, the new tests, and CAPABILITIES.md and the README.

Verdict — REQUEST CHANGES

Summary — Critical: 0 · High: 1 · Medium: 6 · Low: 5 · Lenses run: 19/19 (lenses 12, 14 and 19 are N/A).

Security deep-dive: done. No findings at confidence ≥ 8. The one candidate (filtered at 3/10) is filed as #3.

boundary-sweep: 2 sinks traced, clean. Those are the audit event payloads and the refusal messages; neither carries secrets.

Lens checklist

  1. Spec & intent — Clean (code-reviewer)
  2. Architectural fit & precedent — Clean (code-reviewer)
  3. Correctness & edge cases — See findings #3, #4
  4. Security — See findings #3
  5. Data integrity & migrations — See findings #2
  6. Concurrency — Clean (infra agent: update_fields scoped per key)
  7. API & contract compatibility — See findings #8, #9 (orchestrator consumer search: organization/settings response unchanged; no consumers of the new endpoint)
  8. Reliability & resilience — Clean (infra agent)
  9. Performance & cost — Clean (code-reviewer: one org query per delete; admin lookup memoized)
  10. Observability — Clean (code-reviewer)
  11. Operational safety — See findings #2
  12. LLM/agent-specific — N/A — no LLM code
  13. Testing — See findings #1, #7, #11
  14. Dependencies & build — N/A — none
  15. Code quality — See findings #12 (orchestrator: pre-commit passed)
  16. Doc & comment accuracy — See findings #5, #6, #10
  17. Cross-document rule consistency — See findings #5 (orchestrator: README vs CAPABILITIES.md vs code)
  18. On-prem deployment experience — See findings #2 (an on-prem image downgrade hits the same NOT NULL insert)
  19. Scaling & workload lifecycle — N/A — none

Open questions for the author

  • Does the deploy pipeline ever roll back the backend image without reversing migrations? This affects #2, which is fixed either way.

Assumptions made

  • Platform-key sessions can reach organization/capabilities/.

cost: agents=8 wall=12:00 lenses-examined=16 of 19 files=15 lines=909

Comment thread backend/workflow_manager/workflow_v2/views.py
Comment thread backend/adapter_processor_v2/views.py
Comment thread backend/tenant_account_v2/capabilities.py
Comment thread backend/platform_audit/README.md Outdated
Comment thread backend/tenant_account_v2/serializer.py
Comment thread backend/tenant_account_v2/views.py
Comment thread backend/platform_audit/README.md Outdated
Comment thread backend/tenant_account_v2/test_capabilities.py Outdated
Comment thread backend/tenant_account_v2/capabilities.py

@ritwik-g ritwik-g left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Self-review round 2 — unstract:review-deep (FOLLOWUP) at tip 10969981d

Review: review-deep. The PR carries a migration and an authz change.

Delta: 5b1da17de..10969981d (162 lines). There is no cold read this round because the delta is under 200 lines.

Verdict — REQUEST CHANGES

Summary — Critical: 0 · High: 1 · Medium: 3 · Low: 2 · Lenses run: 19/19 (lenses 12, 14 and 19 are N/A).

Prior context fetched — followup-fetch.sh exited 0. "Since" boundary: the previous review's SHA, 5b1da17de.

Scope change — NO

Security deep-dive: done. No findings at confidence ≥ 8; not degraded.

Boundary sweep: 2 sinks traced, clean.

Prior findings status

  • #1 [High] destroy ownership untested → RESOLVED. The non-owner case and an IsOwner presence check are added; mutants killed.
  • #2 [Medium] no database defaults on the new columns → RESOLVED. RunSQL SET DEFAULT, verified on Postgres 15. The test gap is #16.
  • #3 [Medium] adapter type change on update → RESOLVED. The new type is enforced; the allowed side is untested (#15).
  • #4 [Medium] service accounts on unenforced capabilities → NOT RESOLVED. The fix overshot; see #13.
  • #5, #6, #7, #9, #10, #11 → RESOLVED.
  • #8 [Low] enum names → NOT RESOLVED. The override has no effect; see #14.
  • #12 [Low] "organisation" spelling → WAIVED. It is the spec's literal wording (dossier decision).

Lens checklist

  1. Spec & intent — Clean (code-reviewer)
  2. Architectural fit & precedent — Clean (code-reviewer)
  3. Correctness & edge cases — See findings #13, #18
  4. Security — Clean (orchestrator; security deep-dive done)
  5. Data integrity & migrations — See findings #16
  6. Concurrency — Clean (infra agent)
  7. API & contract compatibility — See findings #14 (orchestrator: no consumers yet)
  8. Reliability & resilience — Clean (infra agent)
  9. Performance & cost — Clean (code-reviewer)
  10. Observability — Clean (code-reviewer)
  11. Operational safety — Clean (infra agent: the RunSQL defaults match the model; reverse is clean)
  12. LLM/agent-specific — N/A — no LLM code
  13. Testing — See findings #15, #16, #17
  14. Dependencies & build — N/A — none
  15. Code quality — Clean (orchestrator: pre-commit passed)
  16. Doc & comment accuracy — See findings #13, #17
  17. Cross-document rule consistency — See findings #13
  18. On-prem deployment experience — Clean (infra agent: on-prem runs the same migrate; the defaults keep an image downgrade safe)
  19. Scaling & workload lifecycle — N/A — none

Open questions for the author

  • Should repointing an existing LLM adapter to another provider count as "creating" one? For now this is documented as not governed (#18).

Assumptions made

  • None.

cost: agents=7 wall=09:00 lenses-examined=16 of 19 files=16 lines=1019

Comment thread backend/tenant_account_v2/capabilities.py
Comment thread backend/backend/settings/base.py Outdated
Comment thread backend/adapter_processor_v2/views.py
Comment thread backend/tenant_account_v2/views.py
Comment thread backend/tenant_account_v2/CAPABILITIES.md Outdated

@ritwik-g ritwik-g left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Self-review round 3 — unstract:review-deep (FOLLOWUP) at tip 9ba8ed2dd

Review: review-deep. The PR carries a migration and an authz change, so review-shallow's gate refuses it.

Pinned to b4dfa18fb: pre-commit.ci's ruff-format autofix, pushed during the round. It differs from the reviewed tip 9ba8ed2dd only by that formatting, which fixes #21.

Delta: 10969981d..9ba8ed2dd (136 lines, 5 files). There is no cold read this round because the delta is under 200 lines.

Verdict — REQUEST CHANGES

Summary — Critical: 0 · High: 0 · Medium: 1 · Low: 2 · Lenses run: 19/19 (N/A: 12, 14).

Prior context fetched — followup-fetch.sh fetched 6 of 6. "Since" boundary: 10969981d.

Scope change — NO

Security deep-dive: done. The find pass returned no candidates at confidence ≥ 6, so no filtering was needed; not degraded.

Boundary sweep: 0 new sinks in the delta. Clean.

Base fetch: ok. The count is verified against GitHub (16 files).

Prior findings status

  • #4, #8, #13–#18 → RESOLVED in 9ba8ed2dd. Each thread has a reply and is resolved. Mutants were killed for #4, #8, #15 and #16.

Lens checklist

  1. Spec & intent — Clean (code-reviewer)
  2. Architectural fit & precedent — Clean (code-reviewer)
  3. Correctness & edge cases — Clean (code-reviewer)
  4. Security — Clean (orchestrator, security deep-dive done, 0 findings)
  5. Data integrity & migrations — Clean (dispatched infra agent: the static test pins both columns and values)
  6. Concurrency — Clean (orchestrator: the delta adds no shared state)
  7. API & contract compatibility — See findings #19, #20 (no consumers in frontend, unstract-cloud or clients)
  8. Reliability & resilience — Clean (orchestrator: no I/O changed)
  9. Performance & cost — Clean (code-reviewer)
  10. Observability — Clean (code-reviewer)
  11. Operational safety — Clean (orchestrator: settings-only enum-name change)
  12. LLM/agent-specific — N/A — no LLM code
  13. Testing — Clean (pr-test-analyzer, 5 mutants killed in a private worktree, no test weakened)
  14. Dependencies & build — N/A — none changed
  15. Code quality — See findings #21
  16. Doc & comment accuracy — See findings #19
  17. Cross-document rule consistency — See findings #19 (merge sweep: allowed_for_me statements agree except the schema help_text)
  18. On-prem deployment experience — Clean (orchestrator: no chart, schema or migration change in the delta)
  19. Scaling & workload lifecycle — Clean (orchestrator: no workload config)

cost: agents=7 wall=05:22 lenses-examined=17 of 19 files=5 lines=136

Comment thread backend/tenant_account_v2/serializer.py
Comment thread backend/tenant_account_v2/serializer.py Outdated
Comment thread backend/tenant_account_v2/test_capabilities.py Outdated

@ritwik-g ritwik-g left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Self-review round 4 — unstract:review-deep (FOLLOWUP) at tip 4ec12071e

Review: review-deep. The PR carries a migration and an authz change, so review-shallow's gate refuses it.

Delta: 9ba8ed2dd..4ec12071e (36 lines, 4 files). That covers pre-commit.ci's b4dfa18fb and the round-3 fixes. There is no cold read this round because the delta is under 200 lines.

Verdict — APPROVE

Summary — Critical: 0 · High: 0 · Medium: 0 · Low: 0 · Lenses run: 19/19 (N/A: 12, 14).

Prior context fetched — followup-fetch.sh fetched 6 of 6. "Since" boundary: 9ba8ed2dd.

Scope change — NO

Security deep-dive: done. No candidates; filtering was not needed; not degraded.

Boundary sweep: 0 new sinks in the delta. Clean.

Base fetch: ok. The count is verified (16 files).

Prior findings status

  • #19 [Medium] allowed_for_me help_text → RESOLVED in 4ec12071e.
  • #20 [Low] KeyEnum → RESOLVED in 4ec12071e. A CapabilityKey override was added and a schema test asserts it; the mutant was killed.
  • #21 [Low] ruff-format → RESOLVED in b4dfa18fb (pre-commit.ci). The pinned pre-commit run is clean at 4ec12071e.

New findings

None.

Lens checklist

  1. Spec & intent — Clean (code-reviewer)
  2. Architectural fit & precedent — Clean (code-reviewer)
  3. Correctness & edge cases — Clean (code-reviewer)
  4. Security — Clean (orchestrator, security deep-dive done, 0 findings)
  5. Data integrity & migrations — Clean (orchestrator, no migration or model in the delta)
  6. Concurrency — Clean (orchestrator, no shared state)
  7. API & contract compatibility — Clean (type-design-analyzer, full-backend schema has no collision, no consumers)
  8. Reliability & resilience — Clean (orchestrator, no I/O)
  9. Performance & cost — Clean (code-reviewer)
  10. Observability — Clean (code-reviewer)
  11. Operational safety — Clean (orchestrator, schema-name-only settings change)
  12. LLM/agent-specific — N/A — no LLM code
  13. Testing — Clean (pr-test-analyzer, 3 mutants killed, nothing weakened)
  14. Dependencies & build — N/A — none changed
  15. Code quality — Clean (orchestrator ran the pinned pre-commit, all hooks pass)
  16. Doc & comment accuracy — Clean (comment-analyzer)
  17. Cross-document rule consistency — Clean (orchestrator, help_text, docstrings and CAPABILITIES.md now agree)
  18. On-prem deployment experience — Clean (orchestrator, no chart, schema or migration in the delta)
  19. Scaling & workload lifecycle — Clean (orchestrator, no workload config)

cost: agents=5 wall=03:30 lenses-examined=17 of 19 files=4 lines=36

@ritwik-g
ritwik-g marked this pull request as ready for review October 14, 2026 23:56
@greptile-apps

greptile-apps Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

via Greptile

RetriggerView in GreptileConfidence Score: 5/5

[Medium impact] The PR appears safe to merge, with no actionable issues found.

Summary

Adds seven organization capabilities, an admin-only PATCH API, member-readable settings, and checks for adapter creation and resource deletion.

  • Organisation admins can set access rules for seven capabilities.
  • Adapter and connector creation follows separate organisation access settings.
  • One organisation setting can restrict deletion of workflows and deployments.

Reviews (10) · Last reviewed commit: "UN-4399 [FEAT] Organisation capability p..." · Reviewed by Greptile

Comment thread backend/tenant_account_v2/views.py Outdated
Comment thread backend/tenant_account_v2/test_capabilities.py Outdated
ritwik-g added a commit that referenced this pull request Oct 15, 2026
…n succeeds

- Both settings endpoints read 'before' and save under select_for_update, so
  of two concurrent changes the second audits against the first's result.
- The capability matrix creates a real connector and asserts 201 instead of
  treating any non-403 as allowed.

Addresses Greptile review on #2344.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ritwik-g added a commit that referenced this pull request Oct 16, 2026
…n succeeds

- Both settings endpoints read 'before' and save under select_for_update, so
  of two concurrent changes the second audits against the first's result.
- The capability matrix creates a real connector and asserts 201 instead of
  treating any non-403 as allowed.

Addresses Greptile review on #2344.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ritwik-g
ritwik-g force-pushed the feat/UN-4399-capability-permissions branch from a8bdbd4 to 6958f22 Compare October 16, 2026 07:36
@ritwik-g
ritwik-g added this pull request to stack #2351 October 16, 2026 07:36
ritwik-g added a commit that referenced this pull request Oct 19, 2026
…n succeeds

- Both settings endpoints read 'before' and save under select_for_update, so
  of two concurrent changes the second audits against the first's result.
- The capability matrix creates a real connector and asserts 201 instead of
  treating any non-403 as allowed.

Addresses Greptile review on #2344.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ritwik-g
ritwik-g force-pushed the feat/UN-4399-capability-permissions branch from 6958f22 to cb54e73 Compare October 19, 2026 09:00
ritwik-g added a commit that referenced this pull request Oct 19, 2026
…n succeeds

- Both settings endpoints read 'before' and save under select_for_update, so
  of two concurrent changes the second audits against the first's result.
- The capability matrix creates a real connector and asserts 201 instead of
  treating any non-403 as allowed.

Addresses Greptile review on #2344.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ritwik-g
ritwik-g force-pushed the feat/UN-4399-capability-permissions branch from cb54e73 to e32449f Compare October 19, 2026 13:14
@ritwik-g

Copy link
Copy Markdown
Contributor Author

@greptileai Re-review (head rebased onto the current stack; no code change since your last review)

ritwik-g added a commit that referenced this pull request Oct 19, 2026
…n succeeds

- Both settings endpoints read 'before' and save under select_for_update, so
  of two concurrent changes the second audits against the first's result.
- The capability matrix creates a real connector and asserts 201 instead of
  treating any non-403 as allowed.

Addresses Greptile review on #2344.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ritwik-g
ritwik-g force-pushed the feat/UN-4399-capability-permissions branch from e32449f to b938b9a Compare October 19, 2026 15:24
@ritwik-g

Copy link
Copy Markdown
Contributor Author

@greptileai Re-review (rebased onto #2342's latest head; no change to this PR's own diff)

@Deepak-Kesavan Deepak-Kesavan left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Automated review pass (Claude, run for @Deepak-Kesavan) on this PR's own layer (feat/UN-4398-platform-audit...fac6e43d1; its own diff is identical to b938b9af2). Deduplicated against the self-review rounds and Greptile. These are starting points: closing any of them is a legitimate outcome, and nothing here blocks the merge.

Legacy sync: clean. The two legacy flags are the storage for create_llm_adapters and create_connectors, and both endpoints write through _save_restrictions under the row lock, so the two can't drift. A v0 client sees the same gate, the same 400s and the same body. The migration's defaults plus SET DEFAULT keep existing orgs and old images on today's behaviour, and 0008 is still free on main. PATCH is admin-only with no path to roles, and the three part-2 capabilities can't be opened, which matches the "Any member" rulings.

Findings 1 and 3 are inline. One more doesn't map to a line in this diff:

2. [Medium] Cloud's Agentic Studio creates adapters without the capability check. In unstract-cloud (main @ 83a9cb6f), pluggable_apps/agentic_studio_v1/views/connectors.py:80 (connectors_list, gated only by IsOrganizationMember) maps type to LLM, X2TEXT, EMBEDDING or VECTOR_DB and calls AdapterInstance.objects.create at :153. connector_detail also accepts a type change (:232). So a non-admin can create an embedding adapter under create_other_adapters=admins_only. The LLM half already bypasses the legacy flag; this PR is where the guarantee gets published. Suggest calling enforce_capability there, perhaps in the cloud companion, or noting it as a known gap in CAPABILITIES.md.

One more item for the Frontend v1 Permissions tab (P3-T12): three server labels (create_other_adapters, manage_api_keys, manage_members) differ from Figma frame P12. The label also appears in the 403 text and in the audit target_name, so aligning SPECS with the P12 copy would keep the toasts and the audit log consistent with the UI.

Comment thread backend/adapter_processor_v2/views.py
Comment thread backend/tenant_account_v2/serializer.py

@Deepak-Kesavan Deepak-Kesavan left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🤖 Automated re-review (head a61aaff81)

Automated pass (Claude, run for @Deepak-Kesavan). These are starting points: closing any of them is a legitimate outcome, and nothing here blocks the merge.

Since the last review, this PR's own diff has one new commit, 244091526; the rest came in through #2342 merges. No new defects in it.

Earlier finding Status
1. Adapter capability trusted the client's adapter_type Resolved in 244091526, verified (reply on the thread)
2. Cloud Agentic Studio creates adapters without the capability check Still open. unstract-cloud main @ d0e478bf: pluggable_apps/agentic_studio_v1/views/connectors.py:79 (IsOrganizationMember only) still calls AdapterInstance.objects.create at :153, and connector_detail still accepts a type change. #1868 doesn't touch it. Calling enforce_capability there, or naming it as a known gap in CAPABILITIES.md, would close it.
3. No configurable flag Resolved in 244091526, verified (reply on the thread)

SonarCloud: quality gate passed, no security hotspots, and one open issue on this PR's own lines (inline below).

Comment thread backend/tenant_account_v2/serializer.py Outdated

@Deepak-Kesavan Deepak-Kesavan left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Approving at becc640cd. Both inline findings are fixed and verified (244091526: registry type check, configurable), and Sonar S7519 is fixed in 34c4740e9 (0 open issues). The cloud Agentic Studio adapter path noted in the review body lives in unstract-cloud and does not block this PR.

ritwik-g added a commit that referenced this pull request Oct 22, 2026
Rebased onto main 7bcb5d0 as one commit; tree = merge-tree(main, becc640), the reviewed head (#2344).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ritwik-g
ritwik-g force-pushed the feat/UN-4399-capability-permissions branch from becc640 to 30555ff Compare October 22, 2026 07:48
@ritwik-g

Copy link
Copy Markdown
Contributor Author

@greptileai review

ritwik-g added a commit that referenced this pull request Oct 22, 2026
Rebased onto main 7bcb5d0 as one commit; tree = merge-tree(main, becc640), the reviewed head (#2344).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ritwik-g
ritwik-g force-pushed the feat/UN-4399-capability-permissions branch from 30555ff to 37d2d2f Compare October 22, 2026 08:02
@ritwik-g

Copy link
Copy Markdown
Contributor Author

@greptileai review

Rebased onto main 7bcb5d0 as one commit; tree = merge-tree(main, becc640), the reviewed head (#2344).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ritwik-g
ritwik-g force-pushed the feat/UN-4399-capability-permissions branch from 37d2d2f to 52cad45 Compare October 22, 2026 09:06
@sonarqubecloud

Copy link
Copy Markdown

@github-actions

Copy link
Copy Markdown
Contributor

Unstract test results

Per-group results

Status Group Tier Passed Failed Errors Skipped Duration (s)
⚪ e2e-agent-kv e2e 0 0 0 1 0.1
✅ e2e-api-deployment e2e 3 0 0 0 12.9
✅ e2e-coowners e2e 1 0 0 0 1.4
✅ e2e-etl e2e 1 0 0 0 10.1
✅ e2e-login e2e 2 0 0 0 1.2
✅ e2e-prompt-studio e2e 1 0 0 0 8.4
✅ e2e-smoke e2e 2 0 0 0 0.9
✅ e2e-workflow e2e 1 0 0 0 12.0
✅ frontend unit 629 0 0 0 19.8
✅ integration-backend integration 1003 0 0 26 51.0
✅ integration-connectors integration 1 0 0 7 6.6
✅ integration-workers integration 179 0 0 1 41.2
❌ ui e2e 0 1 0 0 0.0
✅ unit-agent-kv-schema unit 143 0 0 0 1.7
✅ unit-backend unit 2006 0 0 1 58.0
✅ unit-connectors unit 82 0 0 0 11.5
✅ unit-core unit 281 0 0 0 3.2
✅ unit-filesystem unit 1 0 0 0 4.4
✅ unit-platform-service unit 18 0 0 0 2.7
✅ unit-rig unit 120 0 0 0 4.4
✅ unit-runner unit 12 0 0 0 3.0
✅ unit-sdk1 unit 878 0 0 0 42.0
✅ unit-tool-sidecar unit 8 0 0 0 1.8
✅ unit-workers unit 1526 0 0 2 128.5
TOTAL 6898 1 0 38 426.6

Critical paths

⚠️ Critical paths not yet covered

  • workflow-execution-fan-out — Multi-file workflow execution fans out to file-processing workers and rejoins. (declared coverage: no groups declared)
✅ Covered critical paths
  • auth-login — covered by e2e-login
  • adapter-register-llm — covered by integration-backend
  • workflow-author — covered by integration-backend
  • co-owner-manage — covered by integration-backend, e2e-coowners
  • workflow-create-execute — covered by e2e-workflow
  • api-deployment-provision — covered by integration-backend
  • api-deployment-auth — covered by integration-backend
  • api-deployment-run — covered by e2e-api-deployment
  • mcp-server-auth — covered by integration-backend
  • mcp-platform-auth — covered by integration-backend
  • platform-key-whoami — covered by integration-backend
  • prompt-studio-author — covered by integration-backend
  • prompt-studio-fetch-response — covered by e2e-prompt-studio
  • connector-register-test — covered by integration-backend
  • pipeline-etl-execute — covered by e2e-etl
  • usage-aggregate-read — covered by integration-backend
  • usage-token-tracking — covered by e2e-api-deployment
  • callback-result-delivery — covered by e2e-api-deployment

@ritwik-g

Copy link
Copy Markdown
Contributor Author

@greptileai review

@ritwik-g
ritwik-g merged commit abc0cce into main Oct 22, 2026
14 checks passed
@ritwik-g
ritwik-g deleted the feat/UN-4399-capability-permissions branch October 22, 2026 09:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants