feat(adt-mcp): add delegated assistant read scope#148
Conversation
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
✅ Deploy Preview for adt-cli canceled.
|
📝 WalkthroughWalkthroughThe PR replaces approval-gated delivery guidance, adds strict delegated-assistant read access to ADT MCP, classifies ATC and unit-test analysis as read operations while retaining scoped execution, and exports REST runtime security types and loading utilities. ChangesAutonomous delivery guidance
Delegated MCP read access
REST runtime security surface
Estimated code review effort: 3 (Moderate) | ~25 minutes Sequence Diagram(s)sequenceDiagram
participant Client
participant InvocationVerifier
participant PolicyParser
participant ScopeCatalogue
participant Destination
Client->>InvocationVerifier: submit signed delegated-assistant credential
InvocationVerifier->>PolicyParser: parse delegated read policy
PolicyParser->>ScopeCatalogue: request server/read tools
ScopeCatalogue->>Destination: validate Destination and operation class
Destination-->>ScopeCatalogue: authorize read-scoped execution
ScopeCatalogue-->>Client: advertise and dispatch permitted tools
Possibly related PRs
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
⚔️ Resolve merge conflicts
Warning There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure. 🔧 ESLint
ESLint install failed: dependency version conflict. Check your lock file or package.json. Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
This PR successfully adds the delegated-assistant read scope with proper security controls and comprehensive test coverage. The implementation correctly follows the established patterns for agent policy validation, includes all necessary security checks, and maintains the fail-closed approach. All 20 tests pass, and the code is ready to merge.
You can now have the agent implement changes and create commits directly on your pull request's source branch. Simply comment with /q followed by your request in natural language to ask the agent to make changes.
Up to standards ✅🟢 Issues
|
| Metric | Results |
|---|---|
| Complexity | 19 |
| Duplication | 2 |
NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes.
MergerPending PR has merge conflicts. Commit |
| export function parseDelegatedAssistantReadPolicy( | ||
| claims: TrustedMcpInvocationClaims, | ||
| ): DelegatedAssistantReadPolicy | undefined { | ||
| if ( | ||
| claims.agentId !== 'delegated-assistant' || | ||
| claims.destinationKeys.length !== 1 || | ||
| !hasServerReadClasses(claims) || | ||
| Object.keys(claims.limits).length !== 0 || | ||
| !hasExactSortedKeys(claims.constraint, [ | ||
| 'kind', | ||
| 'threadId', | ||
| 'executionId', | ||
| 'systemSid', | ||
| ]) || | ||
| claims.constraint.kind !== 'delegated-assistant-read-v1' | ||
| ) { | ||
| return undefined; | ||
| } | ||
|
|
||
| const threadId = requiredUuid(claims.constraint.threadId); | ||
| const executionId = requiredUuid(claims.constraint.executionId); | ||
| const systemSid = requiredSystemSid(claims.constraint.systemSid); | ||
| if (!threadId || !executionId || !systemSid) return undefined; | ||
|
|
||
| return Object.freeze({ threadId, executionId, systemSid }); | ||
| } |
There was a problem hiding this comment.
📝 Info: Delegated-assistant policy correctly projects the full read catalogue via generic access construction
invocationRequestAccess at packages/adt-mcp/src/lib/http/server.ts:421-444 builds McpRequestAccess generically from invocation.classes/invocation.destinationKeys, only attaching frozenSource/scoped when the corresponding parsers match. For a delegated-assistant credential, parseAiReviewFrozenSourcePolicy and parseScopedAdtInvocationPolicy both return undefined (agentId mismatch), so the resulting access is a plain {classes:['server','read'], destinationKeys:[one]}. This yields the full server-owned read catalogue via isMcpToolListed, matching the stated intent. The gate isMcpInvocationDispatchPolicySupported now includes the delegated-assistant branch (invocation.ts:242-244), so unsupported/malformed delegated policies still fail closed and expose no tools. The wiring is consistent with the existing autonomous-review-agent path.
Was this helpful? React with 👍 or 👎 to provide feedback.
| | [`verification/after-changes`](rules/verification/after-changes.md) | Build, typecheck, test, lint, format checklist | | ||
| | Rule | Description | | ||
| | ------------------------------------------------------------------------------- | ------------------------------------------------------------ | | ||
| | [`git/autonomous-delivery`](rules/git/autonomous-delivery.md) | Commit and push authorized feature work without re-prompting | |
There was a problem hiding this comment.
📝 Info: Roadmap/agent-rule wording change is consistent across all sites
The PR replaces the git/no-auto-commit rule with git/autonomous-delivery and rewrites every 'Do NOT commit without approval' line across the epic docs and _template.md. I verified there are no dangling references to no-auto-commit remaining anywhere in .md, .cursor, .windsurf, .claude, or .agents (grep returned none), and the new rules/git/autonomous-delivery.md file that .agents/repo-guide.md:115 links to exists. The mechanical transformation appears applied completely and consistently.
Was this helpful? React with 👍 or 👎 to provide feedback.
PR Summary by Qodofeat(adt-mcp): add delegated-assistant signed read scope
AI Description
Diagram
High-Level Assessment
Files changed (28)
|
Classify ATC, AUnit, and coverage as non-mutating read analysis while preserving optional exact scoped execution policies.
4592063 to
a74fb02
Compare
|
There was a problem hiding this comment.
Actionable comments posted: 3
🧹 Nitpick comments (2)
packages/adt-mcp/tests/delegated-assistant-catalogue.test.ts (2)
49-65: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAdd runtime dispatch coverage for
run_unit_tests.This verifies only
isMcpToolAllowed; the suppliedscope-enforcement.test.tschange exercises actual wrapped dispatch foratc_runbut notrun_unit_tests. Since both tools changed classification, add a read-authority handler test that invokesrun_unit_testswith coverage arguments and verifies the handler runs.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/adt-mcp/tests/delegated-assistant-catalogue.test.ts` around lines 49 - 65, Add a runtime read-authority handler test for run_unit_tests alongside the existing dispatch coverage, invoking it with objectType, objectName, withCoverage, and coverageFormat arguments and asserting the handler executes. Use the established wrapped-dispatch test pattern from scope-enforcement.test.ts, while preserving the existing isMcpToolAllowed assertions.
15-32: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick winMake the catalogue test prove the complete read-only boundary.
listed.length > 10plus onelock_objectexclusion will not catch another mutation tool being accidentally advertised. Assert an explicit expected read set, or enumerate all known write entries and assert that none are listed.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/adt-mcp/tests/delegated-assistant-catalogue.test.ts` around lines 15 - 32, Update the delegated read catalogue test around MCP_TOOL_SCOPE_CATALOGUE and isMcpToolListed to assert the complete read-only boundary: compare listed against an explicit expected read-tool set, or explicitly verify every known write entry is absent. Replace the weak length-only assertion while preserving the existing required read tools and lock_object exclusion checks.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/adt-mcp/src/lib/tools/scope-catalogue.ts`:
- Around line 552-560: Update isMcpToolListed() so the atc_run/run_unit_tests
safe_execute exception also requires access.classes to include safe_execute,
matching isMcpToolAllowed() dispatch behavior and preventing uncallable tools
from being listed. Preserve the existing operationClass checks and update the
relevant listed-versus-allowed invariant test.
In `@packages/adt-mcp/tests/delegated-assistant-catalogue.test.ts`:
- Around line 1-2: Replace the Node built-in test imports in
delegated-assistant-catalogue.test.ts with the project’s configured Vitest
imports, using vitest or `@abapify/nx-vitest` for test, describe, and it as
applicable. Keep the existing test behavior unchanged and remove reliance on
node:test.
In `@packages/adt-mcp/tests/delegated-assistant-policy.test.ts`:
- Around line 1-7: Update delegated-assistant-policy.test.ts to import describe
and it from vitest instead of node:test, while preserving the existing test
behavior and other imports.
---
Nitpick comments:
In `@packages/adt-mcp/tests/delegated-assistant-catalogue.test.ts`:
- Around line 49-65: Add a runtime read-authority handler test for
run_unit_tests alongside the existing dispatch coverage, invoking it with
objectType, objectName, withCoverage, and coverageFormat arguments and asserting
the handler executes. Use the established wrapped-dispatch test pattern from
scope-enforcement.test.ts, while preserving the existing isMcpToolAllowed
assertions.
- Around line 15-32: Update the delegated read catalogue test around
MCP_TOOL_SCOPE_CATALOGUE and isMcpToolListed to assert the complete read-only
boundary: compare listed against an explicit expected read-tool set, or
explicitly verify every known write entry is absent. Replace the weak
length-only assertion while preserving the existing required read tools and
lock_object exclusion checks.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 61efa746-1054-406e-bf34-85f9a7af3061
📒 Files selected for processing (38)
.agents/repo-guide.md.agents/rules/git/autonomous-delivery.md.agents/rules/git/no-auto-commit.mddocs/roadmap/README.mddocs/roadmap/epics/_template.mddocs/roadmap/epics/e01-include.mddocs/roadmap/epics/e02-function.mddocs/roadmap/epics/e03-badi.mddocs/roadmap/epics/e04-strust.mddocs/roadmap/epics/e05-format-plugin-api.mddocs/roadmap/epics/e06-gcts-format-plugin.mddocs/roadmap/epics/e07-gcts-command-plugin.mddocs/roadmap/epics/e08-checkin.mddocs/roadmap/epics/e09-acds-parser.mddocs/roadmap/epics/e10-rap-bdef.mddocs/roadmap/epics/e11-rap-srvd.mddocs/roadmap/epics/e12-rap-srvb.mddocs/roadmap/epics/e13-startrfc.mddocs/roadmap/epics/e14-flp.mddocs/roadmap/epics/e15-wb.mdopenspec/changes/add-delegated-assistant-read-scope/design.mdopenspec/changes/add-delegated-assistant-read-scope/proposal.mdopenspec/changes/add-delegated-assistant-read-scope/specs/adt-mcp/spec.mdopenspec/changes/add-delegated-assistant-read-scope/tasks.mdopenspec/changes/classify-atc-as-read-analysis/design.mdopenspec/changes/classify-atc-as-read-analysis/proposal.mdopenspec/changes/classify-atc-as-read-analysis/specs/adt-mcp/spec.mdopenspec/changes/classify-atc-as-read-analysis/tasks.mdpackages/adt-mcp/src/index.tspackages/adt-mcp/src/lib/http/invocation.tspackages/adt-mcp/src/lib/tools/scope-catalogue.tspackages/adt-mcp/tests/delegated-assistant-catalogue.test.tspackages/adt-mcp/tests/delegated-assistant-policy.test.tspackages/adt-mcp/tests/http-invocation.test.tspackages/adt-mcp/tests/scope-enforcement.test.tspackages/adt-server/src/index.tspackages/adt-server/src/rest-runtime.tspackages/adt-server/tests/rest-runtime.test.ts
💤 Files with no reviewable changes (1)
- .agents/rules/git/no-auto-commit.md
| if ( | ||
| operationClass !== access.scoped.operationClass && | ||
| !( | ||
| (name === 'atc_run' || name === 'run_unit_tests') && | ||
| access.scoped.operationClass === 'safe_execute' | ||
| ) | ||
| ) { | ||
| return false; | ||
| } |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== file exists and outline =="
fd 'scope-catalogue\.ts$' . || true
ast-grep outline packages/adt-mcp/src/lib/tools/scope-catalogue.ts --view expanded || true
echo "== relevant lines =="
sed -n '230,290p' packages/adt-mcp/src/lib/tools/scope-catalogue.ts
sed -n '520,570p' packages/adt-mcp/src/lib/tools/scope-catalogue.ts
echo "== search access and safe_execute =="
rg -n "McpRequestAccess|isMcpToolAllowed|isAllowed|safe_execute|atc_run|run_unit_tests|scoped" packages/adt-mcp -SRepository: abapify/adt-cli
Length of output: 34455
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== catalogue row for tool classes =="
sed -n '90,215p' packages/adt-mcp/src/lib/tools/scope-catalogue.ts
echo "== safe-execute tests around listed/list vs dispatch =="
sed -n '210,260p' packages/adt-mcp/tests/safe-execute-enforcement.test.ts
sed -n '360,410p' packages/adt-mcp/tests/safe-execute-enforcement.test.ts
echo "== standalone behavioral probe for listed vs allowed invariant =="
node - <<'JS'
const ops = {
'atc_run': 'safe_execute',
'run_unit_tests': 'safe_execute',
'list_destinations': 'read',
};
function isMcpToolAllowed(access, name) {
const classes = access?.classes;
const scopedAnalysis =
access?.scoped?.operationClass === 'safe_execute' &&
(name === 'atc_run' || name === 'run_unit_tests');
const classAllowed = Boolean(
Array.isArray(classes) &&
classes.every(c => ['server','read','safe_execute','write'].includes(String(c))) &&
(classes.includes(ops[name]) ||
(scopedAnalysis && classes.includes('safe_execute'))),
);
if (!classAllowed) return false;
const scoped = access?.scoped;
return (
!scoped ||
((scoped.operationClass === ops[name] ||
((name === 'atc_run' || name === 'run_unit_tests') &&
scoped.operationClass === 'safe_execute')) &&
scoped.toolNames.includes(name))
);
}
function isMcpToolListed(access, name) {
const operationClass = ops[name];
if (!access) return false;
if (!Array.isArray(access.classes) || !access.classes.every(c => ['server','read','safe_execute','write'].includes(String(c)))) return false;
if (access.scoped) {
if (
operationClass !== access.scoped.operationClass &&
!(
(name === 'atc_run' || name === 'run_unit_tests') &&
access.scoped.operationClass === 'safe_execute'
)
) {
return false;
}
if (!access.scoped.toolNames.includes(name)) return false;
return true;
}
return false;
}
const access = {
classes: ['read'],
destinations: ['dest'],
destinationKeys: ['dest:ZFOO'],
scoped: {
tokenId: 'jti',
principal: 'P',
correlationId: 'corr',
scopeId: 'scope',
executionId: 'exec',
systemSid: 'sid',
resourceKeys: [],
toolNames: ['atc_run','run_unit_tests'],
operationClass: 'safe_execute',
maxToolCalls: 1,
},
};
for (const name of ['atc_run','run_unit_tests','list_destinations']) {
console.log(`${name}: listed=${isMcpToolListed(access,name)} allowed=${isMcpToolAllowed(access,name)}`);
}
JSRepository: abapify/adt-cli
Length of output: 6909
Keep scoped tool listing backed by a matching safe-execution class.
isMcpToolListed() currently allows atc_run/run_unit_tests when scoped.operationClass === 'safe_execute', even if classes lacks safe_execute. Dispatch rejects such calls through isMcpToolAllowed(), so the envelope can advertise tools that cannot be called. Require access.classes.includes('safe_execute') here as well, or reject these scoped grants during McpRequestAccess construction and update the test covering the listed vs allowed invariant.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/adt-mcp/src/lib/tools/scope-catalogue.ts` around lines 552 - 560,
Update isMcpToolListed() so the atc_run/run_unit_tests safe_execute exception
also requires access.classes to include safe_execute, matching
isMcpToolAllowed() dispatch behavior and preventing uncallable tools from being
listed. Preserve the existing operationClass checks and update the relevant
listed-versus-allowed invariant test.
| import assert from 'node:assert/strict'; | ||
| import test from 'node:test'; |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== locate target and package/config files =="
git ls-files | rg '(^|/)(package\.json|vitest\.config|vite\.config|jest\.config|tsdown\.config|nx\.json*|package-lock\.json|pnpm-lock\.yaml|yarn\.lock|bun\.lockb)$|packages/adt-mcp/tests/delegated-assistant-catalogue\.test\.ts$' || true
echo
echo "== target file top =="
if [ -f packages/adt-mcp/tests/delegated-assistant-catalogue.test.ts ]; then
sed -n '1,120p' packages/adt-mcp/tests/delegated-assistant-catalogue.test.ts
fi
echo
echo "== package manifests with devDependencies/scripts =="
git ls-files '*/package.json' | while read -r f; do
if grep -E '"(vitest|jest|node:test|`@vitest`|tsdown|nx)"' "$f" >/dev/null 2>&1; then
echo "--- $f"
node -e "const p=require('./$f'); console.log(JSON.stringify({scripts:p.scripts,devDependencies:p.devDependencies||{},dependencies:p.dependencies||{}}, null, 2))"
fi
done
echo
echo "== test scripts/configs reference =="
rg -n '"(test|vitest|jest|tsdown)"|vitest|jest|tsdown|node:test' package.json packages package-lock.json bun.lock 2>/dev/null | head -200 || trueRepository: abapify/adt-cli
Length of output: 50371
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== packages/adt-mcp/package.json =="
if [ -f packages/adt-mcp/package.json ]; then
node -e "const p=require('./packages/adt-mcp/package.json'); console.log(JSON.stringify({name:p.name,scripts:p.scripts,devDependencies:p.devDependencies||{},dependencies:p.dependencies||{}}, null, 2))"
fi
echo
echo "== tool runner manifests =="
for f in tools/nx-vitest/package.json tools/nx-tsdown/package.json package.json packages/adt-mcp/package.json; do
if [ -f "$f" ]; then
echo "--- $f"
node -e "const fs=require('fs'); const p=JSON.parse(fs.readFileSync('$f','utf8')); console.log(JSON.stringify({name:p.name,scripts:p.scripts,devDependencies:p.devDependencies||{},dependencies:p.dependencies||{}}, null, 2))"
fi
done
echo
echo "== related test files under packages/adt-mcp/tests =="
git ls-files packages/adt-mcp/tests | while read -r f; do
echo "--- $f"
sed -n '1,40p' "$f"
done
echo
echo "== node:test imports in repo =="
rg -n "from 'node:test'|from \"node:test\"|import test from 'node:test'|import test from \"node:test\"" . --glob '*.ts' --glob '*.tsx' --glob '*.js' --glob '*.jsx' || trueRepository: abapify/adt-cli
Length of output: 37192
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== repo test configs =="
git ls-files | rg '(^|/)(vitest|vite|jest|tsdown|nx)\.(json|config\..*)$|(^|/)jest\.config\..*$|(^|/)vitest\.config\..*$|(^|/)tsdown\.config\..*$' || true
echo
echo "== adt-mcp project references =="
rg -n '"adt-mcp"|`@abapify/adt-mcp`|adt-mcp:' nx.json package.json tools packages/adt-mcp --glob '*.json' --glob '*.ts' --glob '*.js' --glob '*.yml' --glob '*.yaml' | head -200 || true
echo
echo "== tests pattern in adt-mcp package config if any =="
if [ -f packages/adt-mcp/project.json ] || [ -w packages/adt-mcp/package.json ]; then
for f in packages/adt-mcp/project.json ; do
[ -f "$f" ] && { echo "--- $f"; cat "$f"; }
done
fi
rg -n 'test|vitest|jest|node:test|scripts' packages/adt-mcp nx.json package.json 2>/dev/null || trueRepository: abapify/adt-cli
Length of output: 32593
Use Vitest-based test imports in adt-mcp.
This file still imports Node’s built-in test runner, and packages/adt-mcp/project.json uses the @nx/vitest plugin, so these tests won’t use the configured Vitest runner. Replace test/describe/it imports from node:test with vitest/@abapify/nx-vitest.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/adt-mcp/tests/delegated-assistant-catalogue.test.ts` around lines 1
- 2, Replace the Node built-in test imports in
delegated-assistant-catalogue.test.ts with the project’s configured Vitest
imports, using vitest or `@abapify/nx-vitest` for test, describe, and it as
applicable. Keep the existing test behavior unchanged and remove reliance on
node:test.
Source: Coding guidelines
| import assert from 'node:assert/strict'; | ||
| import { describe, it } from 'node:test'; | ||
| import { | ||
| parseDelegatedAssistantReadPolicy, | ||
| type TrustedMcpInvocationClaims, | ||
| } from '../src/index.js'; | ||
| import { isMcpInvocationDispatchPolicySupported } from '../src/lib/http/invocation.js'; |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== files =="
git ls-files | rg '(^|/)package\.json$|vitest|jest|test\.config|packages/adt-mcp' | sed -n '1,160p'
echo
echo "== target file imports =="
cat -n packages/adt-mcp/tests/delegated-assistant-policy.test.ts | sed -n '1,80p'
echo
echo "== adtmcp package scripts/config =="
python3 - <<'PY'
import json, pathlib
p=pathlib.Path('packages/adt-mcp/package.json')
if p.exists():
j=json.loads(p.read_text())
print(p)
for k in ['scripts','devDependencies','dependencies']:
print(k, j.get(k))
PY
echo
echo "== vitest references =="
rg -n "'vitest'|\"vitest\"|vitest|node:test|bun test|bunx|test:" -S -g 'package.json' -g 'vitest.*' -g 'tsdown*' -g '!node_modules' .Repository: abapify/adt-cli
Length of output: 15665
Use Vitest for this new suite.
node:test bypasses the repository-required Vitest runner here. Import describe/it from vitest so this test participates in the repository test configuration.
Proposed fix
-import { describe, it } from 'node:test';
+import { describe, it } from 'vitest';📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| import assert from 'node:assert/strict'; | |
| import { describe, it } from 'node:test'; | |
| import { | |
| parseDelegatedAssistantReadPolicy, | |
| type TrustedMcpInvocationClaims, | |
| } from '../src/index.js'; | |
| import { isMcpInvocationDispatchPolicySupported } from '../src/lib/http/invocation.js'; | |
| import assert from 'node:assert/strict'; | |
| import { describe, it } from 'vitest'; | |
| import { | |
| parseDelegatedAssistantReadPolicy, | |
| type TrustedMcpInvocationClaims, | |
| } from '../src/index.js'; | |
| import { isMcpInvocationDispatchPolicySupported } from '../src/lib/http/invocation.js'; |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/adt-mcp/tests/delegated-assistant-policy.test.ts` around lines 1 -
7, Update delegated-assistant-policy.test.ts to import describe and it from
vitest instead of node:test, while preserving the existing test behavior and
other imports.
Source: Coding guidelines



Summary
Verification
Technical Details
This change introduces a new
delegated-assistantsigned invocation policy that allows interactive MCP clients to discover and call read tools on behalf of an authenticated principal without duplicating the server's tool catalogue. The policy is product-neutral and does not include product-specific agent names or workflows.The change also updates the repository's git workflow rules to enable autonomous delivery of verified feature work to scoped branches, replacing the previous "no auto-commit" rule with a more flexible "autonomous delivery" rule that still gates destructive operations and protected-branch updates.
Summary by cubic
Adds a product‑neutral delegated-assistant read scope to
adt-mcpso interactive clients can list and call server-owned read tools without client allowlists. Also classifies ATC and AUnit as non‑mutating read checks and exposes a REST runtime composition seam inadt-server.New Features
delegated-assistantread policy bound to principal,threadId,executionId,systemSid, and one Destination; exportedparseDelegatedAssistantReadPolicy.atc_runandrun_unit_tests(incl. coverage) asread; the optional exactsafe_executepolicy remains supported for stricter runs.loadRestRuntimeSecurityandRestRuntimeSecurityfromadt-serverto compose REST runtime.Refactors
.agents/rules/git/no-auto-commitwith.agents/rules/git/autonomous-delivery; updated guides and epic templates to allow committing and pushing authorized feature work without extra prompts.Written for commit a74fb02. Summary will update on new commits.
Summary by CodeRabbit
New Features
Documentation
Tests