@penpair/web 0.3.0 → 0.3.3

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,85 @@
1
+ # Validate skill discovery and behavior
2
+
3
+ Installation, selection, workflow application, browser evidence and owner
4
+ acceptance are separate checks. A host can load a skill without showing the
5
+ selection in the way a person expects, and can read a skill but underapply it.
6
+
7
+ ## Offline discovery
8
+
9
+ ```sh
10
+ pnpm exec penpair skills check --agent codex --json
11
+ pnpm exec penpair skills check --agent claude --agents CLAUDE.md --json
12
+ pnpm exec penpair skills check --agent copilot --agents .github/copilot-instructions.md --json
13
+ pnpm exec penpair skills check --only penpair-verify --agents AGENTS.md --json
14
+ ```
15
+
16
+ Exit 0 means the selected bundled skills have valid discoverable entrypoints,
17
+ an enabled host invocation policy where evaluated, resolvable local entrypoint resources and matching
18
+ links in the installer-owned task routes. Exit 3 means readiness is incomplete;
19
+ exit 1 indicates invalid arguments or an execution/configuration error. `--only`
20
+ can be repeated. Default selection is all bundled skills; partial installs should
21
+ select their intended subset explicitly.
22
+
23
+ The report distinguishes entrypoints matching the bundle from valid local
24
+ customizations. Different independent installed copies require review. For Codex, missing
25
+ optional `agents/openai.yaml` means implicit invocation is allowed by default;
26
+ an explicit false policy leaves explicit invocation available. Claude's
27
+ `disable-model-invocation` is checked independently. Copilot's invocation policy
28
+ is not evaluated (`implicitInvocation: null`); Codex metadata does not disable
29
+ other hosts. Legacy setup-guide folders make readiness incomplete and require
30
+ review. `--agent` selects the host; it does not change the installation. The check reads
31
+ bounded regular project files, follows in-project links and refuses escapes.
32
+ It does not load adapters/providers, connect to Penpot, read credentials, write
33
+ repairs or inspect global agent settings.
34
+
35
+ The instruction check recognizes Penpair's generated owned task routes. It does
36
+ not interpret arbitrary custom routing prose. Preview updates with
37
+ `skills install --agents AGENTS.md --dry-run`, preserve intentional customizations
38
+ and project-owned facts, then apply the reviewed refresh. Diagnostics do not
39
+ override owner choices or silently enable disabled skills.
40
+
41
+ ## Realistic invocation trials
42
+
43
+ Run these separately in fresh Claude Code, Copilot and Codex sessions in an authorized disposable consumer project.
44
+ Do not append skill names to the natural request. Supply actual reference IDs,
45
+ images, approved scope and case files where the task needs them. For a negative
46
+ case, keep Penpot/provider work out of scope. Each trial uses the same fixture and
47
+ records the actual outcome, including missing skills or unavailable tools.
48
+
49
+ | Natural request | Expected primary skill | Observable result |
50
+ | --- | --- | --- |
51
+ | Set up Penpair with me, step by step. | penpair-setup | Assisted setup preserves the chosen package manager; private browser/key steps handed to the person. |
52
+ | Give me manual installation steps; do not run them. | penpair-setup | Commands and expected results only; no installation or connection commands executed. |
53
+ | I installed the package manually; help me finish with your assistance. | penpair-setup | Inspects existing progress and continues without resetting the config. |
54
+ | Connect this project to Penpot; doctor cannot reach the editor. | penpair-setup | Diagnose the failed check; preserve personal credentials. |
55
+ | Inspect this Penpot frame and export its current design. | penpair-design | Pinned target, complete inspection and actual export. |
56
+ | Create an empty state from this approved Penpot screen. | penpair-recipes | Source evidence, declared regions, representative candidate and critique before expansion. |
57
+ | Implement this approved Penpot design in the frontend. | penpair-handoff | Explicit component mapping/unknowns and routed verification readiness. |
58
+ | Compare this running route with its approved design and fix the visual mismatches. | penpair-verify | Actual case setup/readback, screenshots, findings, scoped fixes and rerun. |
59
+ | Critique this screen's density and hierarchy. | design-judgment | Consequential findings grounded in the supplied image; no implicit Penpot writes. |
60
+ | Fix a backend calculation with no UI change. | none of these | No Penpot or comparison work added. |
61
+ | Explain this repository's release workflow. | none required | No design/browser workflow started. |
62
+ | Explain what Reflection Check does; do not run anything. | none required | Explanation respects the requested scope; no provider execution. |
63
+
64
+ For each case retain: request/context, visible skill catalog if available, actual
65
+ SKILL.md reads, selection announcement, relevant output/checkpoint, command
66
+ results and missing evidence. Record correct selection and correct application
67
+ separately. A badge, a stated intention, a keyword match or valid YAML proves
68
+ neither. If natural selection fails, repeat with explicit invocation (`$skill-name` in Codex, `/skill-name` in Claude Code, or a skill name/path request in Copilot) to
69
+ distinguish discovery/selection from problems following the workflow. Record the
70
+ installed skill version; compare before/after under the same conditions.
71
+
72
+ Do not run live writes just to measure invocation. A read-only plan can establish
73
+ selection; authorized scratch trials establish mutation and visual behavior.
74
+ Missing tools, design references, browser providers or owner approval remain
75
+ pending instead of simulated success.
76
+
77
+ ## Retain the observed results
78
+
79
+ Keep trial results in the project's own review folder. Retain actual loaded
80
+ skills, resulting artifacts, failures and unresolved evidence separately from
81
+ expected behavior. Source/package checks and real consumer trials are described
82
+ in the [validation guide](validation.md).
83
+
84
+ See [official Codex skill documentation](https://developers.openai.com/codex/skills/)
85
+ for supported discovery locations, implicit selection and optional metadata.
@@ -0,0 +1,68 @@
1
+ # Validate a source build and project workflow
2
+
3
+ Use automated checks for code/package contracts, an authorized scratch file for
4
+ live Penpot behavior, and the actual application for frontend comparison. Passing
5
+ one layer does not establish the others. Record versions and observations rather
6
+ than treating a report template or an unrun checklist as evidence.
7
+
8
+ ## Source and package checks
9
+
10
+ From the repository root:
11
+
12
+ ```sh
13
+ pnpm check
14
+ pnpm smoke:package
15
+ ```
16
+
17
+ The first command checks formatting, code paths, build, types, convention
18
+ examples, tests and shared package versions. The package smoke packs all six
19
+ packages, installs them into empty projects and exercises their public commands
20
+ and contracts. It does not publish packages or connect to a live Penpot file.
21
+
22
+ For a separate unreleased consumer trial, install the complete matching tarball
23
+ set. Override transitive `@penpair/core` resolution to that same packed core, as
24
+ `scripts/smoke-package.mjs` does. Installing only a command tarball can otherwise
25
+ resolve a different core from npm. Install one command package, plus only the
26
+ adapters the project actually uses.
27
+
28
+ ## Scratch Penpot checks
29
+
30
+ The owner must authorize a disposable target and identify its file/page IDs.
31
+ Keep its editor and plugin visible, pin the intended file and enter personal
32
+ credentials only through the private connection flow. Never infer scratch
33
+ authorization from a file name.
34
+
35
+ - Run onboarding and `doctor --json`; retain actual target/version evidence.
36
+ - Inspect and build one representative case with the [Hello-card example](../examples/hello-card/README.md)
37
+ or the tagged scratch probe described in [compatibility](compatibility.md#automated-checks-and-manual-scratch-smoke).
38
+ - Exercise wrong-file refusal, advisory writer coordination and interrupted-run
39
+ recovery only on the authorized scratch target. Reusable scripts are under
40
+ `examples/trials/`; follow [recovery](recovery.md) and [team coordination](team.md).
41
+ - Inspect independent readback, export until stable and look at the images.
42
+ Remove only confirmed owned objects or discard the disposable file. A lost
43
+ response is not permission to replay a write.
44
+
45
+ For multi-person checks, use separate project folders and independently owned
46
+ credentials. A same-checkout lock test cannot establish cross-client atomic
47
+ exclusion. Shared writer markers remain advisory.
48
+
49
+ ## Skills, implementation and recovery evidence
50
+
51
+ Use [skill validation](skill-validation.md) to distinguish valid discovery from
52
+ actual skill selection and correct application. For frontend work, configure the
53
+ [comparison companion](adapters.md#check-the-frontend-against-the-design) with
54
+ approved references, real state setup/readback and a real browser provider.
55
+ Inspect reference and actual images; keep pixel metrics, visual findings,
56
+ behavior/accessibility checks and owner acceptance separate.
57
+
58
+ Prove backup restoration with the [scratch export/import checklist](backup.md#prove-the-restore-on-scratch).
59
+ Structural JSON snapshots do not establish full archive fidelity. Native
60
+ component generation requires its own instance-override preservation proof;
61
+ see the [component pilot](marwes-components.md).
62
+
63
+ Record the tested commit/tarball hashes, package/runtime/browser versions, public
64
+ target IDs, exact cases, actual observations, interruptions and unresolved
65
+ findings. Leave unobserved metrics unknown. Keep internal checklists, session
66
+ reports and private evidence in git-ignored `.working-docs/`; promote lasting
67
+ behavior and compatibility findings into maintained guides. Never retain keys,
68
+ private connection URLs or secret-entry screenshots in review artifacts.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@penpair/web",
3
- "version": "0.3.0",
3
+ "version": "0.3.3",
4
4
  "description": "The penpair command for Penpot on the web (design.penpot.app or your team's own): guided setup, a safe write protocol, skills for AI agents. Includes everything in @penpair/core.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -48,7 +48,7 @@
48
48
  "access": "public"
49
49
  },
50
50
  "dependencies": {
51
- "@penpair/core": "0.3.0"
51
+ "@penpair/core": "0.3.3"
52
52
  },
53
53
  "scripts": {
54
54
  "build": "tsc -p tsconfig.json",
@@ -1,59 +0,0 @@
1
- # Improvement branch review
2
-
3
- Branch: `codex/penpair-improvements`. Review before merging. No push, merge, version bump, tag, publish, deployment, real Penpot mutation or upstream message was performed.
4
-
5
- The [living checkbox document](improvements.md) contains the priority order and per-item **Resolved / Changed / Validated / Risks / Next** reports. It mirrors the owner's external brief. At handoff, 37 of 40 top-level items are implemented; the three live acceptance items below stay unchecked. Preparation substeps are checked separately.
6
-
7
- ## Review in this order
8
-
9
- | Area | Main entry points and evidence |
10
- | --- | --- |
11
- | Target safety, execution and recovery | Config/file guards; one-shot ambiguous writes; positive readback; [journals/recovery](recovery.md); [team coordination](team.md) |
12
- | Bounded inspection and artifact trust | [Inspection](inspection.md), [formats](formats.md), [snapshots](snapshots.md), [artifacts](artifacts.md), [approvals](approvals.md) |
13
- | Page construction and token ownership | [Reviewed file scripts](run-file.md), [kit](build-kit.md), [token editing](token-editing.md), [adapter](marwes.md), [mode trials](mode-verification.md) |
14
- | Implementation evidence | [Handoff](handoff.md), [case coverage](coverage.md), [explicit provider adapter](../packages/reflection-check/README.md) |
15
- | Agent and operator paths | Five shipped skills; [MCP](mcp.md), [credentials](credentials.md), [status/open](status.md), [advisory audits](audits.md), [troubleshooting](troubleshooting.md) |
16
- | Release/consumer/upstream preparation | [Release gates](releasing.md), [consumer proposal](tradient-followups.md), [unsent upstream requests](upstream/marwes-requests.md) |
17
-
18
- Commits are grouped by backlog item. Inspect one item/report and its commit before moving to another. Tests use actual generated plugin bodies where possible, fake transports/servers, recorded structures and temporary consumers. The package smoke installs all six tarballs in clean consumers; it does not publish them.
19
-
20
- ## Intentionally open acceptance gates
21
-
22
- - [ ] **G3:** Owner-authorized hosted `.penpot` export/import and full token/component/asset/render restore comparison. Archive candidates and structural review data do not prove restore fidelity.
23
- - [ ] **I12:** Two real people complete onboarding, wrong-file prevention, writer conflict, recovery and one real design-to-code route. Use the [runbook/template](trials.md); no synthetic people or timings are recorded as results.
24
- - [ ] **C1:** Real Button/Card/StatTile fixture measurements and pinned-native-API proof that instance text/style overrides survive updates. Measurement/drift tooling is built; native library generation deliberately refuses until that proof exists. Measured project constants are not fabricated.
25
-
26
- The owner requested finishing branch code and leaving live trials pending. Those unresolved gates remain visible rather than being counted as delivered behavior. Native generation depends on that live proof and is the material remaining implementation gate.
27
-
28
- ## Decisions to assess before adoption
29
-
30
- - Read declarations and trusted project modules are contracts, not execution sandboxes. Default built-in inspection avoids extension imports; explicit adapter/provider/registered-script paths execute trusted code.
31
- - Shared writer markers are advisory across machines. Journals preserve uncertainty and support explicit reconciliation; they are not transactions, rollback or exactly-once execution.
32
- - Typed handoff/mapping hints preserve literal design data. They do not infer application state, component semantics, responsive behavior or accessibility from pixels.
33
- - Rich comparison cases need actual project setup and independent browser readback. Pixel ratios, size signals and heuristic hue findings remain evidence for review.
34
- - Changed baseline references require exact owner-word evidence or a visible forced-reference waiver; waived references do not satisfy approved rich coverage.
35
- - The project MCP server has an immutable explicit root/target, strict file guards and bounded responses. Registered writes require server opt-in and call-level apply. Cancellation remains cooperative for trusted code.
36
- - Private file/Keychain providers are implemented, but no real personal store was exercised. General credential commands remain deferred.
37
- - The release workflow requires owner activation, protected-environment policy and npm publisher settings. No remote policy or actual OIDC/provenance result has been established. All packages remain 0.1.3; the branch is unreleased.
38
- - Consumer changes and upstream sends remain owner actions. Existing optional trend/Card composition and the consumer SidebarNav corrected parts of the original brief; historical measurements remain version/context-scoped.
39
-
40
- ## Release automation follow-up
41
-
42
- R1 adds Changesets version PRs with one fixed group for all six packages and an
43
- API-verified exact merged-PR gate before publishing. Ordinary feature merges do
44
- not publish. The PR token has no npm role; publishing uses OIDC and retains the
45
- existing release guards. Both paths start disabled. Review the [activation
46
- checklist](releasing.md#one-time-owner-activation) and [local PR draft](pr-improvements.md).
47
- The pending minor note proposes 0.2.0; actual package versions remain 0.1.3.
48
-
49
- R2 adds the owner-requested temporary `PENPAIR_RELEASE_EXCLUDE_PENPAIR=true`
50
- publishing exception for the short-name wrapper. All six versions still move
51
- together; five required packages must verify and the omission is explicitly
52
- reported. Remove the variable to restore full-family publishing and use explicit
53
- continuation to catch up the current missing wrapper. See [release exception](releasing.md#temporary-exception-for-the-short-name).
54
-
55
- ## Validation and handoff
56
-
57
- Final verification covers `pnpm check`, `pnpm smoke:package`, docs/anchor and generated-remedy checks, targeted skill-entrypoint validation, release helper syntax and workflow YAML boundaries. The final recorded suite has 583 tests across core, adapter, implementation bridge and Docker. The final full branch check and six-package smoke both passed before handoff. Live/editor/browser/human acceptance remains pending as listed above.
58
-
59
- Review this branch locally against main. External authorization is needed before any push, merge, release activation, publishing, version bump, consumer write or non-scratch Penpot change. No new confirmation is needed for the already authorized local implementation work.
@@ -1,73 +0,0 @@
1
- # Readability conventions completion — 2026-10-22
2
-
3
- Branch: `codex/tradient-feedback`. All repository package versions remain 0.2.0.
4
-
5
- ## Completed checklist and what each update resolves
6
-
7
- - [x] **Readable formatting baseline.** Pin Biome 2.6.2, use two-space indentation
8
- and expanded layouts, add braces and separate variable declarations. This
9
- removes compressed source layouts and makes subsequent diffs consistent. The
10
- mechanical baseline is its own commit, `b1a9445`, for review.
11
- - [x] **Maintained conventions.** Add task-based guidance for naming, package
12
- ownership, module extraction, TypeScript, tests and sandbox code. This gives new
13
- work a concrete placement and implementation pattern instead of relying on
14
- memory or copying unrelated frontend conventions.
15
- - [x] **Checked examples.** Typecheck actual core contracts and run helper,
16
- sandbox-generation and path-rule tests. This catches stale examples and proves
17
- that the generated plugin body compiles and behaves as documented.
18
- - [x] **Agent discovery.** Link the conventions and repository-local
19
- `penpair-code-conventions` skill from `AGENTS.md`, with contributor routing from
20
- `CONTRIBUTING.md`. This makes readable names and early responsibility extraction
21
- part of the implementation workflow.
22
- - [x] **Continuous enforcement.** Include Biome, directory naming and example
23
- validation in `pnpm check`, which existing CI already runs. The CI job name stays
24
- stable for branch protection. These checks prevent automatic style/path drift;
25
- review still judges the meaning of names and module boundaries.
26
- - [x] **Comparison adapter extraction.** Replace the dense entrypoint with focused
27
- public contracts, planning, capture validation, provider validation, PNG I/O,
28
- orchestration and command modules. Public imports, report fields, approval gates
29
- and command behavior remain compatible. Shared test fixtures and capture tests
30
- also have focused files.
31
- - [x] **Installed contract verification.** Extend package smoke testing to import
32
- the packed adapter's public functions/default export and typecheck its public
33
- contracts. This catches missing extracted files or broken declaration exports.
34
-
35
- ## Validation
36
-
37
- - `pnpm check` passes: **640 package tests plus 3 convention tests**, style/path
38
- checks, builds, typechecks and the six-package version guard.
39
- - `pnpm smoke:package` passes for all **six tarballs**, including the new runtime
40
- export and declaration checks.
41
- - The comparison package's tests/helpers also pass a separate strict TypeScript
42
- check. Skill YAML metadata, UI metadata and local convention/skill links resolve.
43
- - Before the manual extraction, an AST comparison across 199 changed
44
- JavaScript/TypeScript files found no differences beyond formatting, equivalent
45
- control-flow blocks and separate declarations. The initial formatted baseline
46
- passed all 630 pre-existing tests.
47
- - `git diff --check` passes. A patch Changeset records the delivered refactor and
48
- documentation. No version bump, push, publication or live Penpot write occurred.
49
-
50
- ## Limits
51
-
52
- Biome cannot determine whether a name expresses the right domain meaning or when
53
- responsibilities deserve separate modules; the skill and review cover those
54
- decisions. Raw async plugin bodies, JavaScript inside strings, generated artifacts
55
- and captured fixtures retain the handling described in the [conventions index](README.md).
56
- This update does not constitute new live Penpot or browser acceptance. The
57
- [existing pending acceptance](../plans/tradient-feedback-review.md#remaining-acceptance)
58
- stays open.
59
-
60
- ## Vertical spacing correction
61
-
62
- - [x] Separate declarations and individual steps in the component pilot module.
63
- - [x] Clarify that Biome retains author-supplied blank lines but does not insert
64
- the separation required by the conventions.
65
-
66
- Resolved: `packages/marwes-ui/src/components.ts` passed Biome while remaining
67
- visually dense. The file now has blank lines between its contracts, functions,
68
- guards and work steps. The diff contains only added blank lines, and Biome keeps
69
- them. `pnpm check:style` and all three existing component tests pass. No behavior
70
- changed; the full suite was not rerun for this whitespace-only follow-up.
71
-
72
- Automatic vertical-spacing enforcement remains outside the current Biome checks;
73
- the conventions and code review require it explicitly.
@@ -1 +0,0 @@
1
- {"version":"3.2.4","results":[[":templates/conventions.test.ts",{"duration":5.28132800000003,"failed":false}]]}
@@ -1,217 +0,0 @@
1
- {
2
- "schemaVersion": 1,
3
- "date": "2026-10-22",
4
- "browser": "148.0.7778.96",
5
- "kind": "local-browser-plumbing-trial",
6
- "approvedDesignTrial": false,
7
- "cases": [
8
- {
9
- "id": "1280-light-loaded",
10
- "complete": true,
11
- "diffPixelRatio": 0,
12
- "clip": {
13
- "x": 0,
14
- "y": 64,
15
- "width": 1280,
16
- "height": 720
17
- },
18
- "fonts": [
19
- {
20
- "family": "Fixture",
21
- "weight": "400",
22
- "style": "normal",
23
- "status": "loaded"
24
- }
25
- ],
26
- "hoveredControls": 0,
27
- "occlusion": {
28
- "samples": 5,
29
- "blocked": 0
30
- }
31
- },
32
- {
33
- "id": "1280-light-empty",
34
- "complete": true,
35
- "diffPixelRatio": 0,
36
- "clip": {
37
- "x": 0,
38
- "y": 64,
39
- "width": 1280,
40
- "height": 720
41
- },
42
- "fonts": [
43
- {
44
- "family": "Fixture",
45
- "weight": "400",
46
- "style": "normal",
47
- "status": "loaded"
48
- }
49
- ],
50
- "hoveredControls": 0,
51
- "occlusion": {
52
- "samples": 5,
53
- "blocked": 0
54
- }
55
- },
56
- {
57
- "id": "1280-dark-loaded",
58
- "complete": true,
59
- "diffPixelRatio": 0,
60
- "clip": {
61
- "x": 0,
62
- "y": 64,
63
- "width": 1280,
64
- "height": 720
65
- },
66
- "fonts": [
67
- {
68
- "family": "Fixture",
69
- "weight": "400",
70
- "style": "normal",
71
- "status": "loaded"
72
- }
73
- ],
74
- "hoveredControls": 0,
75
- "occlusion": {
76
- "samples": 5,
77
- "blocked": 0
78
- }
79
- },
80
- {
81
- "id": "1280-dark-empty",
82
- "complete": true,
83
- "diffPixelRatio": 0,
84
- "clip": {
85
- "x": 0,
86
- "y": 64,
87
- "width": 1280,
88
- "height": 720
89
- },
90
- "fonts": [
91
- {
92
- "family": "Fixture",
93
- "weight": "400",
94
- "style": "normal",
95
- "status": "loaded"
96
- }
97
- ],
98
- "hoveredControls": 0,
99
- "occlusion": {
100
- "samples": 5,
101
- "blocked": 0
102
- }
103
- },
104
- {
105
- "id": "390-light-loaded",
106
- "complete": true,
107
- "diffPixelRatio": 0,
108
- "clip": {
109
- "x": 0,
110
- "y": 64,
111
- "width": 390,
112
- "height": 844
113
- },
114
- "fonts": [
115
- {
116
- "family": "Fixture",
117
- "weight": "400",
118
- "style": "normal",
119
- "status": "loaded"
120
- }
121
- ],
122
- "hoveredControls": 0,
123
- "occlusion": {
124
- "samples": 5,
125
- "blocked": 0
126
- }
127
- },
128
- {
129
- "id": "390-light-empty",
130
- "complete": true,
131
- "diffPixelRatio": 0,
132
- "clip": {
133
- "x": 0,
134
- "y": 64,
135
- "width": 390,
136
- "height": 844
137
- },
138
- "fonts": [
139
- {
140
- "family": "Fixture",
141
- "weight": "400",
142
- "style": "normal",
143
- "status": "loaded"
144
- }
145
- ],
146
- "hoveredControls": 0,
147
- "occlusion": {
148
- "samples": 5,
149
- "blocked": 0
150
- }
151
- },
152
- {
153
- "id": "390-dark-loaded",
154
- "complete": true,
155
- "diffPixelRatio": 0,
156
- "clip": {
157
- "x": 0,
158
- "y": 64,
159
- "width": 390,
160
- "height": 844
161
- },
162
- "fonts": [
163
- {
164
- "family": "Fixture",
165
- "weight": "400",
166
- "style": "normal",
167
- "status": "loaded"
168
- }
169
- ],
170
- "hoveredControls": 0,
171
- "occlusion": {
172
- "samples": 5,
173
- "blocked": 0
174
- }
175
- },
176
- {
177
- "id": "390-dark-empty",
178
- "complete": true,
179
- "diffPixelRatio": 0,
180
- "clip": {
181
- "x": 0,
182
- "y": 64,
183
- "width": 390,
184
- "height": 844
185
- },
186
- "fonts": [
187
- {
188
- "family": "Fixture",
189
- "weight": "400",
190
- "style": "normal",
191
- "status": "loaded"
192
- }
193
- ],
194
- "hoveredControls": 0,
195
- "occlusion": {
196
- "samples": 5,
197
- "blocked": 0
198
- }
199
- }
200
- ],
201
- "negativeCases": [
202
- "wrong theme",
203
- "missing face",
204
- "missing weight",
205
- "scale mismatch",
206
- "hover contamination",
207
- "sticky shell occlusion"
208
- ],
209
- "delayedFontCase": "passed",
210
- "baselineBytesPreserved": true,
211
- "verdict": "owner-review-required",
212
- "limitations": [
213
- "Synthetic unapproved browser references; no Penpot target authorized",
214
- "Occlusion is sampled; visual inspection remains necessary",
215
- "MCP could not import local modules; tested provider using bundled Playwright and cached Chromium"
216
- ]
217
- }
@@ -1,12 +0,0 @@
1
- # Adoption feedback baseline
2
-
3
- Source: owner-supplied `feedback-0.2.0-2026-10-22.md`, consumer trial dated 2026-10-22. Installed Penpair 0.1.3 → 0.2.0; hosted plugin API 2.18.4. Repository baseline: `57f9782`, pnpm 10.12.1, TypeScript 5.6.3, Vitest 3.2.4. The consumer used Codex; its exact model/build and browser version were not recorded here and remain unknown.
4
-
5
- Portable reproductions execute real plugin bodies against minimal objects, with no copied consumer runners, logs, endpoints or private journals:
6
-
7
- - `packages/core/test/feedback-repro.test.ts`: idle native wait failure despite stable geometry; deferred revision during inspection (lease save and external edit both refuse); delayed page navigation. Initially expected failures identify the fixes still required.
8
- - `packages/marwes-ui/test/migration.test.ts`: identical values with legacy metadata/hash still produce an unexplained stale snapshot.
9
-
10
- Confirmed: native failure blocks fallback, metadata staleness lacks an explanation, a single page-switch delay is insufficient in the synthetic delayed editor. Unproven: the hosted lease/save race and the root cause of the consumer's multi-page failure. Synthetic reproduction is not live causal evidence.
11
-
12
- Copy `feedback-scratch.template.json` only after an owner confirms a disposable file. Fill public IDs from inspection; `null` values are deliberately not executable. Keep the personal MCP key outside this manifest. Before any write, inspect, pin a snapshot, apply once, independently read back and look at two exports. Repeat and change one heading; compare IDs, bindings and preservation fields.
@@ -1,9 +0,0 @@
1
- {
2
- "schemaVersion": 1,
3
- "authorized": false,
4
- "fileId": null,
5
- "pages": [{ "role": "build", "id": null }, { "role": "preservation", "id": null }],
6
- "build": { "ownedPrefix": "penpair-feedback/", "flex": true, "text": true, "tokenBindings": ["typography", "fill", "rowGap"] },
7
- "preserve": ["unrelated shape IDs and values", "token definitions and order", "global theme selections", "original visible page"],
8
- "cases": ["desktop/light/loaded", "desktop/light/empty", "desktop/dark/loaded", "desktop/dark/empty", "mobile/light/loaded", "mobile/light/empty", "mobile/dark/loaded", "mobile/dark/empty"]
9
- }