Skip to content

feat(handoff): add skill-gated handoff action, access control gating, and OAuth expiry fixes - #252

Open
Tharickv75 wants to merge 3 commits into
mainfrom
dev-tj
Open

Tharickv75 wants to merge 3 commits into
mainfrom
dev-tj

Conversation

@Tharickv75

Copy link
Copy Markdown
Contributor

Description

Summary

This pull request introduces the new skill-gated handoff capability (jvagent/handoff_action), skill access control filtering, and improvements to Google OAuth credential handling and lead generation profile persistence.

Key updates include:

  • Skill-Gated Handoff Action (jvagent/handoff_action): Adds human-support capability tools (handoff__direct_contact, handoff__notify, handoff__staff_inbox, and handoff__resolve) supported by the jvagent/skills/handoff library skill. Enables single staff random routing across WhatsApp/email channels, pending question tracking, and automatic PageIndex Q&A ingestion to handoff.md.
  • Skill Identity Gating: Adds support for access-action and allowed-groups/denied-groups in skill frontmatter to selectively hide or reveal skills in the catalog based on AccessControlAction.user_groups.
  • Google MCP/OAuth Fixes: Normalized OAuth expiry parsing in GoogleAction to properly handle ISO string formats and avoid ValueError during token refresh, alongside fixing service binding retention.
  • LeadGen Bug Fix: Fixed an issue preventing the lead profile from being overwritten by section updates.
  • Documentation & CI: Added README.md for handoff_action, updated actions catalog and changelog, and updated Dockerfiles/workflows for release versioning (0.1.8rc20-dev1).

Type of change

  • Bug fix (non-breaking)
  • New feature (non-breaking)
  • Breaking change
  • Documentation
  • Chore / tooling / CI

Checklist

  • I read CONTRIBUTING.md and (for subsystem work) the local AGENTS.md.
  • pre-commit run --all-files passes.
  • pytest tests/ passes; I added/updated tests for new behavior.
  • Bug fixes cite file:line in the description.
  • Docs / CHANGELOG.md updated where relevant (entry under [Unreleased]).
  • No ADR was modified in place (changes of decision are written as a new, superseding ADR).

@Tharickv75 Tharickv75 self-assigned this Sep 30, 2026
@Tharickv75
Tharickv75 requested a review from eldonm as a code owner September 30, 2026 20:41

@eldonm eldonm left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Reviewed revision b1048b09c4206bc16c17fafb8ea564ee1df2e732 against dev. I found six actionable issues: four P1 authorization/privacy/data-preservation problems and two P2 queue/delivery reliability problems, detailed inline. I recommend addressing these before merging.

Validation: the existing affected regression slices passed (1,003 passed, one skipped across orchestrator, access control, leadgen, WhatsApp, Google, MCP OAuth, and tool-schema tests; the separate handoff/new WhatsApp slice also passed). Six focused failure-injection/integration reproductions fail on this revision and substantiate the inline findings. External messaging and provider calls were mocked in those reproductions.

Comment thread jvagent/action/orchestrator/orchestrator_interact_action.py Outdated
Comment thread jvagent/action/orchestrator/tools.py Outdated
Comment thread jvagent/action/handoff_action/handoff_action.py
Comment thread jvagent/action/handoff_action/handoff_action.py Outdated
Comment thread jvagent/action/handoff_action/handoff_action.py Outdated
Comment thread jvagent/action/handoff_action/handoff_action.py Outdated

@eldonm eldonm left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Reviewed current head 5230fc7 against dev, including the follow-up fixes for the six earlier findings. The affected regression suite passes, but three independent failure-injection cases still fail: OAuth credential forwarding across origins, service-key disclosure across origins, and cross-worker pending-question lost updates. I cannot clear this revision for merging. Details and remediation are inline. All HTTP requests used MockTransport; all credentials were synthetic; no external messages were sent.

Comment thread jvagent/action/mcp/integral_oauth_auth.py
Comment thread jvagent/action/mcp/service_key_auth.py Outdated
Comment thread jvagent/action/handoff_action/handoff_action.py Outdated

@eldonm eldonm left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Re-reviewed the four follow-up commits through a2571cb. The prior three blockers are addressed: authenticated redirect chains now reject other origins and HTTPS downgrades before sending; independently persisted HandoffQuestion nodes avoid the old shared-list lost update. I also verified concurrent independent creates against the real JSON adapter.

Two new issues in the storage refactor prevent clearance: question-by-ID operations do not enforce agent ownership, and the legacy Action-list migration cannot read old fields after an actual database cold load. Details are inline.

Validation: 871 affected tests passed, one skipped; all seven current GitHub checks are green. Additional real-JSON boundary tests reproduced both findings; independent-node round-trip and concurrent-create checks passed. Customer delivery and knowledge ingestion in the ownership reproduction were mocked; no external messages were sent. No source changes, commits, pushes, or merges were made during this re-review.

Comment thread jvagent/action/handoff_action/handoff_action.py Outdated
Comment thread jvagent/action/handoff_action/handoff_action.py Outdated
@Tharickv75
Tharickv75 changed the base branch from dev to main October 23, 2026 19:01
… fixes

Rebased onto main 0.1.8rc20. Keeps handoff/consult/transfer/observe modes,
AccessControl skill gating, MCP OAuth expiry/binding fixes, and leadgen
full_name / profile resolution work. Branch stays on 0.1.8rc20-dev1 with
Dockerfile and auto-tag targeting dev-tj.

Co-authored-by: Cursor <cursoragent@cursor.com>
…ase version 0.1.8rc20

- Changed the branch in Dockerfile.base from dev-tj to main for cloning jvagent.
- Updated auto-tag workflow to trigger on pushes to the main branch instead of dev-tj.
- Updated version in jvagent/version.py from 0.1.8rc20-dev1 to 0.1.8rc20.
… and spec

- Simplified string concatenation in handoff_action.py for better clarity.
- Reformatted boolean expression in leadgen engine.py for enhanced readability.
- Adjusted the formatting of frozenset in leadgen spec.py to align with style guidelines.
@Tharickv75
Tharickv75 requested a review from eldonm October 23, 2026 19:39

This branch was successfully deployed

1 active (outdated) deployment
testpypi — 46a0411c Deployed Oct 22, 2026 by eldonm via Publish to TestPyPI (pre-release tags) #55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants