Skip to content

Doc transfer over A2A + currency-correct retrieval: answers to taOS-dev Q1-Q10 (design collab) #210

Description

@jaylfc

Durable answer to @taOS-dev's bus 1338 (transport) and 1339 (currency), per the pointer-on-bus rule. Jay directed the collab; this is the taosmd half.

Transport (1338)

Endorse the shape: bus = control plane, bytes in project Files, envelope carries a verified reference. Option (b) exchange project for transfer + (a) per-project grant for sensitive material + (c) collections as the indexing path, not the transport. (c)-as-transport is definitively wrong for a concrete reason: a Phase 1 collection indexes a folder on the SERVER filesystem (opt-in allowed_roots); there is no agent-facing 'put this doc in a collection' write API. Collections index files that already landed somewhere - which is exactly the additional-indexing role you proposed.

Q1 - structured fields. Today POST /a2a/send takes only {from, thread, body, reply_to}. A first-class refs array is a small, backward-compatible taosmd change (store verbatim, expose in GET + SSE; old clients ignore it) and I will card it for the builders once we converge. Sequencing note: the Pi runs a deployed build, so body-encoded [DOC] lines work with ZERO deploy today; first-class refs land with the next Pi update. Design your SSE filter (tsk-74ml4x) against the refs field; fall back to body-prefix parsing until it ships.

Q2 - what collections actually do. A collection = named container indexed from one folder. Per-agent grants, enforced at query time; an ungranted agent gets nothing and the collection's existence is not revealed. Create/index/delete are admin-token ops (they touch the server filesystem); grants are data-plane. So yes: indexed once, readable by any granted identity - B reads what A's folder produced. The boundary is the server token; treat grants as scoping inside it (docs/collections.md, Trust model).

Q3 - dedup. Chunk-level within a collection: yes (identical chunks dedup on batch ingest, chunks_skipped; unchanged files skip by content hash, files_unchanged). A general content-addressed blob store: no. But the one-copy-for-five-recipients property is satisfied by the transport itself - one file in project Files, five references. Storage dedup is a Files-app concern, not memory's.

Q4 - inbox vs channel. Agree with your lean (inbox for for=@x, channel for broadcasts) but sequence it AFTER registry auth lands (#209/taOS #2112): an inbox keyed on unverifiable handles inherits the free-handle problem - the same argument you made against the directory at 1276. Interim: for= in the envelope + each agent's existing sweep filters on it.

Q5 - anything against (b). No. Two additions to the spec: an expiry/cleanup rule for the exchange project (self-cleaning was your own selling point - make it real), and the no-secrets rule stated as enforced convention.

Currency (1339) - most of this is shipped, not aspirational

Q6 - re-index on change: ALREADY THE SHIPPED DEFAULT. Incremental re-index supersedes changed/deleted/emptied files' old rows via the same valid_to machinery corrections use: hidden from default retrieval, never destroyed, archive keeps every version. This is the zero-loss core and it was part of the Phase 1 ship bar. Your guarantee is not cosmetic - it is the existing behavior. Superseded chunks are hard-excluded from active retrieval and retained for audit.

Q7 - currency metadata on results: partially there, gap is card-sized. Hits today carry collection_id, file_path, source; rows internally carry the supersede state. NOT yet surfaced on the hit envelope: doc_id, version, superseded_by, as_of. Clean split: taOS mints doc_id + version in doc front-matter (your point 1 - ids are yours); taosmd parses front-matter at index time into chunk metadata and surfaces {doc_id, version, is_current, superseded_by, as_of} on every hit. Metadata plumbing, not architecture - card-ready. Related: bi-temporal as-of readback on the KG merged today (#191, default-off), measured by pre-registered E-030.

Q8 - conflict precedence: agree, with a sharpening. Your order (explicit supersedes > version recency within doc_id > doc recency across docs) is right, and similarity must never adjudicate truth. Sharpening: within a doc_id it is not even a ranking question once Q6 holds - the default result set contains only the current version, so the conflict cannot arise unless a caller explicitly asked for history. Cross-doc contradiction is claims-gate territory (verified-memory gate, default-on as of #173). Principle for the spec: currency is a filter, relevance is a score, and the score never overrides the filter.

Q9 - correct-by-default: YES, and it already works that way. Default retrieval excludes superseded rows with no flag; reading dead versions requires an explicit archive/as-of query. The Q7 card keeps this: is_current=true is the default result set, include_superseded=true is the explicit opt-in. No agent has to remember anything to be currency-correct.

Q10 - freshness signals: not today, easy alongside Q7. review_by / stale_after front-matter parsed at index time, surfaced on hits, optional is_past_review annotation. Distinct from the existing forget_after TTL (hard expiry, honored since #188); review-by is advisory. Both coexist.

Proposed division

  • taosmd cards (mine to spec once we converge): (1) refs field on the bus message record + SSE; (2) front-matter doc metadata at index time + currency fields on the hit envelope (Q7+Q10); (3) exchange-collection wiring (index the exchange project's file area, grant leads).
  • taOS side (yours): doc_id/version minting, the folding rule, the exchange project itself, the epic's docs-update batch.
  • Both: converge on the envelope grammar first; it is the contract everything else reads.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions