yunti-browser-runtime 0.1.2 → 0.2.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.
@@ -2,10 +2,331 @@
2
2
 
3
3
  ## Current Phase
4
4
 
5
- Patch release `yunti-browser-runtime@0.1.2` is complete. The local loopback
6
- bridge no longer requires a token by default, the extension popup no longer
7
- shows token as a first-run field, and the published package is verified with
8
- `npm run release:verify-published`.
5
+ Patch release `yunti-browser-runtime@0.1.3` is complete. The project is now
6
+ closing the `0.2.0 Best Browser Automation Runtime` npm/unpacked release
7
+ candidate, documented in `docs/NEXT_MAJOR_PLAN.md`.
8
+
9
+ Current implementation focus: P7.1 `0.2.0` npm/unpacked release closure.
10
+ P6.6.1 browser extension distribution readiness, P6.6.2 store-facing
11
+ permission/privacy copy, and P6.6.3 pre-store permission strategy decision are
12
+ complete; P6.5 optional local runtime console is complete through real-browser
13
+ validation. P6.6.4 store-candidate permission UX design is deferred to the
14
+ post-0.2 store-candidate track.
15
+
16
+ Latest visible 0.2.0 phase split:
17
+
18
+ - P6.1.1 completed: `yunti_observe_page` schema, tool hints, and bridge
19
+ routing.
20
+ - P6.1.2 completed: content-script DOM observer, compact text tree, field
21
+ state hints, scroll metadata, and minimum redaction.
22
+ - P6.1.3 completed: fresh observe uids feed existing click/hover/fill uid
23
+ actions while preserving the snapshot compatibility path.
24
+ - P6.1.4 completed: real-browser `observe -> click uid -> observe/verify`
25
+ closure validation passed with the local `pytest-playwright` environment
26
+ plus temporary Node Playwright 1.58.0.
27
+ - P6.2.1 completed: additive structured action result contract and main action
28
+ path coverage.
29
+ - P6.2.2 completed: `yunti_select` uid/selector/value/text semantics and
30
+ structured failure diagnostics.
31
+ - P6.2.3 completed: `yunti_fill` / `yunti_fill_form` field-state,
32
+ contenteditable, failure aggregation, and post-fill value retention
33
+ diagnostics.
34
+ - P6.2.4 completed: `yunti_scroll` uid, coordinate, no-movement, partial
35
+ movement, missing-target, and document-fallback diagnostics.
36
+ - P6.2.5 completed: async UI recovery guidance for
37
+ `yunti_wait_for -> yunti_observe_page -> fresh uid`.
38
+ - P6.2.6 completed: `yunti_wait_for` now preserves compatibility fields such
39
+ as `found`, `text`, `selector`, `condition`, `value`, and `waitedMs` while
40
+ adding `action: "wait_for"`, `target`, `ok`, `recoverable`, `nextStepHint`,
41
+ and timeout diagnostics with `code: "WAIT_TIMEOUT"` plus `recoveryHint`.
42
+ - P6.2.7 completed: structured action result coverage is now captured in
43
+ `docs/ACTION_RESULT_COVERAGE.md` and checked by
44
+ `npm run check:action-results`, which is part of `npm run release:check`.
45
+ - P6.3.1 completed: `docs/AGENT_WORKFLOW_CONTRACT.md`,
46
+ `yunti_get_tool_usage_hints` workflow hints, Tool Guide, and the packaged
47
+ skill now share the same default agent workflow contract and copyable prompt.
48
+ - P6.3.2 completed: Tool Guide, packaged skill, and `yunti_get_tool_usage_hints`
49
+ now expose minimal workflows for click, form fill, scroll-to-find, tab
50
+ switching, and async wait.
51
+ - P6.4.1 completed: strict DOM redaction now covers page title, labels, names,
52
+ visible text, placeholders, value previews, select selected value/text,
53
+ option value/text, scrollable container names, and likely email, phone,
54
+ Luhn-valid payment-card-like, and address-like content while keeping balanced
55
+ credential-like protection as the default.
56
+ - P6.4.2 completed: shared MCP redaction now sanitizes likely Bearer tokens,
57
+ JWTs, private keys, long token-like values, emails, phones, Luhn-valid
58
+ payment-card-like values, and address-like text before learning memory writes
59
+ and console diagnostic caching.
60
+ - P6.4.3 completed: raw CDP and screenshot tools now expose explicit guidance
61
+ for non-default-redaction diagnostics, sanitized-tool preference, scope
62
+ minimization, safe summarization, and CDP cleanup.
63
+ - P6.5.1 completed: optional local runtime console minimum loop. The bridge now
64
+ serves `/console`, `/console/state`, and `/console/cancel-pending`; the CLI
65
+ exposes `yunti-browser-runtime console`; state uses sanitized summaries by
66
+ default and remains protected when bridge auth is enabled.
67
+ - P6.5.2 completed: local console diagnostic polish now includes `HEAD
68
+ /console`, runtime/expected-extension/session-extension version summaries,
69
+ extension version mismatch warnings, visible warning cards, doctor console URL
70
+ output, and stronger no-page recovery guidance.
71
+ - P6.5.3 completed: real-browser console validation now checks `HEAD
72
+ /console`, `/console`, `/console/state`, runtime/extension version alignment,
73
+ connected page state, and absence of no-page or version-mismatch warnings in
74
+ the opt-in Playwright extension smoke.
75
+ - P6.6.1 completed: browser extension distribution readiness audit and public
76
+ doc links.
77
+ - P6.6.2 completed: store-facing permission and privacy copy.
78
+ - P6.6.3 completed: pre-store permission strategy decision.
79
+ - P6.6.4 deferred: store-candidate permission UX design.
80
+ - P7.1 in progress: `0.2.0` npm/unpacked release closure.
81
+
82
+ Latest detailed P6.2 status:
83
+
84
+ - Completed: action result main-path coverage, `yunti_select`
85
+ selector/value + uid/value + uid/text, select uid/selector failure
86
+ diagnostics, contenteditable fill, selector/uid fill failure diagnostics,
87
+ `yunti_fill_form` aggregation diagnostics, uid scroll, and scroll
88
+ no-movement recovery diagnostics.
89
+ - Completed: uid/selector fill diagnostics for non-editable, hidden, disabled,
90
+ or readonly targets while preserving existing successful fill/select/scroll
91
+ behavior and compatibility fields.
92
+ - Completed: uid fill post-value verification for keyboard/contenteditable
93
+ paths. When the value does not remain, `yunti_fill` returns
94
+ `VALUE_NOT_APPLIED` with length-only diagnostics and recovery guidance instead
95
+ of echoing the raw field value.
96
+ - Completed: scroll partial-movement diagnostics. When a scroll moves less than
97
+ requested, results keep `ok: true` and include `partialMovement` with
98
+ requested/actual deltas, affected axes, `edgeHint`, and
99
+ `decision: "observe-before-continuing-scroll"`.
100
+ - Completed: uid scroll missing/stale target diagnostics. When a scroll uid
101
+ cannot be resolved, `yunti_scroll` returns `scrolled: false`,
102
+ `UID_NOT_FOUND` or `UID_COORDINATES_UNAVAILABLE`, and recovery guidance to
103
+ refresh observation before retrying.
104
+ - Completed: coordinate scroll hit/fallback diagnostics. When `x` / `y` is
105
+ provided, `yunti_scroll` can report `coordinateTarget`,
106
+ `scrollContainerFound`, and `coordinateScrollFallback: "document"` so agents
107
+ can detect document fallback instead of assuming a nested panel moved.
108
+ - Completed: coordinate scroll document fallback recovery hints. Successful
109
+ document-fallback scrolls keep `ok: true` but can include
110
+ `coordinateFallbackHint` and a clearer `nextStepHint` pointing agents back to
111
+ `yunti_observe_page` and fresh `scrollableContainers[]` uids.
112
+ - Completed: wait-observe recovery guidance for async UI transitions. Tool
113
+ usage hints, Tool Guide, and the packaged skill now tell agents to use
114
+ `yunti_wait_for`, then `yunti_observe_page`, then fresh uids for async
115
+ fill/select/scroll recovery instead of reusing old targets.
116
+ - Completed: structured `yunti_wait_for` results. Successful waits now include
117
+ `action: "wait_for"`, `target`, `ok: true`, `recoverable: false`, and
118
+ `nextStepHint`; timeout waits return `found: false`, `ok: false`,
119
+ `recoverable: true`, `code: "WAIT_TIMEOUT"`, `recoveryHint`, and
120
+ `nextStepHint`.
121
+ - Latest P6.2.6 validation: `git diff --check` passed; token residue grep
122
+ returned no matches; `node --test tests/tool-handlers.test.js` passed 42
123
+ tests; `node --test tests/bridge.test.js` passed 66 tests; `YUNTI_E2E=1 npm
124
+ run test:e2e` skipped because Playwright/Chromium is not installed in the
125
+ current environment; `npm run release:check` passed with 116 node:test cases
126
+ total, 115 passing and 1 default real-browser smoke skipped, plus npm package
127
+ and extension zip content checks.
128
+ - Completed: `yunti_observe_page` field-state hints, select selected-option
129
+ hints, select `options[]` summaries, and structured disabled-option
130
+ diagnostics for `yunti_select`.
131
+ - Completed: P6.2.7 coverage audit gate. `docs/ACTION_RESULT_COVERAGE.md`
132
+ now records the 11 core action surfaces and their success paths, failure
133
+ diagnostics, preserved compatibility fields, and remaining real-browser
134
+ validation notes. `scripts/check-action-result-coverage.js` validates the
135
+ matrix and is exposed as `npm run check:action-results`.
136
+ - Latest P6.2.7 validation: `npm run check:action-results` passed with 11
137
+ coverage rows; `npm run check` passed; `git diff --check` passed; token
138
+ residue grep returned no matches; `YUNTI_E2E=1 npm run test:e2e` skipped
139
+ because Playwright/Chromium is not installed in the current environment;
140
+ `npm run release:check` passed with 116 node:test cases total, 115 passing
141
+ and 1 default real-browser smoke skipped, plus npm package contents
142
+ validation with 44 files and extension zip contents validation with 13 files.
143
+ - Completed: P6.3.1 agent workflow contract. `docs/AGENT_WORKFLOW_CONTRACT.md`
144
+ records the default browser operation loop, recovery rules, confirmation
145
+ boundary, copyable prompt, and non-goals. `yunti_get_tool_usage_hints` now
146
+ accepts `topic: "workflow"` and returns `defaultPageOperation`,
147
+ `confirmationBoundary`, and `copyableAgentPrompt`. Tool Guide and packaged
148
+ skill now include the same default page operation contract.
149
+ - Latest P6.3.1 validation: `node --test tests/bridge.test.js` passed 67
150
+ tests; `git diff --check` passed; token residue grep returned no matches;
151
+ `YUNTI_E2E=1 npm run test:e2e` skipped because Playwright/Chromium is not
152
+ installed in the current environment; `npm run release:check` passed with
153
+ 117 node:test cases total, 116 passing and 1 default real-browser smoke
154
+ skipped, plus npm package contents validation with 45 files and extension zip
155
+ contents validation with 13 files.
156
+ - Next: implement P6.3.2 minimal use cases in Tool Guide and skill, or close
157
+ P6.1.4 first if Playwright/Chromium is available for real-browser closure.
158
+ - Completed: P6.3.2 minimal use cases. Tool Guide and packaged skill now cover
159
+ Click, Fill Form, Scroll To Find, Switch Tab, and Wait For Async Result.
160
+ `yunti_get_tool_usage_hints` now returns matching `minimalUseCases` under
161
+ the `workflow` topic, and bridge tests lock the five keys plus critical
162
+ guidance such as fresh observation, field state, `scrollableContainers[]`,
163
+ `Target.activateTarget`, and `WAIT_TIMEOUT`.
164
+ - Latest P6.3.2 validation: `node --test tests/bridge.test.js` passed 68
165
+ tests; `git diff --check` passed; token residue grep returned no matches;
166
+ `YUNTI_E2E=1 npm run test:e2e` skipped because Playwright/Chromium is not
167
+ installed in the current environment; `npm run release:check` passed with
168
+ 118 node:test cases total, 117 passing and 1 default real-browser smoke
169
+ skipped, plus npm package contents validation with 45 files and extension zip
170
+ contents validation with 13 files.
171
+ - Completed: P6.4.1 DOM redaction policy deepening. `strict` mode now redacts
172
+ PII-like text surfaces in `yunti_observe_page`, including page title, labels,
173
+ names, visible text, placeholders, value previews, select selected value/text,
174
+ option value/text, scrollable container names, email, phone, Luhn-valid
175
+ payment-card-like values, and address-like text. `balanced` remains the
176
+ default credential-like protection mode; `off` remains explicit local
177
+ debugging only.
178
+ - Latest P6.4.1 validation: `node --check extension/dom-observer.js` passed;
179
+ `node --test tests/dom-observer.test.js` passed 6 tests covering strict PII
180
+ categories, select option text redaction, page title redaction, and balanced
181
+ ordinary business text behavior; `node --test tests/bridge.test.js` passed 68
182
+ tests; `git diff --check` passed; token residue grep returned no matches;
183
+ `YUNTI_E2E=1 npm run test:e2e` skipped because Playwright/Chromium is not
184
+ installed in the current environment; `npm run release:check` passed with
185
+ 119 node:test cases total, 118 passing and 1 default real-browser smoke
186
+ skipped, plus npm package contents validation with 45 files and extension zip
187
+ contents validation with 13 files.
188
+ - Completed: P6.4.2 learning memory / diagnostic artifacts secret-boundary
189
+ tightening. `mcp/redaction.js` now provides shared likely-sensitive text
190
+ sanitization for Bearer tokens, JWTs, private keys, long token-like values,
191
+ emails, phones, Luhn-valid payment-card-like values, and address-like text.
192
+ `yunti_remember_learning` sanitizes title, detail, tags, and source before
193
+ disk writes. Console diagnostics sanitize text, stackTrace, and args before
194
+ caching. Raw CDP events intentionally remain raw low-level diagnostics and
195
+ are documented as an explicit exception to clear after debugging.
196
+ - Latest P6.4.2 validation: `node --check mcp/redaction.js`,
197
+ `node --check mcp/memory.js`, and `node --check mcp/bridge-hub.js` passed;
198
+ `node --test tests/bridge.test.js` passed 70 tests, including new memory and
199
+ console redaction coverage; `git diff --check` passed; token residue grep
200
+ returned no matches; `npm run check` passed; `npm test` passed with 121
201
+ node:test cases total, 120 passing and 1 default real-browser smoke skipped;
202
+ `YUNTI_E2E=1 npm run test:e2e` skipped because Playwright/Chromium is not
203
+ installed in the current environment; `npm run release:check` passed, plus npm
204
+ package contents validation with 45 files and extension zip contents validation
205
+ with 13 files.
206
+ - Completed: P6.4.3 raw CDP / screenshot non-redaction diagnostic guidance and
207
+ cleanup boundaries. Tool descriptions, `yunti_get_tool_usage_hints`, Tool
208
+ Guide, packaged skill, and Security docs now tell agents to prefer sanitized
209
+ diagnostics, use raw CDP only for low-level debugging, filter by `method` and
210
+ `limit`, clear with `yunti_clear_cdp_events`, treat screenshots as real
211
+ visible pixels outside DOM redaction, prefer viewport screenshots when enough,
212
+ and summarize safe findings instead of storing raw payloads or images.
213
+ - Latest P6.4.3 validation: `node --check mcp/tools.js` passed;
214
+ `node --test tests/bridge.test.js` passed 71 tests, including new raw CDP and
215
+ screenshot safety-boundary usage hints coverage; `git diff --check` passed;
216
+ token residue grep returned no matches; `npm run check` passed; `npm test`
217
+ passed with 122 node:test cases total, 121 passing and 1 default real-browser
218
+ smoke skipped; `YUNTI_E2E=1 npm run test:e2e` skipped because
219
+ Playwright/Chromium is not installed in the current environment;
220
+ `npm run release:check` passed, plus npm package contents validation with 45
221
+ files and extension zip contents validation with 13 files.
222
+ - Completed: P6.1.4 real-browser closure validation. The local
223
+ `/opt/miniconda3/envs/pytest-playwright` environment provides Python
224
+ Playwright 1.58.0 and existing browser caches; the Node E2E still needs the
225
+ Node `playwright` package, so validation used temporary `npm install --no-save
226
+ --package-lock=false playwright@1.58.0` with
227
+ `PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1` and without changing package metadata.
228
+ `YUNTI_E2E=1 npm run test:e2e` then passed the real browser extension bridge
229
+ smoke with `observe -> click uid -> verify`. Final validation for this status
230
+ update: `git diff --check` passed; token residue grep returned no matches;
231
+ `npm run check` passed; `npm test` passed with 122 node:test cases total,
232
+ 121 passing and 1 default real-browser smoke skipped; `YUNTI_E2E=1 npm run
233
+ test:e2e` passed with 1 real-browser smoke test; `npm run release:check`
234
+ passed, plus npm package contents validation with 45 files and extension zip
235
+ contents validation with 13 files.
236
+ - Completed: P6.5.1 optional local runtime console minimum loop. `mcp/http-server.js`
237
+ now serves an optional `/console` page, protected `/console/state` JSON, and
238
+ protected `/console/cancel-pending` action. `BridgeHub` tracks sanitized
239
+ recent activity, summarizes connected sessions without raw secrets, exposes
240
+ pending/queued request counts, and can cancel runtime requests that are still
241
+ queued or waiting for browser results. `bin/yunti-browser-runtime.js` and
242
+ `package.json` now expose a `console` command that starts the bridge and
243
+ prints the local console URL.
244
+ - Latest P6.5.1 validation: `git diff --check` passed; token residue grep
245
+ returned no matches; `npm run check` passed; `npm test` passed with 125
246
+ node:test cases total, 124 passing and 1 default real-browser smoke skipped;
247
+ `YUNTI_E2E=1 npm run test:e2e` passed with 1 real-browser smoke test;
248
+ `npm run release:check` passed, including 11 action-result coverage rows, npm
249
+ package contents validation with 45 files, and extension zip contents
250
+ validation with 13 files.
251
+ - Completed: P6.5.2 local console diagnostic polish. Extension sessions now
252
+ report `client.extensionVersion`; console state reports runtime and expected
253
+ extension versions, session extension versions, and warning entries for no
254
+ connected pages, unknown extension version, or mismatched extension/runtime
255
+ versions. The `/console` route now supports `HEAD` for simple probes, the
256
+ console UI renders warning cards and version metadata, and `doctor` JSON plus
257
+ human summary now include the optional console URL.
258
+ - Latest P6.5.2 validation: `git diff --check` passed; token residue grep
259
+ returned no matches; `npm run check` passed; `npm test` passed with 126
260
+ node:test cases total, 125 passing and 1 default real-browser smoke skipped;
261
+ `YUNTI_E2E=1 npm run test:e2e` passed with 1 real-browser smoke test;
262
+ `npm run release:check` passed, including 11 action-result coverage rows, npm
263
+ package contents validation with 45 files, and extension zip contents
264
+ validation with 13 files.
265
+ - Completed: P6.5.3 real-browser console validation. `tests/e2e.test.js` now
266
+ verifies the optional local console against a real Playwright-loaded
267
+ extension session: `HEAD /console` returns HTML, `/console` renders the page,
268
+ `/console/state` includes runtime and expected extension versions, the
269
+ connected session reports the current extension version, and no
270
+ `NO_CONNECTED_PAGES` or `EXTENSION_VERSION_MISMATCH` warning appears after a
271
+ real page registers.
272
+ - Latest P6.5.3 validation: `git diff --check` passed; token residue grep
273
+ returned no matches; `npm run check` passed; `npm test` passed with 126
274
+ node:test cases total, 125 passing and 1 default real-browser smoke skipped;
275
+ `YUNTI_E2E=1 npm run test:e2e` passed with 1 real-browser smoke test;
276
+ `npm run release:check` passed, including 11 action-result coverage rows, npm
277
+ package contents validation with 45 files, and extension zip contents
278
+ validation with 13 files.
279
+ - Completed: P6.6.1 browser extension distribution readiness. Added
280
+ `docs/EXTENSION_DISTRIBUTION.md` with the current manifest permission audit,
281
+ Chrome Web Store / Edge Add-ons policy references, submission checklist,
282
+ privacy disclosure topics, and permission narrowing options. Linked it from
283
+ README, Security notes, and Roadmap.
284
+ - Latest P6.6.1 validation: `git diff --check` passed; token residue grep
285
+ returned no matches; `npm run check` passed; `npm test` passed with 126
286
+ node:test cases total, 125 passing and 1 default real-browser smoke skipped;
287
+ `YUNTI_E2E=1 npm run test:e2e` passed with 1 real-browser smoke in the local
288
+ `pytest-playwright` environment; `npm run release:check` passed, including
289
+ public documentation residue checks, public Markdown link checks for 15 files,
290
+ 11 action-result coverage rows, npm package contents validation with 46
291
+ files, and extension zip contents validation with 13 files.
292
+ - Completed: P6.6.2 store-facing permission and privacy copy. Added
293
+ `docs/EXTENSION_STORE_COPY.md` with draft short and long descriptions,
294
+ permission rationale, privacy-policy language, store data disclosure guidance,
295
+ reviewer notes, local bridge dependency notes, and final review checklist.
296
+ - Latest P6.6.2 validation: `git diff --check` passed; token residue grep
297
+ returned no matches; `npm run check` passed; `npm test` passed with 126
298
+ node:test cases total, 125 passing and 1 default real-browser smoke skipped;
299
+ `YUNTI_E2E=1 npm run test:e2e` passed with 1 real-browser smoke in the local
300
+ `pytest-playwright` environment; `npm run release:check` passed, including
301
+ public documentation residue checks, public Markdown link checks for 16 files,
302
+ 11 action-result coverage rows, npm package contents validation with 47
303
+ files, and extension zip contents validation with 13 files.
304
+ - Completed: P6.6.3 pre-store permission strategy decision. Added
305
+ `docs/EXTENSION_PERMISSION_STRATEGY.md`, keeping the current npm/unpacked
306
+ developer path unchanged, deciding that the current broad-permission manifest
307
+ should not be submitted to browser stores unchanged by default, and defining a
308
+ future store-candidate track for optional host access and optional network
309
+ diagnostics.
310
+ - Latest P6.6.3 validation: `git diff --check` passed; token residue grep
311
+ returned no matches; `npm run check` passed; `npm test` passed with 126
312
+ node:test cases total, 125 passing and 1 default real-browser smoke skipped;
313
+ `YUNTI_E2E=1 npm run test:e2e` passed with 1 real-browser smoke in the local
314
+ `pytest-playwright` environment; `npm run release:check` passed, including
315
+ public documentation residue checks, public Markdown link checks for 17 files,
316
+ 11 action-result coverage rows, npm package contents validation with 48
317
+ files, and extension zip contents validation with 13 files.
318
+ - Next: complete P7.1 `0.2.0` npm/unpacked release closure. Version has moved
319
+ to `0.2.0`; run metadata, release, real-browser E2E, and dry-run gates before
320
+ asking for confirmation to publish. P6.6.4 store-candidate permission UX is
321
+ intentionally deferred and should not block this npm/unpacked release.
322
+ - P7.1 current validation: package and extension versions are both `0.2.0`;
323
+ `git diff --check`, token residue grep, `npm run release:check`,
324
+ `YUNTI_E2E=1 npm run test:e2e`, and direct
325
+ `npm publish --dry-run --registry=https://registry.npmjs.org/` passed.
326
+ `npm run check:metadata` passed once for the public GitHub/npm metadata, then
327
+ later failed because this environment timed out connecting to GitHub; scripted
328
+ `release:prepublish` and `release:dry-run` need to be rerun when GitHub is
329
+ reachable again.
9
330
 
10
331
  ## Current State
11
332
 
@@ -43,9 +364,11 @@ shows token as a first-run field, and the published package is verified with
43
364
  - `npm run release:dry-run` and `npm run release:publish` pin the official npm
44
365
  registry at `https://registry.npmjs.org/`, avoiding accidental publication to
45
366
  a locally configured mirror registry.
46
- - `yunti-browser-runtime@0.1.2` is published on the official npm registry.
47
- - Extension popup keeps Bridge Token under optional advanced settings; default
48
- local installs do not require saving popup settings.
367
+ - `yunti-browser-runtime@0.1.3` is published on the official npm registry.
368
+ - Current branch package and extension versions are being prepared as
369
+ `0.2.0` release candidate.
370
+ - Extension popup is a zero-config status panel by default; Bridge URL, page
371
+ matching, and optional Bridge Token stay under advanced settings.
49
372
  - `npm run test:e2e` provides an opt-in real-browser Playwright smoke test for
50
373
  extension loading, page registration, MCP target listing, snapshot, click/fill,
51
374
  and CDP `Runtime.evaluate`.
@@ -89,6 +412,635 @@ shows token as a first-run field, and the published package is verified with
89
412
  - Extension registers all `http` and `https` pages by default.
90
413
  - Product-specific fixed conversation, workspace, and side-panel entry points
