my-frontend-observer 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/CHANGELOG.md +82 -1
  2. package/README.md +30 -7
  3. package/dist/application/observationPersistence.js +1 -0
  4. package/dist/application/observationPersistence.js.map +1 -1
  5. package/dist/browser/chromiumAdapter.js +58 -4
  6. package/dist/browser/chromiumAdapter.js.map +1 -1
  7. package/dist/browser/evidenceCapture.d.ts +46 -3
  8. package/dist/browser/evidenceCapture.js +393 -94
  9. package/dist/browser/evidenceCapture.js.map +1 -1
  10. package/dist/browser/scrollCapture.d.ts +32 -0
  11. package/dist/browser/scrollCapture.js +163 -0
  12. package/dist/browser/scrollCapture.js.map +1 -0
  13. package/dist/browser/types.d.ts +3 -1
  14. package/dist/cli.js +165 -7
  15. package/dist/cli.js.map +1 -1
  16. package/dist/domain/diagnostics.d.ts +1 -1
  17. package/dist/domain/diagnostics.js +2 -0
  18. package/dist/domain/diagnostics.js.map +1 -1
  19. package/dist/domain/identity.d.ts +8 -3
  20. package/dist/domain/identity.js +10 -4
  21. package/dist/domain/identity.js.map +1 -1
  22. package/dist/domain/schema.d.ts +164 -6
  23. package/dist/domain/schema.js +314 -4
  24. package/dist/domain/schema.js.map +1 -1
  25. package/dist/domain/scrollEvidence.d.ts +51 -0
  26. package/dist/domain/scrollEvidence.js +134 -0
  27. package/dist/domain/scrollEvidence.js.map +1 -0
  28. package/dist/index.d.ts +4 -4
  29. package/dist/index.js +2 -2
  30. package/dist/index.js.map +1 -1
  31. package/dist/request/request.d.ts +57 -1
  32. package/dist/request/request.js +292 -14
  33. package/dist/request/request.js.map +1 -1
  34. package/docs/ARCHITECTURE.md +62 -1
  35. package/docs/CI_CD.md +49 -8
  36. package/docs/COMMANDS.md +184 -9
  37. package/docs/CONTRACTS.md +135 -6
  38. package/docs/CURRENT_STATE.md +128 -6
  39. package/docs/DEVELOPMENT.md +41 -3
  40. package/docs/PROJECT_OVERVIEW.md +12 -6
  41. package/docs/QUICKSTART.md +3 -1
  42. package/docs/RELEASE.md +12 -5
  43. package/docs/ROADMAP.md +9 -0
  44. package/docs/SECURITY.md +6 -2
  45. package/docs/WORKFLOWS.md +41 -14
  46. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,6 +1,87 @@
1
1
  # Changelog
2
2
 
