@agent-native/core 0.203.0-nightly-20261007064822 → 0.203.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/agent/engine/builder-engine.d.ts +1 -1
  2. package/dist/agent/model-config.d.ts +2 -2
  3. package/dist/agent/model-config.js +0 -2
  4. package/dist/agent/thread-data-builder.d.ts +6 -0
  5. package/dist/agent/thread-data-builder.js +747 -25
  6. package/dist/agent/thread-message-projection.d.ts +20 -0
  7. package/dist/agent/thread-message-projection.js +300 -0
  8. package/dist/automation/index.d.ts +1 -1
  9. package/dist/chat-threads/store.d.ts +4 -1
  10. package/dist/chat-threads/store.js +92 -17
  11. package/dist/cli/skills-content/turn-into-app-skill.d.ts +10 -4
  12. package/dist/cli/skills-content/turn-into-app-skill.js +2454 -705
  13. package/dist/cli/skills.d.ts +6 -0
  14. package/dist/cli/skills.js +8 -2
  15. package/dist/client/chat/agentkit-agent-native.js +839 -89
  16. package/dist/client/chat/agentkit-protocol.js +67 -17
  17. package/dist/collab/routes.d.ts +2 -2
  18. package/dist/jobs/actions/manage-recurring-job.d.ts +1 -1
  19. package/dist/mcp/build-server.d.ts +5 -1
  20. package/dist/mcp/build-server.js +56 -13
  21. package/dist/mcp/embed-app.js +6 -1
  22. package/dist/notifications/routes.d.ts +1 -1
  23. package/dist/observability/routes.d.ts +3 -3
  24. package/dist/org/index.d.ts +2 -2
  25. package/dist/provider-api/actions/provider-api.d.ts +4 -4
  26. package/dist/resources/handlers.d.ts +1 -1
  27. package/dist/server/agent-chat/mcp-options.d.ts +4 -0
  28. package/dist/server/agent-chat-plugin.js +97 -22
  29. package/dist/server/agent-engine-default-model-route.d.ts +2 -2
  30. package/dist/server/onboarding-html.js +1 -1
  31. package/dist/server/realtime-token.d.ts +1 -1
  32. package/dist/server/transcribe-voice.d.ts +1 -1
  33. package/dist/shared/embed-auth.js +5 -4
  34. package/dist/sharing/actions/list-resource-shares.d.ts +1 -1
  35. package/dist/templates/factory/.agents/skills/review-latest-feedback/SKILL.md +26 -24
  36. package/dist/templates/factory/.agents/skills/review-latest-feedback/references/deployment-recovery.md +53 -0
  37. package/dist/templates/factory/.agents/skills/review-latest-feedback/references/documentation-proof.md +7 -0
  38. package/dist/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +284 -461
  39. package/dist/templates/workspace-core/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
  40. package/dist/templates/workspace-core/.agents/skills/turn-into-app/references/fresh-project.md +65 -90
  41. package/dist/templates/workspace-core/.agents/skills/turn-into-app/references/local-run-and-deploy.md +161 -0
  42. package/dist/templates/workspace-core/.agents/skills/turn-into-app/references/review-loop.md +384 -0
  43. package/dist/templates/workspace-core/.agents/skills/turn-into-app/references/source-brief.md +116 -0
  44. package/dist/templates/workspace-core/.agents/skills/turn-into-app/references/spreadsheet-source.md +206 -190
  45. package/dist/templates/workspace-core/.agents/skills/turn-into-app/references/ui-archetypes.md +381 -0
  46. package/dist/templates/workspace-core/.agents/skills/turn-into-app/references/ui-direction.md +323 -0
  47. package/dist/templates/workspace-core/.agents/skills/turn-into-app/references/ui-palettes.md +564 -0
  48. package/dist/triggers/actions/manage-automation.d.ts +7 -7
  49. package/docs/content/observability.mdx +136 -0
  50. package/package.json +4 -4
  51. package/src/templates/factory/.agents/skills/review-latest-feedback/SKILL.md +26 -24
  52. package/src/templates/factory/.agents/skills/review-latest-feedback/references/deployment-recovery.md +53 -0
  53. package/src/templates/factory/.agents/skills/review-latest-feedback/references/documentation-proof.md +7 -0
  54. package/src/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +284 -461
  55. package/src/templates/workspace-core/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
  56. package/src/templates/workspace-core/.agents/skills/turn-into-app/references/fresh-project.md +65 -90
  57. package/src/templates/workspace-core/.agents/skills/turn-into-app/references/local-run-and-deploy.md +161 -0
  58. package/src/templates/workspace-core/.agents/skills/turn-into-app/references/review-loop.md +384 -0
  59. package/src/templates/workspace-core/.agents/skills/turn-into-app/references/source-brief.md +116 -0
  60. package/src/templates/workspace-core/.agents/skills/turn-into-app/references/spreadsheet-source.md +206 -190
  61. package/src/templates/workspace-core/.agents/skills/turn-into-app/references/ui-archetypes.md +381 -0
  62. package/src/templates/workspace-core/.agents/skills/turn-into-app/references/ui-direction.md +323 -0
  63. package/src/templates/workspace-core/.agents/skills/turn-into-app/references/ui-palettes.md +564 -0
