@topy-ai/maggie 0.7.23 → 0.7.25

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 CHANGED
@@ -60,6 +60,10 @@ Maggie keeps the existing project foundation and asks for decisions before
60
60
  shared routes, analytics, or publishing boundaries change. The current
61
61
  package ships 19 installable skills and a local-first MaggieDash foundation.
62
62
 
63
+ The current release is `0.7.25`. It adds a host-owned mobile app surface
64
+ contract (`maggie design app-init`/`app-validate`), direct Astro route
65
+ resolution, correlated feedback batches, and runtime package-version capture.
66
+
63
67
  For repeatable browser QA, create a project-owned scenario manifest and record
64
68
  the test, fix, and retest lifecycle:
65
69
 
@@ -87,7 +91,9 @@ maggie qa assertion-audit --project . \
87
91
 
88
92
  For a dialog or drawer, include a browser-runtime `scroll-owner-count` check
89
93
  with `expected: 1`. This catches the fixed-shell plus inner-content double
90
- scrollbar that static class checks can miss.
94
+ scrollbar that static class checks can miss. For icon controls, use
95
+ `icon-rendered` with a visible glyph, positive width/height, and an accessible
96
+ label; this catches a missing runtime glyph that build/typecheck cannot see.
91
97
 
92
98
  Dashboard and documentation audits are provider-neutral and keep host data
93
99
  behind explicit evidence files:
@@ -211,10 +217,10 @@ maggie design ... # authorized interior-page design
211
217
  maggie clone-to-template ... # URL → validated marketplace template
212
218
  maggie marketplace ... # catalog and on-demand template workflow
213
219
  maggie memory ... # confirmed preferences and lessons
214
- maggie feedback ... # redact, preview, submit, list
220
+ maggie feedback ... # redact, preview, batch, submit, list
215
221
  maggie qa ... # scenario browser QA, fix/retest, release gate
216
222
  maggie localization ... # plan, validate, review, publish, stale
217
- maggie service ... # import, sync/report, catalogue, lifecycle, validate
223
+ maggie service ... # import, sync/report, catalogue, lifecycle, validate
218
224
  maggie seo performance ... # sampled PageSpeed/CWV report and baseline
219
225
  maggie seo images ... # inventory, variants, confirmation, validate
220
226
  maggie seo sitemap ... # typed/semantic plan, agent-files, apply, rollback
@@ -224,6 +230,7 @@ maggie seo head-tags ... # rendered-shell head metadata drift audit
224
230
  maggie ops favicon-check ... # served favicon behaviour check
225
231
  maggie deployment | migration | release | analytics | schedule
226
232
  maggie deployment readiness --project PATH
233
+ maggie deployment parity --project PATH --evidence FILE --output FILE
227
234
  maggie migration identity --identity-file FILE [--expected-file FILE]
228
235
  maggie deployment canary --asset URL=SHA256 --render-report report.json
229
236
  maggie design icon-inventory --source-dir src --runtime assets/icons.css
@@ -298,6 +305,11 @@ maggie design icon-inventory --project . --source-dir src \
298
305
  --runtime public/assets/icons.css --output docs/icon-inventory.json
299
306
  ```
300
307
 
308
+ The inventory covers compound selectors such as `.ph.ph-arrow-square-out`
309
+ and is only static name coverage. Pair changed icon controls with a
310
+ browser-runtime `icon-rendered` assertion so the host adapter proves that the
311
+ glyph is visible, has positive dimensions, and has an accessible label.
312
+
301
313
  After deployment, compare an immutable asset fingerprint and validate the
302
314
  browser adapter's rendered report:
303
315
 
@@ -312,8 +324,23 @@ The canary report requires a screenshot and zero console errors, missing
312
324
  assets, and visual placeholders for every route. It records safe cache headers
313
325
  only and never stores response bodies, cookies, or credentials.
314
326
 
327
+ When workers, migrations, browser drivers, import jobs, or route APIs are part
328
+ of the deployment, validate their sanitized parity evidence before the canary:
329
+
330
+ ```bash
331
+ maggie deployment parity --project . \
332
+ --evidence .maggie/verification/runtime-parity-input.json \
333
+ --output .maggie/verification/runtime-parity.json
334
+ ```
335
+
336
+ The parity contract checks required worker configuration, migration
337
+ privileges, route API status, stale resident processes, source-job IDs, and
338
+ browser/driver compatibility. Add the resulting report to readiness with
339
+ `--runtime-parity`; a failed report blocks the gate.
340
+
315
341
  Unit regression does not establish runtime release readiness. Produce unit
316
- evidence and then validate all five release evidence slots:
342
+ evidence and then validate all required release evidence slots; add
343
+ `--runtime-parity` when the deployment uses the worker/browser surfaces above:
317
344
 
318
345
  ```bash
