Follow-up from the five-lens architecture review finding C3 (docs-temp/production-gap-analysis/ARCHITECTURE-REVIEW-2026-06-10.md) and its api-platform fix (fix/contribution-app-scope).
Since SDK #113/#114 the contribution store is per-app: devAppSchemaMiddleware derives app_ from X-MS-App-ID and dev_migrate creates contributions inside each app schema. The platform side now sends X-MS-App-ID on the contrib POST/DELETE and has a seam test asserting header propagation (manifest parse -> host resolution -> wire), but the SDK half of the seam is untested: no test drives devAppSchemaMiddleware + the contrib handlers + dev_migrate together and asserts the row actually exists in app._contributions (and that the DELETE removes it from the same schema).
Wanted: a test that
- provisions an app schema via the dev migrate path,
- POSTs /__mirrorstack/contrib// with X-MS-App-ID,
- asserts the row exists in app_._contributions (and NOT in any other schema),
- DELETEs with the same header and asserts the row is gone.
Without this, a regression in devAppSchemaMiddleware (e.g. scoping only some verbs) would pass both repos' suites while contributions silently land in the wrong schema again.
Follow-up from the five-lens architecture review finding C3 (docs-temp/production-gap-analysis/ARCHITECTURE-REVIEW-2026-06-10.md) and its api-platform fix (fix/contribution-app-scope).
Since SDK #113/#114 the contribution store is per-app: devAppSchemaMiddleware derives app_ from X-MS-App-ID and dev_migrate creates contributions inside each app schema. The platform side now sends X-MS-App-ID on the contrib POST/DELETE and has a seam test asserting header propagation (manifest parse -> host resolution -> wire), but the SDK half of the seam is untested: no test drives devAppSchemaMiddleware + the contrib handlers + dev_migrate together and asserts the row actually exists in app._contributions (and that the DELETE removes it from the same schema).
Wanted: a test that
Without this, a regression in devAppSchemaMiddleware (e.g. scoping only some verbs) would pass both repos' suites while contributions silently land in the wrong schema again.