Repository navigation
Personal-kit API gaps for AgentKit kit publish/sync #88
Description
M0 AgentKit v3 release blocker (owner decision, 2026-10-19): Personal kits are no longer a post-v3 optional milestone. AgentKit #2524 and #2589 require production-compatible first-run flows after
ak update --ssot: create/edit foundation-derived skills and personal kits, rebase/resolve, explicit private publish, locked second-device sync, and approved session-evolution proposal; local/offline use requires no SkillX login, cloud calls require scoped auth. At audit,SKILLX_PERSONAL_KITS_API=0inapps/web/wrangler.jsonc. PR #94 delivered composition metadata andIf-Matchon 2026-10-16, so re-check gaps 1–2 rather than reimplement, and evaluate 3–7 against current schema. Release must pass real staging→production-compatible E2E including signed@agentkit/*foundation publishing, pinned older base handling, CAS conflict, private permissions, no secret leakage and rollback; no fake-only GO. Own exact API enablement, rollback flag and smoke receipts. AgentKit #2282 owns independent acceptance. No automatic user-session upload, public publish or execution of remote scripts. Server-side work should not duplicate AgentKit's Go installer.
Context
AgentKit G2 adds ak skills kit publish and ak skills kit sync --locked for personal kits. The work is tracked in bestagentkits/agentkit#2278 under the epic bestagentkits/agentkit#2274.
Building them against the current personal-kit API surfaced gaps that limit what a synced kit can do. AgentKit works around each one by failing safe and does not depend on any undocumented endpoint.
Gaps
- A revision document has no composition metadata. There is no field for the manifest's
extendsandinclude, or for the resolution records (keep-old, fork and overlay decisions). As a result, a kit synced from SkillX cannot be rebased or edited from that copy.- Ask: optional, schema-validated
compositionfields on a revision document, and include them in the document digest.
- Ask: optional, schema-validated
- No If-Match or ETag precondition on kit writes. AgentKit sends the expected generation in the request body.
- Ask: honor
If-Match: <generation>and return 412 on a mismatch, keeping the body field for compatibility.
- Ask: honor
- Only forks of
ak-skills can be published. An in-place overlay on a foundation skill is refused, so AgentKit exits 6 for it today.- Ask: accept structured overlay revisions against a pinned foundation skill, using the lineage from feat(personal-kits): immutable lineage, structured overlays and conflict-safe foundation rebase #55.
- Bases are verified against SkillX releases only. The
@agentkit/*foundation releases must exist on SkillX before any AgentKit kit can publish or sync.- Ask: publish or mirror the
@agentkit/*releases, or accept a signed AgentKit release manifest as a base.
- Ask: publish or mirror the
- Session proposals are not offered through the personal-kit API that AgentKit uses. This relates to feat(evolution): private reviewed overlay revisions from local session-derived skill improvements #56.
- Every pinned base must be the current release. A skill pinned to an older foundation release cannot be published until it is rebased.
- Ask: allow a revision to pin any published, non-yanked base release.
extends: skillx:<kit>is not supported. A manifest cannot extend another SkillX kit yet; AgentKit keeps it marked unsupported.
Acceptance
Each item is either done or explicitly declined, with the reason. AgentKit then updates its contract and the G2 acceptance rows.
Refs #31
Activity
mrgoonie commentedon Oct 16, 2026
Status of every item, from the code on
mainplus #94. #94 references this issue but does not close it.If-Match/ 412@agentkit/*basesextends: skillx:<kit>parentalready covers a kit, and a release base depends on item 41. Composition (done). A revision document may carry an optional
composition: {extends, include?, resolutions?}. It mirrors the AgentKit manifestextends/includeand theagentkit.skill-overlay-resolution/v1records.packages/contracts/src/fixtures/personal-kit-composition-golden.json.2. If-Match (done). Every generation-guarded write accepts
If-Match: "g<n>"(the kitETag) or a bare<n>.kit.generation_conflict.expectedGenerationstill works and keeps its 409.3. Overlay on a foundation skill (deferred). The refusal does not come from lineage. It is the shared-alias guard,
overlay.shared_alias.ak-/ak:skills as shared, plus the identities inSKILLX_SHARED_SKILL_ALIASES. Every other@agentkit/*skill can already be overlaid in place (seekit-revisions.test.ts).4.
@agentkit/*bases (owner/ops decision). Bases resolve only through SkillX releases. Options:(a) Mirror the releases on SkillX (recommended).
@agentkitpublisher withPOST /api/v1/publishers(admin secret).releases:publish:@agentkitkey.SKILLX_RELEASES_APIon in production, migration 0012 applied, and a D1 backup before any apply.(b) Accept a signed AgentKit release manifest as a base.
(c) Status quo. AgentKit keeps failing safe.
No action was taken here.
5. Session proposals. #83 serves them on the same personal-kit API AgentKit already uses:
POST /api/v1/kits/@h/k/proposals/validate,POST .../proposals,GET .../revisions/:id/proposalandPOST .../revisions/:id/review(web session only), behindSKILLX_PERSONAL_KITS_API. The envelope isskillx.kit-proposal/v1, and the policy is shared via #87. Consuming it is AgentKit G4 slice 4.6. Pins on older releases.
loadPinnedBasealready resolves any release the owner can read, by package, version and digest. It never compared against the newest release.7.
extends: skillx:<kit>(declined as a new server feature).parent: {kit, revisionDigest}already expresses it: one parent, depth 4, and a foreign parent must be public and activated.skillx:+releaseDigestform), the entries already pin releases. What is missing is a published foundation, which is item 4.composition.extendsnow accepts theskillxform as metadata, so AgentKit can record it.AgentKit follow-ups (bestagentkits/agentkit#2278):
If-Match: "g<n>"and map 412 like 409 (exit 6).composition, and compare against the new golden vector.extends: skillx:<kit>toparent.mrgoonie commentedon Oct 19, 2026
#100 (in progress) implements the kit provenance part of gap 4, option (a).
skillx.release/v2carriesprovenance: {provider: "kit", origin}.@agentkit/*is accepted only when provenance is kit, the key is scopedreleases:publish:@agentkit, and the publisher is the active, admin-provisionedagentkit. Trust stayslocal-unverified.The AgentKit client side is tracked in bestagentkits/agentkit#2623.
Generated by Claude Code
zuey-cloud-harness commentedon Oct 19, 2026
Bổ sung issue tích hợp/private-library và DoD theo yêu cầu người dùng ngày 19/10/2026: #107, đối ứng https://github.com/bestagentkits/agentkit/issues/2640.
#107 phân biệt private standalone skill packages với personal-kit overlays, bổ sung owner access, auth/scopes, thư viện riêng API/CLI/dashboard, giữ review policy cho session-derived proposals, và yêu cầu chứng minh vòng A publish → B sync → B sửa/publish → A nhận phiên bản mới.
#88 tiếp tục sở hữu API gaps/enablement; #107 tái sử dụng #55/#56/#83/#94 và provenance #100, không yêu cầu triển khai lại phần đã có. Mỗi DoD phải dẫn test, build/deployment ID và receipts thật; bật feature flag hoặc fake-only tests không đủ GO.
mrgoonie commentedon Oct 19, 2026
Enablement signal, rollback runbook and the smoke script are in draft #109. The staging smoke receipt is still BLOCKED: there is no SkillX staging Worker and no SKILLX_STAGING_TOKEN. #109 has only a local in-memory receipt. The production flag is unchanged and nothing was deployed. AgentKit side: bestagentkits/agentkit#2647.
mrgoonie commentedon Oct 20, 2026
Production receipt (2026-10-20)
Enablement
SKILLX_PERSONAL_KITS_APIwas set to"1"by feat(web): enable personal kits and collections APIs in production #112 (5c1f879)."0"and redeploy; every kit route then answers 404 and stored kits stay untouched.docs/deployment-guide.mdanddocs/personal-kits-api.md.Foundation publisher and release (gap 4)
bestagentkitsis active and admin-provisioned. It has a key scoped toreleases:publish:@bestagentkitsand a GitHub OIDC trusted publisher for.github/workflows/publish-agentkit-foundation.yml(environmentskillx-publish,refs/heads/main).@bestagentkits/plan@0.1.0(beta, published). Source:kits/core/skills/ak-planat AgentKitf8e2da556c1e19dd5e53934304d7fcce4c0974a0.releaseDigestissha256:08b0fce1b56819e0e85f9edcc479432f4f3e56c0a79c9f91c95e58fe84cbac65, identical to AgentKit's own digest of that skill directory.@bestagentkits/<slug>, because theskillx.release/v1contract and every shipped verifier reject@agentkit/*. AgentKit consumes bases asskillx:bestagentkits/<slug>. The@agentkitkey was revoked and theagentkitpublisher row stays reserved.release/v2provenance (skillx.release/v2: kit provenance (provider/origin) to allow @agentkit foundation releases #100) is not needed for this path.Smoke (production, kit
@skillx-smoke/smoke-pk-2610200943)If-Matchreturns 412kit.generation_conflict, and a stale bodyexpectedGenerationreturns 409. In both cases nothing is written.W/"g<n>", which made an echoedIf-Matchfail with 400. fix(web): accept the weak kit ETag in If-Match #116 now accepts the weak form.If-Match: W/"g5"returned 200; the same stale tag sent again returned 412.releases:publish:@bestagentkits: 401 on both the kit and its lock.get_kit: anonymous getsnot_found, the owner getsfound.GET /lockshowed the effective revision changing at each step (generation 3, 4, 5).plans/reports/smoke-261020-prod-personal-kits-install.mdin the delivery workspace. Secrets were redacted.Gaps
If-Matchhardened for weak ETags in #116@bestagentkits(above)parentcovers a kit)The private-library scope in #107 and the staging receipt in draft #109 remain open on their own.