@penpair/web 0.3.1 → 0.3.4
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 +82 -43
- package/docs/backup.md +6 -1
- package/docs/conventions/README.md +2 -4
- package/docs/coverage.md +14 -0
- package/docs/design-workflow.md +4 -1
- package/docs/getting-started.md +40 -20
- package/docs/guide.md +15 -8
- package/docs/installation.md +67 -0
- package/docs/marwes-components.md +1 -1
- package/docs/releasing.md +7 -3
- package/docs/skill-installation.md +58 -2
- package/docs/skill-validation.md +22 -23
- package/docs/validation.md +68 -0
- package/package.json +2 -2
- package/docs/branch-review.md +0 -59
- package/docs/conventions/completion-2026-10-22.md +0 -73
- package/docs/conventions/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
- package/docs/fixtures/browser-capture-2026-10-22.json +0 -217
- package/docs/fixtures/feedback-reproductions.md +0 -12
- package/docs/fixtures/feedback-scratch.template.json +0 -9
- package/docs/improvements.md +0 -1217
- package/docs/plans/registry-polling-fix.md +0 -101
- package/docs/plans/skill-workflow-readiness.md +0 -178
- package/docs/plans/tradient-feedback-0.2.0.md +0 -209
- package/docs/plans/tradient-feedback-review.md +0 -83
- package/docs/pr-improvements.md +0 -57
- package/docs/tradient-followups.md +0 -77
- package/docs/trials/report-template.json +0 -76
- package/docs/trials.md +0 -41
- package/docs/upstream/marwes-1.11.0-evidence.json +0 -15
- package/docs/upstream/marwes-requests.md +0 -35
package/docs/skill-validation.md
CHANGED
|
@@ -1,27 +1,33 @@
|
|
|
1
1
|
# Validate skill discovery and behavior
|
|
2
2
|
|
|
3
3
|
Installation, selection, workflow application, browser evidence and owner
|
|
4
|
-
acceptance are separate checks.
|
|
4
|
+
acceptance are separate checks. A host can load a skill without showing the
|
|
5
5
|
selection in the way a person expects, and can read a skill but underapply it.
|
|
6
6
|
|
|
7
7
|
## Offline discovery
|
|
8
8
|
|
|
9
9
|
```sh
|
|
10
|
-
pnpm exec penpair skills check --json
|
|
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
|
|
11
13
|
pnpm exec penpair skills check --only penpair-verify --agents AGENTS.md --json
|
|
12
14
|
```
|
|
13
15
|
|
|
14
16
|
Exit 0 means the selected bundled skills have valid discoverable entrypoints,
|
|
15
|
-
|
|
17
|
+
an enabled host invocation policy where evaluated, resolvable local entrypoint resources and matching
|
|
16
18
|
links in the installer-owned task routes. Exit 3 means readiness is incomplete;
|
|
17
19
|
exit 1 indicates invalid arguments or an execution/configuration error. `--only`
|
|
18
20
|
can be repeated. Default selection is all bundled skills; partial installs should
|
|
19
21
|
select their intended subset explicitly.
|
|
20
22
|
|
|
21
23
|
The report distinguishes entrypoints matching the bundle from valid local
|
|
22
|
-
customizations. Different independent installed copies require review.
|
|
24
|
+
customizations. Different independent installed copies require review. For Codex, missing
|
|
23
25
|
optional `agents/openai.yaml` means implicit invocation is allowed by default;
|
|
24
|
-
an explicit false policy leaves explicit invocation available.
|
|
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
|
|
25
31
|
bounded regular project files, follows in-project links and refuses escapes.
|
|
26
32
|
It does not load adapters/providers, connect to Penpot, read credentials, write
|
|
27
33
|
repairs or inspect global agent settings.
|
|
@@ -34,7 +40,7 @@ override owner choices or silently enable disabled skills.
|
|
|
34
40
|
|
|
35
41
|
## Realistic invocation trials
|
|
36
42
|
|
|
37
|
-
Run these in fresh Codex sessions in an authorized disposable consumer project.
|
|
43
|
+
Run these separately in fresh Claude Code, Copilot and Codex sessions in an authorized disposable consumer project.
|
|
38
44
|
Do not append skill names to the natural request. Supply actual reference IDs,
|
|
39
45
|
images, approved scope and case files where the task needs them. For a negative
|
|
40
46
|
case, keep Penpot/provider work out of scope. Each trial uses the same fixture and
|
|
@@ -42,6 +48,9 @@ records the actual outcome, including missing skills or unavailable tools.
|
|
|
42
48
|
|
|
43
49
|
| Natural request | Expected primary skill | Observable result |
|
|
44
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. |
|
|
45
54
|
| Connect this project to Penpot; doctor cannot reach the editor. | penpair-setup | Diagnose the failed check; preserve personal credentials. |
|
|
46
55
|
| Inspect this Penpot frame and export its current design. | penpair-design | Pinned target, complete inspection and actual export. |
|
|
47
56
|
| Create an empty state from this approved Penpot screen. | penpair-recipes | Source evidence, declared regions, representative candidate and critique before expansion. |
|
|
@@ -56,7 +65,7 @@ For each case retain: request/context, visible skill catalog if available, actua
|
|
|
56
65
|
SKILL.md reads, selection announcement, relevant output/checkpoint, command
|
|
57
66
|
results and missing evidence. Record correct selection and correct application
|
|
58
67
|
separately. A badge, a stated intention, a keyword match or valid YAML proves
|
|
59
|
-
neither. If natural selection fails, repeat with explicit `$skill-name` to
|
|
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
|
|
60
69
|
distinguish discovery/selection from problems following the workflow. Record the
|
|
61
70
|
installed skill version; compare before/after under the same conditions.
|
|
62
71
|
|
|
@@ -65,22 +74,12 @@ selection; authorized scratch trials establish mutation and visual behavior.
|
|
|
65
74
|
Missing tools, design references, browser providers or owner approval remain
|
|
66
75
|
pending instead of simulated success.
|
|
67
76
|
|
|
68
|
-
##
|
|
77
|
+
## Retain the observed results
|
|
69
78
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
performance. No raw private conversation logs are copied into the repository.
|
|
75
|
-
- Automated tests cover successful and partial discovery, nested links, absent
|
|
76
|
-
files, malformed/oversized metadata, dangling/external links, conflicting copies,
|
|
77
|
-
preserved customization, disabled policy, missing resources and stale routing.
|
|
78
|
-
CLI results retain versioned envelopes and extension code remains unexecuted.
|
|
79
|
-
- [ ] Fresh-session trials of the changed skill pack: pending.
|
|
80
|
-
- [ ] Authorized live variant critique and real consumer browser comparison:
|
|
81
|
-
pending by owner instruction.
|
|
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).
|
|
82
83
|
|
|
83
|
-
|
|
84
|
-
completed implementation, commands and remaining acceptance work. See
|
|
85
|
-
[official Codex skill documentation](https://developers.openai.com/codex/skills/)
|
|
84
|
+
See [official Codex skill documentation](https://developers.openai.com/codex/skills/)
|
|
86
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.
|
|
3
|
+
"version": "0.3.4",
|
|
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.
|
|
51
|
+
"@penpair/core": "0.3.4"
|
|
52
52
|
},
|
|
53
53
|
"scripts": {
|
|
54
54
|
"build": "tsc -p tsconfig.json",
|
package/docs/branch-review.md
DELETED
|
@@ -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":3.757374000000027,"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
|
-
}
|