feat(skills): bundle remaining tools + polymorphic pins - #1499
Conversation
|
@coderabbitai review |
✅ Action performedReview finished.
|
📝 WalkthroughWalkthroughThis change introduces native skill bundles and manifests for multiple tool clusters, updates agent pin configurations and default enabled skills, and adds polymorphic skill/tool pin resolution. MCP servers now expose projected skills through Possibly related issues
Possibly related PRs
Suggested labels: 🚥 Pre-merge checks | ✅ 4✅ Passed checks (4 passed)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 20
🧹 Nitpick comments (1)
src/skills/pin-resolution.ts (1)
26-30: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value
resolvedPinsis dead weight — it’s populated and returned, but nothing insrc/index.tsor the rest ofsrc/reads it. Either thread it into the audit/log path, or drop it before it becomes another bit of decorative allocation.🤖 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 `@src/skills/pin-resolution.ts` around lines 26 - 30, Remove the unused resolvedPins field from the pin-resolution result type and eliminate its population and return handling throughout the associated resolution flow. Keep resolvedSkills and all existing resolution behavior unchanged.
🤖 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 `@agents/research-analyst.yaml`:
- Line 2: Remove the version bump in the agent metadata, restoring the previous
version value because this change only documents existing configuration and does
not alter the pin list or agent behavior.
In `@docs/dev/adding-an-agent.md`:
- Around line 235-238: Update the `tasks` bundle member list in the
documentation to include the sibling tools `plan` and `checkpoint` alongside the
existing four tools, keeping the surrounding bundle behavior and read-only
`task-list` guidance unchanged.
In `@skills/autonomy/tools/get-autonomy/tool.json`:
- Around line 7-11: Update the tool output manifests to match their handlers: in
skills/autonomy/tools/get-autonomy/tool.json lines 7-11, add lastSetBy, trend,
and scoredActionCount; in skills/autonomy/tools/list-pending-actions/tool.json
lines 8-10, declare displayTimezone; in
skills/autonomy/tools/set-autonomy/tool.json lines 10-14, add summary and allow
previous_score to be null; and in
skills/scheduler/tools/scheduler-cancel/tool.json lines 10-12, declare jobId or
remove it from the handler response.
In `@skills/ceo-inbox/tools/ceo-inbox-download-attachment/tool.json`:
- Line 3: Update the tool description to accurately state that the output may
provide a temporary file reference instead of content_base64 when temporary-file
storage succeeds, while preserving the existing attachment ID usage and 10 MB
limit details.
In `@skills/ceo-inbox/tools/ceo-inbox-search/tool.json`:
- Line 3: Add the runtime-enforced allowed_callers restriction with the owning
caller value “ceo-inbox” to the tool manifest in
skills/ceo-inbox/tools/ceo-inbox-search/tool.json at lines 3-3 and apply the
same restriction in skills/ceo-inbox/tools/ceo-inbox-update-folders/tool.json at
lines 3-3, before mailbox operations are permitted.
In `@skills/ceo-inbox/tools/ceo-inbox-sent-observe/tool.json`:
- Around line 10-16: Add the missing boolean output fields backfill_active and
tasks_truncated to the outputs contract in the ceo-inbox-sent-observe tool
manifest, matching the values returned by the handler’s sent-observe flow. Keep
the existing output fields unchanged.
In `@skills/contacts/tools/approve-grant-recommendation/tool.json`:
- Around line 5-6: Update the tool’s action_risk configuration from "low" to
"critical" so the immediate permission-grant approval uses the strongest
confirmation path. Preserve the existing sensitivity setting and other tool
configuration.
In `@skills/contacts/tools/contact-create/tool.json`:
- Around line 23-25: Add the required top-level "capabilities": [] field before
"timeout" in both skills/contacts/tools/contact-create/tool.json lines 23-25 and
skills/contacts/tools/contact-grant-permission/tool.json lines 17-19, preserving
the existing manifest structure.
In `@skills/contacts/tools/scan-grant-recommendations/tool.json`:
- Around line 20-23: Update the tool manifest’s caller restriction by adding the
required schedule-only allowed_callers configuration alongside capabilities in
the tool definition. Ensure the manifest contract permits invocation only by the
scheduler and prevents agents from calling the recommendation scan during user
requests.
In `@skills/context-bridge/tools/context-bridge-clear/tool.json`:
- Around line 7-10: The tool manifest’s inputs currently makes both alternative
fields required. Update the input definition for subjects and subject so callers
may provide either one, while preserving their existing types and mutual
alternative semantics.
In `@skills/context-bridge/tools/context-bridge-release/tool.json`:
- Around line 7-14: Update the manifest schema in the inputs and outputs
definitions: mark reply as optional to match the handler’s accepted release
requests, and make task_id optional because ordinary releases do not return it.
Keep entry_id and released required, preserving the existing types.
In `@skills/diagnostics/tools/audit-query/tool.json`:
- Around line 17-23: Update the outputs schema in the audit-query manifest so
displayTimezone is optional, matching the handler’s undefined result when no
timezone is available. Preserve its string type for responses that do provide a
timezone.
In `@skills/diagnostics/tools/audit-trace/tool.json`:
- Line 20: Make the displayTimezone property optional in the manifests for
audit-trace at skills/diagnostics/tools/audit-trace/tool.json:20-20 and
ops-lookup at skills/diagnostics/tools/ops-lookup/tool.json:26-26, so both tool
contracts allow handlers to omit it when timezone context is unavailable.
In `@skills/email/tools/email-download-attachment/tool.json`:
- Line 3: Update the tool description in tool.json to accurately document that
the output may provide temp_file_url instead of content_base64 when a temporary
file URL is available. Align the main description with the output fields
documented on lines 13-14, and remove the unconditional instruction to pass
content_base64 directly to file-parse.
In `@skills/email/tools/email-draft-save/tool.json`:
- Around line 13-14: Remove the unused export_items field from the tool schema
until EmailDraftSaveHandler and its gateway path read and forward it; update the
associated schema or contract test to ensure callers are not promised
unsupported export-control behavior.
In `@skills/learning/tools/list-learning-digest/tool.json`:
- Around line 3-11: Align the `list-learning-digest` manifest with the handler’s
actual empty-output behavior: update the `sections_markdown` output description
to state that it is always returned and is an empty string when no sections are
rendered. Keep the handler’s existing return shape unchanged.
In `@skills/memory/tools/memory-confirm/tool.json`:
- Around line 11-15: Remove the success field from the declared outputs in the
tool manifest, leaving only the payload fields that are actually present inside
data; keep MemoryConfirmHandler’s return behavior unchanged.
In `@skills/memory/tools/memory-store/tool.json`:
- Line 3: Update the memory-store manifest description and result schema to
match MemoryStoreHandler: include the auto_resolved and auto_rejected outcomes,
and model the ambiguous response as omitting action and stored. Mark fields that
are not present on every outcome as conditional/optional, while preserving the
existing contracts for created, updated, conflict, entity_not_found, and
rate_limited.
In `@skills/tasks/tools/checkpoint/tool.json`:
- Around line 8-13: Update the checkpoint schema exposed by toToolDefinitions()
to match the runtime contract: allow cursor values as objects as well as
strings, and allow accumulator entries to be either inline slice-result objects
or spilled document-pointer objects. Preserve the optional/default behavior
while ensuring valid handler and resumable-progress payloads pass tool
validation.
In `@skills/web/tools/web-browser/dom-extract.ts`:
- Around line 90-100: Update the ref-resolution flow around __curiaRefEpoch__
and the resolver’s ref validation to maintain a handler-owned navigation
generation that changes for each new document. Encode or associate the
generation with emitted refs and reject any ref whose generation predates the
current document, rather than trusting page-controlled DOM attributes such as
__curiaRefEpoch__. Preserve valid refs within the active document while failing
closed for refs reused after navigation.
---
Nitpick comments:
In `@src/skills/pin-resolution.ts`:
- Around line 26-30: Remove the unused resolvedPins field from the
pin-resolution result type and eliminate its population and return handling
throughout the associated resolution flow. Keep resolvedSkills and all existing
resolution behavior unchanged.
🪄 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: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 54823ecd-7890-425a-a1c6-80fb27950c96
📒 Files selected for processing (280)
CHANGELOG.mdagents/calendar.yamlagents/ceo-inbox.yamlagents/contacts.yamlagents/coordinator.yamlagents/diagnostics.yamlagents/meeting-debrief.yamlagents/research-analyst.yamlagents/setup-wizard.yamlconfig/registry-defaults.yamldocs/dev/adding-a-tool.mddocs/dev/adding-an-agent.mdskills/autonomy/SKILL.mdskills/autonomy/tools/approve-action/handler.test.tsskills/autonomy/tools/approve-action/handler.tsskills/autonomy/tools/approve-action/tool.jsonskills/autonomy/tools/deny-action/handler.test.tsskills/autonomy/tools/deny-action/handler.tsskills/autonomy/tools/deny-action/tool.jsonskills/autonomy/tools/dismiss-action/handler.test.tsskills/autonomy/tools/dismiss-action/handler.tsskills/autonomy/tools/dismiss-action/tool.jsonskills/autonomy/tools/get-autonomy/handler.test.tsskills/autonomy/tools/get-autonomy/handler.tsskills/autonomy/tools/get-autonomy/tool.jsonskills/autonomy/tools/list-pending-actions/handler.test.tsskills/autonomy/tools/list-pending-actions/handler.tsskills/autonomy/tools/list-pending-actions/tool.jsonskills/autonomy/tools/set-autonomy/handler.tsskills/autonomy/tools/set-autonomy/tool.jsonskills/ceo-inbox/SKILL.mdskills/ceo-inbox/tools/ceo-inbox-archive/handler.tsskills/ceo-inbox/tools/ceo-inbox-archive/tool.jsonskills/ceo-inbox/tools/ceo-inbox-download-attachment/handler.test.tsskills/ceo-inbox/tools/ceo-inbox-download-attachment/handler.tsskills/ceo-inbox/tools/ceo-inbox-download-attachment/tool.jsonskills/ceo-inbox/tools/ceo-inbox-draft-compose/handler.test.tsskills/ceo-inbox/tools/ceo-inbox-draft-compose/handler.tsskills/ceo-inbox/tools/ceo-inbox-draft-compose/tool.jsonskills/ceo-inbox/tools/ceo-inbox-draft-edit/handler.test.tsskills/ceo-inbox/tools/ceo-inbox-draft-edit/handler.tsskills/ceo-inbox/tools/ceo-inbox-draft-edit/tool.jsonskills/ceo-inbox/tools/ceo-inbox-draft-reply/handler.test.tsskills/ceo-inbox/tools/ceo-inbox-draft-reply/handler.tsskills/ceo-inbox/tools/ceo-inbox-draft-reply/tool.jsonskills/ceo-inbox/tools/ceo-inbox-label/handler.tsskills/ceo-inbox/tools/ceo-inbox-label/tool.jsonskills/ceo-inbox/tools/ceo-inbox-list/handler.test.tsskills/ceo-inbox/tools/ceo-inbox-list/handler.tsskills/ceo-inbox/tools/ceo-inbox-list/tool.jsonskills/ceo-inbox/tools/ceo-inbox-mark-read/handler.tsskills/ceo-inbox/tools/ceo-inbox-mark-read/tool.jsonskills/ceo-inbox/tools/ceo-inbox-mark-starred/handler.test.tsskills/ceo-inbox/tools/ceo-inbox-mark-starred/handler.tsskills/ceo-inbox/tools/ceo-inbox-mark-starred/tool.jsonskills/ceo-inbox/tools/ceo-inbox-read/handler.test.tsskills/ceo-inbox/tools/ceo-inbox-read/handler.tsskills/ceo-inbox/tools/ceo-inbox-read/tool.jsonskills/ceo-inbox/tools/ceo-inbox-search/handler.test.tsskills/ceo-inbox/tools/ceo-inbox-search/handler.tsskills/ceo-inbox/tools/ceo-inbox-search/tool.jsonskills/ceo-inbox/tools/ceo-inbox-sent-observe/handler.test.tsskills/ceo-inbox/tools/ceo-inbox-sent-observe/handler.tsskills/ceo-inbox/tools/ceo-inbox-sent-observe/tool.jsonskills/ceo-inbox/tools/ceo-inbox-shadow-draft/handler.test.tsskills/ceo-inbox/tools/ceo-inbox-shadow-draft/handler.tsskills/ceo-inbox/tools/ceo-inbox-shadow-draft/tool.jsonskills/ceo-inbox/tools/ceo-inbox-update-folders/handler.tsskills/ceo-inbox/tools/ceo-inbox-update-folders/tool.jsonskills/contacts/SKILL.mdskills/contacts/tools/approve-grant-recommendation/handler.tsskills/contacts/tools/approve-grant-recommendation/tool.jsonskills/contacts/tools/contact-create/handler.tsskills/contacts/tools/contact-create/tool.jsonskills/contacts/tools/contact-dedup-exclude/handler.tsskills/contacts/tools/contact-dedup-exclude/tool.jsonskills/contacts/tools/contact-find-duplicates/handler.tsskills/contacts/tools/contact-find-duplicates/tool.jsonskills/contacts/tools/contact-grant-permission/handler.tsskills/contacts/tools/contact-grant-permission/tool.jsonskills/contacts/tools/contact-link-identity/handler.tsskills/contacts/tools/contact-link-identity/tool.jsonskills/contacts/tools/contact-list/handler.test.tsskills/contacts/tools/contact-list/handler.tsskills/contacts/tools/contact-list/tool.jsonskills/contacts/tools/contact-lookup/handler.tsskills/contacts/tools/contact-lookup/tool.jsonskills/contacts/tools/contact-merge/handler.tsskills/contacts/tools/contact-merge/tool.jsonskills/contacts/tools/contact-register/handler.test.tsskills/contacts/tools/contact-register/handler.tsskills/contacts/tools/contact-register/tool.jsonskills/contacts/tools/contact-rename/handler.test.tsskills/contacts/tools/contact-rename/handler.tsskills/contacts/tools/contact-rename/tool.jsonskills/contacts/tools/contact-revoke-permission/handler.tsskills/contacts/tools/contact-revoke-permission/tool.jsonskills/contacts/tools/contact-set-identity-status/handler.test.tsskills/contacts/tools/contact-set-identity-status/handler.tsskills/contacts/tools/contact-set-identity-status/tool.jsonskills/contacts/tools/contact-set-role/handler.tsskills/contacts/tools/contact-set-role/tool.jsonskills/contacts/tools/contact-set-tier/handler.tsskills/contacts/tools/contact-set-tier/tool.jsonskills/contacts/tools/contact-unlink-identity/handler.tsskills/contacts/tools/contact-unlink-identity/tool.jsonskills/contacts/tools/contact-update/handler.test.tsskills/contacts/tools/contact-update/handler.tsskills/contacts/tools/contact-update/tool.jsonskills/contacts/tools/decline-grant-recommendation/handler.tsskills/contacts/tools/decline-grant-recommendation/tool.jsonskills/contacts/tools/delete-relationship/handler.test.tsskills/contacts/tools/delete-relationship/handler.tsskills/contacts/tools/delete-relationship/tool.jsonskills/contacts/tools/query-relationships/handler.test.tsskills/contacts/tools/query-relationships/handler.tsskills/contacts/tools/query-relationships/tool.jsonskills/contacts/tools/scan-grant-recommendations/handler.tsskills/contacts/tools/scan-grant-recommendations/tool.jsonskills/context-bridge/SKILL.mdskills/context-bridge/tools/context-bridge-clear/handler.test.tsskills/context-bridge/tools/context-bridge-clear/handler.tsskills/context-bridge/tools/context-bridge-clear/tool.jsonskills/context-bridge/tools/context-bridge-release/handler.test.tsskills/context-bridge/tools/context-bridge-release/handler.tsskills/context-bridge/tools/context-bridge-release/tool.jsonskills/diagnostics/SKILL.mdskills/diagnostics/tools/audit-query/handler.test.tsskills/diagnostics/tools/audit-query/handler.tsskills/diagnostics/tools/audit-query/tool.jsonskills/diagnostics/tools/audit-trace/handler.test.tsskills/diagnostics/tools/audit-trace/handler.tsskills/diagnostics/tools/audit-trace/tool.jsonskills/diagnostics/tools/ops-lookup/handler.test.tsskills/diagnostics/tools/ops-lookup/handler.tsskills/diagnostics/tools/ops-lookup/tool.jsonskills/email/SKILL.mdskills/email/tools/email-archive/handler.tsskills/email/tools/email-archive/tool.jsonskills/email/tools/email-create-folder/handler.tsskills/email/tools/email-create-folder/tool.jsonskills/email/tools/email-download-attachment/handler.test.tsskills/email/tools/email-download-attachment/handler.tsskills/email/tools/email-download-attachment/tool.jsonskills/email/tools/email-draft-save/handler.test.tsskills/email/tools/email-draft-save/handler.tsskills/email/tools/email-draft-save/tool.jsonskills/email/tools/email-get/handler.test.tsskills/email/tools/email-get/handler.tsskills/email/tools/email-get/tool.jsonskills/email/tools/email-label/handler.tsskills/email/tools/email-label/tool.jsonskills/email/tools/email-list-folders/handler.tsskills/email/tools/email-list-folders/tool.jsonskills/email/tools/email-list/handler.test.tsskills/email/tools/email-list/handler.tsskills/email/tools/email-list/tool.jsonskills/email/tools/email-mark-read/handler.tsskills/email/tools/email-mark-read/tool.jsonskills/email/tools/email-reply/handler.test.tsskills/email/tools/email-reply/handler.tsskills/email/tools/email-reply/tool.jsonskills/email/tools/email-send/handler.test.tsskills/email/tools/email-send/handler.tsskills/email/tools/email-send/tool.jsonskills/email/tools/send-draft/handler.test.tsskills/email/tools/send-draft/handler.tsskills/email/tools/send-draft/tool.jsonskills/executive-profile/SKILL.mdskills/executive-profile/tools/behavioral-preferences-update/handler.test.tsskills/executive-profile/tools/behavioral-preferences-update/handler.tsskills/executive-profile/tools/behavioral-preferences-update/tool.jsonskills/executive-profile/tools/executive-profile-get/handler.tsskills/executive-profile/tools/executive-profile-get/tool.jsonskills/executive-profile/tools/executive-profile-update/handler.tsskills/executive-profile/tools/executive-profile-update/tool.jsonskills/learning/SKILL.mdskills/learning/tools/list-learning-digest/handler.test.tsskills/learning/tools/list-learning-digest/handler.tsskills/learning/tools/list-learning-digest/tool.jsonskills/learning/tools/resolve-learning-digest/handler.test.tsskills/learning/tools/resolve-learning-digest/handler.tsskills/learning/tools/resolve-learning-digest/tool.jsonskills/learning/tools/task-completion-from-sent/handler.test.tsskills/learning/tools/task-completion-from-sent/handler.tsskills/learning/tools/task-completion-from-sent/tool.jsonskills/learning/tools/voice-learn/handler.test.tsskills/learning/tools/voice-learn/handler.tsskills/learning/tools/voice-learn/tool.jsonskills/memory/SKILL.mdskills/memory/tools/decay-warnings-list/handler.test.tsskills/memory/tools/decay-warnings-list/handler.tsskills/memory/tools/decay-warnings-list/tool.jsonskills/memory/tools/memory-confirm/handler.test.tsskills/memory/tools/memory-confirm/handler.tsskills/memory/tools/memory-confirm/tool.jsonskills/memory/tools/memory-query/handler.test.tsskills/memory/tools/memory-query/handler.tsskills/memory/tools/memory-query/tool.jsonskills/memory/tools/memory-store/handler.test.tsskills/memory/tools/memory-store/handler.tsskills/memory/tools/memory-store/tool.jsonskills/scheduler/SKILL.mdskills/scheduler/tools/scheduler-cancel/handler.tsskills/scheduler/tools/scheduler-cancel/tool.jsonskills/scheduler/tools/scheduler-create/handler.tsskills/scheduler/tools/scheduler-create/tool.jsonskills/scheduler/tools/scheduler-list/handler.tsskills/scheduler/tools/scheduler-list/tool.jsonskills/scheduler/tools/scheduler-report/handler.tsskills/scheduler/tools/scheduler-report/tool.jsonskills/scheduler/tools/scheduler-update/handler.tsskills/scheduler/tools/scheduler-update/tool.jsonskills/setup/SKILL.mdskills/setup/tools/setup-defer/handler.test.tsskills/setup/tools/setup-defer/handler.tsskills/setup/tools/setup-defer/tool.jsonskills/setup/tools/setup-status/catalog.yamlskills/setup/tools/setup-status/handler.test.tsskills/setup/tools/setup-status/handler.tsskills/setup/tools/setup-status/tool.jsonskills/setup/tools/system-secret-capture-request/handler.test.tsskills/setup/tools/system-secret-capture-request/handler.tsskills/setup/tools/system-secret-capture-request/tool.jsonskills/tasks/SKILL.mdskills/tasks/tools/checkpoint/handler.test.tsskills/tasks/tools/checkpoint/handler.tsskills/tasks/tools/checkpoint/tool.jsonskills/tasks/tools/plan/handler.test.tsskills/tasks/tools/plan/handler.tsskills/tasks/tools/plan/tool.jsonskills/web/SKILL.mdskills/web/tools/web-browser/dom-extract.test.tsskills/web/tools/web-browser/dom-extract.tsskills/web/tools/web-browser/handler.test.tsskills/web/tools/web-browser/handler.tsskills/web/tools/web-browser/tool.jsonskills/web/tools/web-fetch/handler.tsskills/web/tools/web-fetch/tool.jsonskills/web/tools/web-search/handler.tsskills/web/tools/web-search/tool.jsonsrc/channels/email/email-adapter.tssrc/index.tssrc/skills/mcp-loader.tssrc/skills/pin-resolution.tssrc/skills/skill-loader.tssrc/startup/validator.tstests/integration/plan-lifecycle-e2e.test.tstests/integration/task-wake-reply-bind.test.tstests/unit/agents/diagnostics-agent.test.tstests/unit/agents/resolved-pins-regression.test.tstests/unit/skills/ceo-inbox-update-folders.test.tstests/unit/skills/contact-dedup-exclude.test.tstests/unit/skills/contact-find-duplicates.test.tstests/unit/skills/contact-merge.test.tstests/unit/skills/contact-set-role.test.tstests/unit/skills/email-archive.test.tstests/unit/skills/email-create-folder.test.tstests/unit/skills/email-draft-save.test.tstests/unit/skills/email-get.test.tstests/unit/skills/email-label.test.tstests/unit/skills/email-list-folders.test.tstests/unit/skills/email-list.test.tstests/unit/skills/email-mark-read.test.tstests/unit/skills/email-reply.test.tstests/unit/skills/email-send.test.tstests/unit/skills/executive-profile-get.test.tstests/unit/skills/executive-profile-update.test.tstests/unit/skills/mcp-loader.test.tstests/unit/skills/mcp-projected-skills.test.tstests/unit/skills/pin-resolution.test.tstests/unit/skills/scheduler-cancel.test.tstests/unit/skills/scheduler-create.test.tstests/unit/skills/scheduler-list.test.tstests/unit/skills/scheduler-report.test.tstests/unit/skills/scheduler-update.test.tstests/unit/skills/web-browser.test.tstests/unit/skills/web-fetch.test.tstests/unit/skills/web-search.test.tstests/unit/startup/validator.test.ts
There was a problem hiding this comment.
Caution
Inline review comments failed to post. This is likely due to GitHub's internal server error or limits when posting large numbers of comments. If you are seeing this consistently it is likely a permissions issue. Please check "Moderation" -> "Code review limits" under your organization settings.
Actionable comments posted: 20
🧹 Nitpick comments (1)
src/skills/pin-resolution.ts (1)
26-30: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value
resolvedPinsis dead weight — it’s populated and returned, but nothing insrc/index.tsor the rest ofsrc/reads it. Either thread it into the audit/log path, or drop it before it becomes another bit of decorative allocation.🤖 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 `@src/skills/pin-resolution.ts` around lines 26 - 30, Remove the unused resolvedPins field from the pin-resolution result type and eliminate its population and return handling throughout the associated resolution flow. Keep resolvedSkills and all existing resolution behavior unchanged.
🤖 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 `@agents/research-analyst.yaml`:
- Line 2: Remove the version bump in the agent metadata, restoring the previous
version value because this change only documents existing configuration and does
not alter the pin list or agent behavior.
In `@docs/dev/adding-an-agent.md`:
- Around line 235-238: Update the `tasks` bundle member list in the
documentation to include the sibling tools `plan` and `checkpoint` alongside the
existing four tools, keeping the surrounding bundle behavior and read-only
`task-list` guidance unchanged.
In `@skills/autonomy/tools/get-autonomy/tool.json`:
- Around line 7-11: Update the tool output manifests to match their handlers: in
skills/autonomy/tools/get-autonomy/tool.json lines 7-11, add lastSetBy, trend,
and scoredActionCount; in skills/autonomy/tools/list-pending-actions/tool.json
lines 8-10, declare displayTimezone; in
skills/autonomy/tools/set-autonomy/tool.json lines 10-14, add summary and allow
previous_score to be null; and in
skills/scheduler/tools/scheduler-cancel/tool.json lines 10-12, declare jobId or
remove it from the handler response.
In `@skills/ceo-inbox/tools/ceo-inbox-download-attachment/tool.json`:
- Line 3: Update the tool description to accurately state that the output may
provide a temporary file reference instead of content_base64 when temporary-file
storage succeeds, while preserving the existing attachment ID usage and 10 MB
limit details.
In `@skills/ceo-inbox/tools/ceo-inbox-search/tool.json`:
- Line 3: Add the runtime-enforced allowed_callers restriction with the owning
caller value “ceo-inbox” to the tool manifest in
skills/ceo-inbox/tools/ceo-inbox-search/tool.json at lines 3-3 and apply the
same restriction in skills/ceo-inbox/tools/ceo-inbox-update-folders/tool.json at
lines 3-3, before mailbox operations are permitted.
In `@skills/ceo-inbox/tools/ceo-inbox-sent-observe/tool.json`:
- Around line 10-16: Add the missing boolean output fields backfill_active and
tasks_truncated to the outputs contract in the ceo-inbox-sent-observe tool
manifest, matching the values returned by the handler’s sent-observe flow. Keep
the existing output fields unchanged.
In `@skills/contacts/tools/approve-grant-recommendation/tool.json`:
- Around line 5-6: Update the tool’s action_risk configuration from "low" to
"critical" so the immediate permission-grant approval uses the strongest
confirmation path. Preserve the existing sensitivity setting and other tool
configuration.
In `@skills/contacts/tools/contact-create/tool.json`:
- Around line 23-25: Add the required top-level "capabilities": [] field before
"timeout" in both skills/contacts/tools/contact-create/tool.json lines 23-25 and
skills/contacts/tools/contact-grant-permission/tool.json lines 17-19, preserving
the existing manifest structure.
In `@skills/contacts/tools/scan-grant-recommendations/tool.json`:
- Around line 20-23: Update the tool manifest’s caller restriction by adding the
required schedule-only allowed_callers configuration alongside capabilities in
the tool definition. Ensure the manifest contract permits invocation only by the
scheduler and prevents agents from calling the recommendation scan during user
requests.
In `@skills/context-bridge/tools/context-bridge-clear/tool.json`:
- Around line 7-10: The tool manifest’s inputs currently makes both alternative
fields required. Update the input definition for subjects and subject so callers
may provide either one, while preserving their existing types and mutual
alternative semantics.
In `@skills/context-bridge/tools/context-bridge-release/tool.json`:
- Around line 7-14: Update the manifest schema in the inputs and outputs
definitions: mark reply as optional to match the handler’s accepted release
requests, and make task_id optional because ordinary releases do not return it.
Keep entry_id and released required, preserving the existing types.
In `@skills/diagnostics/tools/audit-query/tool.json`:
- Around line 17-23: Update the outputs schema in the audit-query manifest so
displayTimezone is optional, matching the handler’s undefined result when no
timezone is available. Preserve its string type for responses that do provide a
timezone.
In `@skills/diagnostics/tools/audit-trace/tool.json`:
- Line 20: Make the displayTimezone property optional in the manifests for
audit-trace at skills/diagnostics/tools/audit-trace/tool.json:20-20 and
ops-lookup at skills/diagnostics/tools/ops-lookup/tool.json:26-26, so both tool
contracts allow handlers to omit it when timezone context is unavailable.
In `@skills/email/tools/email-download-attachment/tool.json`:
- Line 3: Update the tool description in tool.json to accurately document that
the output may provide temp_file_url instead of content_base64 when a temporary
file URL is available. Align the main description with the output fields
documented on lines 13-14, and remove the unconditional instruction to pass
content_base64 directly to file-parse.
In `@skills/email/tools/email-draft-save/tool.json`:
- Around line 13-14: Remove the unused export_items field from the tool schema
until EmailDraftSaveHandler and its gateway path read and forward it; update the
associated schema or contract test to ensure callers are not promised
unsupported export-control behavior.
In `@skills/learning/tools/list-learning-digest/tool.json`:
- Around line 3-11: Align the `list-learning-digest` manifest with the handler’s
actual empty-output behavior: update the `sections_markdown` output description
to state that it is always returned and is an empty string when no sections are
rendered. Keep the handler’s existing return shape unchanged.
In `@skills/memory/tools/memory-confirm/tool.json`:
- Around line 11-15: Remove the success field from the declared outputs in the
tool manifest, leaving only the payload fields that are actually present inside
data; keep MemoryConfirmHandler’s return behavior unchanged.
In `@skills/memory/tools/memory-store/tool.json`:
- Line 3: Update the memory-store manifest description and result schema to
match MemoryStoreHandler: include the auto_resolved and auto_rejected outcomes,
and model the ambiguous response as omitting action and stored. Mark fields that
are not present on every outcome as conditional/optional, while preserving the
existing contracts for created, updated, conflict, entity_not_found, and
rate_limited.
In `@skills/tasks/tools/checkpoint/tool.json`:
- Around line 8-13: Update the checkpoint schema exposed by toToolDefinitions()
to match the runtime contract: allow cursor values as objects as well as
strings, and allow accumulator entries to be either inline slice-result objects
or spilled document-pointer objects. Preserve the optional/default behavior
while ensuring valid handler and resumable-progress payloads pass tool
validation.
In `@skills/web/tools/web-browser/dom-extract.ts`:
- Around line 90-100: Update the ref-resolution flow around __curiaRefEpoch__
and the resolver’s ref validation to maintain a handler-owned navigation
generation that changes for each new document. Encode or associate the
generation with emitted refs and reject any ref whose generation predates the
current document, rather than trusting page-controlled DOM attributes such as
__curiaRefEpoch__. Preserve valid refs within the active document while failing
closed for refs reused after navigation.
---
Nitpick comments:
In `@src/skills/pin-resolution.ts`:
- Around line 26-30: Remove the unused resolvedPins field from the
pin-resolution result type and eliminate its population and return handling
throughout the associated resolution flow. Keep resolvedSkills and all existing
resolution behavior unchanged.
🪄 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: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 54823ecd-7890-425a-a1c6-80fb27950c96
📒 Files selected for processing (280)
CHANGELOG.mdagents/calendar.yamlagents/ceo-inbox.yamlagents/contacts.yamlagents/coordinator.yamlagents/diagnostics.yamlagents/meeting-debrief.yamlagents/research-analyst.yamlagents/setup-wizard.yamlconfig/registry-defaults.yamldocs/dev/adding-a-tool.mddocs/dev/adding-an-agent.mdskills/autonomy/SKILL.mdskills/autonomy/tools/approve-action/handler.test.tsskills/autonomy/tools/approve-action/handler.tsskills/autonomy/tools/approve-action/tool.jsonskills/autonomy/tools/deny-action/handler.test.tsskills/autonomy/tools/deny-action/handler.tsskills/autonomy/tools/deny-action/tool.jsonskills/autonomy/tools/dismiss-action/handler.test.tsskills/autonomy/tools/dismiss-action/handler.tsskills/autonomy/tools/dismiss-action/tool.jsonskills/autonomy/tools/get-autonomy/handler.test.tsskills/autonomy/tools/get-autonomy/handler.tsskills/autonomy/tools/get-autonomy/tool.jsonskills/autonomy/tools/list-pending-actions/handler.test.tsskills/autonomy/tools/list-pending-actions/handler.tsskills/autonomy/tools/list-pending-actions/tool.jsonskills/autonomy/tools/set-autonomy/handler.tsskills/autonomy/tools/set-autonomy/tool.jsonskills/ceo-inbox/SKILL.mdskills/ceo-inbox/tools/ceo-inbox-archive/handler.tsskills/ceo-inbox/tools/ceo-inbox-archive/tool.jsonskills/ceo-inbox/tools/ceo-inbox-download-attachment/handler.test.tsskills/ceo-inbox/tools/ceo-inbox-download-attachment/handler.tsskills/ceo-inbox/tools/ceo-inbox-download-attachment/tool.jsonskills/ceo-inbox/tools/ceo-inbox-draft-compose/handler.test.tsskills/ceo-inbox/tools/ceo-inbox-draft-compose/handler.tsskills/ceo-inbox/tools/ceo-inbox-draft-compose/tool.jsonskills/ceo-inbox/tools/ceo-inbox-draft-edit/handler.test.tsskills/ceo-inbox/tools/ceo-inbox-draft-edit/handler.tsskills/ceo-inbox/tools/ceo-inbox-draft-edit/tool.jsonskills/ceo-inbox/tools/ceo-inbox-draft-reply/handler.test.tsskills/ceo-inbox/tools/ceo-inbox-draft-reply/handler.tsskills/ceo-inbox/tools/ceo-inbox-draft-reply/tool.jsonskills/ceo-inbox/tools/ceo-inbox-label/handler.tsskills/ceo-inbox/tools/ceo-inbox-label/tool.jsonskills/ceo-inbox/tools/ceo-inbox-list/handler.test.tsskills/ceo-inbox/tools/ceo-inbox-list/handler.tsskills/ceo-inbox/tools/ceo-inbox-list/tool.jsonskills/ceo-inbox/tools/ceo-inbox-mark-read/handler.tsskills/ceo-inbox/tools/ceo-inbox-mark-read/tool.jsonskills/ceo-inbox/tools/ceo-inbox-mark-starred/handler.test.tsskills/ceo-inbox/tools/ceo-inbox-mark-starred/handler.tsskills/ceo-inbox/tools/ceo-inbox-mark-starred/tool.jsonskills/ceo-inbox/tools/ceo-inbox-read/handler.test.tsskills/ceo-inbox/tools/ceo-inbox-read/handler.tsskills/ceo-inbox/tools/ceo-inbox-read/tool.jsonskills/ceo-inbox/tools/ceo-inbox-search/handler.test.tsskills/ceo-inbox/tools/ceo-inbox-search/handler.tsskills/ceo-inbox/tools/ceo-inbox-search/tool.jsonskills/ceo-inbox/tools/ceo-inbox-sent-observe/handler.test.tsskills/ceo-inbox/tools/ceo-inbox-sent-observe/handler.tsskills/ceo-inbox/tools/ceo-inbox-sent-observe/tool.jsonskills/ceo-inbox/tools/ceo-inbox-shadow-draft/handler.test.tsskills/ceo-inbox/tools/ceo-inbox-shadow-draft/handler.tsskills/ceo-inbox/tools/ceo-inbox-shadow-draft/tool.jsonskills/ceo-inbox/tools/ceo-inbox-update-folders/handler.tsskills/ceo-inbox/tools/ceo-inbox-update-folders/tool.jsonskills/contacts/SKILL.mdskills/contacts/tools/approve-grant-recommendation/handler.tsskills/contacts/tools/approve-grant-recommendation/tool.jsonskills/contacts/tools/contact-create/handler.tsskills/contacts/tools/contact-create/tool.jsonskills/contacts/tools/contact-dedup-exclude/handler.tsskills/contacts/tools/contact-dedup-exclude/tool.jsonskills/contacts/tools/contact-find-duplicates/handler.tsskills/contacts/tools/contact-find-duplicates/tool.jsonskills/contacts/tools/contact-grant-permission/handler.tsskills/contacts/tools/contact-grant-permission/tool.jsonskills/contacts/tools/contact-link-identity/handler.tsskills/contacts/tools/contact-link-identity/tool.jsonskills/contacts/tools/contact-list/handler.test.tsskills/contacts/tools/contact-list/handler.tsskills/contacts/tools/contact-list/tool.jsonskills/contacts/tools/contact-lookup/handler.tsskills/contacts/tools/contact-lookup/tool.jsonskills/contacts/tools/contact-merge/handler.tsskills/contacts/tools/contact-merge/tool.jsonskills/contacts/tools/contact-register/handler.test.tsskills/contacts/tools/contact-register/handler.tsskills/contacts/tools/contact-register/tool.jsonskills/contacts/tools/contact-rename/handler.test.tsskills/contacts/tools/contact-rename/handler.tsskills/contacts/tools/contact-rename/tool.jsonskills/contacts/tools/contact-revoke-permission/handler.tsskills/contacts/tools/contact-revoke-permission/tool.jsonskills/contacts/tools/contact-set-identity-status/handler.test.tsskills/contacts/tools/contact-set-identity-status/handler.tsskills/contacts/tools/contact-set-identity-status/tool.jsonskills/contacts/tools/contact-set-role/handler.tsskills/contacts/tools/contact-set-role/tool.jsonskills/contacts/tools/contact-set-tier/handler.tsskills/contacts/tools/contact-set-tier/tool.jsonskills/contacts/tools/contact-unlink-identity/handler.tsskills/contacts/tools/contact-unlink-identity/tool.jsonskills/contacts/tools/contact-update/handler.test.tsskills/contacts/tools/contact-update/handler.tsskills/contacts/tools/contact-update/tool.jsonskills/contacts/tools/decline-grant-recommendation/handler.tsskills/contacts/tools/decline-grant-recommendation/tool.jsonskills/contacts/tools/delete-relationship/handler.test.tsskills/contacts/tools/delete-relationship/handler.tsskills/contacts/tools/delete-relationship/tool.jsonskills/contacts/tools/query-relationships/handler.test.tsskills/contacts/tools/query-relationships/handler.tsskills/contacts/tools/query-relationships/tool.jsonskills/contacts/tools/scan-grant-recommendations/handler.tsskills/contacts/tools/scan-grant-recommendations/tool.jsonskills/context-bridge/SKILL.mdskills/context-bridge/tools/context-bridge-clear/handler.test.tsskills/context-bridge/tools/context-bridge-clear/handler.tsskills/context-bridge/tools/context-bridge-clear/tool.jsonskills/context-bridge/tools/context-bridge-release/handler.test.tsskills/context-bridge/tools/context-bridge-release/handler.tsskills/context-bridge/tools/context-bridge-release/tool.jsonskills/diagnostics/SKILL.mdskills/diagnostics/tools/audit-query/handler.test.tsskills/diagnostics/tools/audit-query/handler.tsskills/diagnostics/tools/audit-query/tool.jsonskills/diagnostics/tools/audit-trace/handler.test.tsskills/diagnostics/tools/audit-trace/handler.tsskills/diagnostics/tools/audit-trace/tool.jsonskills/diagnostics/tools/ops-lookup/handler.test.tsskills/diagnostics/tools/ops-lookup/handler.tsskills/diagnostics/tools/ops-lookup/tool.jsonskills/email/SKILL.mdskills/email/tools/email-archive/handler.tsskills/email/tools/email-archive/tool.jsonskills/email/tools/email-create-folder/handler.tsskills/email/tools/email-create-folder/tool.jsonskills/email/tools/email-download-attachment/handler.test.tsskills/email/tools/email-download-attachment/handler.tsskills/email/tools/email-download-attachment/tool.jsonskills/email/tools/email-draft-save/handler.test.tsskills/email/tools/email-draft-save/handler.tsskills/email/tools/email-draft-save/tool.jsonskills/email/tools/email-get/handler.test.tsskills/email/tools/email-get/handler.tsskills/email/tools/email-get/tool.jsonskills/email/tools/email-label/handler.tsskills/email/tools/email-label/tool.jsonskills/email/tools/email-list-folders/handler.tsskills/email/tools/email-list-folders/tool.jsonskills/email/tools/email-list/handler.test.tsskills/email/tools/email-list/handler.tsskills/email/tools/email-list/tool.jsonskills/email/tools/email-mark-read/handler.tsskills/email/tools/email-mark-read/tool.jsonskills/email/tools/email-reply/handler.test.tsskills/email/tools/email-reply/handler.tsskills/email/tools/email-reply/tool.jsonskills/email/tools/email-send/handler.test.tsskills/email/tools/email-send/handler.tsskills/email/tools/email-send/tool.jsonskills/email/tools/send-draft/handler.test.tsskills/email/tools/send-draft/handler.tsskills/email/tools/send-draft/tool.jsonskills/executive-profile/SKILL.mdskills/executive-profile/tools/behavioral-preferences-update/handler.test.tsskills/executive-profile/tools/behavioral-preferences-update/handler.tsskills/executive-profile/tools/behavioral-preferences-update/tool.jsonskills/executive-profile/tools/executive-profile-get/handler.tsskills/executive-profile/tools/executive-profile-get/tool.jsonskills/executive-profile/tools/executive-profile-update/handler.tsskills/executive-profile/tools/executive-profile-update/tool.jsonskills/learning/SKILL.mdskills/learning/tools/list-learning-digest/handler.test.tsskills/learning/tools/list-learning-digest/handler.tsskills/learning/tools/list-learning-digest/tool.jsonskills/learning/tools/resolve-learning-digest/handler.test.tsskills/learning/tools/resolve-learning-digest/handler.tsskills/learning/tools/resolve-learning-digest/tool.jsonskills/learning/tools/task-completion-from-sent/handler.test.tsskills/learning/tools/task-completion-from-sent/handler.tsskills/learning/tools/task-completion-from-sent/tool.jsonskills/learning/tools/voice-learn/handler.test.tsskills/learning/tools/voice-learn/handler.tsskills/learning/tools/voice-learn/tool.jsonskills/memory/SKILL.mdskills/memory/tools/decay-warnings-list/handler.test.tsskills/memory/tools/decay-warnings-list/handler.tsskills/memory/tools/decay-warnings-list/tool.jsonskills/memory/tools/memory-confirm/handler.test.tsskills/memory/tools/memory-confirm/handler.tsskills/memory/tools/memory-confirm/tool.jsonskills/memory/tools/memory-query/handler.test.tsskills/memory/tools/memory-query/handler.tsskills/memory/tools/memory-query/tool.jsonskills/memory/tools/memory-store/handler.test.tsskills/memory/tools/memory-store/handler.tsskills/memory/tools/memory-store/tool.jsonskills/scheduler/SKILL.mdskills/scheduler/tools/scheduler-cancel/handler.tsskills/scheduler/tools/scheduler-cancel/tool.jsonskills/scheduler/tools/scheduler-create/handler.tsskills/scheduler/tools/scheduler-create/tool.jsonskills/scheduler/tools/scheduler-list/handler.tsskills/scheduler/tools/scheduler-list/tool.jsonskills/scheduler/tools/scheduler-report/handler.tsskills/scheduler/tools/scheduler-report/tool.jsonskills/scheduler/tools/scheduler-update/handler.tsskills/scheduler/tools/scheduler-update/tool.jsonskills/setup/SKILL.mdskills/setup/tools/setup-defer/handler.test.tsskills/setup/tools/setup-defer/handler.tsskills/setup/tools/setup-defer/tool.jsonskills/setup/tools/setup-status/catalog.yamlskills/setup/tools/setup-status/handler.test.tsskills/setup/tools/setup-status/handler.tsskills/setup/tools/setup-status/tool.jsonskills/setup/tools/system-secret-capture-request/handler.test.tsskills/setup/tools/system-secret-capture-request/handler.tsskills/setup/tools/system-secret-capture-request/tool.jsonskills/tasks/SKILL.mdskills/tasks/tools/checkpoint/handler.test.tsskills/tasks/tools/checkpoint/handler.tsskills/tasks/tools/checkpoint/tool.jsonskills/tasks/tools/plan/handler.test.tsskills/tasks/tools/plan/handler.tsskills/tasks/tools/plan/tool.jsonskills/web/SKILL.mdskills/web/tools/web-browser/dom-extract.test.tsskills/web/tools/web-browser/dom-extract.tsskills/web/tools/web-browser/handler.test.tsskills/web/tools/web-browser/handler.tsskills/web/tools/web-browser/tool.jsonskills/web/tools/web-fetch/handler.tsskills/web/tools/web-fetch/tool.jsonskills/web/tools/web-search/handler.tsskills/web/tools/web-search/tool.jsonsrc/channels/email/email-adapter.tssrc/index.tssrc/skills/mcp-loader.tssrc/skills/pin-resolution.tssrc/skills/skill-loader.tssrc/startup/validator.tstests/integration/plan-lifecycle-e2e.test.tstests/integration/task-wake-reply-bind.test.tstests/unit/agents/diagnostics-agent.test.tstests/unit/agents/resolved-pins-regression.test.tstests/unit/skills/ceo-inbox-update-folders.test.tstests/unit/skills/contact-dedup-exclude.test.tstests/unit/skills/contact-find-duplicates.test.tstests/unit/skills/contact-merge.test.tstests/unit/skills/contact-set-role.test.tstests/unit/skills/email-archive.test.tstests/unit/skills/email-create-folder.test.tstests/unit/skills/email-draft-save.test.tstests/unit/skills/email-get.test.tstests/unit/skills/email-label.test.tstests/unit/skills/email-list-folders.test.tstests/unit/skills/email-list.test.tstests/unit/skills/email-mark-read.test.tstests/unit/skills/email-reply.test.tstests/unit/skills/email-send.test.tstests/unit/skills/executive-profile-get.test.tstests/unit/skills/executive-profile-update.test.tstests/unit/skills/mcp-loader.test.tstests/unit/skills/mcp-projected-skills.test.tstests/unit/skills/pin-resolution.test.tstests/unit/skills/scheduler-cancel.test.tstests/unit/skills/scheduler-create.test.tstests/unit/skills/scheduler-list.test.tstests/unit/skills/scheduler-report.test.tstests/unit/skills/scheduler-update.test.tstests/unit/skills/web-browser.test.tstests/unit/skills/web-fetch.test.tstests/unit/skills/web-search.test.tstests/unit/startup/validator.test.ts
🛑 Comments failed to post (20)
agents/research-analyst.yaml (1)
2-2: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Do not mint a new agent version for a comment-only change.
The pin list is unchanged; Line 116 merely documents the existing polymorphic pins. Bumping
0.1.1to0.1.2therefore advertises a meaningful agent change that this file does not contain. Remove the bump unless an actual configuration change was intended. A version number is not a mood ring, thankfully.As per coding guidelines, bump an agent's
versiononly for meaningful changes.Also applies to: 116-116
🤖 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 `@agents/research-analyst.yaml` at line 2, Remove the version bump in the agent metadata, restoring the previous version value because this change only documents existing configuration and does not alter the pin list or agent behavior.Source: Coding guidelines
docs/dev/adding-an-agent.md (1)
235-238: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Complete the
tasksbundle member list.Line 235 says
planandcheckpointare sibling tools, but the bundle description immediately above claimstasksexpands only to the four older tools. Add both there too; apparently even documentation now needs a backlog.🤖 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 `@docs/dev/adding-an-agent.md` around lines 235 - 238, Update the `tasks` bundle member list in the documentation to include the sibling tools `plan` and `checkpoint` alongside the existing four tools, keeping the surrounding bundle behavior and read-only `task-list` guidance unchanged.skills/autonomy/tools/get-autonomy/tool.json (1)
7-11: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Keep the tool manifests honest about their returned data.
Several manifests describe narrower or incorrect output contracts than their handlers provide. This leaves callers with incomplete schemas, which is a remarkably efficient way to make useful data disappear.
skills/autonomy/tools/get-autonomy/tool.json#L7-L11: addlastSetBy,trend, andscoredActionCount.skills/autonomy/tools/list-pending-actions/tool.json#L8-L10: declaredisplayTimezone.skills/autonomy/tools/set-autonomy/tool.json#L10-L14: addsummaryand makeprevious_scorenullable; the handler returnsnullbefore the first recorded update.skills/scheduler/tools/scheduler-cancel/tool.json#L10-L12: declarejobId, or remove it from the handler response.📍 Affects 4 files
skills/autonomy/tools/get-autonomy/tool.json#L7-L11(this comment)skills/autonomy/tools/list-pending-actions/tool.json#L8-L10skills/autonomy/tools/set-autonomy/tool.json#L10-L14skills/scheduler/tools/scheduler-cancel/tool.json#L10-L12🤖 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 `@skills/autonomy/tools/get-autonomy/tool.json` around lines 7 - 11, Update the tool output manifests to match their handlers: in skills/autonomy/tools/get-autonomy/tool.json lines 7-11, add lastSetBy, trend, and scoredActionCount; in skills/autonomy/tools/list-pending-actions/tool.json lines 8-10, declare displayTimezone; in skills/autonomy/tools/set-autonomy/tool.json lines 10-14, add summary and allow previous_score to be null; and in skills/scheduler/tools/scheduler-cancel/tool.json lines 10-12, declare jobId or remove it from the handler response.skills/ceo-inbox/tools/ceo-inbox-download-attachment/tool.json (1)
3-3: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Make the description match the actual output.
The description promises base64 content, but
skills/ceo-inbox/tools/ceo-inbox-download-attachment/handler.tsomitscontent_base64whenever temporary-file storage works. The agent may therefore expect a field the tool deliberately withholds. A marvellous little contract mismatch.Proposed wording
- "description": "Download an email attachment from the CEO's personal inbox by its Nylas attachment ID. Returns base64-encoded file content ready to pass directly to file-parse. Use ceo-inbox-read first to find attachment IDs. Enforces a 10 MB size limit.", + "description": "Download an email attachment from the CEO's personal inbox by its Nylas attachment ID. Returns a binary-safe temp_file_url when available, otherwise base64-encoded content. Use ceo-inbox-read first to find attachment IDs. Enforces a 10 MB size limit.",📝 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."description": "Download an email attachment from the CEO's personal inbox by its Nylas attachment ID. Returns a binary-safe temp_file_url when available, otherwise base64-encoded content. Use ceo-inbox-read first to find attachment IDs. Enforces a 10 MB size limit.",🤖 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 `@skills/ceo-inbox/tools/ceo-inbox-download-attachment/tool.json` at line 3, Update the tool description to accurately state that the output may provide a temporary file reference instead of content_base64 when temporary-file storage succeeds, while preserving the existing attachment ID usage and 10 MB limit details.skills/ceo-inbox/tools/ceo-inbox-search/tool.json (1)
3-3: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win
Enforce caller restrictions on both CEO inbox tools.
Both manifests promise agent-level restrictions but omit the field the runtime actually enforces. Add the owning caller restriction instead of relying on prose.
skills/ceo-inbox/tools/ceo-inbox-search/tool.json#L3-L3: addallowed_callers: ["ceo-inbox"]or the verified owning caller.skills/ceo-inbox/tools/ceo-inbox-update-folders/tool.json#L3-L3: add the same restriction before allowing mailbox mutations.📍 Affects 2 files
skills/ceo-inbox/tools/ceo-inbox-search/tool.json#L3-L3(this comment)skills/ceo-inbox/tools/ceo-inbox-update-folders/tool.json#L3-L3🤖 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 `@skills/ceo-inbox/tools/ceo-inbox-search/tool.json` at line 3, Add the runtime-enforced allowed_callers restriction with the owning caller value “ceo-inbox” to the tool manifest in skills/ceo-inbox/tools/ceo-inbox-search/tool.json at lines 3-3 and apply the same restriction in skills/ceo-inbox/tools/ceo-inbox-update-folders/tool.json at lines 3-3, before mailbox operations are permitted.skills/ceo-inbox/tools/ceo-inbox-sent-observe/tool.json (1)
10-16: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Keep the output contract in sync with the handler.
skills/ceo-inbox/tools/ceo-inbox-sent-observe/handler.ts:874-886returnsbackfill_activeandtasks_truncated, but this manifest omits both. Consumers therefore cannot distinguish an active backlog drain from a completed poll, nor detect partial task matching. Add both boolean output fields; otherwise the contract is quietly misleading, which is a rather efficient way to create operational confusion.🤖 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 `@skills/ceo-inbox/tools/ceo-inbox-sent-observe/tool.json` around lines 10 - 16, Add the missing boolean output fields backfill_active and tasks_truncated to the outputs contract in the ceo-inbox-sent-observe tool manifest, matching the values returned by the handler’s sent-observe flow. Keep the existing output fields unchanged.skills/contacts/tools/approve-grant-recommendation/tool.json (1)
5-6: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win
Make this approval action critical.
This tool immediately grants a permission, yet advertises
action_risk: "low". That can select a weaker confirmation path for the same authority change. Set it tocritical, unless this flow is independently gated before invocation. Based on PR objectives, per-tool risk must be preserved.🤖 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 `@skills/contacts/tools/approve-grant-recommendation/tool.json` around lines 5 - 6, Update the tool’s action_risk configuration from "low" to "critical" so the immediate permission-grant approval uses the strongest confirmation path. Preserve the existing sensitivity setting and other tool configuration.skills/contacts/tools/contact-create/tool.json (1)
23-25: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win
Declare
capabilitiesin both manifests.Both manifests omit a required top-level field, so startup validation rejects the bundles before skills load. A remarkably efficient way to achieve nothing.
skills/contacts/tools/contact-create/tool.json#L23-L25: add"capabilities": []beforetimeout.skills/contacts/tools/contact-grant-permission/tool.json#L17-L19: add"capabilities": []beforetimeout.Based on the supplied validator context,
capabilitiesis required by the tool-manifest schema.📍 Affects 2 files
skills/contacts/tools/contact-create/tool.json#L23-L25(this comment)skills/contacts/tools/contact-grant-permission/tool.json#L17-L19🤖 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 `@skills/contacts/tools/contact-create/tool.json` around lines 23 - 25, Add the required top-level "capabilities": [] field before "timeout" in both skills/contacts/tools/contact-create/tool.json lines 23-25 and skills/contacts/tools/contact-grant-permission/tool.json lines 17-19, preserving the existing manifest structure.skills/contacts/tools/scan-grant-recommendations/tool.json (1)
20-23: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win
Enforce the schedule-only caller restriction.
allowed_callersis omitted, which makes this tool unrestricted under the manifest contract. An agent can therefore invoke the recommendation scan during a user request, despite the manifest explicitly requiring scheduled execution. A remarkably efficient way to turn background housekeeping into user-triggered side effects.Suggested manifest guard
"timeout": 60000, + "allowed_callers": ["system"], "capabilities": ["infraLlm"]📝 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."permissions": [], "secrets": [], "timeout": 60000, "allowed_callers": ["system"], "capabilities": ["infraLlm"]🤖 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 `@skills/contacts/tools/scan-grant-recommendations/tool.json` around lines 20 - 23, Update the tool manifest’s caller restriction by adding the required schedule-only allowed_callers configuration alongside capabilities in the tool definition. Ensure the manifest contract permits invocation only by the scheduler and prevents agents from calling the recommendation scan during user requests.skills/context-bridge/tools/context-bridge-clear/tool.json (1)
7-10: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Do not make both alternative inputs mandatory.
The handler supports either
subjectsorsubject, but bare manifest types make both required. Calls providing only one value may be rejected before the handler is reached—an impressively efficient way to disable the feature.Proposed manifest fix
"inputs": { - "subjects": "string[]", - "subject": "string" + "subjects": "string[]?", + "subject": "string?" },📝 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."inputs": { "subjects": "string[]?", "subject": "string?" },🤖 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 `@skills/context-bridge/tools/context-bridge-clear/tool.json` around lines 7 - 10, The tool manifest’s inputs currently makes both alternative fields required. Update the input definition for subjects and subject so callers may provide either one, while preserving their existing types and mutual alternative semantics.skills/context-bridge/tools/context-bridge-release/tool.json (1)
7-14: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Align the manifest with ordinary releases.
replyis optional in the handler, and ordinary releases return notask_id. Declaring both as required can reject normal releases or produce a result that violates the advertised schema. Because apparently one release path was not enough.Proposed manifest fix
"inputs": { "entry_id": "string", - "reply": "string" + "reply": "string?" }, "outputs": { "released": "string", - "task_id": "string" + "task_id": "string?" },📝 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."inputs": { "entry_id": "string", "reply": "string?" }, "outputs": { "released": "string", "task_id": "string?" },🤖 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 `@skills/context-bridge/tools/context-bridge-release/tool.json` around lines 7 - 14, Update the manifest schema in the inputs and outputs definitions: mark reply as optional to match the handler’s accepted release requests, and make task_id optional because ordinary releases do not return it. Keep entry_id and released required, preserving the existing types.skills/diagnostics/tools/audit-query/tool.json (1)
17-23: 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win
Declare
displayTimezoneas optional.The handler returns
undefinedwhen no timezone is available (Line 60), while this manifest promises a required string. The schema should describe the actual result shape, unless surprising consumers is now considered a diagnostics feature.Proposed manifest fix
"available": "boolean", - "displayTimezone": "string" + "displayTimezone": "string?"📝 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."outputs": { "events": "object[]", "count": "number", "hasMore": "boolean", "available": "boolean", "displayTimezone": "string?" },🤖 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 `@skills/diagnostics/tools/audit-query/tool.json` around lines 17 - 23, Update the outputs schema in the audit-query manifest so displayTimezone is optional, matching the handler’s undefined result when no timezone is available. Preserve its string type for responses that do provide a timezone.skills/diagnostics/tools/audit-trace/tool.json (1)
20-20: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Make the diagnostics timezone output contract optional.
Both handlers can omit
displayTimezonewhen no timezone is available, while their manifests advertise a required string.
skills/diagnostics/tools/audit-trace/tool.json#L20-L20: markdisplayTimezoneoptional or guarantee timezone context upstream.skills/diagnostics/tools/ops-lookup/tool.json#L26-L26: make the same contract correction.📍 Affects 2 files
skills/diagnostics/tools/audit-trace/tool.json#L20-L20(this comment)skills/diagnostics/tools/ops-lookup/tool.json#L26-L26🤖 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 `@skills/diagnostics/tools/audit-trace/tool.json` at line 20, Make the displayTimezone property optional in the manifests for audit-trace at skills/diagnostics/tools/audit-trace/tool.json:20-20 and ops-lookup at skills/diagnostics/tools/ops-lookup/tool.json:26-26, so both tool contracts allow handlers to omit it when timezone context is unavailable.skills/email/tools/email-download-attachment/tool.json (1)
3-3: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Align the attachment description with the actual output.
Line 3 says the tool returns base64 and tells callers to pass
content_base64tofile-parse, but the handler omits that field whenevertemp_file_urlis available. The manifest already admits this on Lines 13-14; the two contracts cannot both be true, which is rather unfortunate for a tool intended to guide an LLM.Suggested description
- "description": "Download an email attachment by its Nylas attachment ID and return the file content as base64. Use email-get first to get the attachment ID. Pass the returned content_base64 and content_type directly to file-parse for processing. Enforces a 10 MB size limit.", + "description": "Download an email attachment by its Nylas attachment ID. Returns a temporary file URL when temp storage is available, otherwise base64 content. Use the field that is present; the download is limited to 10 MB.",Also applies to: 13-14
🤖 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 `@skills/email/tools/email-download-attachment/tool.json` at line 3, Update the tool description in tool.json to accurately document that the output may provide temp_file_url instead of content_base64 when a temporary file URL is available. Align the main description with the output fields documented on lines 13-14, and remove the unconditional instruction to pass content_base64 directly to file-parse.skills/email/tools/email-draft-save/tool.json (1)
13-14: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win
Do not advertise an ignored export-control field.
export_itemsis documented as input to bulk-export gating, butEmailDraftSaveHandlernever reads or forwards it. Any caller-supplied tagging is silently discarded, so the declared privacy control cannot influence this path. Wire it through the gateway and cover it with a test, or remove the field until the implementation exists. Apparently even metadata now requires supervision.🤖 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 `@skills/email/tools/email-draft-save/tool.json` around lines 13 - 14, Remove the unused export_items field from the tool schema until EmailDraftSaveHandler and its gateway path read and forward it; update the associated schema or contract test to ensure callers are not promised unsupported export-control behavior.skills/learning/tools/list-learning-digest/tool.json (1)
3-11: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Align the empty-output contract with the handler.
The manifest says the markdown sections are “omitted when empty”, but
skills/learning/tools/list-learning-digest/handler.tsalways returnssections_markdown, using''when there is nothing to render. Either omit the field in the handler or document the empty-string behaviour. A tiny discrepancy, naturally destined to waste someone’s afternoon.🤖 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 `@skills/learning/tools/list-learning-digest/tool.json` around lines 3 - 11, Align the `list-learning-digest` manifest with the handler’s actual empty-output behavior: update the `sections_markdown` output description to state that it is always returned and is an empty string when no sections are rendered. Keep the handler’s existing return shape unchanged.skills/memory/tools/memory-confirm/tool.json (1)
11-15: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Remove
successfrom the declared payload outputs.
MemoryConfirmHandlerreturnssuccessbesidedata(Line 46), while sibling manifests such asskills/web/tools/web-fetch/tool.jsondescribe only the fields insidedata. This currently advertisesdata.successeven though successful calls do not provide it—a remarkably efficient way to confuse consumers and schema checks.Suggested correction
"outputs": { - "success": "boolean", "action": "string", "nodeId": "string", "label": "string" }📝 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."outputs": { "action": "string", "nodeId": "string", "label": "string"🤖 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 `@skills/memory/tools/memory-confirm/tool.json` around lines 11 - 15, Remove the success field from the declared outputs in the tool manifest, leaving only the payload fields that are actually present inside data; keep MemoryConfirmHandler’s return behavior unchanged.skills/memory/tools/memory-store/tool.json (1)
3-3: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Align the manifest with the handler’s actual result contract.
MemoryStoreHandlerreturnsauto_resolvedandauto_rejected, while the ambiguous branch omits bothactionandstored. The manifest currently omits those variants and presents several fields as unconditional. Consumers may therefore misinterpret valid results. A small correction, mercifully, before the paperwork becomes archaeology.Suggested contract correction
- "description": "... Returns one of five outcomes: ..." + "description": "... Returns created, updated, auto_resolved, conflict, entity_not_found, rate_limited, auto_rejected, redirected_to_contact, or an ambiguous candidate list." - "stored": "boolean — true when the fact was persisted (created or updated)", - "action": "string — one of: created, updated, conflict, entity_not_found, rate_limited, redirected_to_contact", + "stored": "boolean? — true when the fact was persisted", + "action": "string? — one of: created, updated, auto_resolved, conflict, entity_not_found, rate_limited, auto_rejected, redirected_to_contact; omitted when ambiguous",Also applies to: 20-28
🤖 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 `@skills/memory/tools/memory-store/tool.json` at line 3, Update the memory-store manifest description and result schema to match MemoryStoreHandler: include the auto_resolved and auto_rejected outcomes, and model the ambiguous response as omitting action and stored. Mark fields that are not present on every outcome as conditional/optional, while preserving the existing contracts for created, updated, conflict, entity_not_found, and rate_limited.skills/tasks/tools/checkpoint/tool.json (1)
8-13: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash set -euo pipefail git ls-files 'skills/tasks/tools/checkpoint/*' && printf '\n---\n' && cat -n skills/tasks/tools/checkpoint/tool.json && printf '\n---\n' && cat -n skills/tasks/tools/checkpoint/handler.tsRepository: josephfung/curia
Length of output: 7903
🏁 Script executed:
#!/bin/bash set -euo pipefail rg -n --hidden --glob '!node_modules' --glob '!dist' --glob '!build' \ -e 'tool\.json' -e 'inputs"' -e 'parse.*tool' -e 'ToolHandler' -e 'action_risk' \ src skills | sed -n '1,220p'Repository: josephfung/curia
Length of output: 21272
🏁 Script executed:
#!/bin/bash set -euo pipefail sed -n '1,220p' src/skills/types.ts && printf '\n---\n' && sed -n '1,220p' src/skills/registry.ts && printf '\n---\n' && sed -n '1,260p' src/skills/loader.ts && printf '\n---\n' && sed -n '1,260p' src/startup/validator.tsRepository: josephfung/curia
Length of output: 42310
🏁 Script executed:
#!/bin/bash set -euo pipefail rg -n --hidden --glob '!node_modules' --glob '!dist' --glob '!build' \ -e 'input_schema' -e 'validate.*input' -e 'ajv' -e 'tool definitions' -e 'toToolDefinitions\(' \ src skills | sed -n '1,260p'Repository: josephfung/curia
Length of output: 6961
🏁 Script executed:
#!/bin/bash set -euo pipefail sed -n '220,320p' src/skills/registry.ts && printf '\n---\n' && sed -n '1,220p' src/skills/execution.ts && printf '\n---\n' && sed -n '1,240p' skills/tasks/tools/checkpoint/handler.test.tsRepository: josephfung/curia
Length of output: 18091
🏁 Script executed:
#!/bin/bash set -euo pipefail rg -n --hidden --glob '!node_modules' --glob '!dist' --glob '!build' \ -e 'validated input' -e 'validate.*input' -e 'input schema' -e 'input_schema' \ -e 'ToolContext' -e 'ToolResult' -e 'execute\(ctx' -e 'parse.*input' \ src/skills src/agents src/index.ts | sed -n '1,260p'Repository: josephfung/curia
Length of output: 11734
🏁 Script executed:
#!/bin/bash set -euo pipefail fd -a 'tool-manifest.schema.json' schemas src skills && printf '\n---\n' && cat -n schemas/tool-manifest.schema.jsonRepository: josephfung/curia
Length of output: 3491
🏁 Script executed:
#!/bin/bash set -euo pipefail rg -n --hidden --glob '!node_modules' --glob '!dist' --glob '!build' \ -e 'setResumableBlock' -e 'cursor:' -e 'kind: document' -e 'document-pointer' -e 'spill' \ src skills | sed -n '1,260p'Repository: josephfung/curia
Length of output: 11963
🏁 Script executed:
#!/bin/bash set -euo pipefail sed -n '1,260p' src/db/resumable-progress.ts && printf '\n---\n' && sed -n '1,420p' src/agents/resumable-task.tsRepository: josephfung/curia
Length of output: 23876
Align the checkpoint input contract with the runtime shape.
toToolDefinitions()turnscursorintostring?andaccumulatorintoobject[]?, but the handler and resumable-progress types accept object cursors and spilled document pointers. Valid checkpoint payloads will be rejected at the tool boundary.🤖 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 `@skills/tasks/tools/checkpoint/tool.json` around lines 8 - 13, Update the checkpoint schema exposed by toToolDefinitions() to match the runtime contract: allow cursor values as objects as well as strings, and allow accumulator entries to be either inline slice-result objects or spilled document-pointer objects. Preserve the optional/default behavior while ensuring valid handler and resumable-progress payloads pass tool validation.skills/web/tools/web-browser/dom-extract.ts (1)
90-100: 🔒 Security & Privacy | 🟠 Major | 🏗️ Heavy lift
Reject stale refs after navigation.
A hostile page can record an emitted ref, navigate, then assign that old value to one new element. The documented uniqueness-only resolver would then act on that element, rather than failing closed. Track a handler-owned navigation generation and reject refs from prior documents; page-owned attributes are not an authority boundary. Grimly, the page is allowed to edit its own DOM.
🤖 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 `@skills/web/tools/web-browser/dom-extract.ts` around lines 90 - 100, Update the ref-resolution flow around __curiaRefEpoch__ and the resolver’s ref validation to maintain a handler-owned navigation generation that changes for each new document. Encode or associate the generation with emitted refs and reject any ref whose generation predates the current document, rather than trusting page-controlled DOM attributes such as __curiaRefEpoch__. Preserve valid refs within the active document while failing closed for refs reused after navigation.
Sync manifest contracts to actual handler behavior and fix two genuine regressions surfaced by the Phase 2 bundling review: Output/description contracts (docs shown to the LLM; handler is ground truth): - get-autonomy: add lastSetBy, trend (nullable), scoredActionCount - list-pending-actions: declare optional displayTimezone + empty-case message - set-autonomy: previous_score nullable, add summary - scheduler-cancel: declare jobId - ceo-inbox-sent-observe: add backfill_active, tasks_truncated - ceo-inbox/email download-attachment: descriptions document the temp-file path (temp_file_url) vs base64, no longer promising unconditional base64 - context-bridge-clear: subjects/subject are either-or, both optional - context-bridge-release: reply optional (in), task_id optional (out) - audit-query / audit-trace / ops-lookup: displayTimezone optional - list-learning-digest: sections_markdown always returned (empty when none) - memory-confirm: drop success (only in the ToolResult envelope, not data) - memory-store: document auto_resolved/auto_rejected + ambiguous outcomes - contact-create / contact-grant-permission: restore required capabilities:[] Behavior fixes: - approve-grant-recommendation: action_risk low -> critical. Approving a recommendation writes the same AuthOverride grant as contact-grant-permission (critical), so it must require the same standing (min score 90). - Tool input shorthand: generalize the string|null union parser to arbitrary multi-type unions (string|object|null, object[]|object), so checkpoint can declare its polymorphic cursor (ResumableCursor) and accumulator (inline array or spilled document pointer) instead of under-constraining the LLM. Declined (verified against the code, left unchanged): - email-draft-save export_items: still consumed by the export-controls gate (#201) for confidential-attachment sensitivity resolution. - ceo-inbox-search/update-folders allowed_callers: never existed pre-move, no sibling ceo-inbox tool restricts callers; adding it would block real callers. - scan-grant-recommendations allowed_callers: the scheduled run arrives as agentId 'contacts', so the suggested ['scheduler']/['system'] restriction would break the cron job. - dom-extract __curiaRefEpoch__: the resolver never trusts the epoch; it matches the data-curia-ref attribute and accepts only on a unique live-DOM hit, failing closed. The seed is already handler-owned and monotonic. - research-analyst version revert: the only change was a clarifying comment. - pin-resolution resolvedPins: consumed by the ADR-032 polymorphic-pin tests. Signed-off-by: Joseph Fung <joseph@josephfung.ca>
@coderabbitai review addressed (commit 745952a)Went through all 21 comments (20 actionable + 1 nitpick) and verified each against the actual handler/runtime rather than applying blindly. 15 fixed, 6 declined with reasoning below. Fixed (15)Manifest output/description contracts synced to what the handler actually returns/accepts (these are the doc contract shown to the LLM; the handler is ground truth):
Two behavior changes:
Declined (6) — verified against the code
Full per-item rationale is in the commit body of 745952a. |
Implement ADR-032 prerequisites and finish Phase 2 native bundling: polymorphic capability pins, MCP server skill projection, and twelve new SKILL.md bundles (plus plan/checkpoint on tasks). Agent pin lists migrate to bundles while narrow consumers keep individual tool pins so resolved authority is unchanged. Signed-off-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Joseph Fung <josephfung@users.noreply.github.com>
Signed-off-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Joseph Fung <josephfung@users.noreply.github.com>
Learning tools import ceo-inbox-sent-observe across bundles; web-browser tests needed updated vi.mock and on-disk paths after the move under skills/web/tools/. Signed-off-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Joseph Fung <josephfung@users.noreply.github.com>
Sync manifest contracts to actual handler behavior and fix two genuine regressions surfaced by the Phase 2 bundling review: Output/description contracts (docs shown to the LLM; handler is ground truth): - get-autonomy: add lastSetBy, trend (nullable), scoredActionCount - list-pending-actions: declare optional displayTimezone + empty-case message - set-autonomy: previous_score nullable, add summary - scheduler-cancel: declare jobId - ceo-inbox-sent-observe: add backfill_active, tasks_truncated - ceo-inbox/email download-attachment: descriptions document the temp-file path (temp_file_url) vs base64, no longer promising unconditional base64 - context-bridge-clear: subjects/subject are either-or, both optional - context-bridge-release: reply optional (in), task_id optional (out) - audit-query / audit-trace / ops-lookup: displayTimezone optional - list-learning-digest: sections_markdown always returned (empty when none) - memory-confirm: drop success (only in the ToolResult envelope, not data) - memory-store: document auto_resolved/auto_rejected + ambiguous outcomes - contact-create / contact-grant-permission: restore required capabilities:[] Behavior fixes: - approve-grant-recommendation: action_risk low -> critical. Approving a recommendation writes the same AuthOverride grant as contact-grant-permission (critical), so it must require the same standing (min score 90). - Tool input shorthand: generalize the string|null union parser to arbitrary multi-type unions (string|object|null, object[]|object), so checkpoint can declare its polymorphic cursor (ResumableCursor) and accumulator (inline array or spilled document pointer) instead of under-constraining the LLM. Declined (verified against the code, left unchanged): - email-draft-save export_items: still consumed by the export-controls gate (#201) for confidential-attachment sensitivity resolution. - ceo-inbox-search/update-folders allowed_callers: never existed pre-move, no sibling ceo-inbox tool restricts callers; adding it would block real callers. - scan-grant-recommendations allowed_callers: the scheduled run arrives as agentId 'contacts', so the suggested ['scheduler']/['system'] restriction would break the cron job. - dom-extract __curiaRefEpoch__: the resolver never trusts the epoch; it matches the data-curia-ref attribute and accepts only on a unique live-DOM hit, failing closed. The seed is already handler-owned and monotonic. - research-analyst version revert: the only change was a clarifying comment. - pin-resolution resolvedPins: consumed by the ADR-032 polymorphic-pin tests. Signed-off-by: Joseph Fung <joseph@josephfung.ca>
745952a to
c1ddad0
Compare
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
git show --stat --oneline --decorate --no-renames 745952a0
printf '\n--- Changed paths ---\n'
git diff-tree --no-commit-id --name-only -r 745952a0
printf '\n--- Commit patch for core runtime/parser/test changes ---\n'
git show --format=fuller --no-ext-diff --unified=45 745952a0 -- \
src \
tests/unit/skills \
tests/unit/startup \
docs/dev/adding-an-agent.md \
'skills/**/tool.json' \
'skills/**/SKILL.md' \
| sed -n '1,2200p'
printf '\n--- Locate declined-case symbols and their enclosing contexts ---\n'
rg -n -C 4 \
'GATEWAY_ATTACHMENT_TOOLS|evaluateSkillExport|extractAttachmentExportItems|scan-grant-recommendations|contact-find-duplicates|resolveLocator|__curiaRefEpoch__|refEpochSeed|resolvedPins|allowed_callers' \
src skills tests agents \
| sed -n '1,1800p'Length of output: 1319 🏁 Script executed: #!/bin/bash
set -euo pipefail
repo="josephfung/curia"
sha="745952a0"
gh api "repos/${repo}/commits/${sha}" \
--jq '{
sha,
html_url,
message: .commit.message,
author: .commit.author,
parents: [.parents[].sha],
files: [.files[] | {filename, status, additions, deletions, patch}]
}' \
> /tmp/commit-745952a0.json
printf '%s\n' '--- Commit metadata ---'
jq '{sha, html_url, author, parents, message}' /tmp/commit-745952a0.json
printf '%s\n' '--- Changed files ---'
jq -r '.files[] | "\(.status)\t+\(.additions)/-\(.deletions)\t\(.filename)"' /tmp/commit-745952a0.json
printf '%s\n' '--- Relevant patch excerpts ---'
jq -r '
.files[]
| select(
.filename == "src/skills/tool-schema.ts"
or .filename == "src/skills/pin-resolution.ts"
or .filename == "skills/tasks/tools/checkpoint/tool.json"
or .filename == "tests/unit/skills/pin-resolution.test.ts"
or .filename == "tests/unit/skills/tool-schema.test.ts"
or .filename == "docs/dev/adding-an-agent.md"
or (.filename | endswith("/tool.json"))
)
| "\n### \(.filename)\n\(.patch // "[No patch returned by GitHub]")"
' /tmp/commit-745952a0.json | sed -n '1,2600p'Length of output: 19380 🏁 Script executed: #!/bin/bash
set -euo pipefail
repo="josephfung/curia"
pr_number="1499"
head_sha=$(gh api "repos/${repo}/pulls/${pr_number}" --jq '.head.sha')
printf '%s\n' "--- PR head ---"
printf '%s\n' "$head_sha"
gh api "repos/${repo}/git/trees/${head_sha}?recursive=1" --paginate \
--jq '.tree[] | select(.type == "blob") | .path' \
> /tmp/curia-pr-1499-paths.txt
printf '%s\n' '--- Candidate source/test paths ---'
rg -n \
'(^|/)(registry|registry\.test|dom-extract|handler|export|controls|pin-resolution)(\.test)?\.(ts|js)$|email-draft-save|scan-grant-recommendations|contact-find-duplicates' \
/tmp/curia-pr-1499-paths.txt | sed -n '1,500p'
fetch_file() {
local path="$1"
printf '\n### %s ###\n' "$path"
gh api \
-H 'Accept: application/vnd.github.raw+json' \
"repos/${repo}/contents/${path}?ref=${head_sha}" \
2>/dev/null || true
}
printf '%s\n' '--- Parser implementation and its test ---'
fetch_file 'src/skills/registry.ts' | sed -n '1,850p'
fetch_file 'tests/unit/skills/registry.test.ts' | sed -n '1,900p'
printf '%s\n' '--- Locate declined-case implementation paths ---'
for p in \
"$(rg '(^|/)dom-extract\.ts$' /tmp/curia-pr-1499-paths.txt | head -n1)" \
"$(rg '(^|/)email-draft-save/handler\.ts$' /tmp/curia-pr-1499-paths.txt | head -n1)" \
"$(rg '(^|/)scan-grant-recommendations/handler\.ts$' /tmp/curia-pr-1499-paths.txt | head -n1)" \
"$(rg '(^|/)contact-find-duplicates/handler\.ts$' /tmp/curia-pr-1499-paths.txt | head -n1)" \
"$(rg '(^|/)pin-resolution\.ts$' /tmp/curia-pr-1499-paths.txt | head -n1)" \
"$(rg '(^|/)pin-resolution\.test\.ts$' /tmp/curia-pr-1499-paths.txt | head -n1)"
do
[ -n "$p" ] && printf '%s\n' "$p"
doneLength of output: 38523 🏁 Script executed: #!/bin/bash
set -euo pipefail
repo="josephfung/curia"
head_sha="c1ddad0e3454c76b0be184616286142f24f08926"
# Locate candidate export-control modules from the already-fetched PR tree.
printf '%s\n' '--- Export-control candidate paths ---'
rg -n -i 'export.*(control|gate)|gate.*export|attachment.*export' \
/tmp/curia-pr-1499-paths.txt | sed -n '1,300p'
fetch_file() {
local path="$1"
printf '\n### %s ###\n' "$path"
gh api \
-H 'Accept: application/vnd.github.raw+json' \
"repos/${repo}/contents/${path}?ref=${head_sha}" \
2>/dev/null || true
}
printf '%s\n' '--- Declined-case source and configuration ---'
for path in \
'skills/email/tools/email-draft-save/handler.ts' \
'skills/email/tools/email-draft-save/tool.json' \
'skills/contacts/tools/scan-grant-recommendations/handler.ts' \
'skills/contacts/tools/scan-grant-recommendations/tool.json' \
'skills/contacts/tools/contact-find-duplicates/tool.json' \
'skills/ceo-inbox/tools/ceo-inbox-search/tool.json' \
'skills/ceo-inbox/tools/ceo-inbox-update-folders/tool.json' \
'skills/web/tools/web-browser/dom-extract.ts' \
'skills/web/tools/web-browser/handler.ts' \
'src/skills/pin-resolution.ts' \
'tests/unit/skills/pin-resolution.test.ts' \
'agents/research-analyst.yaml'
do
fetch_file "$path"
done | sed -n '1,4000p'
printf '%s\n' '--- Fetch likely export-control modules discovered above ---'
while IFS= read -r path; do
fetch_file "$path"
done < <(
rg -i 'export.*(control|gate)|gate.*export|attachment.*export' \
/tmp/curia-pr-1499-paths.txt \
| cut -d: -f2- \
| head -n 15
) | sed -n '1,4000p'Length of output: 114641 🏁 Script executed: #!/bin/bash
set -euo pipefail
repo="josephfung/curia"
head_sha="c1ddad0e3454c76b0be184616286142f24f08926"
printf '%s\n' '--- Export-control implementation ---'
gh api \
-H 'Accept: application/vnd.github.raw+json' \
"repos/${repo}/contents/src/security/export-controls.ts?ref=${head_sha}" \
| nl -ba \
| grep -E -C 20 \
'GATEWAY_ATTACHMENT_TOOLS|evaluateSkillExport|extractAttachmentExportItems|export_items|email-draft-save' \
| sed -n '1,1000p'
printf '%s\n' '--- Export-control tests covering draft saves / export_items ---'
gh api \
-H 'Accept: application/vnd.github.raw+json' \
"repos/${repo}/contents/src/security/export-controls.test.ts?ref=${head_sha}" \
| nl -ba \
| grep -E -C 12 \
'email-draft-save|export_items|GATEWAY_ATTACHMENT_TOOLS|extractAttachmentExportItems' \
| sed -n '1,1400p'Length of output: 1213 🏁 Script executed: #!/bin/bash
set -euo pipefail
repo="josephfung/curia"
head_sha="c1ddad0e3454c76b0be184616286142f24f08926"
fetch_and_match() {
local path="$1"
printf '\n--- %s ---\n' "$path"
gh api \
-H 'Accept: application/vnd.github.raw+json' \
"repos/${repo}/contents/${path}?ref=${head_sha}" \
| awk '
{
lines[NR] = $0
}
/GATEWAY_ATTACHMENT_TOOLS|evaluateSkillExport|extractAttachmentExportItems|export_items|email-draft-save/ {
for (i = NR - 12; i <= NR + 20; i++) wanted[i] = 1
}
END {
for (i = 1; i <= NR; i++) {
if (wanted[i]) printf "%d:%s\n", i, lines[i]
}
}
' \
| sed -n '1,1800p'
}
fetch_and_match 'src/security/export-controls.ts'
fetch_and_match 'src/security/export-controls.test.ts'Length of output: 11849 The PR description image 1 shows a dark, rounded “Open in Web” button with an up-right external-link icon. The PR description image 2 shows the matching dark “Open in Cursor” button with the Cursor logo. A small oasis of visual consistency amid the usual administrative abyss.
The 15 fixes are addressed; the six declined findings are withdrawn. I did not independently execute the reported test suites in this environment, but the source-level verification is complete. Grimly competent work. [resolve] ✏️ Learnings added
|
The bundling epic (#1485/#1489/#1494/#1495) plus the #1499 review pass accumulated ~18 Unreleased bullets for one reader-facing theme. Fold the per-PR entries into a tight set (Added 2, Changed 3, Fixed 1) and drop the Signed-off-by: Joseph Fung <joseph@josephfung.ca> #1499 lines that only corrected still-unreleased #1494 code. Unrelated #1487 scheduler entries left as-is.
|
@coderabbitai approve |
✅ Action performedComments resolved and changes approved. |
Sync manifest contracts to actual handler behavior and fix two genuine regressions surfaced by the Phase 2 bundling review: Output/description contracts (docs shown to the LLM; handler is ground truth): - get-autonomy: add lastSetBy, trend (nullable), scoredActionCount - list-pending-actions: declare optional displayTimezone + empty-case message - set-autonomy: previous_score nullable, add summary - scheduler-cancel: declare jobId - ceo-inbox-sent-observe: add backfill_active, tasks_truncated - ceo-inbox/email download-attachment: descriptions document the temp-file path (temp_file_url) vs base64, no longer promising unconditional base64 - context-bridge-clear: subjects/subject are either-or, both optional - context-bridge-release: reply optional (in), task_id optional (out) - audit-query / audit-trace / ops-lookup: displayTimezone optional - list-learning-digest: sections_markdown always returned (empty when none) - memory-confirm: drop success (only in the ToolResult envelope, not data) - memory-store: document auto_resolved/auto_rejected + ambiguous outcomes - contact-create / contact-grant-permission: restore required capabilities:[] Behavior fixes: - approve-grant-recommendation: action_risk low -> critical. Approving a recommendation writes the same AuthOverride grant as contact-grant-permission (critical), so it must require the same standing (min score 90). - Tool input shorthand: generalize the string|null union parser to arbitrary multi-type unions (string|object|null, object[]|object), so checkpoint can declare its polymorphic cursor (ResumableCursor) and accumulator (inline array or spilled document pointer) instead of under-constraining the LLM. Declined (verified against the code, left unchanged): - email-draft-save export_items: still consumed by the export-controls gate (#201) for confidential-attachment sensitivity resolution. - ceo-inbox-search/update-folders allowed_callers: never existed pre-move, no sibling ceo-inbox tool restricts callers; adding it would block real callers. - scan-grant-recommendations allowed_callers: the scheduled run arrives as agentId 'contacts', so the suggested ['scheduler']/['system'] restriction would break the cron job. - dom-extract __curiaRefEpoch__: the resolver never trusts the epoch; it matches the data-curia-ref attribute and accepts only on a unique live-DOM hit, failing closed. The seed is already handler-owned and monotonic. - research-analyst version revert: the only change was a clarifying comment. - pin-resolution resolvedPins: consumed by the ADR-032 polymorphic-pin tests. Signed-off-by: Joseph Fung <joseph@josephfung.ca>
Summary
Closes #1494 (Phase 2 follow-up of epic #1436). Builds on Phase 2 (#1489) and ADR-032.
pinned_skillsmay name a skill, a tool, or an MCP-projected skill. Tool pins resolve to exactly that tool (never siblings).SkillRegistrywith its livetools/listmembership; coordinator pinsgoogle-workspaceinstead of ~24 MCP tool names.email,ceo-inbox,contacts,autonomy,diagnostics,scheduler,web,memory,learning,context-bridge,executive-profile,setupasSKILL.md+ nestedtools/.tasks/memory—plan+checkpointjointasks;decay-warnings-listjoinsmemory.scheduler-report,contact-update, meeting-debrieftask-*, learning producer/consumer split, etc.) so resolved authority is unchanged.skills/<bundle>/tools/<tool>/tool.json.CHANGELOG[Unreleased].Test plan
entity-contextguard, agent resolved-pin regressionspnpm run typecheck(+ console typecheck)pnpm run lintpnpm test— 5270 passed (integration skipped: noDATABASE_URLin this environment)google-workspace+email+contact-updatewithoutcontact-lookupplan/checkpointvia individualtask-*pins