91
414
  have been removed from the standalone extension.
415
+ - The next major execution plan is captured in `docs/NEXT_MAJOR_PLAN.md`.
416
+ - P6.1 observe/action compatibility has started: `yunti_observe_page` now has an
417
+ MCP tool schema, observe-first usage hints, bridge routing contract tests, a
418
+ content-script DOM observer, focused DOM observer tests, and an opt-in
419
+ real-browser smoke assertion. Fresh observe uids now feed the existing
420
+ click/hover/fill uid resolver while preserving the `yunti_take_snapshot`
421
+ compatibility path.
422
+ - Latest P6.1 observe/action validation: `git diff --check` passed,
423
+ `npm run release:check` passed with 69 passing node:test cases and 1 skipped
424
+ real-browser smoke by default, and `YUNTI_E2E=1 npm run test:e2e` skipped
425
+ because Playwright/Chromium is not installed in the current environment.
426
+ - Deterministic observe fixtures now cover hidden/offscreen target handling and
427
+ redaction edge modes in addition to fresh uid, text tree, scroll metadata,
428
+ balanced redaction, and stale uid replacement.
429
+ - `docs/EXECUTION_PLAN.md` now includes a P6.1 real-browser closure runbook for
430
+ the remaining `observe -> click uid -> observe/verify` validation gap.
431
+ - P6.2 preparation has started with tool usage action recovery guidance for
432
+ click/hover/fill, without changing the runtime action implementation.
433
+ - Latest P6.2 preparation validation: `git diff --check` passed,
434
+ `node --test tests/bridge.test.js` passed 63 tests, `npm run release:check`
435
+ passed with 70 passing node:test cases and 1 skipped real-browser smoke by
436
+ default, `YUNTI_E2E=1 npm run test:e2e` skipped because Playwright/Chromium is
437
+ not installed in the current environment, and the token residue grep returned
438
+ no matches.
439
+ - P6.2 action result contract guidance now distinguishes current
440
+ compatibility-shaped action returns from the additive target contract for
441
+ `action`, `target`, `ok`, `code`, `recoverable`, `nextStepHint`, and
442
+ before/after summaries.
443
+ - Latest P6.2 action result contract validation: `git diff --check` passed,
444
+ `node --test tests/bridge.test.js` passed 64 tests, `npm run release:check`
445
+ passed with 71 passing node:test cases and 1 skipped real-browser smoke by
446
+ default, `YUNTI_E2E=1 npm run test:e2e` skipped because Playwright/Chromium is
447
+ not installed in the current environment, and the token residue grep returned
448
+ no matches.
449
+ - Dispatcher-level action result shape tests now lock the current compatible
450
+ uid click, uid hover, uid fill, and content-script scroll passthrough result
451
+ fields before P6.2 adds structured action result fields.
452
+ - Latest P6.2 action result shape validation: `git diff --check` passed,
453
+ `node --test tests/tool-handlers.test.js` passed 4 tests,
454
+ `npm run release:check` passed with 72 passing node:test cases and 1 skipped
455
+ real-browser smoke by default, `YUNTI_E2E=1 npm run test:e2e` skipped because
456
+ Playwright/Chromium is not installed in the current environment, and the token
457
+ residue grep returned no matches.
458
+ - uid-based `yunti_click` now returns additive structured action result fields
459
+ (`action`, `target`, `ok`, `recoverable`, and `nextStepHint`) while preserving
460
+ the existing `clicked`, `uid`, `x/y`, and `browserSessionId` compatibility
461
+ fields.
462
+ - Latest P6.2 uid-click structured result validation: `git diff --check`
463
+ passed, `node --test tests/tool-handlers.test.js` passed 4 tests,
464
+ `npm run release:check` passed with 72 passing node:test cases and 1 skipped
465
+ real-browser smoke by default, `YUNTI_E2E=1 npm run test:e2e` skipped because
466
+ Playwright/Chromium is not installed in the current environment, and the token
467
+ residue grep returned no matches.
468
+ - uid-based `yunti_hover` now returns additive structured action result fields
469
+ (`action`, `target`, `ok`, `recoverable`, and `nextStepHint`) while preserving
470
+ the existing `hovered`, `uid`, `x/y`, and `browserSessionId` compatibility
471
+ fields.
472
+ - Latest P6.2 uid-hover structured result validation: `git diff --check`
473
+ passed, `node --test tests/tool-handlers.test.js` passed 4 tests,
474
+ `npm run release:check` passed with 72 passing node:test cases and 1 skipped
475
+ real-browser smoke by default, `YUNTI_E2E=1 npm run test:e2e` skipped because
476
+ Playwright/Chromium is not installed in the current environment, and the token
477
+ residue grep returned no matches.
478
+ - uid-based `yunti_fill` keyboard path now returns additive structured action
479
+ result fields (`action`, `target`, `ok`, `recoverable`, and `nextStepHint`)
480
+ while preserving the existing `filled`, `uid`, `method`, `value`, and
481
+ `browserSessionId` compatibility fields. Select/contenteditable/scroll
482
+ semantics are intentionally unchanged in this slice.
483
+ - Latest P6.2 uid-fill keyboard structured result validation: `git diff
484
+ --check` passed, `node --test tests/tool-handlers.test.js` passed 4 tests,
485
+ `npm run release:check` passed with 72 passing node:test cases and 1 skipped
486
+ real-browser smoke by default, npm package contents validation passed with 42
487
+ files, extension zip contents validation passed with 13 files,
488
+ `YUNTI_E2E=1 npm run test:e2e` skipped because Playwright/Chromium is not
489
+ installed in the current environment, and the token residue grep returned no
490
+ matches.
491
+ - uid-based `yunti_fill` select path now returns additive structured action
492
+ result fields (`action`, `target`, `ok`, `recoverable`, and `nextStepHint`)
493
+ while preserving the existing `filled`, `uid`, `method`, `value`, and
494
+ `browserSessionId` compatibility fields. Select value dispatch semantics are
495
+ intentionally unchanged in this slice.
496
+ - Latest P6.2 uid-fill select structured result targeted validation: `git diff
497
+ --check` passed and `node --test tests/tool-handlers.test.js` passed 5 tests.
498
+ - Latest P6.2 uid-fill select structured result full validation: `git diff
499
+ --check` passed, `npm run release:check` passed with 73 passing node:test
500
+ cases and 1 skipped real-browser smoke by default, npm package contents
501
+ validation passed with 42 files, extension zip contents validation passed with
502
+ 13 files, `YUNTI_E2E=1 npm run test:e2e` skipped because Playwright/Chromium
503
+ is not installed in the current environment, and the token residue grep
504
+ returned no matches.
505
+ - Coordinate fallback `yunti_click` now returns additive structured action
506
+ result fields (`action`, `target`, `ok`, `recoverable`, and `nextStepHint`)
507
+ while preserving the existing `clicked`, `x/y`, `method`, and
508
+ `browserSessionId` compatibility fields. Coordinate click dispatch semantics
509
+ are intentionally unchanged in this slice.
510
+ - Latest P6.2 coordinate-click structured result targeted validation: `git diff
511
+ --check` passed and `node --test tests/tool-handlers.test.js` passed 6 tests.
512
+ - Latest P6.2 coordinate-click structured result full validation: `git diff
513
+ --check` passed, `npm run release:check` passed with 74 passing node:test
514
+ cases and 1 skipped real-browser smoke by default, npm package contents
515
+ validation passed with 42 files, extension zip contents validation passed with
516
+ 13 files, `YUNTI_E2E=1 npm run test:e2e` skipped because Playwright/Chromium
517
+ is not installed in the current environment, and the token residue grep
518
+ returned no matches.
519
+ - Coordinate fallback `yunti_hover` now returns additive structured action
520
+ result fields (`action`, `target`, `ok`, `recoverable`, and `nextStepHint`)
521
+ while preserving the existing `hovered`, `x/y`, `method`, and
522
+ `browserSessionId` compatibility fields. Coordinate hover dispatch semantics
523
+ are intentionally unchanged in this slice.
524
+ - Latest P6.2 coordinate-hover structured result targeted validation: `git diff
525
+ --check` passed and `node --test tests/tool-handlers.test.js` passed 7 tests.
526
+ - Latest P6.2 coordinate-hover structured result full validation: `git diff
527
+ --check` passed, `npm run release:check` passed with 75 passing node:test
528
+ cases and 1 skipped real-browser smoke by default, npm package contents
529
+ validation passed with 42 files, extension zip contents validation passed with
530
+ 13 files, `YUNTI_E2E=1 npm run test:e2e` skipped because Playwright/Chromium
531
+ is not installed in the current environment, and the token residue grep
532
+ returned no matches.
533
+ - Selector fallback `yunti_hover` now returns additive structured action result
534
+ fields (`action`, `target`, `ok`, `recoverable`, and `nextStepHint`) while
535
+ preserving the existing `hovered`, `selector`, `x/y`, `method`, and
536
+ `browserSessionId` compatibility fields. Selector hover dispatch semantics
537
+ are intentionally unchanged in this slice.
538
+ - Latest P6.2 selector-hover structured result targeted validation: `git diff
539
+ --check` passed and `node --test tests/tool-handlers.test.js` passed 8 tests.
540
+ - Latest P6.2 selector-hover structured result full validation: `git diff
541
+ --check` passed, `npm run release:check` passed with 76 passing node:test
542
+ cases and 1 skipped real-browser smoke by default, npm package contents
543
+ validation passed with 42 files, extension zip contents validation passed with
544
+ 13 files, `YUNTI_E2E=1 npm run test:e2e` skipped because Playwright/Chromium
545
+ is not installed in the current environment, and the token residue grep
546
+ returned no matches.
547
+ - Selector fallback `yunti_click` now returns additive structured action result
548
+ fields (`action`, `target`, `ok`, `recoverable`, and `nextStepHint`) around
549
+ the existing content-script passthrough result while preserving `clicked`,
550
+ `element`, `selector`, `method`, and `browserSessionId` compatibility fields.
551
+ Selector click dispatch semantics are intentionally unchanged in this slice.
552
+ - Latest P6.2 selector-click structured result targeted validation: `git diff
553
+ --check` passed and `node --test tests/tool-handlers.test.js` passed 9 tests.
554
+ - Latest P6.2 selector-click structured result full validation: `git diff
555
+ --check` passed, `npm run release:check` passed with 77 passing node:test
556
+ cases and 1 skipped real-browser smoke by default, npm package contents
557
+ validation passed with 42 files, extension zip contents validation passed with
558
+ 13 files, `YUNTI_E2E=1 npm run test:e2e` skipped because Playwright/Chromium
559
+ is not installed in the current environment, and the token residue grep
560
+ returned no matches.
561
+ - `yunti_scroll` now returns additive structured action result fields
562
+ (`action`, `ok`, `recoverable`, `nextStepHint`, and `browserSessionId`) around
563
+ the existing content-script passthrough result while preserving `scrolled`,
564
+ `deltaX`, `deltaY`, `target`, `before`, and `after` compatibility fields.
565
+ Document/container scroll selection and `scrollBy` dispatch semantics are
566
+ intentionally unchanged in this slice.
567
+ - Latest P6.2 scroll structured result targeted validation: `git diff --check`
568
+ passed and `node --test tests/tool-handlers.test.js` passed 9 tests.
569
+ - Latest P6.2 scroll structured result full validation: `git diff --check`
570
+ passed, `npm run release:check` passed with 77 passing node:test cases and 1
571
+ skipped real-browser smoke by default, npm package contents validation passed
572
+ with 42 files, extension zip contents validation passed with 13 files,
573
+ `YUNTI_E2E=1 npm run test:e2e` skipped because Playwright/Chromium is not
574
+ installed in the current environment, and the token residue grep returned no
575
+ matches.
576
+ - Selector fallback `yunti_fill` now returns additive structured action result
577
+ fields (`action`, `target`, `ok`, `recoverable`, `nextStepHint`, `selector`,
578
+ `method`, and `browserSessionId`) around the existing content-script
579
+ passthrough result while preserving `filled`, `element`, and `valueLength`
580
+ compatibility fields. Selector fill dispatch semantics are intentionally
581
+ unchanged in this slice.
582
+ - Latest P6.2 selector-fill structured result targeted validation: `git diff
583
+ --check` passed and `node --test tests/tool-handlers.test.js` passed 10 tests.
584
+ - Latest P6.2 selector-fill structured result full validation: `git diff
585
+ --check` passed, `npm run release:check` passed with 78 passing node:test
586
+ cases and 1 skipped real-browser smoke by default, npm package contents
587
+ validation passed with 42 files, extension zip contents validation passed with
588
+ 13 files, `YUNTI_E2E=1 npm run test:e2e` skipped because Playwright/Chromium
589
+ is not installed in the current environment, and the token residue grep
590
+ returned no matches.
591
+ - `yunti_type_text` now returns additive structured action result fields
592
+ (`action`, `target`, `ok`, `recoverable`, `nextStepHint`, and
593
+ `browserSessionId`) for both uid-based CDP keyboard typing and content-script
594
+ passthrough typing, while preserving uid path compatibility fields (`typed`,
595
+ `uid`, `text`, and `method`) and content-script compatibility fields
596
+ (`typed`, `element`, `textLength`, and `mode`). Type dispatch semantics are
597
+ intentionally unchanged in this slice.
598
+ - Latest P6.2 type-text structured result targeted validation: `git diff
599
+ --check` passed and `node --test tests/tool-handlers.test.js` passed 12 tests.
600
+ - Latest P6.2 type-text structured result full validation: `git diff --check`
601
+ passed, `npm run release:check` passed with 80 passing node:test cases and 1
602
+ skipped real-browser smoke by default, npm package contents validation passed
603
+ with 42 files, extension zip contents validation passed with 13 files,
604
+ `YUNTI_E2E=1 npm run test:e2e` skipped because Playwright/Chromium is not
605
+ installed in the current environment, and the token residue grep returned no
606
+ matches.
607
+ - `yunti_press_key` now returns additive structured action result fields
608
+ (`action`, `target`, `ok`, `recoverable`, `nextStepHint`, and
609
+ `browserSessionId`) for both uid-based CDP keyboard dispatch and
610
+ content-script passthrough key press, while preserving uid path compatibility
611
+ fields (`pressed`, `uid`, and `key`) and content-script compatibility fields
612
+ (`pressed`, `key`, `element`, and `valueChanged`). Key dispatch semantics are
613
+ intentionally unchanged in this slice.
614
+ - Latest P6.2 press-key structured result targeted validation: `git diff
615
+ --check` passed and `node --test tests/tool-handlers.test.js` passed 14 tests.
616
+ - Latest P6.2 press-key structured result full validation: `git diff --check`
617
+ passed, `npm run release:check` passed with 82 passing node:test cases and 1
618
+ skipped real-browser smoke by default, npm package contents validation passed
619
+ with 42 files, extension zip contents validation passed with 13 files,
620
+ `YUNTI_E2E=1 npm run test:e2e` skipped because Playwright/Chromium is not
621
+ installed in the current environment, and the token residue grep returned no
622
+ matches.
623
+ - `yunti_upload_file` now returns additive structured action result fields
624
+ (`action`, `target`, `ok`, `recoverable`, `nextStepHint`, and
625
+ `browserSessionId`) for both uid-based and selector-based file input
626
+ resolution, while preserving compatibility fields (`uploaded`, `fileCount`,
627
+ and `filePaths`). File input resolution and `DOM.setFileInputFiles` dispatch
628
+ semantics are intentionally unchanged in this slice.
629
+ - Latest P6.2 upload-file structured result targeted validation: `git diff
630
+ --check` passed and `node --test tests/tool-handlers.test.js` passed 16 tests.
631
+ - Latest P6.2 upload-file structured result full validation: `git diff
632
+ --check` passed, `npm run release:check` passed with 84 passing node:test
633
+ cases and 1 skipped real-browser smoke by default, npm package contents
634
+ validation passed with 42 files, extension zip contents validation passed with
635
+ 13 files, `YUNTI_E2E=1 npm run test:e2e` skipped because Playwright/Chromium
636
+ is not installed in the current environment, and the token residue grep
637
+ returned no matches.
638
+ - `yunti_drag` now returns additive structured action result fields (`action`,
639
+ `target`, `ok`, `recoverable`, `nextStepHint`, and `browserSessionId`) while
640
+ preserving compatibility fields (`dragged`, `from`, `to`, and `steps`). CDP
641
+ mouse event dispatch semantics are intentionally unchanged in this slice.
642
+ - Latest P6.2 drag structured result targeted validation: `git diff --check`
643
+ passed and `node --test tests/tool-handlers.test.js` passed 17 tests.
644
+ - Latest P6.2 drag structured result full validation: `git diff --check`
645
+ passed, `npm run release:check` passed with 85 passing node:test cases and 1
646
+ skipped real-browser smoke by default, npm package contents validation passed
647
+ with 42 files, extension zip contents validation passed with 13 files,
648
+ `YUNTI_E2E=1 npm run test:e2e` skipped because Playwright/Chromium is not
649
+ installed in the current environment, and the token residue grep returned no
650
+ matches.
651
+ - P6.2 action result coverage has been audited after the drag slice. Structured
652
+ action result fields now cover the main single-action paths for click, hover,
653
+ fill, scroll, type text, press key, upload, and drag while preserving existing
654
+ compatibility fields. Remaining action result gaps are standalone
655
+ `yunti_select` content-script passthrough and aggregate `yunti_fill_form`.
656
+ These must be completed before moving into deeper fill/select/scroll
657
+ semantics.
658
+ - Latest P6.2 action result coverage checklist validation: `git diff --check`
659
+ passed, `npm run release:check` passed with 85 passing node:test cases and 1
660
+ skipped real-browser smoke by default, npm package contents validation passed
661
+ with 42 files, extension zip contents validation passed with 13 files. This
662
+ slice only updates docs and skill guidance, so `YUNTI_E2E=1 npm run test:e2e`
663
+ was not rerun; the token residue grep returned no matches.
664
+ - Standalone `yunti_select` now returns additive structured action result
665
+ fields (`action`, `target`, `ok`, `recoverable`, `nextStepHint`, and
666
+ `browserSessionId`) around the existing content-script passthrough result
667
+ while preserving compatibility fields (`selected`, `element`, and `value`).
668
+ Select value assignment and input/change event dispatch semantics are
669
+ intentionally unchanged in this slice.
670
+ - Latest P6.2 select structured result targeted validation: `git diff --check`
671
+ passed and `node --test tests/tool-handlers.test.js` passed 18 tests.
672
+ - Latest P6.2 select structured result full validation: `git diff --check`
673
+ passed; `npm run release:check` passed with 87 node:test cases total, 86
674
+ passed, and 1 real-browser smoke skipped by default; npm package contents
675
+ validation passed with 42 files; extension zip contents validation passed
676
+ with 13 files; `YUNTI_E2E=1 npm run test:e2e` was executed but skipped
677
+ because Playwright/Chromium is not installed locally; the token residue grep
678
+ returned no matches.
679
+ - Aggregate `yunti_fill_form` now returns additive structured action result
680
+ fields (`action`, `target`, `ok`, `recoverable`, `nextStepHint`, and
681
+ `browserSessionId`) around the existing aggregate summary while preserving
682
+ compatibility fields (`filled`, `failed`, and `results`). Per-field
683
+ `fillByUid` and content-script selector fill semantics are intentionally
684
+ unchanged in this slice.
685
+ - Latest P6.2 fill_form structured result targeted validation: `git diff --check`
686
+ passed and `node --test tests/tool-handlers.test.js` passed 19 tests.
687
+ - Latest P6.2 fill_form structured result full validation: `git diff --check`
688
+ passed; `npm run release:check` passed with 88 node:test cases total, 87
689
+ passed, and 1 real-browser smoke skipped by default; npm package contents
690
+ validation passed with 42 files; extension zip contents validation passed
691
+ with 13 files; `YUNTI_E2E=1 npm run test:e2e` was executed but skipped
692
+ because Playwright/Chromium is not installed locally; the token residue grep
693
+ returned no matches.
694
+ - `yunti_select` now has a P6.2 uid/visible text planning contract in schema
695
+ and usage hints. The current runtime remains selector/value compatible; uid
696
+ and visible text selection semantics are intentionally left for the next
697
+ runtime slice.
698
+ - Latest P6.2 select uid/text contract targeted validation: `git diff --check`
699
+ passed and `node --test tests/bridge.test.js` passed.
700
+ - Latest P6.2 select uid/text contract full validation: `git diff --check`
701
+ passed; `npm run release:check` passed with 89 node:test cases total, 88
702
+ passed, and 1 real-browser smoke skipped by default; npm package contents
703
+ validation passed with 42 files; extension zip contents validation passed
704
+ with 13 files. This slice only updates schema, usage hints, docs, and skill
705
+ guidance, so `YUNTI_E2E=1 npm run test:e2e` was not rerun; the token residue
706
+ grep returned no matches.
707
+ - `yunti_select` now supports the `uid + value` runtime path while preserving
708
+ selector/value compatibility. The uid path reuses the latest observe/snapshot
709
+ uid map, matches select options by option value, dispatches change/input
710
+ events, and returns structured action result fields. Visible option text
711
+ selection remains intentionally deferred to the next runtime slice.
712
+ - Latest P6.2 select uid/value runtime targeted validation: `git diff --check`
713
+ passed and `node --test tests/tool-handlers.test.js tests/bridge.test.js`
714
+ passed 85 tests.
715
+ - Latest P6.2 select uid/value runtime full validation: `git diff --check`
716
+ passed; `npm run release:check` passed with 90 node:test cases total, 89
717
+ passed, and 1 real-browser smoke skipped by default; npm package contents
718
+ validation passed with 42 files; extension zip contents validation passed
719
+ with 13 files; `YUNTI_E2E=1 npm run test:e2e` was executed but skipped
720
+ because Playwright/Chromium is not installed locally; the token residue grep
721
+ returned no matches.
722
+ - `yunti_select` now supports the `uid + visible text` runtime path while
723
+ preserving selector/value and uid/value compatibility. The text path reuses
724
+ the latest observe/snapshot uid map, matches select options by visible label,
725
+ dispatches change/input events, and returns structured action result fields.
726
+ - Latest P6.2 select uid/text runtime targeted validation: `git diff --check`
727
+ passed and `node --test tests/tool-handlers.test.js tests/bridge.test.js`
728
+ passed 86 tests.
729
+ - Latest P6.2 select uid/text runtime full validation: `git diff --check`
730
+ passed; `npm run release:check` passed with 91 node:test cases total, 90
731
+ passed, and 1 real-browser smoke skipped by default; npm package contents
732
+ validation passed with 42 files; extension zip contents validation passed
733
+ with 13 files; `YUNTI_E2E=1 npm run test:e2e` was executed but skipped
734
+ because Playwright/Chromium is not installed locally; the token residue grep
735
+ returned no matches.
736
+ - `yunti_select` uid failure paths now return structured recovery diagnostics.
737
+ Option misses return `selected: false`, `code: "OPTION_NOT_FOUND"`,
738
+ `matchMode`, `targetOption`, available option values/texts when exposed by
739
+ the page, and `recoveryHint`; non-select uid targets return `code:
740
+ "NOT_SELECT"` plus `recoveryHint.decision` pointing agents toward the actual
741
+ select element or selector/value fallback.
742
+ - Latest P6.2 select uid failure diagnostic targeted validation:
743
+ `node --test tests/tool-handlers.test.js tests/bridge.test.js` passed 93
744
+ tests.
745
+ - Latest P6.2 select uid failure diagnostic full validation: `git diff
746
+ --check` passed; `node --test tests/tool-handlers.test.js tests/bridge.test.js`
747
+ passed 93 tests; `npm run release:check` passed with 98 node:test cases
748
+ total, 97 passed, and 1 real-browser smoke skipped by default; npm package
749
+ contents validation passed with 42 files; extension zip contents validation
750
+ passed with 13 files; `YUNTI_E2E=1 npm run test:e2e` was executed but skipped
751
+ because Playwright/Chromium is not installed locally; the token residue grep
752
+ returned no matches.
753
+ - `yunti_select` selector/value failure paths now return structured recovery
754
+ diagnostics. Value mismatches return `selected: false`, `code:
755
+ "OPTION_NOT_FOUND"`, `actualValue`, `matchMode`, `targetOption`, and
756
+ `recoveryHint`; thrown selector failures return `code:
757
+ "SELECTOR_SELECT_FAILED"` plus `recoveryHint.decision` pointing agents toward
758
+ the actual select element or a fresh uid/value fallback.
759
+ - Latest P6.2 select selector failure diagnostic targeted validation:
760
+ `node --test tests/tool-handlers.test.js tests/bridge.test.js` passed 95
761
+ tests.
762
+ - Latest P6.2 select selector failure diagnostic full validation: `git diff
763
+ --check` passed; `node --test tests/tool-handlers.test.js tests/bridge.test.js`
764
+ passed 95 tests; `npm run release:check` passed with 100 node:test cases
765
+ total, 99 passed, and 1 real-browser smoke skipped by default; npm package
766
+ contents validation passed with 42 files; extension zip contents validation
767
+ passed with 13 files; `YUNTI_E2E=1 npm run test:e2e` was executed but skipped
768
+ because Playwright/Chromium is not installed locally; the token residue grep
769
+ returned no matches.
770
+ - P6.2 action path coverage was re-audited after select uid/text support.
771
+ Structured action result fields now cover the main action surfaces, and
772
+ `yunti_select` has selector/value, uid/value, and uid/text operation paths.
773
+ The next work should move into deeper fill/select/scroll semantics while
774
+ preserving selector/value compatibility, CDP fallback, diagnostics, and
775
+ existing action result fields.
776
+ - Latest P6.2 action path coverage audit validation: `git diff --check`
777
+ passed; `npm run release:check` passed with 91 node:test cases total, 90
778
+ passed, and 1 real-browser smoke skipped by default; npm package contents
779
+ validation passed with 42 files; extension zip contents validation passed
780
+ with 13 files; the token residue grep returned no matches. Real-browser E2E
781
+ was not rerun for this docs-only audit patch.
782
+ - P6.2 deeper fill semantics have started with uid-targeted contenteditable
783
+ result reporting. The runtime keeps the existing CDP keyboard input flow, but
784
+ contenteditable targets now return `method: "contenteditable"` plus
785
+ before/after text length summaries and a verification-oriented next step
786
+ hint. Selector fill and normal keyboard fill compatibility fields are
787
+ unchanged.
788
+ - Latest P6.2 contenteditable fill targeted validation:
789
+ `node --test tests/tool-handlers.test.js` passed 22 tests.
790
+ - Latest P6.2 contenteditable fill full validation: `git diff --check`
791
+ passed; `node --test tests/tool-handlers.test.js tests/bridge.test.js`
792
+ passed 87 tests; `npm run release:check` passed with 92 node:test cases
793
+ total, 91 passed, and 1 real-browser smoke skipped by default; npm package
794
+ contents validation passed with 42 files; extension zip contents validation
795
+ passed with 13 files; `YUNTI_E2E=1 npm run test:e2e` was executed but
796
+ skipped because Playwright/Chromium is not installed locally; the token
797
+ residue grep returned no matches.
798
+ - P6.2 fill failure diagnostics have started. Selector fill thrown failures and
799
+ uid select option misses now return structured `filled: false` diagnostics
800
+ with `ok: false`, `recoverable: true`, `code`, `recoveryHint`, and
801
+ `nextStepHint`, while preserving successful fill compatibility fields and
802
+ dispatch semantics. Uid select option misses include `availableValues` /
803
+ `availableTexts` when the page exposes them.
804
+ - Latest P6.2 fill failure diagnostic targeted validation:
805
+ `node --check extension/tool-handlers.js` passed; `node --test
806
+ tests/tool-handlers.test.js` passed 32 tests.
807
+ - Latest P6.2 fill failure diagnostic full validation: `git diff --check`
808
+ passed; the token residue grep returned no matches; `YUNTI_E2E=1 npm run
809
+ test:e2e` was executed but skipped because Playwright/Chromium is not
810
+ installed locally; `npm run release:check` passed with 102 node:test cases
811
+ total, 101 passed, and 1 real-browser smoke skipped by default; npm package
812
+ contents validation passed with 42 files; extension zip contents validation
813
+ passed with 13 files.
814
+ - P6.2 fill_form aggregation now preserves per-field structured fill failure
815
+ diagnostics. Aggregate results keep existing `filled`, `failed`, `results`,
816
+ `action: "fill_form"`, `target`, `ok`, `recoverable`, and `nextStepHint`
817
+ fields, while failed `results[]` items can carry `code`, `recoveryHint`,
818
+ `availableValues` / `availableTexts`, and field-level `nextStepHint` from
819
+ `yunti_fill`.
820
+ - Latest P6.2 fill_form diagnostic aggregation targeted validation:
821
+ `node --check extension/tool-handlers.js` passed; `node --test
822
+ tests/tool-handlers.test.js` passed 32 tests.
823
+ - Latest P6.2 fill_form diagnostic aggregation full validation: `git diff
824
+ --check` passed; the token residue grep returned no matches; `YUNTI_E2E=1
825
+ npm run test:e2e` was executed but skipped because Playwright/Chromium is
826
+ not installed locally; `npm run release:check` passed with 102 node:test
827
+ cases total, 101 passed, and 1 real-browser smoke skipped by default; npm
828
+ package contents validation passed with 42 files; extension zip contents
829
+ validation passed with 13 files.
830
+ - P6.2 non-editable fill diagnostics are complete. Uid fill now inspects the
831
+ resolved target before dispatching keyboard events and returns structured
832
+ `TARGET_NOT_EDITABLE` diagnostics for hidden/no-size, disabled, readonly, or
833
+ non-editable targets. Selector fill now checks editability in the content
834
+ script before mutating values. Failed results keep `filled: false`, `ok:
835
+ false`, `recoverable: true`, `code`, `recoveryHint`, and `nextStepHint`; uid
836
+ failures can also include a lightweight `element` diagnostic summary.
837
+ - Latest P6.2 non-editable fill diagnostic targeted validation:
838
+ `node --check extension/tool-handlers.js` passed; `node --check
839
+ extension/content.js` passed; `node --test tests/tool-handlers.test.js`
840
+ passed 34 tests.
841
+ - Latest P6.2 non-editable fill diagnostic full validation: `git diff
842
+ --check` passed; the token residue grep returned no matches; `YUNTI_E2E=1
843
+ npm run test:e2e` was executed but skipped because Playwright/Chromium is
844
+ not installed locally; `npm run release:check` passed with 104 node:test
845
+ cases total, 103 passed, and 1 real-browser smoke skipped by default; npm
846
+ package contents validation passed with 42 files; extension zip contents
847
+ validation passed with 13 files.
848
+ - P6.2 observe field-state hints are complete. `yunti_observe_page` element
849
+ entries can now expose `editable`, `fillable`, `readOnly`,
850
+ `fillBlockReason`, and select `options[]` summaries so agents can inspect
851
+ field state before calling `yunti_fill` or `yunti_select`. This is additive
852
+ observe metadata only; uid lifecycle, default balanced redaction, and existing
853
+ page action tools remain unchanged.
854
+ - Latest P6.2 observe field-state targeted validation:
855
+ `node --check extension/dom-observer.js` passed; `node --test
856
+ tests/dom-observer.test.js` passed 5 tests; `node --test tests/bridge.test.js`
857
+ passed 65 tests.
858
+ - Latest P6.2 observe field-state full validation: `git diff --check` passed;
859
+ the token residue grep returned no matches; `YUNTI_E2E=1 npm run test:e2e`
860
+ was executed but skipped because Playwright/Chromium is not installed
861
+ locally; `npm run release:check` passed with 105 node:test cases total, 104
862
+ passed, and 1 real-browser smoke skipped by default; npm package contents
863
+ validation passed with 42 files; extension zip contents validation passed
864
+ with 13 files.
865
+ - P6.2 observe select-state hints are complete. Select elements can now expose
866
+ `selectedIndex`, `selectedValue`, `selectedValueRedacted`, and `selectedText`
867
+ alongside `options[]`, so agents can inspect the current selection before
868
+ deciding whether to call `yunti_select`. This is additive observe metadata
869
+ only; `yunti_select` execution, uid lifecycle, and default balanced redaction
870
+ remain unchanged.
871
+ - Latest P6.2 observe select-state targeted validation:
872
+ `node --check extension/dom-observer.js` passed; `node --test
873
+ tests/dom-observer.test.js` passed 5 tests.
874
+ - P6.2 select disabled-option diagnostics are complete. Uid/value, uid/text,
875
+ and selector/value select paths now return structured `OPTION_DISABLED`
876
+ failures with `disabledValue`, `disabledText`, and recovery guidance to
877
+ choose an enabled option, wait for the field to unlock, or ask the user
878
+ before retrying. Existing successful select paths and compatibility fields
879
+ remain unchanged.
880
+ - Latest P6.2 select disabled-option targeted validation:
881
+ `node --check extension/tool-handlers.js` passed; `node --check
882
+ extension/content.js` passed; `node --test tests/tool-handlers.test.js`
883
+ passed 36 tests.
884
+ - Latest P6.2 select disabled-option full validation: `git diff --check`
885
+ passed; the token residue grep returned no matches; `YUNTI_E2E=1 npm run
886
+ test:e2e` was executed but skipped because Playwright/Chromium is not
887
+ installed locally; `npm run release:check` passed with 107 node:test cases
888
+ total, 106 passed, and 1 real-browser smoke skipped by default; npm package
889
+ contents validation passed with 42 files; extension zip contents validation
890
+ passed with 13 files.
891
+ - P6.2 deeper scroll semantics have started with fresh observed scrollable
892
+ container uids. `yunti_observe_page` scrollableContainers now feed the current
893
+ browserSessionId uid map, and `yunti_scroll` can resolve a container uid to
894
+ its center while reusing the existing coordinate/container scroll path. The
895
+ existing `target` compatibility field is preserved; uid scroll adds `uid`,
896
+ `method: "uid"`, and `scrollTarget`.
897
+ - Latest P6.2 uid scroll targeted validation:
898
+ `node --test tests/tool-handlers.test.js` passed 23 tests.
899
+ - Latest P6.2 uid scroll full validation: `git diff --check` passed;
900
+ `node --test tests/tool-handlers.test.js tests/bridge.test.js` passed 88
901
+ tests; `npm run release:check` passed with 93 node:test cases total, 92
902
+ passed, and 1 real-browser smoke skipped by default; npm package contents
903
+ validation passed with 42 files; extension zip contents validation passed
904
+ with 13 files; `YUNTI_E2E=1 npm run test:e2e` was executed but skipped
905
+ because Playwright/Chromium is not installed locally; the token residue grep
906
+ returned no matches.
907
+ - P6.2 scroll boundary diagnostics now report movement when before/after scroll
908
+ positions are comparable. A scroll that dispatches but does not move returns
909
+ `moved: false`, `code: "NO_SCROLL_MOVEMENT"`, `ok: false`, and
910
+ `recoverable: true`, while preserving existing `scrolled`, `target`, and
911
+ before/after compatibility fields.
912
+ - Latest P6.2 scroll no-movement targeted validation:
913
+ `node --test tests/tool-handlers.test.js` passed 24 tests.
914
+ - Latest P6.2 scroll no-movement full validation: `git diff --check` passed;
915
+ `node --test tests/tool-handlers.test.js tests/bridge.test.js` passed 89
916
+ tests; `npm run release:check` passed with 94 node:test cases total, 93
917
+ passed, and 1 real-browser smoke skipped by default; npm package contents
918
+ validation passed with 42 files; extension zip contents validation passed
919
+ with 13 files; `YUNTI_E2E=1 npm run test:e2e` was executed but skipped
920
+ because Playwright/Chromium is not installed locally; the token residue grep
921
+ returned no matches.
922
+ - P6.2 scroll no-movement diagnostics now include directional `edgeHint` values
923
+ when delta direction can be inferred, such as `possible-bottom-edge`,
924
+ `possible-top-edge`, `possible-right-edge`, and `possible-left-edge`. This
925
+ helps agents stop repeating the same scroll and choose a different direction,
926
+ nearby scrollable container uid, or recovery path.
927
+ - Latest P6.2 scroll edge-hint targeted validation:
928
+ `node --test tests/tool-handlers.test.js` passed 25 tests.
929
+ - Latest P6.2 scroll edge-hint full validation: `git diff --check` passed;
930
+ `node --test tests/tool-handlers.test.js tests/bridge.test.js` passed 90
931
+ tests; `npm run release:check` passed with 95 node:test cases total, 94
932
+ passed, and 1 real-browser smoke skipped by default; npm package contents
933
+ validation passed with 42 files; extension zip contents validation passed
934
+ with 13 files; `YUNTI_E2E=1 npm run test:e2e` was executed but skipped
935
+ because Playwright/Chromium is not installed locally; the token residue grep
936
+ returned no matches.
937
+ - P6.2 scroll no-movement diagnostics now include structured `recoveryHint`.
938
+ For `NO_SCROLL_MOVEMENT`, the result includes reason, nextAction,
939
+ recommendedTools, currentTarget, edgeHint, and, for fresh scrollable container
940
+ uids, lastObservedContainer scrollability and remaining-pixel metadata.
941
+ - Latest P6.2 scroll recovery-hint targeted validation:
942
+ `node --test tests/tool-handlers.test.js` passed 26 tests.
943
+ - Latest P6.2 scroll recovery-hint full validation: `git diff --check` passed;
944
+ `node --test tests/tool-handlers.test.js tests/bridge.test.js` passed 91
945
+ tests; `npm run release:check` passed with 96 node:test cases total, 95
946
+ passed, and 1 real-browser smoke skipped by default; npm package contents
947
+ validation passed with 42 files; extension zip contents validation passed
948
+ with 13 files; `YUNTI_E2E=1 npm run test:e2e` was executed but skipped
949
+ because Playwright/Chromium is not installed locally; the token residue grep
950
+ returned no matches.
951
+ - P6.2 scroll recovery guidance now includes `recoveryHint.suggestedRetry`.
952
+ When an opposite direction can be derived from `edgeHint`, the hint carries a
953
+ one-shot opposite `deltaX` / `deltaY`; uid-targeted scroll keeps the same
954
+ fresh container uid so agents can retry once, observe again, then switch
955
+ container or stop repeating if there is still no movement.
956
+ - Latest P6.2 scroll suggested-retry targeted validation:
957
+ `node --test tests/tool-handlers.test.js tests/bridge.test.js` passed 91
958
+ tests.
959
+ - Latest P6.2 scroll suggested-retry full validation: `git diff --check`
960
+ passed; `node --test tests/tool-handlers.test.js tests/bridge.test.js`
961
+ passed 91 tests; `npm run release:check` passed with 96 node:test cases
962
+ total, 95 passed, and 1 real-browser smoke skipped by default; npm package
963
+ contents validation passed with 42 files; extension zip contents validation
964
+ passed with 13 files; `YUNTI_E2E=1 npm run test:e2e` was executed but
965
+ skipped because Playwright/Chromium is not installed locally; the token
966
+ residue grep returned no matches.
967
+ - P6.2 scroll recovery guidance now includes `recoveryHint.decision`. For
968
+ `NO_SCROLL_MOVEMENT`, the decision is derived from `edgeHint` and whether the
969
+ scroll used a fresh container uid, producing machine-readable guidance such
970
+ as observing for a container, retrying the opposite direction once on the
971
+ same container, or providing a nonzero delta.
972
+ - Latest P6.2 scroll decision-hint targeted validation:
973
+ `node --test tests/tool-handlers.test.js tests/bridge.test.js` passed 91
974
+ tests.
975
+ - Latest P6.2 scroll decision-hint full validation: `git diff --check` passed;
976
+ `node --test tests/tool-handlers.test.js tests/bridge.test.js` passed 91
977
+ tests; `npm run release:check` passed with 96 node:test cases total, 95
978
+ passed, and 1 real-browser smoke skipped by default; npm package contents
979
+ validation passed with 42 files; extension zip contents validation passed
980
+ with 13 files; `YUNTI_E2E=1 npm run test:e2e` was executed but skipped
981
+ because Playwright/Chromium is not installed locally; the token residue grep
982
+ returned no matches.
983
+ - P6.2 uid fill post-value verification is complete. Keyboard/contenteditable
984
+ fill paths now perform a lightweight post-dispatch value check when possible.
985
+ If the target value does not remain, `yunti_fill` returns structured
986
+ `filled: false`, `ok: false`, `code: "VALUE_NOT_APPLIED"`,
987
+ `expectedValueLength`, `actualValueLength`, `recoveryHint`, and
988
+ `nextStepHint` diagnostics without echoing the raw field value. Existing
989
+ successful fill/select/scroll compatibility fields are preserved.
990
+ - Latest P6.2 uid fill post-value verification targeted validation:
991
+ `node --check extension/tool-handlers.js` passed; `node --test
992
+ tests/tool-handlers.test.js` passed 37 tests.
993
+ - P6.2 scroll partial-movement diagnostics are complete. When comparable
994
+ `before` / `after` positions show movement that is smaller than the requested
995
+ `deltaX` / `deltaY`, `yunti_scroll` keeps the action successful but adds a
996
+ structured `partialMovement` hint with requested/actual deltas, affected axes,
997
+ `edgeHint`, `nextAction: "observe-again"`, and
998
+ `decision: "observe-before-continuing-scroll"`.
999
+ - Latest P6.2 scroll partial-movement targeted validation:
1000
+ `node --check extension/tool-handlers.js` passed; `node --test
1001
+ tests/tool-handlers.test.js` passed 38 tests.
1002
+ - P6.2 uid scroll missing/stale target diagnostics are complete. Missing,
1003
+ stale, hidden, or coordinate-unresolvable scroll uids now return structured
1004
+ `scrolled: false`, `ok: false`, `recoverable: true`, `code`, `recoveryHint`,
1005
+ and `nextStepHint` instead of only bubbling a generic dispatcher error.
1006
+ Existing successful scroll, no-movement, and partial-movement paths are
1007
+ preserved.
1008
+ - Latest P6.2 uid scroll missing-target targeted validation:
1009
+ `node --check extension/tool-handlers.js` passed; `node --test
1010
+ tests/tool-handlers.test.js` passed 39 tests.
1011
+ - P6.2 coordinate scroll hit/fallback diagnostics are complete. Coordinate
1012
+ scrolls can now report `coordinateTarget`, `scrollContainerFound`, and
1013
+ `coordinateScrollFallback: "document"` from the content script, so agents can
1014
+ distinguish nested container hits from document fallback without changing the
1015
+ existing scroll dispatch behavior.
1016
+ - P6.2 coordinate scroll document fallback recovery hints are complete. When
1017
+ handler results include `coordinateScrollFallback: "document"`, successful
1018
+ scrolls keep `ok: true` and `recoverable: false` while adding
1019
+ `coordinateFallbackHint` plus a clearer `nextStepHint` to observe again and
1020
+ choose a fresh `scrollableContainers[]` uid when a panel/sidebar was intended.
1021
+ - Latest P6.2 coordinate scroll fallback targeted validation:
1022
+ `node --test tests/tool-handlers.test.js tests/bridge.test.js
1023
+ tests/content-scroll.test.js` passed 107 tests.
1024
+ - Latest P6.2 coordinate scroll fallback full validation: `git diff --check`
1025
+ passed; the token residue grep returned no matches; `YUNTI_E2E=1 npm run
1026
+ test:e2e` was executed but skipped because Playwright/Chromium is not
1027
+ installed locally; `npm run release:check` passed with 113 node:test cases
1028
+ total, 112 passed, and 1 real-browser smoke skipped by default; npm package
1029
+ contents validation passed with 42 files; extension zip contents validation
1030
+ passed with 13 files.
1031
+ - P6.2 wait-observe recovery guidance is complete for tool guidance surfaces.
1032
+ `yunti_get_tool_usage_hints`, `docs/TOOL_GUIDE.md`, and the packaged skill now
1033
+ tell agents to recover from async rendering, validation, option population, or
1034
+ newly loaded content by calling `yunti_wait_for`, observing again, and using a
1035
+ fresh uid for fill/select/scroll continuation.
1036
+ - Latest P6.2 wait-observe guidance targeted validation: `node --test
1037
+ tests/bridge.test.js` passed 65 tests.
1038
+ - Latest P6.2 wait-observe guidance full validation: `git diff --check` passed;
1039
+ the token residue grep returned no matches; `YUNTI_E2E=1 npm run test:e2e`
1040
+ was executed but skipped because Playwright/Chromium is not installed locally;
1041
+ `npm run release:check` passed with 113 node:test cases total, 112 passed, and
1042
+ 1 real-browser smoke skipped by default; npm package contents validation
1043
+ passed with 42 files; extension zip contents validation passed with 13 files.
92
1044
 
93
1045
  ## Decisions
94
1046
 
@@ -102,10 +1054,60 @@ shows token as a first-run field, and the published package is verified with
102
1054
  `yunti_list_browser_targets` to refresh the route inventory.
103
1055
  - The content script must not call product-specific login APIs in the
104
1056
  standalone runtime.
1057
+ - `0.2.0` is a Yunti-first enhancement cycle aimed at becoming the most useful
1058
+ local browser automation operation layer for agents and developers.
1059
+ - Reference projects such as Playwright, Puppeteer, Selenium, CDP, browser-use,
1060
+ Page Agent, BrowserGym, and extension runtimes are sources of practical ideas,
1061
+ not product shapes to copy.
1062
+ - Page Agent has been reviewed as the concrete first reference for P6.1/P6.2:
1063
+ absorb browser-state observation, indexed interactive elements, scrollable
1064
+ metadata, action sequencing, and retry discipline; do not copy its built-in
1065
+ LLM loop or make its UI model mandatory.
1066
+ - A multi-perspective 0.2.0 review has been completed across product,
1067
+ architecture/API, Agent workflow, security/privacy, and test/release strategy.
1068
+ The resulting plan changes emphasize product success metrics, field-level
1069
+ observation contracts, uid lifecycle, P6.1 minimum redaction, deterministic
1070
+ fixtures, and observe-first skill/tool guidance.
1071
+ - Implementation should proceed step by step: first use Page Agent/browser-use
1072
+ as the concrete reference for P6.1 page observation and P6.2 indexed actions,
1073
+ then absorb Playwright/CDP/BrowserGym-style reliability and diagnostics later.
1074
+ - Each `0.2.0` implementation slice should be documented before code changes:
1075
+ user-facing capability, compatibility rule, non-goals, acceptance checks, and
1076
+ why it strengthens Yunti's own direction.
1077
+ - Yunti should not require an LLM API key, mandatory hub tab, side panel, or
1078
+ single black-box `execute_task` tool in the default path.
1079
+ - Yunti should preserve its own distinctive capabilities: fine-grained MCP
1080
+ tools, real Chrome/Edge state, CDP, screenshots, network/console diagnostics,
1081
+ tab control, local bridge routing, and zero-config local install.
1082
+ - P6.1 implementation is proceeding in small slices: schema/tool hints/bridge
1083
+ routing are complete, content-script observation MVP is underway, and fresh
1084
+ observe uids now feed existing uid-based actions without replacing the
1085
+ snapshot path.
105
1086
 