319
346
  python3 tools/tests/run_regression.py \
@@ -323,13 +350,27 @@ maggie deployment readiness --project . \
323
350
  --browser-report .maggie/verification/browser-evidence.json \
324
351
  --rendered-canary .maggie/deployment-canary.json \
325
352
  --deployment-preflight .maggie/release-preflight.json \
353
+ --runtime-parity .maggie/verification/runtime-parity.json \
326
354
  --output .maggie/deployment-readiness.json
327
355
  ```
328
356
 
329
357
  The readiness report follows `maggie-deployment-readiness.v1`. It reports unit
330
358
  regression, package smoke, host browser evidence, rendered canary, and
331
359
  deployment preflight separately. Missing host adapter evidence is
332
- `inconclusive`; only five passing slots produce `passed`.
360
+ `inconclusive`; only all configured slots produce `passed`.
361
+
362
+ For service-booking hosts, validate independent import, local-search, and
363
+ website-research jobs before public generation:
364
+
365
+ ```bash
366
+ maggie service orchestration-validate --project . \
367
+ --manifest .maggie/booking/onboarding-orchestration.json \
368
+ --output docs/service-onboarding-orchestration.json
369
+ ```
370
+
371
+ The contract requires unique idempotency keys, bounded retry history, pollable
372
+ status references, and disjoint field ownership so one onboarding workflow
373
+ cannot overwrite another.
333
374
 
334
375
  ### Localization and analytics release gates
335
376
 
@@ -356,8 +397,8 @@ artifact schemas.
356
397
  Recommended upgrade sequence for the current release:
357
398
 
358
399
  ```bash
359
- npx @topy-ai/maggie@0.7.23 update --project . --force
360
- npx @topy-ai/maggie@0.7.23 cleanup --project .
400
+ npx @topy-ai/maggie@0.7.25 update --project . --force
401
+ npx @topy-ai/maggie@0.7.25 cleanup --project .
361
402
  ```
362
403
 
363
404
  Maintainers should pass npm credentials through the repository helper, never
@@ -367,7 +408,12 @@ as a command-line argument:
367
408
  node scripts/publish-npm.mjs --maggie-env-file ../.env
368
409
  ```
369
410
 
370
- The 0.7.23 workflow adds the single-scroll-owner MaggieDash modal primitive,
411
+ The 0.7.25 workflow adds host-owned mobile app surface plans with signed-in
412
+ camera-state QA, direct `.astro` route resolution, correlated feedback batch
413
+ drafts, and runtime package-version precedence. The 0.7.24 workflow adds
414
+ browser-runtime `icon-rendered` assertions, sanitized
415
+ worker/browser parity preflight evidence, and the provider-neutral asynchronous
416
+ service-onboarding contract. The 0.7.23 workflow adds the single-scroll-owner MaggieDash modal primitive,
371
417
  server-runtime-only auth/provider configuration guidance, best-effort optional
372
418
  identity-mirror semantics, and `scroll-owner-count` browser QA evidence. The
373
419
  0.7.22 workflow adds provider-catalogue authority checks, field/variant
@@ -514,6 +560,15 @@ maggie feedback submit .maggie/feedback/<feedback-id>.json \
514
560
  --endpoint https://feedback.noblox.app/api/feedback --confirm
515
561
  ```
516
562
 
563
+ For related observations, create 1–50 local drafts with shared correlation
564
+ metadata and review them before submitting:
565
+
566
+ ```bash
567
+ maggie feedback batch --project . --batch-file ./feedback-batch.json
568
+ ```
569
+
570
+ The batch command never submits automatically or writes active memory.
571
+
517
572
  Submission is never implicit. Project paths, source files, logs, and secrets
518
573
  are excluded by default. The hosted endpoint stores the normalized feedback in
519
574
  NoBlox for maintainer review; it does not automatically create a GitHub Issue.
package/README.zh-TW.md CHANGED
@@ -8,7 +8,7 @@ Codex、Claude Code 與相容的 coding agents。
8
8
  ## 安裝
9
9
 
10
10
  ```bash
11
- npx @topy-ai/maggie@0.7.23 init --agent all
11
+ npx @topy-ai/maggie@0.7.25 init --agent all
12
12
  npx @topy-ai/maggie doctor --project .
13
13
  ```
14
14
 
@@ -25,6 +25,12 @@ maggie doctor --project . --require-bootstrap --strict
25
25
  deployment、memory、feedback 和 MaggieDash。內容先 draft/review,外部寫入、
26
26
  publish 與 production deployment 需要明確確認。
27
27
 
28
+ 目前 release 是 `0.7.25`,加入 host-owned mobile app surface contract、signed-in
29
+ camera-state QA、直接 Astro route resolution、correlated feedback batch,以及
30
+ runtime package version capture。
31
+
32
+ 0.7.24 加入 `icon-rendered` browser QA assertion、worker/browser deployment parity
33
+ preflight,以及 import/search/research 的非同步 service onboarding contract。
28
34
  0.7.23 加入 dashboard dialog 單一 scroll owner、server runtime-only auth/provider
29
35
  設定規則、optional identity mirror 的 best-effort 邊界,以及 QA 的
30
36
  `scroll-owner-count` browser evidence。0.7.22 加入 provider catalogue authority check、field/variant sync report、
package/bin/maggie.js CHANGED
@@ -88,6 +88,8 @@ Usage:
88
88
  maggie design reference-ui --project PATH --reference PATH --surface blog,service --confirm
89
89
  maggie design init --project PATH --surface blog|service --reference-run PATH --confirm
90
90
  maggie design validate-ui --project PATH --plan PATH --rendered-dir PATH --confirm
91
+ maggie design app-init --project PATH --route /app/valuation --auth-mode email-password --confirm
92
+ maggie design app-validate --project PATH --plan PATH --runtime-evidence FILE --rendered-dir PATH --confirm
91
93
  maggie design icon-inventory --project PATH --source-dir src --runtime assets/icons.css --output docs/icon-inventory.json
92
94
  maggie design author --project PATH --route /about --purpose TEXT --audience TEXT --confirm
93
95
  maggie design in-place --project PATH --route /pricing [--content-source PATH]
@@ -108,10 +110,12 @@ Usage:
108
110
  maggie service validate --project PATH
109
111
  maggie service inspect --project PATH
110
112
  maggie service status --project PATH
113
+ maggie service orchestration-validate --project PATH --manifest FILE
111
114
  maggie service convert-page <page-path> --project PATH
112
115
  maggie service match-pages --project PATH --pages-dir src/pages
113
116
  maggie deployment --project PATH --target vps-with-cloudflare-dns
114
117
  maggie deployment readiness --project PATH
118
+ maggie deployment parity --project PATH --evidence FILE --output FILE
115
119
  maggie deployment canary --project PATH --asset URL=SHA256 --render-report report.json --output docs/deployment-canary.json
116
120
  maggie migration --project PATH --environment staging
117
121
  maggie migration identity --identity-file FILE [--expected-file FILE]
@@ -301,7 +305,8 @@ function marketplace(args) {
301
305
 
302
306
  function service(args) {
303
307
  const root = projectRoot(args);
304
- const script = join(root, "tools", "clis", "maggie_service_booking.py");
308
+ const scriptName = args[0] === "orchestration-validate" ? "maggie_service_onboarding.py" : "maggie_service_booking.py";
309
+ const script = join(root, "tools", "clis", scriptName);
305
310
  if (!existsSync(script)) throw new Error(`service booking CLI is missing: ${script}`);
306
311
  const result = spawnSync("python3", [script, ...args], { stdio: "inherit", cwd: root, env: { ...process.env, MAGGIE_VERSION: PACKAGE_VERSION } });
307
312
  if (result.error) throw result.error;
@@ -324,7 +329,8 @@ function workflowCli(name, args) {
324
329
  const root = projectRoot(args);
325
330
  const script = join(root, "tools", "clis", name);
326
331
  if (!existsSync(script)) throw new Error(`${name} is missing: ${script}`);
327
- const result = spawnSync("python3", [script, ...args], { stdio: "inherit", cwd: root });
332
+ const env = name === "maggie_feedback.py" ? { ...process.env, MAGGIE_VERSION: PACKAGE_VERSION } : process.env;
333
+ const result = spawnSync("python3", [script, ...args], { stdio: "inherit", cwd: root, env });
328
334
  if (result.error) throw result.error;
329
335
  process.exitCode = result.status ?? 1;
330
336
  }
@@ -413,6 +419,7 @@ try {
413
419
  else if (command === "ops") workflowCli("maggie_ops.py", args);
414
420
  else if (command === "deployment" && args[0] === "canary") workflowCli("maggie_deployment_canary.py", args.slice(1));
415
421
  else if (command === "deployment" && args[0] === "readiness") workflowCli("maggie_deployment_readiness.py", args.slice(1));
422
+ else if (command === "deployment" && args[0] === "parity") workflowCli("maggie_deployment_parity.py", args.slice(1));
416
423
  else if (command === "deployment") workflowCli("maggie_deployment.py", args);
417
424
  else if (command === "migration") workflowCli("maggie_migration.py", args);
418
425
  else if (command === "schedule") workflowCli("maggie_schedule.py", args);
@@ -16,7 +16,8 @@
16
16
  "packageSmoke": {"$ref": "#/$defs/check"},
17
17
  "browserEvidence": {"$ref": "#/$defs/check"},
18
18
  "renderedCanary": {"$ref": "#/$defs/check"},
19
- "deploymentPreflight": {"$ref": "#/$defs/check"}
19
+ "deploymentPreflight": {"$ref": "#/$defs/check"},
20
+ "runtimeParity": {"$ref": "#/$defs/check"}
20
21
  }
21
22
  }
22
23
  },
@@ -0,0 +1,38 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://maggie.noblox.app/contracts/deployment-runtime-parity-v1.json",
4
+ "title": "Maggie deployment worker and browser runtime parity evidence",
5
+ "type": "object",
6
+ "required": ["schemaVersion", "environment", "passed", "worker", "browser"],
7
+ "properties": {
8
+ "schemaVersion": {"const": "maggie-deployment-runtime-parity.v1"},
9
+ "environment": {"enum": ["development", "staging", "production"]},
10
+ "passed": {"const": true},
11
+ "worker": {
12
+ "type": "object",
13
+ "required": ["config", "migration", "routeApis", "residentProcesses", "sourceJobs"],
14
+ "properties": {
15
+ "config": {"$ref": "#/$defs/config"},
16
+ "migration": {"type": "object", "required": ["privilegeCheck"], "properties": {"privilegeCheck": {"$ref": "#/$defs/passed"}}},
17
+ "routeApis": {"type": "array", "minItems": 1, "items": {"$ref": "#/$defs/route"}},
18
+ "residentProcesses": {"$ref": "#/$defs/processes"},
19
+ "sourceJobs": {"type": "array", "items": {"$ref": "#/$defs/job"}}
20
+ },
21
+ "additionalProperties": true
22
+ },
23
+ "browser": {
24
+ "type": "object",
25
+ "required": ["browserVersion", "driverVersion", "compatible"],
26
+ "properties": {"browserVersion": {"type": "string", "minLength": 1}, "driverVersion": {"type": "string", "minLength": 1}, "compatible": {"const": true}},
27
+ "additionalProperties": true
28
+ }
29
+ },
30
+ "$defs": {
31
+ "passed": {"type": "object", "required": ["passed"], "properties": {"passed": {"const": true}}, "additionalProperties": true},
32
+ "config": {"type": "object", "required": ["required", "missing", "passed"], "properties": {"required": {"type": "array", "minItems": 1, "items": {"type": "string", "minLength": 1}}, "missing": {"type": "array", "maxItems": 0}, "passed": {"const": true}}, "additionalProperties": true},
33
+ "route": {"type": "object", "required": ["method", "path", "status", "passed"], "properties": {"method": {"type": "string"}, "path": {"type": "string", "pattern": "^/"}, "status": {"type": "integer", "minimum": 200, "maximum": 399}, "passed": {"const": true}}, "additionalProperties": true},
34
+ "processes": {"type": "object", "required": ["checked", "unexpected", "stale", "passed"], "properties": {"checked": {"const": true}, "unexpected": {"type": "array", "maxItems": 0}, "stale": {"type": "array", "maxItems": 0}, "passed": {"const": true}}, "additionalProperties": true},
35
+ "job": {"type": "object", "required": ["jobId", "passed"], "properties": {"jobId": {"type": "string", "minLength": 1}, "passed": {"const": true}}, "additionalProperties": true}
36
+ },
37
+ "additionalProperties": true
38
+ }
@@ -0,0 +1,99 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/TOPY-AI-LTD/ai-cmo-skills/blob/main/contracts/maggie-design/mobile-app-surface-v1.schema.json",
4
+ "title": "Maggie mobile app surface contract",
5
+ "type": "object",
6
+ "required": [
7
+ "schemaVersion",
8
+ "workflow",
9
+ "mode",
10
+ "route",
11
+ "auth",
12
+ "shell",
13
+ "camera",
14
+ "viewports",
15
+ "requiredSteps",
16
+ "publicWrite"
17
+ ],
18
+ "properties": {
19
+ "schemaVersion": {
20
+ "const": "maggie-mobile-app-surface.v1"
21
+ },
22
+ "workflow": {
23
+ "const": "maggie-design"
24
+ },
25
+ "mode": {
26
+ "const": "app-view-init"
27
+ },
28
+ "route": {
29
+ "type": "string",
30
+ "pattern": "^/"
31
+ },
32
+ "auth": {
33
+ "type": "object",
34
+ "required": ["mode", "required", "credentialPolicy"],
35
+ "properties": {
36
+ "mode": {
37
+ "enum": ["email-password", "existing-session", "none"]
38
+ },
39
+ "required": {
40
+ "type": "boolean"
41
+ },
42
+ "credentialPolicy": {
43
+ "const": "use-host-auth-without-recording-credentials"
44
+ }
45
+ },
46
+ "additionalProperties": true
47
+ },
48
+ "shell": {
49
+ "type": "object",
50
+ "required": ["fixedHeader", "fixedFooter", "oneScrollOwner"],
51
+ "properties": {
52
+ "fixedHeader": {"const": true},
53
+ "fixedFooter": {"const": true},
54
+ "oneScrollOwner": {"const": true}
55
+ },
56
+ "additionalProperties": true
57
+ },
58
+ "camera": {
59
+ "type": "object",
60
+ "required": ["requiredStates", "controls", "fallback"],
61
+ "properties": {
62
+ "requiredStates": {
63
+ "type": "array",
64
+ "contains": {"const": "permission"}
65
+ },
66
+ "controls": {
67
+ "type": "array",
68
+ "minItems": 4
69
+ },
70
+ "fallback": {
71
+ "type": "string",
72
+ "minLength": 1
73
+ }
74
+ },
75
+ "additionalProperties": true
76
+ },
77
+ "viewports": {
78
+ "type": "object",
79
+ "required": ["desktop", "tablet", "mobile"],
80
+ "additionalProperties": {
81
+ "type": "array",
82
+ "prefixItems": [
83
+ {"type": "integer", "minimum": 1},
84
+ {"type": "integer", "minimum": 1}
85
+ ],
86
+ "minItems": 2,
87
+ "maxItems": 2
88
+ }
89
+ },
90
+ "requiredSteps": {
91
+ "type": "array",
92
+ "contains": {"const": "signed-in-browser-qa"}
93
+ },
94
+ "publicWrite": {
95
+ "const": false
96
+ }
97
+ },
98
+ "additionalProperties": true
99
+ }
@@ -0,0 +1,34 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://maggie.noblox.app/contracts/service-onboarding-orchestration-v1.json",
4
+ "title": "Maggie provider-neutral asynchronous service onboarding orchestration",
5
+ "type": "object",
6
+ "required": ["schemaVersion", "workflows", "fieldOwnership"],
7
+ "properties": {
8
+ "schemaVersion": {"const": "maggie-service-onboarding-orchestration.v1"},
9
+ "workflows": {"type": "array", "minItems": 3, "maxItems": 3, "items": {"$ref": "#/$defs/workflow"}},
10
+ "fieldOwnership": {"type": "object", "minProperties": 1, "additionalProperties": {"enum": ["import", "search", "research"]}}
11
+ },
12
+ "$defs": {
13
+ "workflow": {
14
+ "type": "object",
15
+ "required": ["name", "jobId", "idempotencyKey", "state", "history", "attempt", "maxAttempts", "owner", "statusRef", "nextAction", "writes"],
16
+ "properties": {
17
+ "name": {"enum": ["import", "search", "research"]},
18
+ "jobId": {"type": "string", "minLength": 1},
19
+ "idempotencyKey": {"type": "string", "minLength": 1},
20
+ "state": {"enum": ["queued", "running", "succeeded", "failed", "blocked", "cancelled"]},
21
+ "history": {"type": "array", "minItems": 1, "items": {"type": "object", "required": ["state", "at"], "properties": {"state": {"type": "string"}, "at": {"type": "string"}}}},
22
+ "attempt": {"type": "integer", "minimum": 1},
23
+ "maxAttempts": {"type": "integer", "minimum": 1},
24
+ "owner": {"type": "string", "minLength": 1},
25
+ "statusRef": {"type": "string", "minLength": 1},
26
+ "nextAction": {"type": "string", "minLength": 1},
27
+ "writes": {"type": "array", "minItems": 1, "items": {"type": "string", "minLength": 1}},
28
+ "errorCode": {"type": ["string", "null"]}
29
+ },
30
+ "additionalProperties": true
31
+ }
32
+ },
33
+ "additionalProperties": true
34
+ }
@@ -2,7 +2,7 @@
2
2
  name: maggie-deployment
3
3
  description: Deploy and operate Maggie blog projects with Cloudflare Workers as the default target, while preserving an adapter boundary for VPS, GCP, and AWS.
4
4
  metadata:
5
- version: 1.3.0
5
+ version: 1.4.0
6
6
  ---
7
7
 
8
8
  # Maggie Deployment
@@ -37,12 +37,33 @@ visitor-facing files. The canary must include screenshots, zero console or
37
37
  network errors, and zero placeholder matches. Query-driven routes belong in
38
38
  behavior/API checks, not static byte baselines.
39
39
 
40
+ ## Worker/browser runtime parity
41
+
42
+ Before a canary when the release depends on workers, migrations, browser
43
+ automation, import jobs, or route APIs, collect sanitized host-adapter evidence
44
+ and validate it before traffic moves:
45
+
46
+ ```bash
47
+ maggie deployment parity --project . \
48
+ --evidence .maggie/verification/runtime-parity-input.json \
49
+ --output .maggie/verification/runtime-parity.json
50
+ ```
51
+
52
+ The `maggie-deployment-runtime-parity.v1` contract checks required worker
53
+ configuration and missing bindings, migration privileges, route API status,
54
+ stale/unexpected resident import processes, non-empty source-job IDs, and
55
+ browser/driver compatibility. It is provider-neutral: the host adapter runs
56
+ the environment checks and supplies only safe facts; Maggie validates the
57
+ evidence and never receives credentials, cookies, or response bodies. A failed
58
+ parity report blocks the readiness command and therefore the canary.
59
+
40
60
  ## Release readiness evidence
41
61
 
42
62
  Unit regression is necessary but does not prove runtime release readiness. The
43
- readiness command keeps five evidence slots separate: dependency-free unit
44
- regression, package smoke, host browser evidence, rendered canary, and
45
- deployment preflight:
63
+ readiness command keeps five required evidence slots separate: dependency-free
64
+ unit regression, package smoke, host browser evidence, rendered canary, and
65
+ deployment preflight. Add the optional `runtimeParity` slot whenever the
66
+ release uses the worker/browser surfaces described above:
46
67
 
47
68
  ```bash
