@agent-native/core 0.206.0 → 0.206.1-nightly-20261009213000
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/action.d.ts +2 -0
- package/dist/agent/default-agent-engine.js +25 -0
- package/dist/agent/durable-background.d.ts +2 -0
- package/dist/agent/durable-background.js +2 -0
- package/dist/agent/engine/error-detail.d.ts +1 -0
- package/dist/agent/engine/error-detail.js +6 -1
- package/dist/agent/engine/tool-call-journal-seed.d.ts +1 -1
- package/dist/agent/engine/tool-call-journal-seed.js +47 -11
- package/dist/agent/engine/translate-anthropic.d.ts +9 -0
- package/dist/agent/engine/translate-anthropic.js +18 -3
- package/dist/agent/production-agent.d.ts +6 -4
- package/dist/agent/production-agent.js +126 -85
- package/dist/agent/run-store.js +15 -3
- package/dist/agent/thread-data-builder.js +1 -2
- package/dist/agent/types.d.ts +1 -0
- package/dist/automation/index.d.ts +1 -1
- package/dist/chat-threads/store.js +6 -2
- package/dist/cli/design-connect.d.ts +1 -0
- package/dist/cli/design-connect.js +72 -19
- package/dist/client/analytics.js +48 -58
- package/dist/client/chat/agentkit-agent-native.js +11 -10
- package/dist/client/chat/agentkit-protocol.js +5 -1
- package/dist/client/chat/runtime.d.ts +4 -1
- package/dist/client/chat/runtime.js +135 -43
- package/dist/client/session-replay-endpoint.d.ts +1 -0
- package/dist/client/session-replay-endpoint.js +35 -0
- package/dist/client/session-replay.js +2 -24
- package/dist/client/sharing/share-controller-helpers.d.ts +1 -1
- package/dist/client/sharing/share-controller-helpers.js +2 -1
- package/dist/client/sharing/useShareButtonController.js +2 -9
- package/dist/client/use-action.d.ts +1 -0
- package/dist/client/use-action.js +2 -1
- package/dist/deploy/build.js +1 -1
- package/dist/deploy/workspace-deploy.js +65 -6
- package/dist/file-upload/actions/upload-image.d.ts +2 -2
- package/dist/file-upload/registry.d.ts +7 -1
- package/dist/file-upload/registry.js +25 -7
- package/dist/mcp/build-server.d.ts +6 -0
- package/dist/mcp/build-server.js +97 -28
- package/dist/mcp/embed-app.js +9 -8
- package/dist/mcp/screen-memory-stdio.d.ts +7 -7
- package/dist/notifications/routes.d.ts +3 -3
- package/dist/observability/metrics.d.ts +5 -0
- package/dist/observability/metrics.js +62 -7
- package/dist/observability/routes.d.ts +4 -4
- package/dist/org/handlers.d.ts +1 -1
- package/dist/org/index.d.ts +1 -1
- package/dist/provider-api/actions/custom-provider-registration.d.ts +13 -13
- package/dist/provider-api/actions/provider-api.d.ts +5 -5
- package/dist/scripts/docs/search.d.ts +1 -0
- package/dist/scripts/docs/search.js +17 -4
- package/dist/secrets/index.d.ts +1 -1
- package/dist/secrets/index.js +1 -1
- package/dist/secrets/storage.d.ts +1 -0
- package/dist/secrets/storage.js +8 -0
- package/dist/server/action-routes.js +62 -29
- package/dist/server/agent-chat/mcp-options.d.ts +2 -0
- package/dist/server/agent-chat/prompt-resources.js +2 -2
- package/dist/server/agent-engine-api-key-route.d.ts +2 -1
- package/dist/server/agent-engine-api-key-route.js +66 -2
- package/dist/server/agent-engine-default-model-route.d.ts +1 -1
- package/dist/server/agent-engine-ollama-models-route.d.ts +2 -2
- package/dist/server/agent-run-context.js +21 -1
- package/dist/server/agent-teams-run-queue.js +2 -1
- package/dist/server/agents-bundle.js +1 -1
- package/dist/server/auth.js +1 -0
- package/dist/server/core-routes-plugin.js +12 -0
- package/dist/server/embed-session.js +15 -1
- package/dist/server/http-response-telemetry.js +37 -8
- package/dist/server/realtime-token.d.ts +1 -1
- package/dist/shared/embed-auth.d.ts +4 -0
- package/dist/shared/embed-auth.js +156 -23
- package/dist/shared/inline-bytes.d.ts +29 -0
- package/dist/shared/inline-bytes.js +170 -0
- package/dist/shared/mcp-embed-headers.d.ts +1 -1
- package/dist/shared/mcp-embed-headers.js +1 -1
- package/dist/sharing/actions/list-resource-shares.d.ts +1 -1
- package/dist/sharing/actions/list-resource-shares.js +10 -4
- package/dist/sharing/actions/set-resource-visibility.js +3 -1
- package/dist/sharing/actions/share-resource.js +4 -2
- package/dist/sharing/actions/unshare-resource.js +3 -1
- package/dist/sharing/widget-grant.d.ts +19 -0
- package/dist/sharing/widget-grant.js +55 -0
- package/dist/templates/factory/.agents/skills/review-latest-feedback/SKILL.md +20 -21
- package/dist/testing.d.ts +1 -0
- package/dist/testing.js +1 -0
- package/dist/tracking/registry.d.ts +3 -2
- package/dist/tracking/registry.js +12 -3
- package/dist/vite/client.js +6 -1
- package/docs/content/observability.mdx +15 -10
- package/docs/content/tracking.mdx +1 -1
- package/package.json +4 -4
- package/src/templates/factory/.agents/skills/review-latest-feedback/SKILL.md +20 -21
|
@@ -245,27 +245,25 @@ Do not change code for an unrelated product idea, praise, status update, merge
|
|
|
245
245
|
or review request, irrelevant bot forward, duplicate, or work outside the
|
|
246
246
|
invocation's ownership.
|
|
247
247
|
|
|
248
|
-
**
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
Requests for a new capability still follow the invoking identity's `:upvote:`
|
|
261
|
-
gate. Content remains Alice's area unless the invocation claims it.
|
|
248
|
+
**Subjective UX proposals need human review.** Adding buttons/chrome or changing
|
|
249
|
+
visibility, placement, emphasis, or discoverability (including “hard to find”)
|
|
250
|
+
is a product proposal, not a defect. Check overflow, keyboard, Cmd+K, and
|
|
251
|
+
contextual surfaces first. Recap the ask, findings, options, recommendation,
|
|
252
|
+
and tradeoff; mark **Skipped**. A report or `:upvote:` never authorizes automatic
|
|
253
|
+
implementation; only a user-directed task may implement an approved approach.
|
|
254
|
+
If claimed, keep 👀, post **Skipped** once, and don't ask the reporter to choose.
|
|
255
|
+
|
|
256
|
+
Auto-fix objective defects only: broken behavior/results, misalignment,
|
|
257
|
+
overlap/clipping, illegibility, unusable focus/targets, jank, jitter,
|
|
258
|
+
measurable slowness, regressions. Separate defects from preferences; measure
|
|
259
|
+
failures with `text-heavy-ui`. Content remains Alice's unless claimed.
|
|
262
260
|
|
|
263
261
|
### `:upvote:` authorizes feature requests
|
|
264
262
|
|
|
265
263
|
An `:upvote:` from **the invoking identity** - not from anyone else - promotes
|
|
266
|
-
an otherwise out-of-scope item into scope and authorizes the work.
|
|
267
|
-
|
|
268
|
-
|
|
264
|
+
an otherwise out-of-scope item into scope and authorizes the work. Subjective
|
|
265
|
+
UX proposals are the exception: an upvote routes them for human review, not
|
|
266
|
+
implementation by this sweep.
|
|
269
267
|
|
|
270
268
|
Find them alongside the newest-message scan:
|
|
271
269
|
|
|
@@ -279,10 +277,11 @@ the query also returns ordinary replies and old polls that happen to carry the
|
|
|
279
277
|
reaction. Take the ones that name a concrete improvement; skip the rest
|
|
280
278
|
without comment.
|
|
281
279
|
|
|
282
|
-
An upvote endorses
|
|
283
|
-
it does not change ownership, reaction, verification, or
|
|
284
|
-
|
|
285
|
-
|
|
280
|
+
An upvote endorses an otherwise out-of-scope **feature request** and skips only
|
|
281
|
+
the clear-bug bar; it does not change ownership, reaction, verification, or
|
|
282
|
+
question-budget rules. Subjective UX proposals remain review-only as above.
|
|
283
|
+
Build the smallest eligible endorsed version, name Sid or Alice, and state
|
|
284
|
+
requested versus actual behavior in the recap. Add `👀` before investigation or
|
|
286
285
|
delegation and read it back. Keep it evidence-limited until Phase 2's four bars
|
|
287
286
|
hold; then use **Shipped**, adding `✅` only if it meets **Fixed**.
|
|
288
287
|
|
package/dist/testing.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export { createGetDb } from "./db/create-get-db.js";
|
|
2
2
|
export { startLocalPlanBridge } from "./cli/plan-local.js";
|
|
3
3
|
export { prepareDesignConnectManifest, startDesignConnectBridge, type DesignConnectBridge, } from "./cli/design-connect.js";
|
|
4
|
+
export { assertNoInlineImageBytes } from "./shared/inline-bytes.js";
|
package/dist/testing.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export { createGetDb } from "./db/create-get-db.js";
|
|
2
2
|
export { startLocalPlanBridge } from "./cli/plan-local.js";
|
|
3
3
|
export { prepareDesignConnectManifest, startDesignConnectBridge, } from "./cli/design-connect.js";
|
|
4
|
+
export { assertNoInlineImageBytes } from "./shared/inline-bytes.js";
|
|
@@ -9,11 +9,12 @@ export interface TrackingMeta {
|
|
|
9
9
|
userId?: string;
|
|
10
10
|
authUserId?: string;
|
|
11
11
|
anonymousId?: string;
|
|
12
|
-
|
|
12
|
+
/** Null pins session absence and disables request-context fallback. */
|
|
13
|
+
sessionId?: string | null;
|
|
13
14
|
occurredAt?: number;
|
|
14
15
|
telemetryOrigin?: TrackingEventOrigin;
|
|
15
16
|
}
|
|
16
|
-
export type TrackingSource = TrackingMeta | ActionRunContext;
|
|
17
|
+
export type TrackingSource = TrackingMeta | (ActionRunContext & Pick<TrackingMeta, "sessionId">);
|
|
17
18
|
export declare function track(name: string, properties?: Record<string, unknown>, source?: TrackingSource): void;
|
|
18
19
|
export declare function identify(userId: string, traits?: Record<string, unknown>): void;
|
|
19
20
|
export declare function flushTracking(): Promise<void[]>;
|
|
@@ -57,12 +57,17 @@ function resolveTrackingSource(source) {
|
|
|
57
57
|
}
|
|
58
58
|
if (isActionRunContext(source)) {
|
|
59
59
|
const callerMatchesRequest = source.userEmail === requestContext?.userEmail;
|
|
60
|
+
const explicitSessionId = source.sessionId;
|
|
60
61
|
return {
|
|
61
62
|
userId: source.userEmail,
|
|
62
63
|
...(callerMatchesRequest
|
|
63
64
|
? { authUserId: requestContext?.authUserId }
|
|
64
65
|
: {}),
|
|
65
|
-
sessionId:
|
|
66
|
+
sessionId: explicitSessionId === undefined
|
|
67
|
+
? callerMatchesRequest
|
|
68
|
+
? ambientSessionId
|
|
69
|
+
: undefined
|
|
70
|
+
: (explicitSessionId ?? undefined),
|
|
66
71
|
telemetryOrigin: "server",
|
|
67
72
|
};
|
|
68
73
|
}
|
|
@@ -76,7 +81,11 @@ function resolveTrackingSource(source) {
|
|
|
76
81
|
authUserId: source.authUserId ??
|
|
77
82
|
(canUseAmbientIdentity ? requestContext?.authUserId : undefined),
|
|
78
83
|
anonymousId: source.anonymousId,
|
|
79
|
-
sessionId: source.sessionId
|
|
84
|
+
sessionId: source.sessionId === undefined
|
|
85
|
+
? canUseAmbientSession
|
|
86
|
+
? ambientSessionId
|
|
87
|
+
: undefined
|
|
88
|
+
: (source.sessionId ?? undefined),
|
|
80
89
|
occurredAt: source.occurredAt,
|
|
81
90
|
telemetryOrigin: source.telemetryOrigin ?? "server",
|
|
82
91
|
};
|
|
@@ -158,7 +167,7 @@ function emitTrackingEvent(name, properties, source) {
|
|
|
158
167
|
timestamp: new Date(source.occurredAt || Date.now()).toISOString(),
|
|
159
168
|
userId: source.userId,
|
|
160
169
|
anonymousId: source.anonymousId,
|
|
161
|
-
sessionId: source.sessionId,
|
|
170
|
+
sessionId: source.sessionId ?? undefined,
|
|
162
171
|
};
|
|
163
172
|
for (const provider of getRegistry().values()) {
|
|
164
173
|
if (properties.test_identity === true &&
|
package/dist/vite/client.js
CHANGED
|
@@ -3785,7 +3785,7 @@ function createAgentNativeConfig(options = {}, command, userConfig = {}, mode =
|
|
|
3785
3785
|
const forcePollingWatch = process.env.CHOKIDAR_USEPOLLING === "1";
|
|
3786
3786
|
const pollingWatchInterval = Number(process.env.CHOKIDAR_INTERVAL ?? 1000);
|
|
3787
3787
|
const userWatch = userConfig.server?.watch ?? {};
|
|
3788
|
-
const { rollupOptions: _buildRollupOptionsAlias, ...userBuild } = userConfig.build ?? {};
|
|
3788
|
+
const { rollupOptions: _buildRollupOptionsAlias, rolldownOptions: _buildRolldownOptions, ...userBuild } = userConfig.build ?? {};
|
|
3789
3789
|
const { rollupOptions: _depsRollupOptionsAlias, ...userOptimizeDeps } = userConfig.optimizeDeps ?? {};
|
|
3790
3790
|
return {
|
|
3791
3791
|
nitro: {
|
|
@@ -3891,6 +3891,11 @@ function createAgentNativeConfig(options = {}, command, userConfig = {}, mode =
|
|
|
3891
3891
|
},
|
|
3892
3892
|
build: {
|
|
3893
3893
|
...userBuild,
|
|
3894
|
+
rolldownOptions: {
|
|
3895
|
+
experimental: {
|
|
3896
|
+
lazyBarrel: userConfig.build?.rolldownOptions?.experimental?.lazyBarrel ?? true,
|
|
3897
|
+
},
|
|
3898
|
+
},
|
|
3894
3899
|
outDir: options.outDir ?? userConfig.build?.outDir ?? "dist/spa",
|
|
3895
3900
|
cssMinify: userConfig.build?.cssMinify ?? "esbuild",
|
|
3896
3901
|
cssTarget: userConfig.build?.cssTarget ?? ["es2020", "safari18"],
|
|
@@ -421,14 +421,17 @@ Spans are finished with OK/ERROR status and record a fixed code-derived message
|
|
|
421
421
|
|
|
422
422
|
Core also records metrics once the host registers a meter provider with `registerObservabilityProvider()` from `@agent-native/core/server`. Metrics are recorded for every request and run, with no sampling:
|
|
423
423
|
|
|
424
|
-
| Instrument
|
|
425
|
-
|
|
|
426
|
-
| `http.server.request.duration`
|
|
427
|
-
| `
|
|
428
|
-
| `gen_ai.client.
|
|
429
|
-
| `
|
|
430
|
-
| `agent_native.
|
|
431
|
-
| `agent_native.
|
|
424
|
+
| Instrument | Attributes |
|
|
425
|
+
| ------------------------------------------- | -------------------------------------------------------------------------------------------- |
|
|
426
|
+
| `http.server.request.duration` | `http.request.method`, `http.response.status_code`, `http.route`, `error.type` |
|
|
427
|
+
| `agent_native.http.server.handoff.duration` | `http.request.method`, `http.response.status_code`, `http.route`, `error.type` |
|
|
428
|
+
| `gen_ai.client.operation.duration` | `gen_ai.operation.name`, `gen_ai.provider.name`, `gen_ai.request.model`, `error.type` |
|
|
429
|
+
| `gen_ai.client.token.usage` | `gen_ai.operation.name`, `gen_ai.provider.name`, `gen_ai.request.model`, `gen_ai.token.type` |
|
|
430
|
+
| `agent_native.agent.runs` | `status`, `terminal_reason`, `gen_ai.provider.name`, `gen_ai.request.model` |
|
|
431
|
+
| `agent_native.tool.calls` | `gen_ai.tool.name`, `error.type` |
|
|
432
|
+
| `agent_native.telemetry.flush_failures` | `error.type`, `agent_native.telemetry.signal` |
|
|
433
|
+
|
|
434
|
+
`agent_native.http.server.handoff.duration` has the same attributes and buckets as `http.server.request.duration`, but it ends when the response hook hands the response back to the runtime instead of when the hook starts. When its percentiles pull away from `http.server.request.duration`'s, finished responses are being held, for example by an inline telemetry flush. The gap is a signal, not any one request's wait, since the two percentiles can come from different requests. Without `waitUntil`, core records the sample after that flush, so it reaches the back end with the next one.
|
|
432
435
|
|
|
433
436
|
On metrics, `gen_ai.tool.name` is a framework action's name or `other`, and `gen_ai.request.model` is the model id only when the engine lists it as supported, otherwise `_OTHER`. App-defined tools and caller-supplied model ids therefore cannot create unbounded series; spans keep the exact values.
|
|
434
437
|
|
|
@@ -472,9 +475,11 @@ A later call replaces the earlier provider. The returned function unregisters th
|
|
|
472
475
|
|
|
473
476
|
### Flushing on serverless {#otel-flush}
|
|
474
477
|
|
|
475
|
-
Serverless functions freeze between invocations, so an SDK's export timer may never fire. When a registered provider implements `forceFlush()`, core calls it from the response hook after every request and waits for it. Each flush races one shared 2-second timeout, so telemetry never holds a response longer than that.
|
|
478
|
+
Serverless functions freeze between invocations, so an SDK's export timer may never fire. When a registered provider implements `forceFlush()`, core calls it from the response hook after every request and waits for it. Each flush races one shared 2-second timeout, so telemetry never holds a response longer than that. When the platform provides `waitUntil` (Cloudflare, or the Netlify invocation context), core hands the flush to it and sends the response first instead of waiting.
|
|
476
479
|
|
|
477
|
-
|
|
480
|
+
Core calls a meter provider's `forceFlush()` at most once every 10 seconds per process and skips it on the requests in between. Each metric export re-sends every series the process holds, so this keeps upload volume from growing with request rate. Skipped points are not lost: the next export carries them, unless the instance never serves another request. A tracer provider is flushed on every request.
|
|
481
|
+
|
|
482
|
+
When a flush fails or times out, core stops waiting for it and adds 1 to `agent_native.telemetry.flush_failures`, which the next flush exports. A timed-out export keeps running and can still arrive, unless the runtime freezes the process first. The failure's `error.type` is `timeout`, `suspended` when the runtime froze the process mid-flush, or the error's name. Because a collector that keeps timing out never receives that counter, core also writes one `agent-native.telemetry_flush_failed` line to the function log per signal and error type in each process.
|
|
478
483
|
|
|
479
484
|
On a long-running server, a flush after every response means one export per request. Register providers without `forceFlush()` there and let the SDK's own timers export. `isServerlessRuntime()` from `@agent-native/core/server` tells the two apart. It is true on Netlify, Vercel, AWS Lambda, and Cloudflare.
|
|
480
485
|
|
|
@@ -390,7 +390,7 @@ Template roots call `configureTracking()` once at startup. Browser events sent w
|
|
|
390
390
|
- `llm_connection_source` — `app_secrets`, `settings`, or `env`
|
|
391
391
|
- `llm_connection_configured` — whether an LLM connection is available
|
|
392
392
|
|
|
393
|
-
The framework also tracks `builder connect clicked` when a user selects a Use Builder.io CTA, and the server-side Builder connect routes track started/succeeded/failed lifecycle events. `configureTracking()` is called automatically by the framework; you don't need to call it in your own template code.
|
|
393
|
+
The framework also tracks `builder connect clicked` when a user selects a Use Builder.io CTA, and the server-side Builder connect routes track started/succeeded/failed lifecycle events. Server-side setup changes also emit `llm_credential_changed` (`change_type`, normalized `provider`, `scope`, `credential_kind`, and optional `surface`) and `llm_default_model_changed` (`engine`, `model`, optional prior engine/model, `scope`, and `operation`). These events never include credential or endpoint values. `configureTracking()` is called automatically by the framework; you don't need to call it in your own template code.
|
|
394
394
|
|
|
395
395
|
</details>
|
|
396
396
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-native/core",
|
|
3
|
-
"version": "0.206.
|
|
3
|
+
"version": "0.206.1-nightly-20261009213000",
|
|
4
4
|
"description": "The agentic application framework for building autonomous agents with intuitive UIs",
|
|
5
5
|
"homepage": "https://github.com/BuilderIO/agent-native#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -688,8 +688,8 @@
|
|
|
688
688
|
"yaml": "^2.9.0",
|
|
689
689
|
"yjs": "^13.6.33",
|
|
690
690
|
"zod": "^4.3.6",
|
|
691
|
-
"@agent-native/
|
|
692
|
-
"@agent-native/
|
|
691
|
+
"@agent-native/recap-cli": "^0.5.68",
|
|
692
|
+
"@agent-native/agentkit": "^0.206.1-nightly-20261009213000"
|
|
693
693
|
},
|
|
694
694
|
"devDependencies": {
|
|
695
695
|
"@ai-sdk/anthropic": "^3.0.71",
|
|
@@ -759,7 +759,7 @@
|
|
|
759
759
|
"xlsx": "^0.18.5"
|
|
760
760
|
},
|
|
761
761
|
"peerDependencies": {
|
|
762
|
-
"@agent-native/core-corpus": "
|
|
762
|
+
"@agent-native/core-corpus": "0.206.1-nightly-20261009213000",
|
|
763
763
|
"@ai-sdk/anthropic": ">=3",
|
|
764
764
|
"@ai-sdk/cohere": ">=3",
|
|
765
765
|
"@ai-sdk/google": ">=3",
|
|
@@ -245,27 +245,25 @@ Do not change code for an unrelated product idea, praise, status update, merge
|
|
|
245
245
|
or review request, irrelevant bot forward, duplicate, or work outside the
|
|
246
246
|
invocation's ownership.
|
|
247
247
|
|
|
248
|
-
**
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
Requests for a new capability still follow the invoking identity's `:upvote:`
|
|
261
|
-
gate. Content remains Alice's area unless the invocation claims it.
|
|
248
|
+
**Subjective UX proposals need human review.** Adding buttons/chrome or changing
|
|
249
|
+
visibility, placement, emphasis, or discoverability (including “hard to find”)
|
|
250
|
+
is a product proposal, not a defect. Check overflow, keyboard, Cmd+K, and
|
|
251
|
+
contextual surfaces first. Recap the ask, findings, options, recommendation,
|
|
252
|
+
and tradeoff; mark **Skipped**. A report or `:upvote:` never authorizes automatic
|
|
253
|
+
implementation; only a user-directed task may implement an approved approach.
|
|
254
|
+
If claimed, keep 👀, post **Skipped** once, and don't ask the reporter to choose.
|
|
255
|
+
|
|
256
|
+
Auto-fix objective defects only: broken behavior/results, misalignment,
|
|
257
|
+
overlap/clipping, illegibility, unusable focus/targets, jank, jitter,
|
|
258
|
+
measurable slowness, regressions. Separate defects from preferences; measure
|
|
259
|
+
failures with `text-heavy-ui`. Content remains Alice's unless claimed.
|
|
262
260
|
|
|
263
261
|
### `:upvote:` authorizes feature requests
|
|
264
262
|
|
|
265
263
|
An `:upvote:` from **the invoking identity** - not from anyone else - promotes
|
|
266
|
-
an otherwise out-of-scope item into scope and authorizes the work.
|
|
267
|
-
|
|
268
|
-
|
|
264
|
+
an otherwise out-of-scope item into scope and authorizes the work. Subjective
|
|
265
|
+
UX proposals are the exception: an upvote routes them for human review, not
|
|
266
|
+
implementation by this sweep.
|
|
269
267
|
|
|
270
268
|
Find them alongside the newest-message scan:
|
|
271
269
|
|
|
@@ -279,10 +277,11 @@ the query also returns ordinary replies and old polls that happen to carry the
|
|
|
279
277
|
reaction. Take the ones that name a concrete improvement; skip the rest
|
|
280
278
|
without comment.
|
|
281
279
|
|
|
282
|
-
An upvote endorses
|
|
283
|
-
it does not change ownership, reaction, verification, or
|
|
284
|
-
|
|
285
|
-
|
|
280
|
+
An upvote endorses an otherwise out-of-scope **feature request** and skips only
|
|
281
|
+
the clear-bug bar; it does not change ownership, reaction, verification, or
|
|
282
|
+
question-budget rules. Subjective UX proposals remain review-only as above.
|
|
283
|
+
Build the smallest eligible endorsed version, name Sid or Alice, and state
|
|
284
|
+
requested versus actual behavior in the recap. Add `👀` before investigation or
|
|
286
285
|
delegation and read it back. Keep it evidence-limited until Phase 2's four bars
|
|
287
286
|
hold; then use **Shipped**, adding `✅` only if it meets **Fixed**.
|
|
288
287
|
|