Track-as-issue items from the Milestone 2 final review (none blocking):
Contract note (deliberate decision, recorded for M3): step/question statements store their child IRI (<activityIri>/steps/<id>, .../questions/<id>) in statements.activity_iri AND create a pseudo-activity row in activities per distinct child. The M3 dashboard must filter/namespace by the /steps/|/questions/ path segment when listing activities, and can parse child IRIs back to step/question ids for the funnel. This shape is frozen with the public snippet wire format.
🤖 Generated with Claude Code
Track-as-issue items from the Milestone 2 final review (none blocking):
/admin/*responses carry noAccess-Control-Allow-Origin(guards the/xapi/*middleware scope against glob-broadening regressions)proof:deviceid (pins a privacy-relevant guarantee that's currently implicit)test:watchdoesn't chainbuild:snippet— stale-bundle dev footgun; chain it or document it<script>tag must precede any inlineproof.*calls (synchronous-load ordering)Contract note (deliberate decision, recorded for M3): step/question statements store their child IRI (
<activityIri>/steps/<id>,.../questions/<id>) instatements.activity_iriAND create a pseudo-activity row inactivitiesper distinct child. The M3 dashboard must filter/namespace by the/steps/|/questions/path segment when listing activities, and can parse child IRIs back to step/question ids for the funnel. This shape is frozen with the public snippet wire format.🤖 Generated with Claude Code