3
- ## Unreleased
3
+ ## 0.3.0 - 2026-08-12
4
+
5
+ Runtime Scrolling, Overflow, and Visibility Behavior.
6
+
7
+ - Bounded runtime scroll scenarios: an observation may configure zero or
8
+ one scroll action, `window-scroll-by` or `target-scroll-by` (signed
9
+ integer `deltaX`/`deltaY`, bounded to `[-20000, 20000]`, at least one
10
+ non-zero). Not a generic interaction recorder or browser automation
11
+ framework - exactly one bounded action per observation.
12
+ - Real `window-scroll-by` execution: vertical and horizontal document
13
+ scrolling, with browser-authoritative (not calculated) final position,
14
+ including natural boundary clamping and valid no-movement scenarios.
15
+ - Real `target-scroll-by` execution against the existing stable configured
16
+ target identity and the same canonical target-resolution path every
17
+ locator kind already uses: real nested vertical/horizontal element
18
+ scrolling, boundary clamping, and non-scrollable/no-movement targets. An
19
+ action target that cannot be uniquely resolved at runtime is never
20
+ scrolled and never fabricated as moved - the existing target-missing/
21
+ target-ambiguous/target-hidden diagnostics explain it honestly.
22
+ - Initial/final bounded runtime snapshots (window scroll position, the
23
+ browser's own scrolling-root/`documentElement`/`body` metrics, and
24
+ per-configured-target scroll metrics) around an immediate, non-smooth
25
+ scroll action and an exact two-`requestAnimationFrame` stabilization
26
+ wait.
27
+ - Actual dimensional overflow (`scrollWidth`/`scrollHeight` vs.
28
+ `clientWidth`/`clientHeight`) kept explicitly distinct from the computed
29
+ `overflow-x`/`overflow-y` CSS declaration.
30
+ - Real viewport-relation evidence (`above`/`intersecting`/`below`,
31
+ `intersectsViewport`, `fullyWithinViewport`) and `enteredViewport`/
32
+ `leftViewport` scenario transitions; a hidden/non-rendered target's
33
+ viewport relation is honestly `not-applicable`, never fabricated
34
+ geometry - hidden and offscreen remain distinct.
35
+ - Bounded before/after scenario transition evidence for window and
36
+ per-target scroll position, geometry, and viewport relation - not a
37
+ generic comparison/diff engine.
38
+ - Derived scroll-owner interpretation (`document` /
39
+ `target:<stable-target-name>` / `none` / `indeterminate`), always
40
+ traceable (`derivedFrom`) to the underlying observed scroll-position
41
+ measurements only - never from CSS overflow, bounding-rectangle movement
42
+ alone, target name, or DOM hierarchy.
43
+ - New `--scroll-scenario-file <json-file>` CLI input, usable together with
44
+ either `--target` or `--targets-file`; the file path is operational input
45
+ only, never persisted and never part of request identity, exactly like
46
+ `--targets-file`'s path.
47
+ - Observation schema `1.2.0` (additive over `1.1.0`).
48
+ - Cross-platform packed-candidate validation: one hash-verified npm
49
+ candidate tarball proven on Windows, Linux, and macOS, covering the
50
+ legacy `--target` CSS shorthand, the structured `--targets-file`
51
+ semantic-target path, and both `--scroll-scenario-file` action kinds.
52
+
53
+ ## 0.2.0 - 2026-08-11
54
+
55
+ Stable Semantic Targets and Region Identity.
56
+
57
+ - Canonical `{name, locators}` target model with a stable observer-owned
58
+ target identity, distinct from both the browser locator that resolves a
59
+ target and any source-code symbol. The existing `--target id=selector`
60
+ CSS shorthand remains fully supported and normalizes into this model
61
+ unchanged.
62
+ - Six frozen, real-Chromium-resolved locator kinds per target, evaluated in
63
+ configured order with fallback on no match, immediate stop (no fallback)
64
+ on ambiguous or unevaluable results: `role` (+ optional exact accessible
65
+ name), `id`, `data-attribute`, `semantic-element`, `css`, and `text`
66
+ (exact match only).
67
+ - Explicit missing/ambiguous/unavailable resolution reporting, and hidden
68
+ (present-but-not-visible) target evidence, for every locator kind.
69
+ - Bounded semantic-region evidence per resolved target: accessibility
70
+ state (`disabled`/`expanded`/`checked`/`selected`/`pressed`/`current`,
71
+ with an explicit `false` always distinguishable from "not applicable"),
72
+ derived landmark identity, and configured-target-only DOM containment.
73
+ - Proven stable request identity: the same target configuration produces
74
+ the same request identity across repeated observations; changing a
75
+ target's locator strategy changes the request identity without changing
76
+ its stable name; a target's actual runtime disappearance is
77
+ distinguishable from a configuration change.
78
+ - New `--targets-file <json-file>` CLI input for structured semantic target
79
+ configuration, mutually exclusive with `--target`.
80
+ - Observation schema `1.1.0`.
81
+ - Cross-platform packed-candidate validation: one hash-verified npm
82
+ candidate tarball proven on Windows, Linux, and macOS, covering both the
83
+ legacy `--target` CSS shorthand and the structured `--targets-file`
84
+ semantic-target path.
4
85
 
5
86
  ## 0.1.0 - 2026-08-11
6
87
 
package/README.md CHANGED
@@ -6,11 +6,12 @@ in [docs/PROJECT_DESCRIPTION.md](docs/PROJECT_DESCRIPTION.md).
6
6
 
7
7
  ## Current status
8
8
 