48
69
  python3 tools/tests/run_regression.py \
@@ -52,12 +73,13 @@ maggie deployment readiness --project . \
52
73
  --browser-report .maggie/verification/browser-evidence.json \
53
74
  --rendered-canary .maggie/deployment-canary.json \
54
75
  --deployment-preflight .maggie/release-preflight.json \
76
+ --runtime-parity .maggie/verification/runtime-parity.json \
55
77
  --output .maggie/deployment-readiness.json
56
78
  ```
57
79
 
58
80
  The report follows `maggie-deployment-readiness.v1`. A failed evidence file
59
81
  returns `failed`; a missing or unavailable host/browser adapter returns
60
- `inconclusive`; only five passing evidence slots return `passed`. Maggie does
82
+ `inconclusive`; only all configured evidence slots return `passed`. Maggie does
61
83
  not fabricate browser, rendered, or deployment evidence and does not deploy
62
84
  from this command. See
63
85
  [`readiness-v1.schema.json`](../../bundled-contracts/maggie-deployment/readiness-v1.schema.json).
@@ -2,7 +2,7 @@
2
2
  name: maggie-design
3
3
  description: Design authorized interior pages, review rendered responsive layouts, or explicitly rebrand a packaged homepage/template. Use rebrand only with a named source brand and target brand.
4
4
  metadata:
5
- version: 1.4.0
5
+ version: 1.6.0
6
6
  ---
7
7
 
8
8
  # Maggie Design
@@ -10,7 +10,7 @@ metadata:
10
10
  ## In-place route evidence
11
11
 
12
12
  `maggie design in-place --project . --route /example` resolves local source
13
- files and falls back to a discovered `[...slug]`/`[[...slug]]` file. A catch-all
13
+ files, including direct `src/pages/<route>.astro` files, and falls back to a discovered `[...slug]`/`[[...slug]]` file. A catch-all
14
14
  is recorded as `resolution: unproven` unless `--content-source` names the
15
15
  actual DB/content resolver. A source candidate is not proof that the concrete
16
16
  URL is served: verify the HTTP response, content identity, and framework route
@@ -55,9 +55,18 @@ Use `missing`, `unknown`, and `coverage` from the versioned
55
55
  name map is reported as evidence only; it must not be treated as proof that a
56
56
  glyph exists. Fix the source token or add the runtime definition before
57
57
  shipping. The inventory compares a scoped runtime icon family (`ph-*`, `fa-*`,
58
- or `lucide-*`), normalizes family prefixes, and ignores inline SVG IDs and font
59
- filename noise. Do not paste private source, URLs with credentials, or user
60
- data into the report.
58
+ or `lucide-*`), including compound CSS selectors such as
59
+ `.ph.ph-arrow-square-out`, normalizes family prefixes, and ignores inline SVG
60
+ IDs and font filename noise. Do not paste private source, URLs with
61
+ credentials, or user data into the report.
62
+
63
+ Inventory is static name coverage, not proof that the browser painted a glyph.
64
+ For every new or changed icon control, pair it with the QA `icon-rendered`
65
+ assertion: the host browser adapter must record a visible glyph, positive
66
+ rendered width and height, and an accessible label. If the runtime font/map
67
+ cannot render the icon, add an approved runtime definition or inline SVG
68
+ fallback and rerun both checks. Never release a source token solely because
69
+ typecheck or build succeeded.
61
70
 
62
71
  ## Automatic memory hook
63
72
 
@@ -193,6 +202,33 @@ semantics from `maggie-blog`. For service UI, preserve provider identity,
193
202
  variants, booking URLs, duplicate canonical/noindex decisions, and service
194
203
  sitemap semantics from `maggie-service-booking`.
195
204
 
205
+ ## Mobile app surfaces
206
+
207
+ Use the app surface contract for camera, scan, inventory, valuation, or other
208
+ authenticated app views. It is a general host contract, not a replacement for
209
+ the project's auth or camera implementation:
210
+
211
+ maggie design app-init --project . --route /app/valuation \
212
+ --auth-mode email-password --confirm
213
+
214
+ The initializer records the fixed header/footer, one-scroll-owner rule,
215
+ camera permission/ready/gallery/scan/unavailable states, decision-critical UI,
216
+ and desktop/tablet/mobile evidence requirements. It never collects credentials
217
+ or copies private project data. Use `existing-session` only when the host
218
+ already supplies a safe signed-in session; use `none` for public app surfaces.
219
+
220
+ After implementation, validate sanitized runtime evidence and screenshots:
221
+
222
+ maggie design app-validate --project . \
223
+ --plan .maggie/design/app-view/app-<id>/plan.json \
224
+ --runtime-evidence ./qa/mobile-app-evidence.json \
225
+ --rendered-dir ./qa/screenshots --confirm
226
+
227
+ The evidence must prove the auth state, fixed shell, exactly one scroll owner,
228
+ all required camera states, and valid PNGs at 390px, 768px, and desktop
229
+ widths. The machine-readable contract is
230
+ [mobile-app-surface-v1.schema.json](../../bundled-contracts/maggie-design/mobile-app-surface-v1.schema.json).
231
+
196
232
  ## Explicit homepage rebrand mode
197
233
 
198
234
  The homepage `review` mode only compares screenshots. It does not rebrand a
@@ -2,7 +2,7 @@
2
2
  name: maggie-feedback
3
3
  description: Collect, review, and explicitly submit privacy-safe feedback about a Maggie skill run, workflow result, bug, or feature request.
4
4
  metadata:
5
- version: 1.0.0
5
+ version: 1.1.0
6
6
  ---
7
7
 
8
8
  # Maggie Feedback
@@ -39,6 +39,41 @@ If a draft is marked fixed with `--fixed` (or the supplied run report says
39
39
  also scrubs common POSIX/home/temp and Windows absolute paths by default while
40
40
  preserving public URLs and route paths.
41
41
 
42
+ The CLI records the executing Maggie package version when it is available from
43
+ the runtime environment or `node_modules/@topy-ai/maggie/package.json`. A
44
+ stale `.maggie/install.json` is only a fallback; conflicting runtime package
45
+ versions fail closed as `unknown`.
46
+
47
+ ## Correlated feedback batches
48
+
49
+ When several observations belong to one workflow run, create bounded drafts
50
+ with one shared correlation ID instead of losing their relationship:
51
+
52
+ maggie feedback batch --project . --batch-file ./feedback-batch.json
53
+
54
+ The batch file contains 1–50 items and may provide shared `skill`, `runId`,
55
+ `phase`, `priority`, and `affectedCli` values. An item can override those
56
+ fields and supplies the normal `type`, `summary`, `expected`, `actual`,
57
+ `errorFingerprint`, reproduction, resolution, validation, and screenshot
58
+ metadata fields. Each generated draft stores only the safe batch ID, zero-based
59
+ index, and bounded size. The batch command still creates local drafts only;
60
+ review each draft and submit explicitly.
61
+
62
+ Example:
63
+
64
+ {
65
+ "batchId": "run-review-001",
66
+ "skill": "maggie-design",
67
+ "runId": "design-001",
68
+ "phase": "post-release-review",
69
+ "priority": "normal",
70
+ "affectedCli": "design",
71
+ "items": [
72
+ {"type": "bug", "summary": "Route evidence is incomplete", "expected": "Direct route resolves", "actual": "Fallback was used"},
73
+ {"type": "feature", "summary": "Need an app-surface QA contract", "expected": "Reusable evidence plan", "actual": "Only public-page rules exist"}
74
+ ]
75
+ }
76
+
42
77
  ## Submit explicitly
43
78
 
44
79
  The CLI never submits automatically. After reviewing the draft:
@@ -2,7 +2,7 @@
2
2
  name: maggie-qa-workflow
3
3
  description: Run scenario-based browser QA with explicit evidence, fix/retest lifecycle, and release-gate decisions for web projects.
4
4
  metadata:
5
- version: 1.1.0
5
+ version: 1.2.0
6
6
  ---
7
7
 
8
8
  # Maggie QA Workflow
@@ -91,10 +91,14 @@ HTTP status evidence, a screenshot/reference, and boolean results for runtime
91
91
  checks such as `text-present`, `text-absent`, `meta`, `link-absent`, or
92
92
  `redirect`. For dialogs and drawers, `scroll-owner-count` records the browser
93
93
  runtime's computed number of intentional scroll owners and must use
94
- `expected: 1`. Source/class/markup-only checks are rejected. The audit stores
95
- assertion IDs and safe pass/fail metadata, never response bodies, credentials,
96
- or cookies. A passing assertion audit complements browser evidence; it does
97
- not replace the host adapter's actual HTTP and screenshot capture.
94
+ `expected: 1`. For an icon control, `icon-rendered` records browser-runtime
95
+ evidence with `actual.visible: true`, positive `actual.width` and
96
+ `actual.height`, and `actual.accessibleLabel: true`; a blank glyph, zero-sized
97
+ glyph, or unlabelled control fails the audit even when build/typecheck passes.
98
+ Source/class/markup-only checks are rejected. The audit stores assertion IDs
99
+ and safe pass/fail metadata, never response bodies, credentials, or cookies. A
100
+ passing assertion audit complements browser evidence; it does not replace the
101
+ host adapter's actual HTTP and screenshot capture.
98
102
 
99
103
  ## Gate and release evidence
100
104