Skip to content

feat: Vision 2026 — osprotocol, SDK, ops, and full agentic stack#545

Open
synerbot[bot] wants to merge 128 commits intomainfrom
feat/vision-2026
Open

feat: Vision 2026 — osprotocol, SDK, ops, and full agentic stack#545
synerbot[bot] wants to merge 128 commits intomainfrom
feat/vision-2026

Conversation

@synerbot
Copy link
Contributor

@synerbot synerbot bot commented Mar 15, 2026

Syner
syner/vision-2026


121 commits · 180 files · ~10,400 lines added

Motivation

This is the Vision 2026 integration branch — the full agentic runtime stack that transforms Syner from a skill orchestrator into an agent-native platform with protocol-level verification, self-development capabilities, and cross-instance communication.

What changed

New packages

  • @syner/osprotocol — Protocol types, SKILL.md v2 parser, runtime validators, Run lifecycle, OspResult/OspContext/OspAction/OspVerification core types
  • @syner/ops — Operational runtime: friction analyzer, boundary crossing verification, sandbox evaluator, remote invocation, supervisor contracts
  • @syner/sdk (renamed from packages/syner) — Core orchestrator with resolveSkill(), resolveContext(), executeSkill(), VaultStore interface (filesystem + Blob), agent model provisioning

Enhanced packages

  • @syner/vercelcreateAgentHandler(), Edit tool for sandbox, Vault AI tools (read/write/glob/list/delete), withSyner() Next.js wrapper, executeSkill() bridge
  • @syner/githubgetIssue(), listIssues(), removeLabel(), closeIssue(), readThread(), token caching
  • @syner/ui — Slide template registry (title, highlights, metrics, outlook, custom), Satori font exports
  • @syner/slack — Agent definition rewrite for capability description

Apps

  • bot — Full E2E orchestration: POST /agent with lead-aware routing, supervisor gate, Slack interactive actions, GitHub handler v2 with osprotocol verification, model provisioning, lazy sandbox
  • dev — Skill resolution endpoint, automated SKILL.md review gate, self-development pipeline (candidate generator, corpus, evaluator, metrics, deploy)
  • design — Slide generation API (POST /api/slides/generate, GET /api/slides/[deckId]/[index])
  • vaults — Deck parser (MDX → Deck objects), Fumadocs collection + OG routes

Infrastructure

  • Agent definitions for all packages (sdk, osprotocol, vercel, github, ops, slack, ui)
  • README.md + AGENTS.md for every app and package
  • PR templates (feature, fix, skill, agent) with Syner branding
  • Code reviewer accuracy standards from lead feedback
  • Vision 2026 workflow in CLAUDE.md

How it works

User intent → /syner orchestrator
  → resolveSkill() (intent matching)
  → resolveContext() (vault loading)
  → executeSkill() (sandboxed execution)
  → OspResult (verified output)

The stack flows through osprotocol types at every boundary: skill resolution returns typed manifests, execution produces verified results, cross-instance calls use boundary crossing verification, and the supervisor gate controls approval workflows.

Test plan

  • bun install succeeds
  • bun run build passes across all packages and apps
  • Bot E2E: POST /api/agent returns orchestrated response
  • Dev: GET /api/skills/resolve returns matched skill
  • Design: POST /api/slides/generate produces slide images
  • All package exports resolve correctly

Breaking changes

  • packages/syner renamed to packages/sdk (@syner/sdk)
  • packages/create-syner-agent eliminated (merged into bot)
  • osprotocol primitives renamed to clean names (OspResult, OspContext, etc.)

syner/vision-2026

rbadillap and others added 30 commits March 12, 2026 15:59
Enables any new Claude session to automatically find, claim, and
implement vision-2026 issues by following the documented workflow.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Foundation package for the agent execution protocol — context, action,
verification lifecycle. Follows monorepo conventions from packages/syner.

Closes #263

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Define SkillManifestV2 extending current SKILL.md fields with
preconditions, effects, verification, inputs, outputs, visibility,
and notFor. All new fields are optional — v1 SKILL.md still valid.

Closes #268

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Operational layer package for friction logging, self-development,
and supervisor contracts. Depends on @syner/osprotocol.

Closes #271

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Define OspAction, Precondition, and Effect interfaces with createAction
and checkPreconditions helpers. Actions declare what an agent is about
to do with pre-conditions and expected effects.

Closes #265

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Define OspVerification, Assertion, and Escalation interfaces with verify
and escalate helpers. Verification checks whether an action produced its
intended effects and supports rollback/escalation on failure.

Closes #266

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Define OspContext and ContextSource interfaces with createContext helper.
Context captures what an agent knows before acting — loaded sources,
missing data, and chain linkage via parentContext.

Closes #264

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Define ChangeCategory (skill-tweak | new-skill | structural),
MetricThreshold, and ChangeProposal types per DEC-001. These types
govern the self-development loop's proposal system.

Closes #272

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Parse SKILL.md files into SkillManifestV2 via gray-matter frontmatter
plus structured markdown sections (Preconditions, Effects, Inputs,
Outputs, I am NOT). Backwards compatible — parses all 62 existing
v1 SKILL.md files without error.

Closes #269

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Define OspResult<T> — the complete lifecycle of one agent action,
composing context, action, and verification. Includes createResult
helper and chain field for linking handoff sequences.

Closes #267

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Runtime type guards for osprotocol types: validateContext, validateAction,
validateVerification, validateResult. Zero external dependencies — pure
field and type checking.

Closes #270

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Define SupervisorDecision and DecisionCorpus types per DEC-001.
Decisions require reason + reviewer. JSDoc enforces that the
supervisor must be a separate entity from the agent being evaluated.

Closes #273

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Replace raw frontmatter parsing with parseSkillManifest() from
@syner/osprotocol. Adds manifest: SkillManifestV2 field to Skill type.
Backwards compatible — existing code using Skill unchanged.

Closes #276

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Add optional protocol field with version and capabilities to AgentCard.
Existing agents without protocol field load unchanged.

Closes #277

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Makes any Next.js app a discoverable agent. Reads SKILL.md from project
root via parseSkillManifest(), adds /agent rewrite to /api/agent.
Zero breaking changes to existing config.

Closes #278

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Log failed OspResults as structured FrictionEvents to .syner/ops/friction.jsonl.
Tracks skillRef, failureType, frequency, and temporal range. Reads existing
log to update frequency counts for recurring failures.

Closes #274

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Wrap session generation in osprotocol lifecycle: context, action,
verification. GenerateResult preserved as result.output. All handlers
(Slack, GitHub, Chat API) updated to access result.output.

Also fixes .js import extensions across osprotocol and ops packages
for webpack/Next.js compatibility.

Closes #282

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
feat: wrap skill tool invocation in osprotocol lifecycle

Skill tool now returns OspResult with context, action, and verification.
Raw text output available via result.output. Tracks duration and
verification status per skill invocation.

Closes #280

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Request handler that wraps execution in full osprotocol lifecycle:
context → check preconditions → action → execute → verify → result.
Returns 412 with unmet list on precondition failure.

Closes #279

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Tools work as before by default. When osprotocol: true is passed to
createTools(), each tool invocation is wrapped in context → action →
verification lifecycle with duration tracking.

Closes #281

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Add SKILL.md v2 with preconditions, effects, inputs/outputs, and
visibility. Add /agent route that returns SkillManifestV2 JSON.

Closes #286

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Add SKILL.md v2 with preconditions, effects, inputs/outputs, and
visibility. Add /agent route that returns SkillManifestV2 JSON.

Closes #287

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
feat: add verification and failure logging to Slack handler

Log verification status, duration, and failed assertions when
session.generate() returns a failed OspResult.

Closes #284

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Chain of steps producing linked OspResults that break on failure.
Results linked via chain UUID. Failed steps escalate to caller
and halt the chain.

Closes #283

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Groups friction events by skill+failure type and detects recurring
patterns within a configurable time window. Assigns severity levels
and suggests change categories based on frequency thresholds.

Closes #275

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
feat(bot): add osprotocol verification to GitHub webhook handler

Wraps generateText with context/action/verification lifecycle,
logs OspResult status and duration, warns on failed assertions.

Closes #285

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
session.generate() now returns OspResult<GenerateResult> with full
context, action, verification, and duration tracking. GenerateResult
is preserved as result.output. Updated Slack webhook and command
handlers to use result.output.text.

