Repository navigation
Open
Labels
app/idPackage/app: id (pkgs/ or apps/ in this repo)Package/app: id (pkgs/ or apps/ in this repo)effort/lLarge: multi-day or open-ended; expect staged check-insLarge: multi-day or open-ended; expect staged check-inskind/featureNew feature or capability requestNew feature or capability requestmeta/enrichedIntake review done: acceptance criteria, links, and normalized labels addedIntake review done: acceptance criteria, links, and normalized labels addedpriority/normalOrdinary priority (the default)Ordinary priority (the default)queue/blockedQueue or user escalation stateQueue or user escalation statesource/creatorFiled by the new-issue-creator jobFiled by the new-issue-creator jobstatus/blockedQueue or user escalation stateQueue or user escalation statetask/triageQueue packet kind: verify, reproduce, and route this itemQueue packet kind: verify, reproduce, and route this itemuser/escalatedQueue or user escalation stateQueue or user escalation statework/assignedQueue worker lifecycle stateQueue worker lifecycle state
Description
Follow-up from the capability taxonomy v0 investigation (#2027, record: doc/2026-10-29T14-05-00Z_investigation_capability_taxonomy/, PR #2337).
Goal
media.* with typed artifacts as the default and exactly one raw channel: media.image/media.audio/media.video returning artifact references, and media.stream for realtime only.
Scope
- Artifact reference
{artifact_id, mime, bytes, sha256, width/height or duration_ms, created_at}; read back by id, bounded, deduplicable, replayable from the journal. - Decision needed (taxonomy §9.3): artifact storage beside
records— artifacts want dedupe and GC,records.readhas neither. Propose the shape in the issue before implementing. media.stream: subscription of frames each ≤MAX_EVENT_BYTES, explicit end, backpressure signal; never the permanent record — it ends in an artifact or is discarded.- Refusals:
unknown_cap+device_lacks_affordance(no storage/hardware),outside_ceiling(slow link),bad_args+oversize,cap_denied+consent_requiredfor capture.
Acceptance
- Typed artifact produced and read back by id with digest verified; oversize refused.
- A stream test asserting the 64 KiB frame ceiling and clean termination into an artifact.
Mediasurface renders artifact refs only — bytes never travel in a surface.
Out of scope
Transcoding, thumbnails, CDN delivery, inline playback.
Acceptance criteria
- The artifact-storage decision (taxonomy §9.3 — beside
records, which has neither dedupe nor GC) is proposed on this issue before implementation - A typed artifact (media.image/audio/video) is produced and read back by id ({artifact_id, mime, bytes, sha256, dimensions/duration, created_at}) with digest verified; oversize refused (bad_args + oversize)
- A stream test asserts the MAX_EVENT_BYTES (64 KiB) frame ceiling, backpressure/end signalling, and clean termination into an artifact (or discard) — the stream is never the permanent record
- The Media surface renders artifact refs only; bytes never travel in a surface; capture refusals use the documented vocabulary (unknown_cap/device_lacks_affordance, outside_ceiling, cap_denied/consent_required)
Metadata
Metadata
Assignees
Labels
app/idPackage/app: id (pkgs/ or apps/ in this repo)Package/app: id (pkgs/ or apps/ in this repo)effort/lLarge: multi-day or open-ended; expect staged check-insLarge: multi-day or open-ended; expect staged check-inskind/featureNew feature or capability requestNew feature or capability requestmeta/enrichedIntake review done: acceptance criteria, links, and normalized labels addedIntake review done: acceptance criteria, links, and normalized labels addedpriority/normalOrdinary priority (the default)Ordinary priority (the default)queue/blockedQueue or user escalation stateQueue or user escalation statesource/creatorFiled by the new-issue-creator jobFiled by the new-issue-creator jobstatus/blockedQueue or user escalation stateQueue or user escalation statetask/triageQueue packet kind: verify, reproduce, and route this itemQueue packet kind: verify, reproduce, and route this itemuser/escalatedQueue or user escalation stateQueue or user escalation statework/assignedQueue worker lifecycle stateQueue worker lifecycle state
Activity
developing-today commentedon Oct 29, 2026
CODE-1187
dezren39 commentedon Oct 29, 2026
Intake review
Related: parent investigation #2027 (record: PR #2337); siblings #2338-#2345 are the other taxonomy follow-ups
Notes: Filed 2026-10-29T14:04Z from #2027. Still live: no open or merged PR implements it. #2344 (speech.capture) reuses this issue's stream ceiling and consent rules.
Risks: Building storage before the §9.3 decision lands risks a second media store to migrate; the decision is an explicit acceptance gate here.
Suggested approach: Post the storage-shape proposal on the issue first; implement artifacts, then the single raw stream.
🤖 Agent note · filed
meta/enrichedapplied. Still-live check this pass: no merged PR or fix commit explicitly resolving this issue was found; where a queue triage task owns verification, it is named in the notes.23 remaining items
dezren39 commentedon Nov 3, 2026
🤖 Agent note · parked
dezren39 commentedon Nov 3, 2026
🤖 Agent note · parked
media.*typed artifacts +media.streamstarts once the §9.3 decision is accepted on this issue.dezren39 commentedon Nov 3, 2026
🤖 Agent note · parked
dezren39 commentedon Nov 4, 2026
agent-note:v1
state: parked
task 8776 (small_fix, lane code-l, direct) parked 3600s on the §9.3 decision gate. Fresh check 2026-11-04T00:46Z: proposal comment 6614191454 still awaits Drew answering/amending its 4 open questions (sha256 vs BLAKE3 in the ref, MAX_MEDIA_BYTES value, GC grace period, journal vs artifact-chain placement); no comments on #2342 since 2026-11-03T23:33Z and no acceptance recorded. Per the packet's ordering rule, implementation does not start before acceptance. Resume: when the decision is accepted on this issue.
dezren39 commentedon Nov 4, 2026
🤖 Agent note · escalated
My read, to make the decision cheap (recommendations, not decisions)
DocumentRef::verify_contentis the working precedent). The only reason to also store sha256 is external interop outside the world protocol — if no external consumer is planned, BLAKE3-only is the simpler correct call.MAX_EVENT_BYTES; making it server-configurable below the constant is nearly free (devices already advertise lower ceilings viaoutside_ceiling), so "constant + configurable-down" loses nothing.media.putin the world event journal follows thedocuments.rsprecedent and is what makes the sharedblob_gatereference index coherent; theartifact.rschain would duplicate that machinery. Lowest-risk option is the proposal's.Blocking task 8776 as escalated-to-user with this note attached; issue #2342 label moves user/review → user/escalated.