@@ -1,7 +1,7 @@
1
1
  import crypto from "node:crypto";
2
2
  import nodePath from "node:path";
3
3
  import { AgentProtocolValidationError, parseAgentRunOptions, } from "@agent-native/agentkit/protocol";
4
- import { createError, defineEventHandler, setResponseStatus, setResponseHeader, getMethod, getQuery, getHeader, getRequestIP, } from "h3";
4
+ import { createError, defineEventHandler, setResponseStatus, setResponseHeader, getMethod, getQuery, getHeader, getRequestIP, readBody as readH3Body, } from "h3";
5
5
  import { applyA2AAgentActivityEvent, buildA2AAgentActivityPart, createA2AAgentActivityState, } from "../a2a/activity.js";
6
6
  import { appendA2AArtifactLinks, buildA2ARecoverableArtifactMessage, } from "../a2a/artifact-response.js";
7
7
  import { hasConfiguredA2ASecret, isLoopbackAddress, isTrustedLocalRuntime, } from "../a2a/auth-policy.js";
@@ -2620,6 +2620,7 @@ export function createAgentChatPlugin(options) {
2620
2620
  ? Object.fromEntries(Object.entries(mcpOptions.directoryProfile.widgetReadActionArguments ?? {})
2621
2621
  .filter(([name]) => (mcpOptions.directoryProfile?.connectorCatalog.includes(name) ||
2622
2622
  mcpOptions.directoryProfile?.widgetReadPublicActions?.includes(name) ||
2623
+ mcpOptions.directoryProfile?.widgetReadAuthenticatedActions?.includes(name) ||
2623
2624
  mcpOptions.directoryProfile?.widgetReadPrivateActions?.includes(name)) &&
2624
2625
  httpActions[name] &&
2625
2626
  (httpActions[name]?.readOnly === true ||
@@ -5333,7 +5334,14 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
5333
5334
  // run could clobber the assistant message the server just
5334
5335
  // appended (and vice versa).
5335
5336
  return await withThreadDataLock(threadId, async () => {
5336
- const body = await readBody(event);
5337
+ const rawBody = await readH3Body(event);
5338
+ if (!rawBody ||
5339
+ typeof rawBody !== "object" ||
5340
+ Array.isArray(rawBody)) {
5341
+ setResponseStatus(event, 400);
5342
+ return { error: "Invalid request body" };
5343
+ }
5344
+ const body = rawBody;
5337
5345
  const bodyIncludesScope = Boolean(body &&
5338
5346
  typeof body === "object" &&
5339
5347
  Object.prototype.hasOwnProperty.call(body, "scope"));
@@ -5360,12 +5368,37 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
5360
5368
  setResponseStatus(event, 404);
5361
5369
  return { error: "Thread not found" };
5362
5370
  }
5363
- let newThreadData = body.threadData || thread.threadData;
5364
- let newMessageCount = body.messageCount ?? thread.messageCount;
5371
+ const hasThreadDataField = Boolean(body &&
5372
+ typeof body === "object" &&
5373
+ Object.prototype.hasOwnProperty.call(body, "threadData"));
5374
+ const incomingThreadData = body.threadData;
5375
+ if (hasThreadDataField &&
5376
+ typeof incomingThreadData !== "string") {
5377
+ setResponseStatus(event, 400);
5378
+ return { error: "Invalid threadData JSON" };
5379
+ }
5380
+ // Empty threadData is the existing metadata-only save sentinel.
5381
+ const hasThreadData = typeof incomingThreadData === "string" &&
5382
+ incomingThreadData.length > 0;
5383
+ let newThreadData = hasThreadData
5384
+ ? incomingThreadData
5385
+ : thread.threadData;
5386
+ const requestedMessageCount = body.messageCount;
5387
+ if (Object.prototype.hasOwnProperty.call(body, "messageCount") &&
5388
+ (typeof requestedMessageCount !== "number" ||
5389
+ !Number.isSafeInteger(requestedMessageCount) ||
5390
+ requestedMessageCount < 0)) {
5391
+ setResponseStatus(event, 400);
5392
+ return { error: "Invalid request body" };
5393
+ }
5394
+ let newMessageCount = typeof requestedMessageCount === "number"
5395
+ ? requestedMessageCount
5396
+ : thread.messageCount;
5365
5397
  let nextTitle = typeof body.title === "string" ? body.title : thread.title;
5366
5398
  const nextPreview = typeof body.preview === "string"
5367
5399
  ? body.preview
5368
5400
  : thread.preview;
5401
+ const annotationConflicts = [];
5369
5402
  const preserveTitleOverride = (repo) => {
5370
5403
  if (repo &&
5371
5404
  typeof repo === "object" &&
@@ -5377,14 +5410,51 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
5377
5410
  nextTitle = meta.title;
5378
5411
  }
5379
5412
  };
5380
- // Merge the incoming full-thread blob over the current SQL
5381
- // copy. Periodic saves can be stale relative to server-side
5382
- // run completion, and threadRuntime.export() does not carry
5383
- // queuedMessages.
5384
- if (body.threadData) {
5413
+ let isSnapshotDelta = false;
5414
+ let existing;
5415
+ try {
5416
+ existing = JSON.parse(thread.threadData);
5417
+ }
5418
+ catch {
5419
+ setResponseStatus(event, 500);
5420
+ return { error: "Stored thread data is invalid JSON" };
5421
+ }
5422
+ if (!existing ||
5423
+ typeof existing !== "object" ||
5424
+ Array.isArray(existing)) {
5425
+ setResponseStatus(event, 500);
5426
+ return { error: "Stored thread data is invalid JSON" };
5427
+ }
5428
+ // Merge the incoming snapshot delta over the current SQL copy.
5429
+ // Let updateThreadData apply delta markers to each latest
5430
+ // revision if its compare-and-swap needs to retry.
5431
+ if (hasThreadData) {
5432
+ let incoming;
5385
5433
  try {
5386
- const existing = JSON.parse(thread.threadData);
5387
- const incoming = JSON.parse(newThreadData);
5434
+ incoming = JSON.parse(incomingThreadData);
5435
+ }
5436
+ catch {
5437
+ setResponseStatus(event, 400);
5438
+ return { error: "Invalid threadData JSON" };
5439
+ }
5440
+ if (!incoming ||
5441
+ typeof incoming !== "object" ||
5442
+ Array.isArray(incoming)) {
5443
+ setResponseStatus(event, 400);
5444
+ return { error: "Invalid threadData JSON" };
5445
+ }
5446
+ const incomingAgentKit = incoming
5447
+ .agentKit;
5448
+ isSnapshotDelta =
5449
+ incomingAgentKit !== null &&
5450
+ typeof incomingAgentKit === "object" &&
5451
+ !Array.isArray(incomingAgentKit) &&
5452
+ incomingAgentKit
5453
+ ._snapshotDelta === true;
5454
+ if (isSnapshotDelta) {
5455
+ preserveTitleOverride(existing);
5456
+ }
5457
+ else {
5388
5458
  const merged = mergeThreadDataForClientSave(existing, incoming);
5389
5459
  newThreadData = JSON.stringify(merged);
5390
5460
  if (Array.isArray(merged.messages)) {
@@ -5392,19 +5462,18 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
5392
5462
  }
5393
5463
  preserveTitleOverride(merged);
5394
5464
  }
5395
- catch {
5396
- // Invalid JSON in either side — fall back to raw body blob.
5397
- }
5398
5465
  }
5399
5466
  else {
5400
- try {
5401
- preserveTitleOverride(JSON.parse(newThreadData));
5402
- }
5403
- catch {
5404
- // Invalid JSON — keep the title supplied by the client.
5405
- }
5467
+ preserveTitleOverride(existing);
5468
+ }
5469
+ const updated = await updateThreadData(threadId, newThreadData, nextTitle, nextPreview, newMessageCount, {
5470
+ preserveCurrentTitleAndPreview: isSnapshotDelta,
5471
+ onAnnotationConflict: (conflict) => annotationConflicts.push(conflict),
5472
+ });
5473
+ if (!updated) {
5474
+ setResponseStatus(event, 404);
5475
+ return { error: "Thread not found" };
5406
5476
  }
5407
- await updateThreadData(threadId, newThreadData, nextTitle, nextPreview, newMessageCount);
5408
5477
  // Scope updates piggyback on the PUT — the client uses this
5409
5478
  // path for detach and for claiming a legacy unscoped thread.
5410
5479
  // A scoped thread cannot be retagged across resources here.
@@ -5416,7 +5485,13 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
5416
5485
  // between the read above and this save), so the client records
5417
5486
  // what the server holds instead of guessing from the page.
5418
5487
  const saved = await resolveThreadAccess(owner, threadId, "editor", { orgId });
5419
- return { ok: true, scope: saved?.scope ?? null };
5488
+ return {
5489
+ ok: true,
5490
+ scope: saved?.scope ?? null,
5491
+ ...(annotationConflicts.length > 0
5492
+ ? { annotationConflicts }
5493
+ : {}),
5494
+ };
5420
5495
  });
5421
5496
  }
5422
5497
  // POST /threads/:id/queued — apply a single queue mutation against
@@ -8,17 +8,17 @@ export declare const AGENT_ENGINE_API_KEY_ACTION_NAME = "agent-engine-api-key";
8
8
  * resolveEngine's credential detection.
9
9
  */
10
10
  export declare function createAgentEngineDisconnectHandler(): import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
11
- ok?: undefined;
12
11
  error: string;
13
12
  scope?: undefined;
13
+ ok?: undefined;
14
14
  } | {
15
15
  ok: boolean;
16
16
  error: any;
17
17
  scope?: undefined;
18
18
  } | {
19
- error?: undefined;
20
19
  ok: boolean;
21
20
  scope: "org" | "user";
21
+ error?: undefined;
22
22
  }>>;
23
23
  export interface DefaultModelSelectionRequest {
24
24
  engine: string;
@@ -1837,7 +1837,7 @@ export function getOnboardingHtml(opts = {}) {
1837
1837
  .auth-wave-background {
1838
1838
  position: fixed;
1839
1839
  inset: 0;
1840
- transform: translateY(-9vh);
1840
+ transform: translateY(-15vh);
1841
1841
  z-index: 0;
1842
1842
  pointer-events: none;
1843
1843
  }
@@ -54,8 +54,8 @@ export declare function createRealtimeTokenHandler(): import("h3").EventHandlerW
54
54
  expiresAt?: undefined;
55
55
  ttlSeconds?: undefined;
56
56
  } | {
57
+ error?: undefined;
57
58
  token: string;
58
59
  expiresAt: string;
59
60
  ttlSeconds: number;
60
- error?: undefined;
61
61
  }>>;
@@ -20,6 +20,6 @@ export declare function createTranscribeVoiceHandler(): import("h3").EventHandle
20
20
  error: string;
21
21
  text?: undefined;
22
22
  } | {
23
- text: string;
24
23
  error?: undefined;
24
+ text: string;
25
25
  }>>;
@@ -77,7 +77,7 @@ function isWidgetReadCapability(value) {
77
77
  return (actions.length > 0 &&
78
78
  actions.length <= 32 &&
79
79
  actions.every(([actionName, args]) => MCP_DIRECTORY_ACTION_NAME.test(actionName) &&
80
- isWidgetReadArgumentRecord(args)));
80
+ isWidgetReadArgumentRecord(args, { minEntries: 0 })));
81
81
  }
