@penpair/web 0.3.6 → 0.4.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.
@@ -0,0 +1,139 @@
1
+ # Journey maps
2
+
3
+ A journey map records what a person is trying to accomplish, which states they
4
+ encounter, and the decisions still needed before implementation. It is a
5
+ project-owned contract that later agents can read without recovering earlier
6
+ chats. Use an [integration map](integration-maps.md) to connect the journey to
7
+ application structure, and a [design release](design-releases.md) to freeze a
8
+ reviewed design handoff.
9
+
10
+ ## Local commands
11
+
12
+ ```sh
13
+ penpair journey-map check --from design/journeys/reset-password/map.json
14
+ penpair journey-map render --from design/journeys/reset-password/map.json --out design/journeys/reset-password/rendered
15
+ penpair journey-map context --from design/journeys/reset-password/map.json --out design/journeys/reset-password/context.json
16
+ ```
17
+
18
+ Use your project's local command, such as `pnpm exec penpair`, when installed as
19
+ an application dependency. Rendering with `--out` writes local derived artifacts;
20
+ it does not publish into Penpot. Context is intended for reviewed inputs; drafts
21
+ must be explicit and cannot imply readiness.
22
+
23
+ ## Start from observed intent
24
+
25
+ Inspect the actual frames and existing application before drafting. Record the
26
+ user goal, entry points, successful outcome, alternate paths and recovery. Use
27
+ stable requirement and node IDs so a finding can refer to the same requirement
28
+ through review and implementation. A frame establishes visible design facts;
29
+ it does not establish what a button does, how an API behaves or how keyboard
30
+ focus moves.
31
+
32
+ Every node, edge and requirement declares its origin:
33
+
34
+ | Origin | Meaning |
35
+ | --- | --- |
36
+ | `observed` | Directly supported by the referenced design, code or evidence |
37
+ | `proposed` | An AI or designer recommendation awaiting a decision |
38
+ | `owner-decision` | A decision actually supplied by the owner |
39
+ | `unknown` | Missing information; retain it as a question |
40
+
41
+ An origin is provenance, not approval. In particular, an `owner-decision` label
42
+ cannot replace a review record binding the owner's actual words to the exact
43
+ contract hash. Do not turn guesses into observations or invent approval notes.
44
+
45
+ ## Keep the flow readable
46
+
47
+ Use short, specific node titles (`label`), optional one-line `summary` and longer
48
+ `description` text for evidence, decisions and unknowns. The map itself also
49
+ accepts optional `summary` and `description`. Origin badges distinguish observed
50
+ facts from proposals without repeating that status in every title. Optional
51
+ semantic `icon` values use fixed native vectors. Full notes remain available
52
+ below the flow and in Markdown/context; legacy contracts need no new fields.
53
+ See [titles and descriptions](integration-maps.md#readable-titles-and-descriptions).
54
+ These optional fields are part of reviewed canonical intent, so changing them
55
+ needs renewed approval.
56
+
57
+ ## Contract and review
58
+
59
+ The schema-1 JSON contract contains `kind: "journey-map"`, `id`, `title`, `goal`,
60
+ `sources`, `nodes`, `edges`, `requirements` and `findings`. Sources retain their
61
+ SHA-256 and available path/file/page/frame/revision identity. Nodes and edges
62
+ carry readable labels and stable IDs; requirement links connect them to the
63
+ intended outcomes. Open blocking findings keep readiness pending. Resolving a
64
+ finding requires an explicit resolution, rather than deleting its history.
65
+
66
+ The `journey-map` command family supports checking, rendering, publishing,
67
+ importing managed edits as proposals, accepting proposals, recording supplied
68
+ approval, and producing bounded context. Consult the installed command's help
69
+ for arguments. Checking and rendering locally do not approve or publish a map.
70
+ Native publication is a Penpot write and needs the normal inspection, pinned
71
+ snapshot, one idempotent write, independent readback and inspected stable export.
72
+ Check the exported typeface against the canvas: a font available to the editor
73
+ can still be unavailable to its exporter. Correct font metadata and identical
74
+ consecutive exports do not prove font fidelity. Visible font substitution needs
75
+ correction before visual approval.
76
+
77
+ The contract is authoritative; Mermaid and native Penpot objects are derived
78
+ views. Managed native edits become a proposal against the exact prior contract
79
+ hash. Review the diff and accept it explicitly before regenerating dependent
80
+ views. A changed label or connector must not silently rewrite accepted intent.
81
+ An old proposal cannot overwrite a newer contract.
82
+
83
+ Owner review is a separate `artifact-review` record containing the artifact
84
+ identity, exact hash, supplied words, identity, date and record hash. Review is
85
+ not authenticated identity. Changed contracts or source hashes need fresh review;
86
+ matching saved inputs do not prove the live file is unchanged.
87
+
88
+ ## Review gates
89
+
90
+ 1. **Intent ready:** the goal, success/recovery paths, evidence and unknowns are
91
+ explicit. Blocking questions are answered or remain visibly blocking.
92
+ 2. **Contract reviewed:** the owner reviewed the exact map and supporting
93
+ decisions. Technical checks and a neat diagram do not supply acceptance.
94
+ 3. **Handoff ready:** the integration map references this exact journey hash,
95
+ required design cases exist, and outstanding implementation work is explicit.
96
+
97
+ ## Reset-password example
98
+
99
+ The [worked example](../examples/design-release-maps/README.md) describes an
100
+ illustrative reset flow. An observed confirmation frame is distinct from a
101
+ proposed submission transition and an unknown expiry policy. The example is
102
+ unapproved and contains no fabricated inspection or owner evidence.
103
+
104
+ Keep loading, empty, error and success states proportionate to the feature.
105
+ Capture keyboard entry, focus movement, error announcements and responsive
106
+ behavior as explicit requirements or unknowns. The map does not establish that
107
+ any of these behaviors has been implemented or tested.
108
+
109
+ Contracts are bounded to 16 MiB, 1,000 nodes and 2,000 edges. Context has a
110
+ 128 KiB limit and reports omissions explicitly. Source paths remain inside the
111
+ project. Labels and descriptions are escaped literal data in generated views.
112
+
113
+ Every local requirement must be connected through node/edge `requirementIds`.
114
+ A readable graph with unmapped requirements remains incomplete for readiness.
115
+ Drawing plans also refuse complete native publication above a 16,384 px axis or
116
+ 64 KiB serialized plan size; split large maps into reviewable parts. Semantic
117
+ native imports retain a bound adjacent `.native.json` observation and require
118
+ fresh live readback during acceptance. Pure geometry changes instead produce a
119
+ presentation proposal, preserve canonical intent and require fresh visual review.
120
+
121
+ For explicit decomposition, use [linked detail maps](integration-maps.md#linked-detail-maps).
122
+ Journey details remain journey contracts, with independent publication and review;
123
+ parent approval does not cover a child map automatically.
124
+
125
+ ## Publication recovery
126
+
127
+ After an uncertain write, inspect the actual target and retained run first. Resume
128
+ the original journal explicitly, keeping the original contract, sources and
129
+ target flags (including whether `--board-id` was omitted):
130
+
131
+ ```sh
132
+ penpair journey-map publish --from design/journeys/reset-password/map.json \
133
+ --page-id PAGE_ID --apply --resume RUN_ID
134
+ ```
135
+
136
+ Use the original `--board-id` and `--projection` options if they were supplied.
137
+ Resume independently reconciles readback and exports; it does not blindly repeat
138
+ the write. Changed input or code signatures must refuse reuse. Inspect again and
139
+ start a new explicitly authorized run when needed; do not bypass those guards.
package/docs/releasing.md CHANGED
@@ -8,7 +8,7 @@ All packages in this repository are released **together, at one version, even a
8
8
  | `pnpm version-packages` | One Changesets fixed group versions every package, synchronizes `version.ts` and refreshes the lockfile |
9
9
  | `pnpm check:versions` | Missing, duplicate, ignored or separately grouped release packages, including packages added later |
10
10
  | `prepublishOnly` in every package | `pnpm publish` inside one package: it refuses unless `pnpm release` started it, and checks the versions again |
11
- | `pnpm release` | A half release: it checks, publishes the whole set in dependency order, looks each one up on npm, and reports anything missing |
11
+ | `pnpm release` | A half release: it checks, uploads the whole set with at most three workers, verifies registry visibility concurrently, and reports anything missing |
12
12
 
13
13
  Publishing cannot be undone: a version, once published, cannot be replaced. Check first, publish once.
14
14
 
@@ -34,10 +34,11 @@ Publishing cannot be undone: a version, once published, cannot be replaced. Chec
34
34
  publishing. The protected `npm-release` environment may require an additional
35
35
  owner approval, depending on its configured protection.
36
36
  5. The existing `pnpm release` entrypoint reruns checks and all package smoke
37
- installs, publishes packed tarballs in dependency order with npm OIDC and
38
- provenance, and verifies every required registry version (all six by default). A moved main branch stops
39
- the job instead of publishing a different commit. Do not merge another main
40
- change until a release finishes; use manual recovery if it has moved.
37
+ installs, uploads packed tarballs with at most three workers using npm OIDC and
38
+ provenance, then verifies every required registry version concurrently (all six by default).
39
+ It checks out the exact reviewed release SHA and verifies that it belongs to main's
40
+ history. Feature PRs may merge while that immutable snapshot publishes; newer
41
+ feature commits and their pending Changesets cannot alter the release artifacts.
41
42
 
42
43
  Automation is opt-in through the activation switches below. Merging a feature PR
43
44
  creates or updates the version PR; publishing starts only after that reviewed
@@ -134,20 +135,36 @@ pnpm release # dry run; publishes nothing
134
135
  pnpm release --publish --confirm-version X.Y.Z
135
136
  ```
136
137
 
138
+ Local OTP publication uploads one package at a time to keep interactive prompts
139
+ separate, then uses the same concurrent family visibility barrier.
140
+
137
141
  The manual GitHub **Publish reviewed Penpair release** dispatch also remains:
138
- enter the exact version already on main. It rejects mismatches or pending notes;
139
- set `continue_release` only after inspecting an interrupted release. The dispatch
140
- still passes through the protected environment and all unchanged release guards.
142
+ enter the exact reviewed version. Optionally enter its full 40-character `release_sha`
143
+ when main has advanced; omitting it selects the dispatch commit. Both automatic
144
+ and manual releases require the selected SHA to match a merged, same-repository
145
+ release PR, contain the increased shared version, and have no pending Changesets
146
+ in that snapshot. Set `continue_release` only after inspecting an interrupted
147
+ release. The dispatch still passes through the protected environment and release guards.
148
+ Historical recovery requires the selected commit's `scripts/release-protocol.json`
149
+ to declare the controller's supported protocol (currently version 1). Missing or
150
+ unsupported protocols are rejected before checkout or publication approval; releases
151
+ predating this tooling must use their original recovery process. Incompatible future
152
+ publisher safeguards must increment both the marker and the supported protocol so
153
+ older publisher scripts cannot bypass them.
141
154
 
142
155
  ## If a release stops half way
143
156
 
144
157
  After a successful upload, npm may still be processing the version. The release
145
- checks registry visibility immediately and then once per minute within a
146
- ten-minute deadline **for each uploaded package**, printing progress while it
147
- waits. Each metadata query has a 30-second maximum (or the remaining deadline,
158
+ does not block the remaining uploads on that package's registry visibility.
159
+ Up to three uploads run together. After all started uploads settle, every accepted
160
+ upload and already published required package is checked concurrently under one
161
+ shared ten-minute visibility deadline, with immediate checks followed by minute
162
+ polls. Each metadata query has a 30-second maximum (or the remaining deadline,
148
163
  whichever is smaller), with npm's internal retries disabled. Query time counts
149
- toward the deadline. A registry error still stops the release; only an actual
150
- not-found result waits for propagation. The visibility wait never republishes.
164
+ toward the deadline. Registry errors remain unknown failures rather than evidence
165
+ of absence. Visibility checks never republish. A failed upload stops new scheduling;
166
+ already started uploads finish and their results are retained before the command exits.
167
+ A partial release still requires explicit recovery.
151
168
 
152
169
  A publish can fail after some packages are out (a network error, a wrong one-time code, a name npm refuses). The version is then on npm for some packages and not for others, which must not stay that way. Fix the cause and run:
153
170
 
@@ -158,18 +175,26 @@ pnpm release --publish --continue # publishes only what is missing at this ve
158
175
  Without `--continue`, `pnpm release` refuses to run while only some packages are at the version, so a partial release cannot be forgotten.
159
176
 
160
177
  For GitHub recovery, run **Publish reviewed Penpair release** on `main`, enter
161
- the exact interrupted version and set `continue_release=true`. Approve
162
- `npm-release` when requested. This checks the registry again, skips versions
163
- already present and publishes only missing required packages. Inspect the final
164
- package/provenance verification before counting the release complete.
165
-
166
- Finish an interrupted release before merging unrelated changes or a tooling fix
167
- with new pending Changesets. The manual release gate requires a reviewed version
168
- with no pending notes; merging another feature can prevent continuation until
169
- that release state is reconciled. Do not discard pending package-release notes
170
- or weaken guards to force recovery through.
171
-
172
- An empty, tooling-only Changeset contains no package release entries. Changesets
178
+ the exact interrupted version, its full `release_sha` when main has advanced, and
179
+ set `continue_release=true`. Approve `npm-release` when requested. This checks
180
+ the registry again, skips versions already present and publishes only missing
181
+ required packages from that reviewed snapshot. If an accepted upload is still
182
+ propagating, wait and independently inspect the registry before requesting recovery.
183
+ A newer published `latest` version on any required package refuses the older
184
+ release rather than moving that tag backward. Tags are checked both during
185
+ preflight and immediately before uploads. Inspect final package/provenance
186
+ verification before counting the release complete.
187
+
188
+ Feature merges may continue during publication or recovery: pending Changesets
189
+ on newer main commits do not change the reviewed release snapshot. Keep release
190
+ versions in sequence and inspect a failed family before approving a newer release.
191
+ Only actual publish jobs enter the `penpair-package-release` concurrency group;
192
+ `queue: max` retains up to 100 pending jobs rather than replacing the previous one.
193
+ Queue arrival order can differ from version order, so the latest-version rollback
194
+ check remains required. See [GitHub concurrency documentation](https://docs.github.com/en/actions/how-tos/write-workflows/choose-when-workflows-run/control-workflow-concurrency).
195
+ Do not discard pending package-release notes or weaken guards to force recovery through.
196
+
197
+ For legacy releases predating snapshot-aware recovery, an empty, tooling-only Changeset contains no package release entries. Changesets
173
198
  can consume that metadata without changing versions. If such a note blocks an
174
199
  interrupted release, handle it in a reviewed metadata-only cleanup, preserve its
175
200
  summary in the completion report and verify unchanged package/source versions
@@ -185,7 +210,7 @@ the release's own evidence; never relax the existing release guards.
185
210
  pnpm release --publish --except penpair
186
211
  ```
187
212
 
188
- The release is then reported as `INCOMPLETE` (exit code 3) on purpose, and `pnpm release --publish --continue` finishes it the day npm allows the name. Nothing else can be left out, and only by naming it.
213
+ The release is then reported as `INCOMPLETE` (exit code 3) on purpose. Recovery at that version requires explicit continuation and refuses if a newer required package version has already taken `latest`. Nothing else can be left out, and only by naming it.
189
214
 
190
215
  ## Verify
191
216
 
@@ -217,10 +242,15 @@ See [npm trusted publishing](https://docs.npmjs.com/trusted-publishers/) and
217
242
  [provenance requirements](https://docs.npmjs.com/generating-provenance-statements/).
218
243
  Publishing validates the workflow context and rejects long-lived npm token
219
244
  fallback, packs with pnpm to rewrite `workspace:*` to exact versions, and publishes
220
- single tarballs with npm and provenance. These local checks are operational guards;
245
+ single tarballs with npm and provenance. For SHA-selected recovery, only the npm
246
+ publish subprocess receives `GITHUB_SHA` set to the verified source SHA, so npm's
247
+ provenance source digest identifies the artifact checkout. Workflow identity/ref,
248
+ OIDC issuance and run invocation retain the actual dispatch context. These local checks are operational guards;
221
249
  npm authenticates the actual identity against owner-managed publisher settings.
222
250
 
223
- npm cannot atomically publish multiple packages. A network/permission failure can
251
+ npm cannot atomically publish multiple packages. With concurrent uploads a dependent
252
+ package may briefly appear before its exact dependency has propagated. Consumers
253
+ should use a version after final family verification succeeds. A network/permission failure can
224
254
  leave some published and others missing; the release reports failure and requires
225
255
  explicit continuation at the same version. A rerun never silently resumes.
226
256
 
@@ -0,0 +1,72 @@
1
+ # Reviewed-map workflow example
2
+
3
+ These contracts describe a **synthetic, unapproved** reset-password feature.
4
+ They are valid draft inputs, not a real Penpot inspection, code audit, owner
5
+ review or finalized design release. `sample-source.md` is their only observed
6
+ source. Proposed application architecture and unknown policy stay labeled.
7
+
8
+ From the repository root:
9
+
10
+ ```sh
11
+ pnpm build
12
+ node packages/web/dist/cli.js journey-map render --from examples/design-release-maps/journey.json
13
+ node packages/web/dist/cli.js integration-map render --from examples/design-release-maps/integration.json
14
+ ```
15
+
16
+ Use the installed CLI entrypoint when working from a packaged installation.
17
+ Rendering is offline and establishes neither owner approval nor live fidelity.
18
+ Checks/context should retain the open blockers and missing reviews; this fixture
19
+ is intentionally not ready for implementation or release finalization.
20
+
21
+ ## Read the map
22
+
23
+ ```mermaid
24
+ flowchart LR
25
+ Entry["Enter email"]
26
+ Confirm["Check your email"]
27
+ Error["Retry request"]
28
+ Entry -->|"Success"| Confirm
29
+ Entry -->|"Failure"| Error
30
+ Error -->|"Retry"| Entry
31
+ ```
32
+
33
+ Each JSON node uses a concise `label` as its title, a one-line `summary`, a
34
+ longer `description` for evidence and decisions, and a fixed semantic `icon`.
35
+ Native cards show the compact title/summary with origin badges; detailed notes
36
+ retain the full explanation below the flow. The short labels above do not
37
+ change provenance: entry/confirmation are observations of the synthetic text,
38
+ while success, failure and retry behavior remain proposals. Policy and actual
39
+ code/browser evidence remain unknown.
40
+
41
+ This short illustration explains the intended flow; the JSON contract remains
42
+ authoritative. Generate full Mermaid/native drawing plans from it rather than
43
+ editing this illustration as if it updated the contract. A native drawing is
44
+ editable, but managed semantic changes must be imported as proposals, reviewed,
45
+ accepted against their base hash and approved again.
46
+
47
+ | Requirement | Intended result | Hypothetical mismatch | Next action |
48
+ | --- | --- | --- | --- |
49
+ | `reset-error-retry` | Keep the address after a failed request and allow retry | An implementation clears it and makes the person retype it | Confirm the proposed behavior, then test a real failed request and retry. This row is not observed project evidence. |
50
+
51
+ ## Three review gates
52
+
53
+ 1. **Intent ready:** inspect real source frames; decide request, disclosure,
54
+ expiry, recovery, loading and focus behavior. Do not convert unknown policy
55
+ into an inferred security rule.
56
+ 2. **Design package reviewed:** replace synthetic sources with actual inspection
57
+ paths/hashes, review the exact journey/integration maps, assemble target
58
+ native frames in `release/<product-version>`, verify fidelity, then obtain
59
+ the actual owner words for the exact release candidate. Source image
60
+ approval does not approve new target frame identities.
61
+ 3. **Implementation accepted:** implement against that stable context, observe
62
+ actual route/state/fixture behavior, compare browser images, test recovery
63
+ and accessibility, and review the results. Finalized design alone cannot
64
+ satisfy this gate.
65
+
66
+ No release plan with invented file IDs, frame IDs, transfer receipts or owner
67
+ words is included. Create a plan only after inspecting the actual pinned file
68
+ and selecting sources. The [release guide](../../docs/design-releases.md)
69
+ describes the native copy, immutable evidence and later drift checks.
70
+
71
+ New baselines default to static lossless WebP. Preserve existing approved PNG
72
+ bytes; format migration is explicit and requires normal exact-byte review.
@@ -0,0 +1,181 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "kind": "integration-map",
4
+ "id": "reset-password-integration",
5
+ "title": "Reset implementation",
6
+ "goal": "Connect the proposed reset flow to implementation responsibilities without inventing existing code.",
7
+ "sources": [
8
+ {
9
+ "id": "sample-brief",
10
+ "kind": "other",
11
+ "path": "examples/design-release-maps/sample-source.md",
12
+ "sha256": "ab97f0a30f066e9a9f2689d1624608ea91287751cbc6a613542c0e97de187a96"
13
+ }
14
+ ],
15
+ "journey": {
16
+ "path": "examples/design-release-maps/journey.json",
17
+ "sha256": "956fbe3e9d4eb3519d714912ec89bfaedd2a8c2b8882d06dc5ee9c4c279439a9"
18
+ },
19
+ "nodes": [
20
+ {
21
+ "id": "reset-route",
22
+ "label": "Reset route",
23
+ "kind": "route",
24
+ "origin": "proposed",
25
+ "requirementIds": [
26
+ "reset-entry"
27
+ ],
28
+ "summary": "Open /reset-password to begin the flow.",
29
+ "description": "Proposed route responsibility: enter the reset flow using the existing application router. The route and surrounding navigation have not been inspected. Reuse the actual project structure rather than treating this illustrative path as an approved architecture decision.",
30
+ "icon": "code"
31
+ },
32
+ {
33
+ "id": "reset-form",
34
+ "label": "Reset form",
35
+ "kind": "component",
36
+ "origin": "proposed",
37
+ "requirementIds": [
38
+ "reset-entry",
39
+ "reset-error-retry"
40
+ ],
41
+ "summary": "Collect an address and retain it on retry.",
42
+ "description": "Proposed form responsibility: collect the address, follow agreed validation and preserve input during recoverable failure. Inspect existing components before choosing an implementation. Form semantics and behavior need explicit review and real browser evidence.",
43
+ "icon": "screen"
44
+ },
45
+ {
46
+ "id": "reset-mutation",
47
+ "label": "Reset service",
48
+ "kind": "data",
49
+ "origin": "unknown",
50
+ "requirementIds": [
51
+ "reset-request",
52
+ "reset-expiry"
53
+ ],
54
+ "summary": "Agree the request and response contract.",
55
+ "description": "The endpoint, request payload, validation, response policy and expiry behavior are unknown. Obtain the actual project API and product decisions before implementation. This node does not claim that a service exists or prescribe a new backend.",
56
+ "icon": "service"
57
+ },
58
+ {
59
+ "id": "reset-feedback",
60
+ "label": "Request feedback",
61
+ "kind": "state",
62
+ "origin": "proposed",
63
+ "requirementIds": [
64
+ "reset-error-retry",
65
+ "reset-confirmation",
66
+ "reset-focus"
67
+ ],
68
+ "summary": "Show confirmation or a recoverable error.",
69
+ "description": "Proposed feedback responsibility: present the agreed confirmation state after an accepted request and useful recovery after failure. Define focus and announcements with the actual application. The synthetic source does not establish these transitions or their accessibility.",
70
+ "icon": "decision"
71
+ },
72
+ {
73
+ "id": "browser-case",
74
+ "label": "Verify recovery",
75
+ "kind": "verification",
76
+ "origin": "unknown",
77
+ "requirementIds": [
78
+ "reset-error-retry",
79
+ "reset-confirmation",
80
+ "reset-focus",
81
+ "reset-expiry"
82
+ ],
83
+ "summary": "Check retry, focus, and announcements.",
84
+ "description": "Verification is pending. Map approved design cases to actual route/state/fixture setup, then observe failed submission, retained input, retry and confirmation in the real browser. Assess keyboard and screen-reader behavior separately from visual comparison. No provider or result is supplied here.",
85
+ "icon": "check"
86
+ }
87
+ ],
88
+ "edges": [
89
+ {
90
+ "id": "route-form",
91
+ "from": "reset-route",
92
+ "to": "reset-form",
93
+ "label": "Compose",
94
+ "origin": "proposed",
95
+ "requirementIds": [
96
+ "reset-entry"
97
+ ]
98
+ },
99
+ {
100
+ "id": "form-request",
101
+ "from": "reset-form",
102
+ "to": "reset-mutation",
103
+ "label": "Submit",
104
+ "origin": "unknown",
105
+ "requirementIds": [
106
+ "reset-request"
107
+ ]
108
+ },
109
+ {
110
+ "id": "request-feedback",
111
+ "from": "reset-mutation",
112
+ "to": "reset-feedback",
113
+ "label": "Handle result",
114
+ "origin": "proposed",
115
+ "requirementIds": [
116
+ "reset-error-retry"
117
+ ]
118
+ },
119
+ {
120
+ "id": "feedback-evidence",
121
+ "from": "reset-feedback",
122
+ "to": "browser-case",
123
+ "label": "Verify behavior",
124
+ "origin": "proposed",
125
+ "requirementIds": [
126
+ "reset-error-retry"
127
+ ]
128
+ }
129
+ ],
130
+ "requirements": [
131
+ {
132
+ "id": "reset-entry",
133
+ "text": "Proposed: map the entry screen to the project route and existing form conventions after inspecting code.",
134
+ "origin": "proposed"
135
+ },
136
+ {
137
+ "id": "reset-request",
138
+ "text": "Unknown: endpoint, validation and response policy require the actual project contract.",
139
+ "origin": "unknown"
140
+ },
141
+ {
142
+ "id": "reset-error-retry",
143
+ "text": "Proposed: retain the entered address on failure; verify retry and accessible feedback in the real browser.",
144
+ "origin": "proposed"
145
+ },
146
+ {
147
+ "id": "reset-confirmation",
148
+ "text": "Proposed: render confirmation only after the agreed response; final request policy remains unknown.",
149
+ "origin": "proposed"
150
+ },
151
+ {
152
+ "id": "reset-expiry",
153
+ "text": "Unknown: expiry/repeated request behavior must follow the agreed product/security contract.",
154
+ "origin": "unknown"
155
+ },
156
+ {
157
+ "id": "reset-focus",
158
+ "text": "Proposed: implement and verify keyboard focus and announced error recovery.",
159
+ "origin": "proposed"
160
+ }
161
+ ],
162
+ "findings": [
163
+ {
164
+ "id": "code-not-inspected",
165
+ "message": "No application code, route or component identity has been inspected for this synthetic example.",
166
+ "severity": "blocking",
167
+ "status": "open"
168
+ },
169
+ {
170
+ "id": "provider-pending",
171
+ "message": "No approved design cases, actual provider or browser evidence are supplied.",
172
+ "severity": "blocking",
173
+ "status": "open"
174
+ }
175
+ ],
176
+ "presentation": {
177
+ "fontFamily": "Inter"
178
+ },
179
+ "summary": "Connect the reset flow to application responsibilities.",
180
+ "description": "This unapproved integration proposal links the synthetic journey to a route, form, service contract, feedback states and verification work. No application code, API or browser behavior has been inspected. Every proposed responsibility needs project evidence and review before implementation."
181
+ }