@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.
- package/dist/agent/engine/builder-engine.d.ts +1 -1
- package/dist/agent/model-config.d.ts +2 -2
- package/dist/agent/model-config.js +0 -2
- package/dist/agent/thread-data-builder.d.ts +6 -0
- package/dist/agent/thread-data-builder.js +747 -25
- package/dist/agent/thread-message-projection.d.ts +20 -0
- package/dist/agent/thread-message-projection.js +300 -0
- package/dist/automation/index.d.ts +1 -1
- package/dist/chat-threads/store.d.ts +4 -1
- package/dist/chat-threads/store.js +92 -17
- package/dist/cli/skills-content/turn-into-app-skill.d.ts +10 -4
- package/dist/cli/skills-content/turn-into-app-skill.js +2454 -705
- package/dist/cli/skills.d.ts +6 -0
- package/dist/cli/skills.js +8 -2
- package/dist/client/chat/agentkit-agent-native.js +839 -89
- package/dist/client/chat/agentkit-protocol.js +67 -17
- package/dist/collab/routes.d.ts +2 -2
- package/dist/jobs/actions/manage-recurring-job.d.ts +1 -1
- package/dist/mcp/build-server.d.ts +5 -1
- package/dist/mcp/build-server.js +56 -13
- package/dist/mcp/embed-app.js +6 -1
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/observability/routes.d.ts +3 -3
- package/dist/org/index.d.ts +2 -2
- package/dist/provider-api/actions/provider-api.d.ts +4 -4
- package/dist/resources/handlers.d.ts +1 -1
- package/dist/server/agent-chat/mcp-options.d.ts +4 -0
- package/dist/server/agent-chat-plugin.js +97 -22
- package/dist/server/agent-engine-default-model-route.d.ts +2 -2
- package/dist/server/onboarding-html.js +1 -1
- package/dist/server/realtime-token.d.ts +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/shared/embed-auth.js +5 -4
- package/dist/sharing/actions/list-resource-shares.d.ts +1 -1
- package/dist/templates/factory/.agents/skills/review-latest-feedback/SKILL.md +26 -24
- package/dist/templates/factory/.agents/skills/review-latest-feedback/references/deployment-recovery.md +53 -0
- package/dist/templates/factory/.agents/skills/review-latest-feedback/references/documentation-proof.md +7 -0
- package/dist/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +284 -461
- package/dist/templates/workspace-core/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
- package/dist/templates/workspace-core/.agents/skills/turn-into-app/references/fresh-project.md +65 -90
- package/dist/templates/workspace-core/.agents/skills/turn-into-app/references/local-run-and-deploy.md +161 -0
- package/dist/templates/workspace-core/.agents/skills/turn-into-app/references/review-loop.md +384 -0
- package/dist/templates/workspace-core/.agents/skills/turn-into-app/references/source-brief.md +116 -0
- package/dist/templates/workspace-core/.agents/skills/turn-into-app/references/spreadsheet-source.md +206 -190
- package/dist/templates/workspace-core/.agents/skills/turn-into-app/references/ui-archetypes.md +381 -0
- package/dist/templates/workspace-core/.agents/skills/turn-into-app/references/ui-direction.md +323 -0
- package/dist/templates/workspace-core/.agents/skills/turn-into-app/references/ui-palettes.md +564 -0
- package/dist/triggers/actions/manage-automation.d.ts +7 -7
- package/docs/content/observability.mdx +136 -0
- package/package.json +4 -4
- package/src/templates/factory/.agents/skills/review-latest-feedback/SKILL.md +26 -24
- package/src/templates/factory/.agents/skills/review-latest-feedback/references/deployment-recovery.md +53 -0
- package/src/templates/factory/.agents/skills/review-latest-feedback/references/documentation-proof.md +7 -0
- package/src/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +284 -461
- package/src/templates/workspace-core/.agents/skills/turn-into-app/agents/openai.yaml +2 -2
- package/src/templates/workspace-core/.agents/skills/turn-into-app/references/fresh-project.md +65 -90
- package/src/templates/workspace-core/.agents/skills/turn-into-app/references/local-run-and-deploy.md +161 -0
- package/src/templates/workspace-core/.agents/skills/turn-into-app/references/review-loop.md +384 -0
- package/src/templates/workspace-core/.agents/skills/turn-into-app/references/source-brief.md +116 -0
- package/src/templates/workspace-core/.agents/skills/turn-into-app/references/spreadsheet-source.md +206 -190
- package/src/templates/workspace-core/.agents/skills/turn-into-app/references/ui-archetypes.md +381 -0
- package/src/templates/workspace-core/.agents/skills/turn-into-app/references/ui-direction.md +323 -0
- 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
|
|
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
|
-
|
|
5364
|
-
|
|
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
|
-
|
|
5381
|
-
|
|
5382
|
-
|
|
5383
|
-
|
|
5384
|
-
|
|
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
|
-
|
|
5387
|
-
|
|
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
|
-
|
|
5401
|
-
|
|
5402
|
-
|
|
5403
|
-
|
|
5404
|
-
|
|
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 {
|
|
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;
|
|
@@ -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
|
}>>;
|
|
@@ -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
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
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,
|
|
444
|
-
|
|
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
|
|
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.
|