82
82
  function decodeMcpDirectoryWidgetReadCapability(scope) {
83
83
  if (!scope.startsWith(MCP_DIRECTORY_WIDGET_READ_CAPABILITY_PREFIX) ||
@@ -134,7 +134,7 @@ export function createMcpDirectoryWidgetReadCapability(input) {
134
134
  if (actionEntries.length === 0 ||
135
135
  actionEntries.length > 32 ||
136
136
  actionEntries.some(([actionName, args]) => !MCP_DIRECTORY_ACTION_NAME.test(actionName) ||
137
- !isWidgetReadArgumentRecord(args))) {
137
+ !isWidgetReadArgumentRecord(args, { minEntries: 0 }))) {
138
138
  return undefined;
139
139
  }
140
140
  const capability = {
@@ -186,8 +186,9 @@ export function normalizeMcpDirectoryWidgetReadActionArguments(scope, input) {
186
186
  const includesResourceBinding = suppliedArgs.some(([name, value]) => typeof expectedArgs[name] === "string" && expectedArgs[name] === value);
187
187
  if (hasSchemaArgument && !includesResourceBinding)
188
188
  return undefined;
189
- if (suppliedArgs.length === 0)
190
- return undefined;
189
+ if (suppliedArgs.length === 0) {
190
+ return Object.keys(expectedArgs).length === 0 ? {} : undefined;
191
+ }
191
192
  const normalizedArgs = [];
192
193
  for (const [name, value] of suppliedArgs) {
193
194
  if (!Object.hasOwn(expectedArgs, name))
@@ -2,7 +2,6 @@ declare const _default: import("../../action.js").ActionDefinition<{
2
2
  resourceType: string;
3
3
  resourceId: string;
4
4
  }, {
5
- role?: undefined;
6
5
  ownerEmail: any;
7
6
  visibility: any;
8
7
  shares: any[];
@@ -12,6 +11,7 @@ declare const _default: import("../../action.js").ActionDefinition<{
12
11
  supportsGroupShares?: boolean;
13
12
  };
14
13
  orgId?: undefined;
14
+ role?: undefined;
15
15
  agentReadable?: undefined;
16
16
  } | {
17
17
  ownerEmail: string;
@@ -1,12 +1,10 @@
1
1
  ---
2
2
  name: review-latest-feedback
3
3
  description: >-
4
- Sweep recent Slack, GitHub issues, Sentry, Agent-Native Analytics errors,
5
- actionable automated diagnostics, and linked-tracker feedback: answer
6
- reporters first, then fix verified bugs and actionable
7
- objective UI defects at the owning boundary, require human signoff for
8
- subjective UI changes, build features the invoking user endorsed with an
9
- :upvote:, and recap every disposition. Use for scheduled or manual sweeps.
4
+ Sweep Slack, GitHub, Sentry, Analytics, trackers, and automated diagnostics,
5
+ plus app/template, desktop, and package deploy/release/publish lanes. Fix
6
+ verified defects, verify recovery targets, and recap. Use for scheduled or
7
+ manual sweeps.
10
8
  user-invocable: true
11
9
  scope: dev
12
10
  metadata:
@@ -326,6 +324,16 @@ correlation. Apply the same local-first rule. Fix worthwhile repo-owned failures
326
324
  at their boundary; record external, deployment, or unclear issues without
327
325
  inventing a fix.
328
326
 
327
+ ### Deployment, release, and publish failures
328
+
329
+ Scan app/template, desktop build/release, and package-publish lanes on every
330
+ sweep, even without a linked report. Include queued/running runs, run-only
331
+ failures, and missing/stale artifacts; carry active run IDs and rows across
332
+ cursors. Fix verified repo-owned causes; record external/manual causes with the
333
+ next owner/action. Use [`deployment-recovery.md`](references/deployment-recovery.md)
334
+ for lane-specific recovery and target proof. Green CI or merged source
335
+ does not prove delivery.
336
+
329
337
  ## Phase 2: fix
330
338
 
331
339
  Before changing code, read `fix-at-the-boundary`, `verifying-changes`, and
@@ -426,24 +434,16 @@ pre-existing.
426
434
 
427
435
  ### Npx and package reports have a release follow-up
428
436
 
429
- Npx scaffolds are versioned. Record pinned/filed versions, fresh npm cache/no
430
- local override, candidate result, release, and existing-app path (`pnpm add
431
- @agent-native/core@<version>` or hand edit).
432
-
433
- Local proof, beta promises, and scaffolds aren't **Shipped**/**Live verified**
434
- until published. A verified merge is **Fixed**; follow the issue-closure rule
435
- above. Record merge proof, release, verification, and bump/re-scaffold
436
- follow-up. Unknown package/endpoint context is a release follow-up. Ask only if
437
- scope or reporter input is unclear. Missing evidence alone doesn't keep a
438
- verified merge open.
439
- Merge/beta is not npx delivery.
437
+ Use [`deployment-recovery.md`](references/deployment-recovery.md) for npx
438
+ version evidence, registry proof, publication status, and existing-app upgrade
439
+ verification. A verified merge may be **Fixed** under the issue-closure rule
440
+ above while its delivery row stays open; a local scaffold or beta promise is not
441
+ delivery.
440
442
 
441
443
  ### Documentation has a runnable proof obligation
442
444
 
443
- For each docs row, copy commands into a clean temporary scaffold; verify every
444
- referenced file, directory, script, env var, deploy target, link, and fence
445
- order. A docs diff/build is not enough. Update configured locales and run
446
- `guard:i18n-catalogs` plus `guard:i18n-changed-copy`.
445
+ For each docs row, use [`documentation-proof.md`](references/documentation-proof.md).
446
+ A docs diff/build alone isn't proof.
447
447
 
448
448
  Choose the narrowest seam the evidence supports:
449
449
 
@@ -577,14 +577,16 @@ message details.
577
577
  Start cursors: product [Slack message](...) · QA [Slack message](...) · dev [Slack message](...)
578
578
  Reply cursors (reuse next run): product <timestamp> · QA <timestamp> · dev <timestamp>
579
579
  Messages: product N · QA N · dev N (total N)
580
+ Deployment cursor: <timestamp> · carried active run IDs/rows: <ids/count>
581
+ Release lanes: N inspected · failed/stale N · target verified N
580
582
  Reaction-gated skips: N · claimed N · answered N
581
583
  Questions asked: N/3 · Dropped at 4 days: N
582
584
  Repeats of a prior Fixed claim: N (each with its earlier thread and failed fix)
583
585
  Upvoted items in scope: N (built: N)
584
586
 
585
- | Tracker/source | Reporter | Status | Repro (expected/actual) | Pre/post | Runtime proof | Locales | Handoff (action/owner/ticket) | Replied | Reactions |
587
+ | Tracker/source or workflow run | Reporter/owner | Status | Repro or failed step | Pre/post/recovery | Run/SHA/target/version/artifact/runtime proof | Locales | Handoff (action/owner/ticket) | Replied | Reactions |
586
588
  | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
587
- | 18 / [thread](...) | ... | <disposition> | steps; expected/actual | before/after | source/tests/build/URL | updated/N/A/pending | none or action/owner/[ticket](...) | yes/no | 👀 claim; ✅ Fixed; 🎫 ticketed only |
589
+ | 18 / [thread](...) or [workflow run](...) | ... | <disposition> | steps; expected/actual or failed job/step | before/after/recovery run | source/tests/build/run/SHA/target/version/URL | updated/N/A/pending | none or action/owner/[ticket](...) | yes/no | 👀 claim; ✅ Fixed; 🎫 ticketed only |
588
590
 
589
591
  Sibling sweep: <fingerprint> - N hits, M fixed, K triaged
590
592
  Tracker: <sheet/export and bounded range> - N rows enumerated, N ledgers complete
@@ -601,4 +603,4 @@ cursor stated.
601
603
  ## Related skills
602
604
 
603
605
  `address-feedback`, `address-feedback-with-replies`, `fix-at-the-boundary`,
604
- `concurrent-agents`, `verifying-changes`, `ship`
606
+ `concurrent-agents`, `verifying-changes`, `ship`, `ship-and-monitor`
@@ -0,0 +1,53 @@
1
+ # Deployment, release, and publish recovery
2
+
3
+ Use this guide for each `review-latest-feedback` sweep, even when no report
4
+ links a failed run.
5
+
6
+ ## Scan and classify
7
+
8
+ - Inspect recent deploy, release, desktop build/sign/notarize/update, and
9
+ package-publish runs since the previous deployment cursor; on the first run,
10
+ use the last 7 days for completed-run history and independently include every
11
+ nonterminal run regardless of age. Seed the carried-run list with all active
12
+ runs before advancing the cursor. Include queued, approval-waiting, and
13
+ running jobs, and recheck them regardless of age. Finish all result pages
14
+ before advancing the cursor. Cover app/template beta, docs, and production
15
+ lanes where configured. Use current workflow/target maps and provider or
16
+ registry state.
17
+ - Check deployed app revisions, desktop release assets, and package versions
18
+ for missing or stale artifacts, including when a workflow reports success.
19
+ - For each failure or target mismatch, inspect authoritative logs. Record the
20
+ run URL, workflow, failed job/step, target/platform/package/version, source
21
+ SHA, and error in the ledger.
22
+ - Separate repo-owned source/workflow/config defects from provider errors,
23
+ skipped or manual gates, cancellations, and superseded runs. Fix confirmed
24
+ repo-owned causes at their owning boundary. Record an external owner and exact
25
+ next action when the cause is outside the repo.
26
+
27
+ ## Recover and verify
28
+
29
+ Use the lane's normal workflow and the invocation's applicable publish/deploy
30
+ authority. Recover only affected lanes. Read `ship` for PR/push/merge work and
31
+ `ship-and-monitor` for beta, docs, release-tail, or manual-production proof.
32
+ If a required release action is not authorized, keep its operational row active
33
+ with the exact next action.
34
+
35
+ Verify the intended source and delivery artifact at the target:
36
+
37
+ - **Apps:** confirm the target has the intended revision and smoke-test the
38
+ affected URL or health path, including cache behavior when relevant.
39
+ - **Desktop:** confirm the expected version and platform assets exist, then
40
+ exercise the affected install or update path through launch.
41
+ - **Packages:** confirm the exact version is in the registry and install or
42
+ scaffold it from a clean cache. For npx, record pinned/filed versions, remove
43
+ local overrides, verify the candidate and published release, and check the
44
+ existing-app upgrade path (for example, `pnpm add
45
+ @agent-native/core@<version>` or the documented hand edit).
46
+
47
+ A green workflow, merged source, beta promise, or local scaffold alone does not
48
+ prove delivery. Keep carrying each operational row and nonterminal run ID until
49
+ the intended artifact is present and its target check passes; a linked source issue can be **Fixed**
50
+ while the operational row remains open. Run-only failures get a ledger row, not
51
+ a fabricated Slack reaction. Local proof is not **Shipped**/**Live verified**
52
+ until the relevant artifact is published and its delivery/runtime bar passes.
53
+ Link the merge, release, verification, and any bump/re-scaffold follow-up.
@@ -0,0 +1,7 @@
1
+ # Documentation proof checklist
2
+
3
+ For each documentation row, copy its commands into a clean temporary scaffold.
4
+ Verify referenced files, directories, scripts, environment variables, deploy
5
+ targets, links, and fenced-command order. Update configured locales when source
6
+ meaning changes. Run `guard:i18n-catalogs` and `guard:i18n-changed-copy`; a docs
7
+ diff or build alone is not proof.