9
- `v0.1.0`, Runtime Observation Foundation, is the current published release:
10
- `my-frontend-observer observe` launches a real, sandboxed Chromium browser,
11
- enforces a loopback-only safety policy, captures a viewport screenshot plus
12
- bounded page/target evidence, and persists it as one portable
13
- `manifest.json` + `screenshot.png` artifact.
9
+ `v0.3.0`, Runtime Scrolling, Overflow, and Visibility Behavior, is the
10
+ current published release: `my-frontend-observer observe` launches a real,
11
+ sandboxed Chromium browser, enforces a loopback-only safety policy,
12
+ captures a viewport screenshot plus bounded page/target evidence, and
13
+ persists it as one portable `manifest.json` + `screenshot.png` artifact
14
+ (observation schema `1.2.0`).
14
15
 
15
16
  Install:
16
17
 
@@ -44,6 +45,28 @@ This prints a concise result (`Observation:`/`State:`/`Artifact:`/`Targets:`/
44
45
  `Diagnostics:`) and exits `0` on a successfully persisted observation. See
45
46
  [docs/COMMANDS.md](docs/COMMANDS.md) for the full flag reference.
46
47
 
48
+ `--target <id=css-selector>` remains the simple CSS shorthand. A structured
49
+ `--targets-file <json-file>` input mode - supporting a role and accessible
50
+ name, a stable `id`, a `data-*` attribute, a semantic landmark element,
51
+ exact text, or an ordered fallback between several of those - ships
52
+ alongside it. See "Structured semantic targets" in
53
+ [docs/COMMANDS.md](docs/COMMANDS.md#structured-semantic-targets-targets-file)
54
+ for the exact JSON format.
55
+
56
+ ### Runtime scroll scenarios
57
+
58
+ `--scroll-scenario-file <json-file>` ships in this release: a real, bounded
59
+ `window-scroll-by` or `target-scroll-by` action performs one immediate,
60
+ non-smooth scroll and captures initial/final runtime evidence - window and
61
+ configured-target scroll position, actual overflow, viewport relation,
62
+ entered/left-viewport transitions, and a derived scroll-owner
63
+ interpretation (`document`, `target:<stable-target-name>`, `none`, or
64
+ `indeterminate`), all persisted in the same `manifest.json`. It may be
65
+ combined with either `--target` or `--targets-file`. See "Scroll scenario"
66
+ in
67
+ [docs/COMMANDS.md](docs/COMMANDS.md#scroll-scenario---scroll-scenario-file)
68
+ for the exact JSON format and flag reference.
69
+
47
70
  Validation:
48
71
 
49
72
  ```powershell
@@ -61,8 +84,8 @@ Planning authorities:
61
84
  intent and responsibility boundaries.
62
85
  - [Project Milestones](docs/PROJECT_MILESTONES.md): complete ordered capability
63
86
  design and cross-milestone rules.
64
- - [ROADMAP](docs/ROADMAP.md): version-level requirements; v0.1 is released,
65
- v0.2 is next.
87
+ - [ROADMAP](docs/ROADMAP.md): version-level requirements; v0.1, v0.2, and
88
+ v0.3 are released, v0.4 is next.
66
89
  - [Current State](docs/CURRENT_STATE.md): retained scaffold and release state.
67
90
 
68
91
  No sibling ecosystem repository is a runtime dependency of the retained
@@ -26,6 +26,7 @@ export function buildObservationArtifact(capture, request) {
26
26
  provenance: { capturedAt: new Date().toISOString(), observationMethod: 'chromium-navigate-and-capture' },
27
27
  pageEvidence: capture.pageEvidence,
28
28
  targetEvidence: capture.targetEvidence,
29
+ ...(capture.scrollScenarioEvidence ? { scrollScenarioEvidence: capture.scrollScenarioEvidence } : {}),
29
30
  screenshot: { state: 'available', source: 'browser', value: { path: SCREENSHOT_FILENAME } },
30
31
  completion,
31
32
  diagnostics: capture.diagnostics,
@@ -1 +1 @@
1
- {"version":3,"file":"observationPersistence.js","sourceRoot":"","sources":["../../src/application/observationPersistence.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"observationPersistence.js","sourceRoot":"","sources":["../../src/application/observationPersistence.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,9 @@
1
1
  import { chromium } from 'playwright';
2
2
  import { DIAGNOSTIC_SEVERITY } from '../domain/diagnostics.js';
3
3
  import { classifyUrl, classifyRedirect, classifySubresource, classifyPopup, classifyDownload } from '../safety/policy.js';
4
- import { capturePageEvidence, captureTargetEvidence } from './evidenceCapture.js';
4
+ import { capturePageEvidence, captureTargetEvidence, resolveConfiguredTargets, findResolvedTarget } from './evidenceCapture.js';
5
+ import { captureScrollRuntimeSnapshot, performWindowScrollBy, performTargetScrollBy, waitTwoAnimationFrames } from './scrollCapture.js';
6
+ import { deriveScrollScenarioTransition, deriveScrollOwner } from '../domain/scrollEvidence.js';
5
7
  function diagnostic(code, message) {
6
8
  return { code, severity: DIAGNOSTIC_SEVERITY[code], message };
7
9
  }
@@ -104,8 +106,52 @@ export async function captureViewportInternal(request) {
104
106
  result = { ok: false, diagnostics: [...diagnostics, classifyNavigationError(navigationError, request.readiness.timeoutMs)] };
105
107
  }
106
108
  else {
107
- // Captured from the same live page, after the same readiness point, as
108
- // required by Batch 3: no second browser/page is ever opened.
109
+ // v0.3 Batch 2/3: for a scenario request, resolve configured targets
110
+ // exactly once (reusing the same canonical resolveConfiguredTargets
111
+ // algorithm captureTargetEvidence uses below), capture the initial
112
+ // runtime snapshot, perform the one immediate scroll action (window or
113
+ // the uniquely-resolved action target - same two-animation-frame
114
+ // stabilization either way), and capture the final runtime snapshot -
115
+ // all before the screenshot and ordinary page/target evidence below,
116
+ // so every one of those downstream captures describes only the final
117
+ // post-action state. No second navigation, page, or observation ever
118
+ // happens.
119
+ let scrollScenarioEvidence;
120
+ if (request.scrollScenario) {
121
+ const action = request.scrollScenario.action;
122
+ const resolvedForScenario = await resolveConfiguredTargets(page, request.targets);
123
+ try {
124
+ const initial = await captureScrollRuntimeSnapshot(page, resolvedForScenario, request.viewport);
125
+ if (action.kind === 'window-scroll-by') {
126
+ await performWindowScrollBy(page, action.deltaX, action.deltaY);
127
+ }
128
+ else {
129
+ const actionTarget = findResolvedTarget(resolvedForScenario, action.target);
130
+ if (actionTarget?.status === 'matched' && actionTarget.handle) {
131
+ await performTargetScrollBy(actionTarget.handle, action.deltaX, action.deltaY);
132
+ }
133
+ // else: the configured action target could not be uniquely
134
+ // resolved at runtime (not-found/ambiguous/unavailable) - no
135
+ // scroll is performed and no movement is fabricated. The
136
+ // existing target-missing/target-ambiguous/target-hidden/
137
+ // browser-evidence-unavailable diagnostic for this same target
138
+ // name still surfaces below from the ordinary
139
+ // captureTargetEvidence pass, so the unresolved action target
140
+ // remains honestly explained rather than silently ignored.
141
+ }
142
+ await waitTwoAnimationFrames(page);
143
+ const final = await captureScrollRuntimeSnapshot(page, resolvedForScenario, request.viewport);
144
+ const transition = deriveScrollScenarioTransition(initial, final);
145
+ const scrollOwner = deriveScrollOwner(transition);
146
+ scrollScenarioEvidence = { initial, final, transition, scrollOwner };
147
+ }
148
+ finally {
149
+ await Promise.all(resolvedForScenario.filter((info) => info.handle).map((info) => info.handle.dispose()));
150
+ }
151
+ }
152
+ // Captured from the same live page, after the same readiness point (and,
153
+ // for a scenario request, after the scroll action above), as required by
154
+ // Batch 3/v0.3 Batch 2: no second browser/page is ever opened.
109
155
  const screenshotBuffer = await page.screenshot({ type: 'png' });
110
156
  const provenance = { engine: 'chromium', version: browser.version() };
111
157
  let pageEvidence;
@@ -128,7 +174,15 @@ export async function captureViewportInternal(request) {
128
174
  diagnostics.push(diagnostic('browser-evidence-unavailable', `target evidence collection failed: ${message}`));
129
175
  targetEvidence = {};
130
176
  }
131
- result = { ok: true, provenance, screenshot: new Uint8Array(screenshotBuffer), pageEvidence, targetEvidence, diagnostics };
177
+ result = {
178
+ ok: true,
179
+ provenance,
180
+ screenshot: new Uint8Array(screenshotBuffer),
181
+ pageEvidence,
182
+ targetEvidence,
183
+ diagnostics,
184
+ ...(scrollScenarioEvidence ? { scrollScenarioEvidence } : {}),
185
+ };
132
186
  }
133
187
  }
134
188
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"chromiumAdapter.js","sourceRoot":"","sources":["../../src/browser/chromiumAdapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chromiumAdapter.js","sourceRoot":"","sources":["../../src/browser/chromiumAdapter.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- import type { Page } from 'playwright';
1
+ import type { Page, Locator, ElementHandle } from 'playwright';
2
2
  import type { EvidenceField } from '../domain/evidence.js';
3
3
  import type { Diagnostic } from '../domain/diagnostics.js';
4
4
  import type { NamedTarget, Viewport } from '../request/request.js';
5
- import type { TargetEvidenceRecord } from '../domain/schema.js';
5
+ import type { TargetEvidenceRecord, TargetLocatorAttempt, TargetResolution } from '../domain/schema.js';
6
6
  /**
7
7
  * Captures the v0.1 minimum page evidence (docs/PROJECT_MILESTONES.md
8
8
  * "Minimum page evidence") from the already-navigated, already-ready page.
@@ -15,5 +15,48 @@ export interface TargetEvidenceCaptureResult {
15
15
  targetEvidence: Record<string, TargetEvidenceRecord>;
16
16
  diagnostics: Diagnostic[];
17
17
  }
18
- /** Observes every explicitly configured Batch 1 target from the same live page, honoring the 0/1/many cardinality contract. */
18
+ export interface ResolvedTargetInfo {
19
+ name: string;
20
+ attempts: TargetLocatorAttempt[];
21
+ status: TargetResolution['selectionStatus'];
22
+ selectedIndex?: number;
23
+ locator?: Locator;
24
+ handle?: ElementHandle<Element>;
25
+ unavailableReason?: string;
26
+ }
27
+ /**
28
+ * Looks up one already-resolved configured target by its stable observer
29
+ * name (case-insensitively, matching the same case-insensitive comparison
30
+ * `request.ts#normalizeRequest` already uses for target-name uniqueness) -
31
+ * never a second locator/resolution algorithm, just a lookup into the
32
+ * `resolveConfiguredTargets` result already computed once for this
33
+ * observation.
34
+ */
35
+ export declare function findResolvedTarget(resolved: readonly ResolvedTargetInfo[], name: string): ResolvedTargetInfo | undefined;
36
+ /**
37
+ * The one canonical target-resolution algorithm (Phase 1 of the v0.2 Batch 3
38
+ * three-phase design below), exported so v0.3 Batch 2 scroll-scenario
39
+ * runtime-snapshot capture can resolve configured targets exactly once and
40
+ * reuse the same live `{locator, handle}` pairs across its initial/final
41
+ * snapshots, instead of re-implementing resolution with different locator
42
+ * semantics. Callers own disposing any returned `handle`.
43
+ */
44
+ export declare function resolveConfiguredTargets(page: Page, targets: readonly NamedTarget[]): Promise<ResolvedTargetInfo[]>;
45
+ /**
46
+ * Observes every explicitly configured target from the same live page,
47
+ * honoring the frozen ordered-locator resolution contract: 0 matches tries
48
+ * the next locator; exactly 1 match selects and stops; more than 1 match is
49
+ * ambiguous and stops (never falls through); an unevaluable locator is
50
+ * unavailable and stops (never falls through). Ambiguity never triggers
51
+ * fallback.
52
+ *
53
+ * Batch 3 restructures this into three phases over one resolved set: (1)
54
+ * resolve every configured target exactly once, keeping a live
55
+ * `{locator, handle}` for each match; (2) compute bounded pairwise DOM
56
+ * containment among only the resolved configured targets, reusing those
57
+ * same handles (never re-resolving, never a second/independent resolution
58
+ * algorithm); (3) measure every resolved target and assemble its evidence,
59
+ * attaching the phase-2 containment result. Every handle is disposed once,
60
+ * after all three phases, regardless of outcome.
61
+ */
19
62
  export declare function captureTargetEvidence(page: Page, targets: readonly NamedTarget[]): Promise<TargetEvidenceCaptureResult>;