feat(apptest): personal (my) surface contract - manifest metadata + the runner's my flow - #6343
Merged
Conversation
…he runner's my flow The <name>.test manifest now carries a 'personal' block for every entity with a personal: true relation (the scoped MyController path, the owner relation, the sensitive field list) - emitted by AppTestIntentGenerator from the intent, unit-tested. The runner gains flows/my.js driving the wire contract of that surface: create through the scoped controller (the owner FK is forced server-side - the payload never sends it), every sensitive field asserted null on the personal wire (the allow-list is the security boundary), the own row present in the personal list, a foreign (ownerless) row 404 through the personal controller and absent from the personal list (exercised when the owner relation is optional), own-row delete through the personal controller. No identity mapping -> the flow SKIPS with a pointer (the personal surface is empty by design). Personal UI parity (resolved labels, chat layout, calendar views on the My shell) is deliberately not asserted yet - it tracks the known personal-template parity gaps; this flow pins the wire contract those pages consume. Verified live against a running instance via hand-injected manifest blocks matching the new emission: a required-owner document entity (sensitive aggregate stripped) and an optional-owner entity (foreign-row 404 branch) both green.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The
<name>.testmanifest now carries apersonalblock for every entity with apersonal: truerelation — the scoped<Entity>MyControllerpath, the owner relation name, and thesensitivefield list (AppTestIntentGenerator, unit-tested).The runner gains
flows/my.js, always-on when the manifest marks an entity personal, driving the personal surface's wire contract:sensitivefield asserted null on the personal wire (the allow-list serialization is the security boundary — UI hiding alone is cosmetic);No identity mapping → the flow skips with a pointer (the personal surface is empty by design, never an error).
Personal UI parity (resolved labels, chat layout, calendar views on the My shell) is deliberately not asserted yet — it tracks the known personal-template parity gaps; this flow pins down the wire contract those pages consume, so the parity fixes can land against a stable base.
Verified live against a running instance via hand-injected manifest blocks matching the new emission: a required-owner document entity (sensitive aggregate stripped from the wire while the power surface keeps it) and an optional-owner entity (the foreign-row 404 branch) — both green.
🤖 Generated with Claude Code