Also fixes osprotocol barrel imports to drop .js extensions for
Next.js transpilePackages compatibility.

Closes #282

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
feat(bot): GET /agent returns public SkillManifestV2 listing (#290)

Enhance agent route to aggregate all public skills from the registry
and return them alongside the bot's own manifest.

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
feat: add skill visibility filtering (public/instance/private)

Filter skills by visibility field from SkillManifestV2. Default: instance.
New helpers: getPublicSkills(), getInstanceSkills(), getPrivateSkills(app).

Closes #292

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
feat: add candidate generator for self-development loop

Generates typed ChangeProposal from FrictionPattern. Categorizes changes
(skill-tweak/new-skill/structural) and estimates metric thresholds.

Closes #293

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
synerbot bot and others added 11 commits March 14, 2026 20:25
* docs(dev): split proposal into README.md + AGENTS.md

Split the dual-audience proposal into developer-facing README.md
and agent-facing AGENTS.md.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(dev): address code review feedback on README + AGENTS

- Fix skill count from 19 to 18 (excludes _find-ideas with _ prefix)
- Fix category casing: "dev" → "Dev" to match SDK source

-- syner/dev

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* docs(ui): split proposal into README.md + AGENTS.md

Split the dual-audience proposal into developer-facing README.md
and agent-facing AGENTS.md.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(ui): address code review feedback on README + AGENTS

- Fix install command to workspace pattern
- Clarify font aliases (geistSans is alias for GeistSans)
- Add lucide-react to AGENTS.md Dependencies table
- Fix constraint 6: undefined behavior, not silent failure
- Add theme provider note for dynamic dark mode switching
- Note Radix WAI-ARIA accessibility defaults

-- syner/ui

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* docs(vaults): split proposal into README.md + AGENTS.md

Split the dual-audience proposal into developer-facing README.md
and agent-facing AGENTS.md.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(vaults): address code review feedback on AGENTS.md

- Fix channel nesting: move under metadata: to match agents/vaults.md
- Add user-invoked note for vaults-grow-specialist
- Add state file initialization note for fresh machines

-- syner/vaults

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* docs(bot): split proposal into README.md + AGENTS.md

Split the dual-audience proposal into developer-facing README.md
and agent-facing AGENTS.md.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(bot): address code review feedback — delegate URL bug + docs

- Fix delegate URL: /agent → /api/agent (blocking production bug)
- Note step count difference in README (15 webhook vs 10 createSession)
- Document chain intent silent fallback in AGENTS.md Status table

-- syner/bot

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* docs(ops): split proposal into README.md + AGENTS.md

Split the dual-audience proposal into developer-facing README.md
and agent-facing AGENTS.md.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(ops): address code review feedback on README + AGENTS

- Correct logFriction frequency description (append-per-call, not in-place update)
- Change "6 checks" to "up to 6 checks" for validateRemoteResult
- Fix install command to workspace pattern
- Note empty-test-suite vacuous truth in evaluate()
- Add unbounded growth warning for friction JSONL

-- syner/ops

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
docs(github): split proposal into README.md + AGENTS.md

Split the dual-audience proposal into developer-facing README.md
and agent-facing AGENTS.md.

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* docs(vercel): split proposal into README.md + AGENTS.md

Split the dual-audience proposal into developer-facing README.md
and agent-facing AGENTS.md.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(vercel): address code review feedback on README + AGENTS

- Fix errors table source: executeEditWithSandbox → createEditTool
- Fix missing-entry string to use em dash matching source
- Rewrite constraint #10 as known limitation (preconditions always met)
- Add default comment to SkillConfig.context
- Document $N 0-based indexing in buildSkillInstructions
- Add createToolsByName pointer in README

-- syner/vercel

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* docs(osprotocol): split proposal into README.md + AGENTS.md

Split the dual-audience proposal into developer-facing README.md
and agent-facing AGENTS.md.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(osprotocol): address code review feedback on README + AGENTS

- Mark reason/timestamp as optional in validateApproval table
- Note verify() vacuous truth with empty effects
- Fix install command to workspace pattern

-- syner/osprotocol

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* docs(sdk): split proposal into README.md + AGENTS.md

Split the dual-audience proposal into developer-facing README.md
and agent-facing AGENTS.md.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(sdk): address code review feedback on README + AGENTS

- Add anthropic/ prefix to FALLBACK_MODELS values
- Note getPrivateSkills returns [] for apps with no private skills
- Clarify SkillsRegistry is not exported as a type
- Clarify targeted scope query source in constraint #10
- Fix install command to workspace pattern

-- syner/sdk

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
fix: resolve build errors across bot, design, vaults, and sdk

- vaults: add createMDX() wrapper for Turbopack MDX support
- design: switch /api/slides/generate from edge to nodejs runtime
- bot: extract registerApproval from route to lib/supervisor.ts
- bot: fix ToolSet type and inputSchema union inference
- bot: move providerOptions from generate() to ToolLoopAgent constructor
- bot: import AgentSandbox from @syner/vercel instead of @vercel/sandbox
- sdk: refactor getModel/getModelFallbacks into resolveModel(tier)

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@rbadillap
Copy link
Contributor

On-hold until code review is finished (issues referenced)

synerbot bot and others added 2 commits March 15, 2026 21:36
* feat(osprotocol): rename SkillManifest → Skill (#555)

Primitives first — the protocol type gets the clean name.

- Rename SkillManifest to Skill in types/skill.ts
- Remove SkillManifestV2 deprecated alias
- Update parser.ts and index.ts internal references
- Consumers update in their own issues

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(osprotocol): align Skill interface with agentskills.io spec

Strip invented fields nobody uses (preconditions, effects, verification,
inputs, outputs, notFor, category, visibility). Align with the official
Agent Skills spec: name, description, license, compatibility, metadata.

metadata is now Record<string, string> — the spec's extension point.

Parser simplified from 143 to 30 lines — no more 3-tier priority
parsing for fields that never existed in any SKILL.md.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Delete vault-{read,write,delete,list,glob}.ts and their exports.
Vaults are filesystem-only — no Blob storage needed.

Closes #558

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@synerbot synerbot bot mentioned this pull request Mar 16, 2026
synerbot bot and others added 4 commits March 16, 2026 08:38
* feat(osprotocol): align Run lifecycle with Vercel Workflow spec

RunStatus 9→6 states, rewrite Approval shape, add Cancel interface,
update validTransitions and validators to match osprotocol.dev spec.

Closes #556

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(osprotocol): migrate validators to zod schemas

Zod schemas become the single source of truth — types are inferred via
z.infer, validators use .safeParse(), and deprecated Osp* aliases are
removed. ~240 lines of manual validation replaced by ~140 lines of
declarative schemas.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Delete blob-vault-store.ts, clean exports, remove @vercel/blob
and picomatch deps. FileSystemVaultStore is the only vault store.

Closes #560

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
feat(osprotocol,vercel): RunAdapter interface + VercelRunAdapter implementation

OSProtocol defines the RunAdapter contract (start, get, cancel, approve)
plus RunRequest and RunEvent types. @syner/vercel implements it as
VercelRunAdapter with adapter helpers for approval tokens, timeout
strategies, retry/backoff, beforeCancel veto, and progress events.

Closes #575

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat(vercel,sdk): wire Workflow + clean SDK imports

- Install workflow + @workflow/ai in @syner/vercel
- Wire VercelRunAdapter to real workflow/api primitives (start, Run.status, Run.cancel)
- Re-export DurableAgent from @workflow/ai/agent
- Fix SkillManifest → Skill across agent-handler.ts, with-syner.ts
- Fix OspResult → Result in tools/skill.ts
- Fix SDK SkillManifest → Skill as OspSkill in skills/types.ts
- Fix visibility read from manifest.metadata in skills/loader.ts
- Remove BlobVaultStore reference from vault-store.ts comment

Closes #583

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* refactor(sdk): unify Skill type — use osprotocol Skill with metadata

Eliminate the SDK's duplicate Skill interface. The osprotocol Skill type
is the standard (agentskills.io compatible). Runtime enrichment fields
(slug, category, visibility, version, author) now live in metadata.

- Remove SDK Skill interface, re-export osprotocol Skill
- SkillContent becomes Skill & { content: string }
- Loader populates metadata with slug, category, visibility
- Update all consumers: skill.slug → skill.name, skill.category → skill.metadata?.category
- Fix SkillManifest → Skill in apps/dev candidate.ts and apps/bot instance.ts

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat: skills architecture prerequisites (#585, #586, #587, #588, #589)

Pre-Epic 2 skills architecture — LLM-driven routing replaces regex classification.

- sdk: buildSkillsManifest() scans skill dirs, outputs index.json (#585)
- osprotocol: remove RunRequest.tools field (no consumer) (#586)
- vercel: remove createTools/createToolsByName (tools imported standalone) (#586)
- vercel: redesign Skill tool — context injection, not subagent (#587)
- vercel: create Run tool — agent starts durable workflows via RunAdapter (#589)
- bot: delete router.ts regex classifier, LLM decides via tools (#588)
- bot: update Slack handler to use session directly
- bot: add routing guidance to agents/bot.md

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* refactor: rename Run tool → Workflow per #588/#589 feedback

Tool naming convention from @rbadillap: Skill, Agent, Workflow.
- Rename run.ts → workflow.ts
- createRunTool → createWorkflowTool
- CreateRunToolOptions → CreateWorkflowToolOptions
- Update SpecialToolName to include Workflow
- Update bot agent routing table
- Update skip list in registry (Task → Workflow)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* refactor: rename Workflow tool → Task

Tool naming: Skill, Agent, Task.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* refactor(vercel): remove SpecialToolName, SandboxToolName, ToolName types

Dead types from the createTools() era — no consumers remain.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(vercel,bot): Skill tool with prepareStep injection (#587)

Hybrid pattern matching Claude Code's skill architecture:
- Skill tool has NO execute — calling it pauses the agent loop
- prepareStep detects the Skill call and injects content as user message
- User message > tool result for LLM attention priority
- Explicit /skillname in prompts preprocessed before the loop starts
- Skill descriptions always in system prompt (agent knows what's available)
- SkillLoader class encapsulates all skill loading + tool creation + prepareStep

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(vercel): validate skill against index before disk I/O

- Add has() method for explicit index validation
- prepareStep: validate index → clear error if not found, separate error if on-disk missing
- preprocessPrompt: check index before loading from disk

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(vercel): add build-skill-manifest script + generated index.json

Script scans all skill directories, builds index.json, and verifies
the full SkillLoader pipeline: has(), loadContent(), preprocessPrompt(),
and createPrepareStep() with simulated tool calls.

31 skills discovered across all apps.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* refactor(vercel): move build-skill-manifest to skills/ structure

scripts/ → skills/build-skill-manifest/scripts/run.ts
Added SKILL.md. Follows same pattern as packages/github/skills/.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(vercel): Skill tool execute returns true, prepareStep only injects user message

Without execute, AI SDK treats the tool as a stop signal and terminates
the loop. execute: async () => true keeps the loop running.

prepareStep simplified: only appends skill content as user message.
Tool result (true) is already in messages from execute.
Unknown skills: prepareStep returns {} (no injection, LLM sees true and moves on).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(sdk): add Tools contracts — SDK defines, adapters implement

Tools.Bash, Tools.Read, Tools.Skill, etc. define name, description,
and inputSchema (zod). Adapters (@syner/vercel, etc.) implement execute.

Agent definitions declare tool names, the runtime resolves implementations.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@synerbot synerbot bot mentioned this pull request Mar 17, 2026
synerbot bot and others added 3 commits March 17, 2026 08:31
…rcel (#591)

* fix(vercel): fix exports after squash merge — SkillLoader, not createSkillTool

Squash merge of #584 left stale exports referencing createSkillTool
which was replaced by SkillLoader class.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* refactor(bot,vercel): true thin consumer — bot only imports @syner/vercel

8 fixes from code review:

1. Split skills system (SkillLoader, SkillsMap, SkillDescriptor) into
   src/skills/index.ts, Skill tool into src/tools/skill.ts
2. Strip src/index.ts to createRuntime + types, add ./tools subpath
3. Delete legacy filesystem scanner (src/skills/loader.ts), extend
   SkillDescriptor with command/agent, SkillsMap.commands()
4. Bot routes use console.* instead of @syner/sdk/logger
5. Shared runtime instance (lib/runtime.ts), agents routes use
   runtime.agents Map
6. runtime.card() for A2A discovery, delete card.ts
7. Slash commands use runtime.skills.commands()
8. Remove @syner/sdk and @syner/osprotocol from bot deps

Also: async SkillLoader (fs/promises), load→start rename,
regenerated index.json with command/agent fields, deleted
agent-handler.ts and with-syner.ts (0 consumers).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore(vercel): add TODO for external snapshot cache (Redis/KV) (#593)

* feat(vercel): use Sandbox source + snapshots for faster startup

Replace manual git clone with native Vercel Sandbox source parameter
and add snapshot caching. First generate() call creates sandbox from
git source and snapshots it. Subsequent calls restore from snapshot
(milliseconds instead of full clone).

- Use source: { url, type: 'git' } instead of manual runCommand clone
- Add in-memory snapshot cache keyed by repo+branch
- Validate cached snapshots before reuse (handles expiry)
- Cold path: create → snapshot → create from snapshot
- Warm path: create directly from cached snapshot

https://claude.ai/code/session_01Dbgkiuu4yoy7s9caDui54Q

* refactor(vercel): rename createAgentSandbox → createSandbox, AgentSandbox → SandboxInstance

Cleaner API surface — drop the "Agent" prefix since the sandbox module
already implies agent context. Snapshot caching optimization stays intact.

https://claude.ai/code/session_01Dbgkiuu4yoy7s9caDui54Q

* chore(vercel): add TODO for external snapshot cache (Redis/KV)

In-memory Map loses snapshot IDs when serverless instances recycle.
When we add Redis/KV, this is the integration point.

https://claude.ai/code/session_01Dbgkiuu4yoy7s9caDui54Q

* refactor(vercel): drop SandboxInstance alias, use Sandbox directly

No need for a type alias that just copies the original.
Re-export `Sandbox` type from sandbox.ts for consumers.

https://claude.ai/code/session_01Dbgkiuu4yoy7s9caDui54Q

---------

Co-authored-by: Claude <noreply@anthropic.com>

---------

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…isclosure + dead code (#595)

refactor(vercel,ops,design,vaults): kill SkillLoader, progressive disclosure, cleanup dead code

SkillsMap cleanup:
- Move describe() to SkillsMap (domain method on collection, like commands())
- Kill SkillLoader class — replaced by loadSkills() pure function
- Create src/skills/loader.ts with loadSkills() + loadSkillContent()
- Delete preprocessPrompt (LLM decides routing via Skill tool, not regex)
- In-memory content cache with TODO for Redis/Vercel KV

Progressive disclosure (agentskills.io spec):
- Build script generates per-skill {name}.json with pre-rendered content
- Runtime loads index.json at startup (metadata), {name}.json on activation (lazy)
- Zero filesystem scanning at runtime — works in Vercel serverless
- Path traversal defense: /^[a-z0-9-]+$/ validation on skill names

#566 — ops: Remove all 12 deprecated type aliases (FrictionPattern,
ChangeCategory, MetricThreshold, TestCase, MetricResult, etc.)
Update consumers in apps/dev/lib/self-dev/

#570 — vaults: Delete deck-parser.ts, og route, remove gray-matter
and fumadocs-ui deps

#571 — design: Delete app/api/slides/ (2 routes), remove @vercel/blob
and nanoid deps

Bonus: Fix pre-existing type bugs in dev deploy.ts + corpus.ts
(Approval.decision → Approval.approved, .reviewer → .approvedBy)

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…596)

feat(design,vaults): migrate deck pipeline from vaults to design

#572 — vaults→design migration:
- Move source.config.ts, lib/source.ts, content/decks/, app/decks/[slug]/page.tsx
- Add fumadocs-core + fumadocs-mdx deps to design
- Add postinstall script + createMDX() wrapper in next.config.ts
- /decks/example pre-rendered via generateStaticParams (SSG)

#573 — vaults cleanup after migration:
- Remove all deck files, fumadocs deps, postinstall script
- Revert next.config.ts to vanilla Next.js

#574 — build-time slide pipeline:
- Design uses generateStaticParams for static deck pages
- No runtime API, no Blob storage — pure build-time generation

Co-authored-by: Ronny Badilla <info@ronnybadilla.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@synerbot synerbot bot mentioned this pull request Mar 18, 2026
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.

1 participant