@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.
- package/README.md +1 -1
- package/docs/adapters.md +2 -2
- package/docs/approvals.md +33 -2
- package/docs/artifacts.md +23 -3
- package/docs/coverage.md +20 -4
- package/docs/design-releases.md +162 -0
- package/docs/guide.md +20 -3
- package/docs/handoff.md +1 -1
- package/docs/integration-maps.md +171 -0
- package/docs/journey-maps.md +139 -0
- package/docs/releasing.md +58 -28
- package/examples/design-release-maps/README.md +72 -0
- package/examples/design-release-maps/integration.json +181 -0
- package/examples/design-release-maps/journey.json +187 -0
- package/examples/design-release-maps/sample-source.md +8 -0
- package/examples/reflection-browser/README.md +18 -1
- package/examples/reflection-browser/capture.mjs +23 -5
- package/examples/reflection-browser/provider.mjs +35 -5
- package/package.json +2 -2
|
@@ -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,
|
|
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,
|
|
38
|
-
provenance,
|
|
39
|
-
the
|
|
40
|
-
|
|
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
|
|
139
|
-
|
|
140
|
-
|
|
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
|
-
|
|
146
|
-
|
|
147
|
-
|
|
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.
|
|
150
|
-
|
|
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
|
|
162
|
-
`npm-release` when requested. This checks
|
|
163
|
-
already present and publishes only missing
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
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
|
|
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.
|
|
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.
|
|
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
|
+
}
|