106
1087
  ## Open Work
107
1088
 
108
- - Follow `docs/EXECUTION_PLAN.md` when defining the next post-0.1.1 phase.
1089
+ - Follow `docs/NEXT_MAJOR_PLAN.md` for the next major cycle.
1090
+ - P6.1 real-browser closure is complete: `YUNTI_E2E=1 npm run test:e2e` passed
1091
+ locally with temporary Node Playwright 1.58.0 and the existing Playwright
1092
+ browser cache from `/opt/miniconda3/envs/pytest-playwright`.
1093
+ - Continue 0.2.0 in small compatibility-preserving slices. Current completed
1094
+ subphases are P6.2.1 action result coverage, P6.2.2 select semantics, P6.2.3
1095
+ fill/form diagnostics, P6.2.4 scroll diagnostics, P6.2.5 wait-observe
1096
+ guidance, P6.2.6 structured `yunti_wait_for` results, and P6.2.7 automated
1097
+ action result coverage audit, P6.3.1 agent workflow contract, P6.3.2 minimal
1098
+ Tool Guide use cases, P6.4.1 DOM redaction policy deepening, P6.4.2 learning
1099
+ memory / console diagnostic secret-boundary tightening, P6.4.3 raw CDP /
1100
+ screenshot non-redaction diagnostic guidance, P6.5.1 optional local runtime
1101
+ console minimum loop, P6.5.2 local console diagnostic polish, and P6.5.3
1102
+ real-browser console validation. P6.6.1 browser extension distribution
1103
+ readiness, P6.6.2 store-facing permission/privacy copy, and P6.6.3 pre-store
1104
+ permission strategy decision are complete. P6.6.4 store-candidate permission
1105
+ UX design is deferred to post-0.2. The next anchored slice is P7.1 `0.2.0`
1106
+ npm/unpacked release closure.
1107
+ - For the next coding slice, update all affected guidance surfaces in one
1108
+ commit: `mcp/tools.js`, `docs/TOOL_GUIDE.md`,
1109
+ `skills/yunti-browser-runtime/SKILL.md`, `docs/EXECUTION_PLAN.md`, and this
1110
+ status file.
109
1111
  - P4.1 release-readiness docs and permission review is complete.
110
1112
  - P4.2 Agent integration examples are complete.
111
1113
  - P4.3 npm publishing URL confirmation is complete with the GitHub repository
@@ -258,6 +1260,15 @@ shows token as a first-run field, and the published package is verified with
258
1260
  - Latest P5.2 validation: `npm run release:check` passed; `npm run
259
1261
  release:publish` published `yunti-browser-runtime@0.1.2`; `npm run
260
1262
  release:verify-published` returned 0.
1263
+ - P5.3 extension zero-config first-run is complete: popup first screen now only
1264
+ shows connection status plus refresh, optional Bridge URL/page match/token
1265
+ controls are hidden under advanced settings, and docs explain that the MCP
1266
+ server starts the local bridge automatically.
1267
+ - Latest P5.3 validation: `npm run release:check` passed; `npm run
1268
+ release:publish` published `yunti-browser-runtime@0.1.3`; a first
1269
+ `npm run release:verify-published` hit npm registry lag, then a retry passed
1270
+ and `npm view yunti-browser-runtime version dist-tags.latest` returned
1271
+ `0.1.3`.
261
1272
 
262
1273
  ## Known Risks
263
1274