@open-mercato/cli 0.6.8-develop.6984.1.f0cf23f0f6 → 0.6.8-develop.6986.1.3adb0d0df6
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/.turbo/turbo-build.log +11 -1
- package/dist/agentic/guides/module-facts.json +8739 -5654
- package/dist/agentic/guides/module-facts.v2.json +8738 -5653
- package/dist/agentic/guides/modules/ai_assistant/index.md +1 -1
- package/dist/agentic/guides/modules/api_docs/index.md +1 -1
- package/dist/agentic/guides/modules/api_keys/index.md +1 -1
- package/dist/agentic/guides/modules/attachments/index.md +1 -1
- package/dist/agentic/guides/modules/audit_logs/index.md +1 -1
- package/dist/agentic/guides/modules/auth/index.md +1 -1
- package/dist/agentic/guides/modules/business_rules/index.md +1 -1
- package/dist/agentic/guides/modules/catalog/index.md +1 -1
- package/dist/agentic/guides/modules/channel_apns/acl-features.md +12 -0
- package/dist/agentic/guides/modules/channel_apns/contribution-resolutions.md +12 -0
- package/dist/agentic/guides/modules/channel_apns/di-registrations-rich.md +12 -0
- package/dist/agentic/guides/modules/channel_apns/exact-override-targets.md +17 -0
- package/dist/agentic/guides/modules/channel_apns/index.md +18 -0
- package/dist/agentic/guides/modules/channel_apns/owned-contract-module-metadata.md +11 -0
- package/dist/agentic/guides/modules/channel_apns/setup.md +11 -0
- package/dist/agentic/guides/modules/channel_apns/umes-contributions.md +12 -0
- package/dist/agentic/guides/modules/channel_expo/acl-features.md +12 -0
- package/dist/agentic/guides/modules/channel_expo/contribution-resolutions.md +12 -0
- package/dist/agentic/guides/modules/channel_expo/di-registrations-rich.md +12 -0
- package/dist/agentic/guides/modules/channel_expo/exact-override-targets.md +17 -0
- package/dist/agentic/guides/modules/channel_expo/index.md +18 -0
- package/dist/agentic/guides/modules/channel_expo/owned-contract-module-metadata.md +11 -0
- package/dist/agentic/guides/modules/channel_expo/setup.md +11 -0
- package/dist/agentic/guides/modules/channel_expo/umes-contributions.md +12 -0
- package/dist/agentic/guides/modules/channel_fcm/acl-features.md +12 -0
- package/dist/agentic/guides/modules/channel_fcm/contribution-resolutions.md +12 -0
- package/dist/agentic/guides/modules/channel_fcm/di-registrations-rich.md +12 -0
- package/dist/agentic/guides/modules/channel_fcm/exact-override-targets.md +17 -0
- package/dist/agentic/guides/modules/channel_fcm/index.md +18 -0
- package/dist/agentic/guides/modules/channel_fcm/owned-contract-module-metadata.md +11 -0
- package/dist/agentic/guides/modules/channel_fcm/setup.md +11 -0
- package/dist/agentic/guides/modules/channel_fcm/umes-contributions.md +12 -0
- package/dist/agentic/guides/modules/channel_gmail/index.md +1 -1
- package/dist/agentic/guides/modules/channel_imap/index.md +1 -1
- package/dist/agentic/guides/modules/checkout/index.md +1 -1
- package/dist/agentic/guides/modules/communication_channels/acl-features.md +2 -1
- package/dist/agentic/guides/modules/communication_channels/active-extension-bindings.md +1 -0
- package/dist/agentic/guides/modules/communication_channels/domain-commands.md +1 -0
- package/dist/agentic/guides/modules/communication_channels/exact-override-targets.md +1 -0
- package/dist/agentic/guides/modules/communication_channels/incoming-installed-contributions.md +3 -0
- package/dist/agentic/guides/modules/communication_channels/index.md +3 -3
- package/dist/agentic/guides/modules/configs/index.md +1 -1
- package/dist/agentic/guides/modules/content/index.md +1 -1
- package/dist/agentic/guides/modules/currencies/index.md +1 -1
- package/dist/agentic/guides/modules/customer_accounts/index.md +1 -1
- package/dist/agentic/guides/modules/customers/index.md +1 -1
- package/dist/agentic/guides/modules/dashboards/index.md +1 -1
- package/dist/agentic/guides/modules/data_sync/index.md +1 -1
- package/dist/agentic/guides/modules/design_system/index.md +1 -1
- package/dist/agentic/guides/modules/devices/acl-features.md +13 -0
- package/dist/agentic/guides/modules/devices/active-extension-bindings.md +11 -0
- package/dist/agentic/guides/modules/devices/backend-pages.md +13 -0
- package/dist/agentic/guides/modules/devices/di-registrations-rich.md +11 -0
- package/dist/agentic/guides/modules/devices/domain-commands.md +13 -0
- package/dist/agentic/guides/modules/devices/encryption.md +11 -0
- package/dist/agentic/guides/modules/devices/entities.md +11 -0
- package/dist/agentic/guides/modules/devices/events.md +15 -0
- package/dist/agentic/guides/modules/devices/exact-override-targets.md +19 -0
- package/dist/agentic/guides/modules/devices/host-extension-points.md +10 -0
- package/dist/agentic/guides/modules/devices/index.md +24 -0
- package/dist/agentic/guides/modules/devices/owned-contract-module-metadata.md +11 -0
- package/dist/agentic/guides/modules/devices/setup.md +11 -0
- package/dist/agentic/guides/modules/devices/umes-hosts.md +17 -0
- package/dist/agentic/guides/modules/dictionaries/index.md +1 -1
- package/dist/agentic/guides/modules/directory/index.md +1 -1
- package/dist/agentic/guides/modules/entities/index.md +1 -1
- package/dist/agentic/guides/modules/eudr/index.md +1 -1
- package/dist/agentic/guides/modules/events/index.md +1 -1
- package/dist/agentic/guides/modules/feature_toggles/index.md +1 -1
- package/dist/agentic/guides/modules/gateway_stripe/index.md +1 -1
- package/dist/agentic/guides/modules/generators/index.md +1 -1
- package/dist/agentic/guides/modules/inbox_ops/index.md +1 -1
- package/dist/agentic/guides/modules/integrations/index.md +1 -1
- package/dist/agentic/guides/modules/messages/index.md +1 -1
- package/dist/agentic/guides/modules/notifications/acl-features.md +3 -1
- package/dist/agentic/guides/modules/notifications/backend-pages.md +2 -0
- package/dist/agentic/guides/modules/notifications/contribution-resolutions.md +11 -0
- package/dist/agentic/guides/modules/notifications/di-registrations-rich.md +2 -1
- package/dist/agentic/guides/modules/notifications/di-service-tokens.md +2 -1
- package/dist/agentic/guides/modules/notifications/entities.md +3 -0
- package/dist/agentic/guides/modules/notifications/exact-override-targets.md +9 -2
- package/dist/agentic/guides/modules/notifications/generator-plugins.md +12 -0
- package/dist/agentic/guides/modules/notifications/index.md +8 -5
- package/dist/agentic/guides/modules/notifications/setup.md +1 -1
- package/dist/agentic/guides/modules/notifications/umes-contributions.md +11 -0
- package/dist/agentic/guides/modules/notifications/umes-hosts.md +3 -0
- package/dist/agentic/guides/modules/onboarding/index.md +1 -1
- package/dist/agentic/guides/modules/payment_gateways/index.md +1 -1
- package/dist/agentic/guides/modules/perspectives/index.md +1 -1
- package/dist/agentic/guides/modules/planner/index.md +1 -1
- package/dist/agentic/guides/modules/portal/index.md +1 -1
- package/dist/agentic/guides/modules/progress/index.md +1 -1
- package/dist/agentic/guides/modules/push_notifications/acl-features.md +12 -0
- package/dist/agentic/guides/modules/push_notifications/backend-pages.md +13 -0
- package/dist/agentic/guides/modules/push_notifications/contribution-resolutions.md +12 -0
- package/dist/agentic/guides/modules/push_notifications/di-registrations-rich.md +12 -0
- package/dist/agentic/guides/modules/push_notifications/entities.md +11 -0
- package/dist/agentic/guides/modules/push_notifications/events.md +12 -0
- package/dist/agentic/guides/modules/push_notifications/exact-override-targets.md +21 -0
- package/dist/agentic/guides/modules/push_notifications/host-extension-points.md +10 -0
- package/dist/agentic/guides/modules/push_notifications/index.md +24 -0
- package/dist/agentic/guides/modules/push_notifications/owned-contract-module-metadata.md +11 -0
- package/dist/agentic/guides/modules/push_notifications/setup.md +11 -0
- package/dist/agentic/guides/modules/push_notifications/umes-contributions.md +12 -0
- package/dist/agentic/guides/modules/push_notifications/umes-hosts.md +13 -0
- package/dist/agentic/guides/modules/push_notifications/workers.md +12 -0
- package/dist/agentic/guides/modules/query_index/index.md +1 -1
- package/dist/agentic/guides/modules/record_locks/index.md +1 -1
- package/dist/agentic/guides/modules/resources/index.md +1 -1
- package/dist/agentic/guides/modules/sales/index.md +1 -1
- package/dist/agentic/guides/modules/scheduler/index.md +1 -1
- package/dist/agentic/guides/modules/search/index.md +1 -1
- package/dist/agentic/guides/modules/security/index.md +1 -1
- package/dist/agentic/guides/modules/shipping_carriers/index.md +1 -1
- package/dist/agentic/guides/modules/sso/index.md +1 -1
- package/dist/agentic/guides/modules/staff/index.md +1 -1
- package/dist/agentic/guides/modules/storage_s3/index.md +1 -1
- package/dist/agentic/guides/modules/sync_akeneo/index.md +1 -1
- package/dist/agentic/guides/modules/sync_excel/index.md +1 -1
- package/dist/agentic/guides/modules/system_status_overlays/index.md +1 -1
- package/dist/agentic/guides/modules/translations/index.md +1 -1
- package/dist/agentic/guides/modules/webhooks/index.md +1 -1
- package/dist/agentic/guides/modules/wms/index.md +1 -1
- package/dist/agentic/guides/modules/workflows/index.md +1 -1
- package/dist/agentic/guides/reference-module-facts.json +141 -3
- package/dist/agentic/guides/reference-modules/example/contribution-resolutions.md +2 -0
- package/dist/agentic/guides/reference-modules/example/exact-override-targets.md +2 -0
- package/dist/agentic/guides/reference-modules/example/index.md +2 -2
- package/dist/agentic/guides/reference-modules/example/notifications.md +2 -0
- package/dist/agentic/guides/reference-modules/example/umes-contributions.md +2 -0
- package/dist/agentic/guides/upstream/AGENTS.md +1 -1
- package/dist/agentic/guides/upstream/manifest.json +2 -2
- package/dist/agentic/shared/AGENTS.md.template +2 -2
- package/dist/agentic/shared/ai/harness/README.md +2 -2
- package/dist/agentic/shared/ai/harness/RELEASE.md +4 -4
- package/dist/agentic/shared/ai/harness/cases.json +175 -2
- package/dist/agentic/shared/ai/harness/cases.schema.json +4 -4
- package/dist/agentic/shared/ai/harness/validators.json +1 -1
- package/dist/lib/testing/integration.js +30 -0
- package/dist/lib/testing/integration.js.map +2 -2
- package/package.json +6 -6
- package/src/lib/generators/__tests__/module-facts.bc-guard.test.ts +9 -3
- package/src/lib/testing/integration.ts +30 -0
|
@@ -111,7 +111,7 @@ Read `.agents/skills/<id>/SKILL.md` AND any `.ai/skills/<id>/SKILL.md` override.
|
|
|
111
111
|
|
|
112
112
|
## Module-Specific Facts
|
|
113
113
|
|
|
114
|
-
|
|
114
|
+
Mechanisms: events/subscribers→events; long operation/progress→progress; provider settings/health/OAuth→integrations; sync/import→data_sync. Hosts: session/auth→auth; customer/contact/deal/pipeline→customers; product/price/stock/inventory→catalog; currency/money→currencies; cart/checkout/shopper→checkout; portal→portal+customer_accounts; quote/order/invoice/sales assistant→sales; notification→notifications; webhook/callback→webhooks; schedule/reminder→scheduler; workflow/activity/user task→workflows; assistant→ai_assistant; maintained query index/reindex→query_index; search convergence→search. staff/employee≠optional staff; audit/record-who≠audit_logs unless extended. App primitives skip api_docs/search/query_index unless changed. Big fact-sheets: read in sections.
|
|
115
115
|
|
|
116
116
|
<!-- om:module-guides:start -->
|
|
117
117
|
<!-- om:module-guides:end -->
|
|
@@ -121,4 +121,4 @@ Load facts for every named/targeted module, not incidental use. Mechanisms: even
|
|
|
121
121
|
1. Route, then implement the smallest complete slice through real call sites.
|
|
122
122
|
2. Discovery change: run `yarn generate`; then the smallest gate/integration paths.
|
|
123
123
|
|
|
124
|
-
Precedence: root
|
|
124
|
+
Precedence: root→BC→installed `AGENTS.md`→facts; stop on skew/conflict; never guess.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Agent harness evaluations
|
|
2
2
|
|
|
3
|
-
`cases.json` is the
|
|
3
|
+
`cases.json` is the 233-case standalone-app contract. Run `yarn harness:validate --all` for the deterministic gate. Live routing uses a fresh read-only process per case:
|
|
4
4
|
|
|
5
5
|
UMES routing is fact-first. The additive and unified-override audit evaluations, plus their targeted cases, resolve exact/pattern hosts, outgoing contributions, correlation provenance, round-trip groups, framework-owned targets, and override domain/key/mode from the generated module sheets and `.ai/guides/framework-extension-points.md` before bounded installed source. The repository UMES umbrella spec may appear as optional source-checkout provenance; it is never required in a standalone scaffold.
|
|
6
6
|
|
|
@@ -18,7 +18,7 @@ yarn harness:release --runner codex --prepare-targets /absolute/empty-release-ta
|
|
|
18
18
|
yarn harness:release --runner codex --portability-runner claude --prepare-targets /absolute/empty-release-targets --acknowledge-writes
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
-
The primary runner owns all
|
|
21
|
+
The primary runner owns all 233 routing cases, all 49 writable cases, and all generative-judge runs. No per-case fallback or mixed primary ownership is allowed. Omitting `--portability-runner` is valid and the sanitized report records `portabilityRunner: null`; explicitly requesting an unavailable or failing secondary runner fails that extended run.
|
|
22
22
|
|
|
23
23
|
Writable evaluation is intentionally opt-in. The expanded catalog has a 49-case writable release target, but only cases registered in `release-matrix.json` and backed by controller-owned fixtures and oracles are executable. Copy or create a fresh standalone app for one registered case, then seed only that case and mark the target disposable:
|
|
24
24
|
|
|
@@ -6,7 +6,7 @@ Run the complete per-release gate from a generated standalone app with one comma
|
|
|
6
6
|
yarn harness:release --runner codex --prepare-targets /absolute/empty-release-targets --acknowledge-writes
|
|
7
7
|
```
|
|
8
8
|
|
|
9
|
-
Choose exactly one blocking primary runner with `--runner codex` or `--runner claude`. That runner owns the complete
|
|
9
|
+
Choose exactly one blocking primary runner with `--runner codex` or `--runner claude`. That runner owns the complete 233-case routing gate and every writable/review lane. To add cross-model portability evidence, explicitly pass the other runner as `--portability-runner claude` or `--portability-runner codex`; it runs only the exact 49-case representative read-only set. The two runners must differ. Omitting the portability option is valid and is recorded as `portabilityRunner: null`; no secondary result is claimed. There is no per-case fallback or mixed primary ownership. Once requested, a portability failure or unavailable runner fails that extended release run.
|
|
10
10
|
|
|
11
11
|
`--prepare-targets` accepts only an absolute, new or empty regular directory outside the controller app. The controller must be a sanitized fresh scaffold: automatic preparation fails before copying when it finds `.env`, `.env.*` (except `.env.example`, `.env.sample`, and `.env.template`), credential files, or private-key files. Never use a configured development or production app as the controller. It copies the fresh scaffold once per catalog case whose `evaluationKind` is `implementation` or `regression`, while excluding `.git`, `node_modules`, build/cache/coverage output, `.ai/harness/results`, `.ai/reports`, and `.ai/framework-context`. Each target receives a guarded link to the controller's installed dependency tree. The OS sandbox resolves that link as read-only during both the writable model run and the target command gate. The release gate also hashes every dependency entry and regular-file body once before execution and once after the complete suite, and fails if any nested content or metadata changed. A generated `release-targets.json` records the local mapping.
|
|
12
12
|
|
|
@@ -34,17 +34,17 @@ For externally prepared apps, `--writable-targets /absolute/release-targets.json
|
|
|
34
34
|
}
|
|
35
35
|
```
|
|
36
36
|
|
|
37
|
-
The current catalog contains
|
|
37
|
+
The current catalog contains 233 cases, including 49 writable implementation/regression cases (21.0%). The command still derives all counts and case IDs from `cases.json`, `validators.json`, and `release-matrix.json`; those figures are documented release facts, not runner constants. The matrix keeps both supported runner model selectors, an exact all-case primary profile, an exact 49-case portability profile, and runner-neutral writable assignments. Run `yarn install-skills` first so the pinned external `om-code-review` skill and ownership evidence are present; the reusable local `om-judge-agent-session` skill ships with the scaffold. Before running a model or writing a fixture, the release command requires complete deterministic, primary live-routing, writable, trusted-oracle, target, generated-test, and generative-judge coverage. Every one of the 49 writable cases must have a judge assignment composing both skills. Missing business fixtures or release-matrix entries fail preflight and are listed by exact case ID in the report.
|
|
38
38
|
|
|
39
39
|
## PR #4529 remediation evidence
|
|
40
40
|
|
|
41
|
-
The PR's focused remediation evidence is not a release-certification substitute. Fresh emitted controllers pass deterministic 192/192, and the field-tested OMH-188–192 generative cohort passes on default Codex, Claude Sonnet, and high-effort gpt-5.4-mini. Fresh OMH-185 writable attempts fixed concrete organization-scope, command-object, module-activation, command-snapshot, schema, custom-field, UI, and Jest guidance defects at their routed owners without relaxing trusted oracles. The final attempt reached the case's fixed 600-second ceiling and is excluded from pass evidence. Issue #4670 now owns the complete selected-primary
|
|
41
|
+
The PR's focused remediation evidence is not a release-certification substitute. Fresh emitted controllers pass deterministic 192/192, and the field-tested OMH-188–192 generative cohort passes on default Codex, Claude Sonnet, and high-effort gpt-5.4-mini. Fresh OMH-185 writable attempts fixed concrete organization-scope, command-object, module-activation, command-snapshot, schema, custom-field, UI, and Jest guidance defects at their routed owners without relaxing trusted oracles. The final attempt reached the case's fixed 600-second ceiling and is excluded from pass evidence. Issue #4670 now owns the complete selected-primary 233-case routing and 49-case writable/generated-test/review certification, prioritizing the generative cohort and recording unavailable Claude lanes without fallback or mixed-runner ownership.
|
|
42
42
|
|
|
43
43
|
After preflight it runs, in order:
|
|
44
44
|
|
|
45
45
|
1. deterministic validation for the complete catalog;
|
|
46
46
|
2. the release matrix's fixed `yarn generate`, `yarn typecheck`, `yarn lint`, and `yarn build` foundation;
|
|
47
|
-
3. the selected primary runner across all
|
|
47
|
+
3. the selected primary runner across all 233 live-routing cases, followed by the optional distinct portability runner across the exact 49-case read-only sample when requested;
|
|
48
48
|
4. fixture preparation and the selected primary runner for every writable case, including the controller-owned AST/behavior oracles and target typecheck;
|
|
49
49
|
5. `yarn generate`, `yarn typecheck`, `yarn lint`, and `yarn build` in every writable target, after its trusted oracles;
|
|
50
50
|
6. real generated-code execution for OMH-163 and OMH-192 through fixed Jest, OMH-164 through API-only Playwright, and OMH-165 through real-browser Playwright; and
|
|
@@ -1560,7 +1560,9 @@
|
|
|
1560
1560
|
],
|
|
1561
1561
|
"allowedExtra": [
|
|
1562
1562
|
".ai/guides/extensions.md",
|
|
1563
|
-
".ai/skills/om-system-extension/SKILL.md"
|
|
1563
|
+
".ai/skills/om-system-extension/SKILL.md",
|
|
1564
|
+
".ai/guides/modules/push_notifications/index.md",
|
|
1565
|
+
".ai/guides/modules/devices/index.md"
|
|
1564
1566
|
],
|
|
1565
1567
|
"forbidden": [
|
|
1566
1568
|
".env*",
|
|
@@ -3090,7 +3092,10 @@
|
|
|
3090
3092
|
".ai/guides/modules/channel_imap/index.md"
|
|
3091
3093
|
],
|
|
3092
3094
|
"allowedExtra": [
|
|
3093
|
-
".ai/guides/modules/integrations/index.md"
|
|
3095
|
+
".ai/guides/modules/integrations/index.md",
|
|
3096
|
+
".ai/guides/modules/channel_fcm/index.md",
|
|
3097
|
+
".ai/guides/modules/channel_apns/index.md",
|
|
3098
|
+
".ai/guides/modules/channel_expo/index.md"
|
|
3094
3099
|
],
|
|
3095
3100
|
"forbidden": [
|
|
3096
3101
|
".env*",
|
|
@@ -20924,5 +20929,173 @@
|
|
|
20924
20929
|
"maxTotalContextBytes": 196608,
|
|
20925
20930
|
"relatedCases": ["OMH-003", "OMH-222"],
|
|
20926
20931
|
"source": { "paths": [".ai/specs/2026-08-14-standalone-harness-optimizations.md"] }
|
|
20932
|
+
},
|
|
20933
|
+
{
|
|
20934
|
+
"id": "OMH-232",
|
|
20935
|
+
"title": "Reach a customer's phone when an order ships without a private device table",
|
|
20936
|
+
"family": "architecture",
|
|
20937
|
+
"mode": "analysis",
|
|
20938
|
+
"evaluationKind": "routing",
|
|
20939
|
+
"risk": "high",
|
|
20940
|
+
"prompt": "In a freshly scaffolded standalone Open Mercato app, the business wants a shipment update to reach the customer's phone as a notification, and the mobile client already has a provider token per install. Before proposing any schema, establish whether installed modules already own the device registry and the push delivery path, and name them, or state positively that none does. Then decide the smallest safe design against what the installed modules already provide: where a per-user device and its provider token live and how that token is protected at rest and kept out of responses and logs, how one notification fans out to that user's devices, what happens when a provider reports a token that no longer exists, and how a user's per-type and per-channel opt-out is honoured before anything is sent. Keep tenant and organization boundaries intact, state the access-control posture for a user registering their own device versus an administrator reading the fleet, and identify the smallest relevant validation. Do not model your own device, token, or delivery-log tables, and do not call a provider SDK directly from a request handler, before that check is done.",
|
|
20941
|
+
"tags": [
|
|
20942
|
+
"architecture",
|
|
20943
|
+
"module-facts",
|
|
20944
|
+
"reuse-installed",
|
|
20945
|
+
"device-registry",
|
|
20946
|
+
"push-delivery"
|
|
20947
|
+
],
|
|
20948
|
+
"owner": {
|
|
20949
|
+
"kind": "facts",
|
|
20950
|
+
"path": ".ai/guides/modules/push_notifications/index.md",
|
|
20951
|
+
"ruleIds": [
|
|
20952
|
+
"BC-01",
|
|
20953
|
+
"BC-04"
|
|
20954
|
+
]
|
|
20955
|
+
},
|
|
20956
|
+
"expectedRouter": {
|
|
20957
|
+
"required": [
|
|
20958
|
+
"architecture"
|
|
20959
|
+
],
|
|
20960
|
+
"allowedExtra": [
|
|
20961
|
+
"module-data",
|
|
20962
|
+
"integration",
|
|
20963
|
+
"umes",
|
|
20964
|
+
"framework-context",
|
|
20965
|
+
"backend-ui"
|
|
20966
|
+
]
|
|
20967
|
+
},
|
|
20968
|
+
"requiredSkills": [
|
|
20969
|
+
"om-help"
|
|
20970
|
+
],
|
|
20971
|
+
"context": {
|
|
20972
|
+
"required": [
|
|
20973
|
+
"AGENTS.md",
|
|
20974
|
+
".ai/guides/architecture.md",
|
|
20975
|
+
".ai/skills/om-help/SKILL.md",
|
|
20976
|
+
".ai/guides/modules/devices/index.md",
|
|
20977
|
+
".ai/guides/modules/push_notifications/index.md"
|
|
20978
|
+
],
|
|
20979
|
+
"allowedExtra": [
|
|
20980
|
+
".ai/guides/contracts.md",
|
|
20981
|
+
".ai/guides/modules/notifications/index.md"
|
|
20982
|
+
],
|
|
20983
|
+
"forbidden": [
|
|
20984
|
+
".env*",
|
|
20985
|
+
".git/**"
|
|
20986
|
+
]
|
|
20987
|
+
},
|
|
20988
|
+
"requiredDecisions": [
|
|
20989
|
+
"facts-first",
|
|
20990
|
+
"tenant-scope",
|
|
20991
|
+
"acl-features",
|
|
20992
|
+
"encrypted-credentials",
|
|
20993
|
+
"smallest-validation"
|
|
20994
|
+
],
|
|
20995
|
+
"forbiddenPatterns": [
|
|
20996
|
+
"node_modules.{0,40}(?:write|edit|patch)",
|
|
20997
|
+
"(?:tenant|organization).{0,30}(?:unscoped|scope optional)",
|
|
20998
|
+
"(?:token|secret|password).{0,20}(?:console|log)"
|
|
20999
|
+
],
|
|
21000
|
+
"validators": [
|
|
21001
|
+
"catalog.schema",
|
|
21002
|
+
"owner.reference",
|
|
21003
|
+
"skills.reference",
|
|
21004
|
+
"router.contract",
|
|
21005
|
+
"context.budget",
|
|
21006
|
+
"context.forbidden",
|
|
21007
|
+
"patterns.forbidden"
|
|
21008
|
+
],
|
|
21009
|
+
"maxContextFiles": 8,
|
|
21010
|
+
"maxInitialContextBytes": 57344,
|
|
21011
|
+
"maxTotalContextBytes": 98304,
|
|
21012
|
+
"relatedCases": [
|
|
21013
|
+
"OMH-020",
|
|
21014
|
+
"OMH-194"
|
|
21015
|
+
]
|
|
21016
|
+
},
|
|
21017
|
+
{
|
|
21018
|
+
"id": "OMH-233",
|
|
21019
|
+
"title": "Add tenant-wide push provider credentials without a bespoke integration",
|
|
21020
|
+
"family": "architecture",
|
|
21021
|
+
"mode": "analysis",
|
|
21022
|
+
"evaluationKind": "routing",
|
|
21023
|
+
"risk": "high",
|
|
21024
|
+
"prompt": "In a freshly scaffolded standalone Open Mercato app, operations hold a Firebase service account for Android, an APNs signing key for iOS, and an Expo access token for the managed client, and want each one connected once for the whole tenant so push can be sent. Before proposing any schema, establish whether installed provider modules already own these three connections and name them, or state positively that none does. Then decide the smallest safe design against what the installed modules already provide: where such credentials are stored and validated at connect time, why they belong to the tenant rather than to the person who connected them and what that means for a caller whose selected organization differs, and how a provider's permanent token rejection is distinguished from a retryable failure. Keep tenant and organization boundaries intact, state the access-control posture for connecting a tenant-wide provider versus reading its health, and identify the smallest relevant validation. Do not write your own credential store, and do not build a bespoke provider integration, before that check is done.",
|
|
21025
|
+
"tags": [
|
|
21026
|
+
"architecture",
|
|
21027
|
+
"module-facts",
|
|
21028
|
+
"reuse-installed",
|
|
21029
|
+
"push-provider",
|
|
21030
|
+
"encrypted-credentials"
|
|
21031
|
+
],
|
|
21032
|
+
"owner": {
|
|
21033
|
+
"kind": "facts",
|
|
21034
|
+
"path": ".ai/guides/modules/channel_fcm/index.md",
|
|
21035
|
+
"ruleIds": [
|
|
21036
|
+
"BC-01",
|
|
21037
|
+
"BC-04"
|
|
21038
|
+
]
|
|
21039
|
+
},
|
|
21040
|
+
"expectedRouter": {
|
|
21041
|
+
"required": [
|
|
21042
|
+
"architecture"
|
|
21043
|
+
],
|
|
21044
|
+
"allowedExtra": [
|
|
21045
|
+
"integration",
|
|
21046
|
+
"module-data",
|
|
21047
|
+
"umes",
|
|
21048
|
+
"framework-context"
|
|
21049
|
+
]
|
|
21050
|
+
},
|
|
21051
|
+
"requiredSkills": [
|
|
21052
|
+
"om-help"
|
|
21053
|
+
],
|
|
21054
|
+
"context": {
|
|
21055
|
+
"required": [
|
|
21056
|
+
"AGENTS.md",
|
|
21057
|
+
".ai/guides/architecture.md",
|
|
21058
|
+
".ai/skills/om-help/SKILL.md",
|
|
21059
|
+
".ai/guides/modules/channel_fcm/index.md",
|
|
21060
|
+
".ai/guides/modules/channel_apns/index.md",
|
|
21061
|
+
".ai/guides/modules/channel_expo/index.md"
|
|
21062
|
+
],
|
|
21063
|
+
"allowedExtra": [
|
|
21064
|
+
".ai/guides/integrations.md",
|
|
21065
|
+
".ai/guides/modules/push_notifications/index.md"
|
|
21066
|
+
],
|
|
21067
|
+
"forbidden": [
|
|
21068
|
+
".env*",
|
|
21069
|
+
".git/**"
|
|
21070
|
+
]
|
|
21071
|
+
},
|
|
21072
|
+
"requiredDecisions": [
|
|
21073
|
+
"facts-first",
|
|
21074
|
+
"tenant-scope",
|
|
21075
|
+
"acl-features",
|
|
21076
|
+
"encrypted-credentials",
|
|
21077
|
+
"smallest-validation"
|
|
21078
|
+
],
|
|
21079
|
+
"forbiddenPatterns": [
|
|
21080
|
+
"node_modules.{0,40}(?:write|edit|patch)",
|
|
21081
|
+
"(?:tenant|organization).{0,30}(?:unscoped|scope optional)",
|
|
21082
|
+
"(?:token|secret|password).{0,20}(?:console|log)"
|
|
21083
|
+
],
|
|
21084
|
+
"validators": [
|
|
21085
|
+
"catalog.schema",
|
|
21086
|
+
"owner.reference",
|
|
21087
|
+
"skills.reference",
|
|
21088
|
+
"router.contract",
|
|
21089
|
+
"context.budget",
|
|
21090
|
+
"context.forbidden",
|
|
21091
|
+
"patterns.forbidden"
|
|
21092
|
+
],
|
|
21093
|
+
"maxContextFiles": 9,
|
|
21094
|
+
"maxInitialContextBytes": 57344,
|
|
21095
|
+
"maxTotalContextBytes": 98304,
|
|
21096
|
+
"relatedCases": [
|
|
21097
|
+
"OMH-039",
|
|
21098
|
+
"OMH-232"
|
|
21099
|
+
]
|
|
20927
21100
|
}
|
|
20928
21101
|
]
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
"$id": "https://open-mercato.dev/schemas/standalone-harness-cases.schema.json",
|
|
4
4
|
"title": "Open Mercato standalone harness case catalog",
|
|
5
5
|
"type": "array",
|
|
6
|
-
"minItems":
|
|
7
|
-
"maxItems":
|
|
6
|
+
"minItems": 233,
|
|
7
|
+
"maxItems": 233,
|
|
8
8
|
"items": {
|
|
9
9
|
"type": "object",
|
|
10
10
|
"additionalProperties": false,
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"maxTotalContextBytes", "relatedCases"
|
|
16
16
|
],
|
|
17
17
|
"properties": {
|
|
18
|
-
"id": { "type": "string", "pattern": "^OMH-(00[1-9]|0[1-9][0-9]|1[0-9][0-9]|20[0-9]|21[0-9]|22[0-9]|23[
|
|
18
|
+
"id": { "type": "string", "pattern": "^OMH-(00[1-9]|0[1-9][0-9]|1[0-9][0-9]|20[0-9]|21[0-9]|22[0-9]|23[0-3])$" },
|
|
19
19
|
"title": { "type": "string", "minLength": 12, "maxLength": 180 },
|
|
20
20
|
"family": { "enum": ["architecture", "module", "umes", "integration", "ai-workflow", "bugfix", "business", "testing"] },
|
|
21
21
|
"mode": { "enum": ["analysis", "one-shot", "spec", "bugfix", "review"] },
|
|
@@ -168,7 +168,7 @@
|
|
|
168
168
|
"maxInitialContextBytes": { "type": "integer", "minimum": 4096, "maximum": 98304 },
|
|
169
169
|
"maxTotalContextBytes": { "type": "integer", "minimum": 8192, "maximum": 1048576 },
|
|
170
170
|
"timeoutMs": { "type": "integer", "minimum": 1000, "maximum": 600000 },
|
|
171
|
-
"relatedCases": { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "type": "string", "pattern": "^OMH-(00[1-9]|0[1-9][0-9]|1[0-9][0-9]|20[0-9]|21[0-9]|22[0-9]|23[
|
|
171
|
+
"relatedCases": { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "type": "string", "pattern": "^OMH-(00[1-9]|0[1-9][0-9]|1[0-9][0-9]|20[0-9]|21[0-9]|22[0-9]|23[0-3])$" } },
|
|
172
172
|
"source": {
|
|
173
173
|
"type": "object",
|
|
174
174
|
"additionalProperties": false,
|
|
@@ -1467,6 +1467,18 @@ function buildReusableEnvironment(baseUrl, databaseUrl, queueBaseDir, captureScr
|
|
|
1467
1467
|
OM_TEST_MODE: "1",
|
|
1468
1468
|
OM_TEST_EMAIL_CAPTURE_PATH: EPHEMERAL_EMAIL_CAPTURE_PATH,
|
|
1469
1469
|
OM_TEST_AUTH_RATE_LIMIT_MODE: "opt-in",
|
|
1470
|
+
// Register the test-only `push_stub` channel adapter in the reused Playwright
|
|
1471
|
+
// process (and any drain/worker child it spawns) so push integration specs can
|
|
1472
|
+
// drive real delivery. Production-safe + inert unless a delivery row carries
|
|
1473
|
+
// `provider='push_stub'`. Mirrors the fresh-environment app server env below.
|
|
1474
|
+
OM_ENABLE_PUSH_STUB_ADAPTER: process.env.OM_ENABLE_PUSH_STUB_ADAPTER ?? "1",
|
|
1475
|
+
// Swap the FCM/APNs/Expo SDK clients for network-free fakes so the REAL provider
|
|
1476
|
+
// adapters run end-to-end. Unlike `push_stub` (which replaces the whole adapter),
|
|
1477
|
+
// this replaces only each SDK client. Mirrors the fresh-environment env below.
|
|
1478
|
+
OM_PUSH_FAKE_PROVIDERS: process.env.OM_PUSH_FAKE_PROVIDERS ?? "1",
|
|
1479
|
+
// Expo's receipt reaper ignores rows younger than 15 minutes by default, which no
|
|
1480
|
+
// integration test can wait out. Poll immediately instead.
|
|
1481
|
+
OM_PUSH_RECEIPT_MIN_AGE_MINUTES: process.env.OM_PUSH_RECEIPT_MIN_AGE_MINUTES ?? "0",
|
|
1470
1482
|
// Tests assert on access_logs immediately after CRUD reads; keep the
|
|
1471
1483
|
// blocking write path on inside the integration runtime so tests do
|
|
1472
1484
|
// not have to call flushPendingCrudAccessLogs() explicitly.
|
|
@@ -2648,6 +2660,24 @@ async function startEphemeralEnvironment(options) {
|
|
|
2648
2660
|
OM_TEST_MODE: "1",
|
|
2649
2661
|
OM_TEST_EMAIL_CAPTURE_PATH: EPHEMERAL_EMAIL_CAPTURE_PATH,
|
|
2650
2662
|
OM_TEST_AUTH_RATE_LIMIT_MODE: "opt-in",
|
|
2663
|
+
// Register the network-free `push_stub` channel adapter so push integration
|
|
2664
|
+
// specs (TC-PUSH-003) can drive the strategy → delivery-row → send-push worker
|
|
2665
|
+
// → sendMessage chain end-to-end without a real FCM/APNs/Expo provider. The
|
|
2666
|
+
// adapter is production-safe (registered only under this flag) and inert unless
|
|
2667
|
+
// a delivery row carries `provider='push_stub'` — i.e. a test seeded a matching
|
|
2668
|
+
// push channel + device. Applies to the app server, the Playwright process, and
|
|
2669
|
+
// any drain/worker child that inherits this environment.
|
|
2670
|
+
OM_ENABLE_PUSH_STUB_ADAPTER: process.env.OM_ENABLE_PUSH_STUB_ADAPTER ?? "1",
|
|
2671
|
+
// Swap the FCM/APNs/Expo SDK clients for network-free fakes (TC-CHANNEL-PUSH-005+) so the REAL
|
|
2672
|
+
// provider adapters — native message construction, credential parsing, client caching, and every
|
|
2673
|
+
// error → `device_unregistered` mapping — run end-to-end without live keys. Unlike
|
|
2674
|
+
// `push_stub`, which replaces the whole adapter, this replaces only each SDK client, and is
|
|
2675
|
+
// registered only under this flag. Applies to the app server, the Playwright process, and any
|
|
2676
|
+
// drain/worker child that inherits this environment.
|
|
2677
|
+
OM_PUSH_FAKE_PROVIDERS: process.env.OM_PUSH_FAKE_PROVIDERS ?? "1",
|
|
2678
|
+
// Expo's receipt reaper ignores rows younger than 15 minutes by default (it polls a real
|
|
2679
|
+
// provider's async receipts). No integration test can wait that out — poll immediately.
|
|
2680
|
+
OM_PUSH_RECEIPT_MIN_AGE_MINUTES: process.env.OM_PUSH_RECEIPT_MIN_AGE_MINUTES ?? "0",
|
|
2651
2681
|
OM_DISABLE_EMAIL_DELIVERY: "1",
|
|
2652
2682
|
OM_WEBHOOKS_ALLOW_PRIVATE_URLS: process.env.OM_WEBHOOKS_ALLOW_PRIVATE_URLS ?? "1",
|
|
2653
2683
|
// Read at build time as well as at runtime, so this block has to carry it:
|