Files
strukto-ai--mirage/spec/parity_exceptions.json
Zecheng Zhang 88698fa08b feat(ops): optional byte-range reads across backends, and drop github_ci
Adds an optional read_range slot to the op table. Backends that can fetch a
window do; the generic read op falls back to read-and-slice for the rest, so
no backend has to implement one. Wired in both languages for box, databricks,
dify, discord, disk, dropbox, gdrive, gridfs, hf, nextcloud, onedrive, opfs,
ram, redis, s3, sharepoint, slack and ssh.

Shared helpers live in utils/ranges (range_header for a raw push-down,
slice_window for rendered content, is_unsatisfiable_range to normalise a 416).
Backends that render their bytes take the window right after building them,
which is why dify and ram are on the native list too: a windowed read is
answered the same way everywhere, whatever is behind the mount.

Fixes a crash on hf and nextcloud: OpenDAL's reader seeks rather than sending
a header, so a window past EOF raised from the seek instead of surfacing a
416. Both now read as empty. Caught by the integ battery, not by unit tests.

Removes the github_ci resource, its commands, ops, docs and examples.

Integ: a shared ranges/read.json across 21 targets, plus per-backend cases for
slack, discord and dify, reached through ws.dispatch since no shell command
asks for a window.
2026-08-15 04:20:57 -07:00

64 lines
2.7 KiB
JSON

{
"command_io": {
"hf": {
"slots": "find is a slot in python and a bespoke command in typescript (see notion) \u2014 the same query, expressed at a different layer."
},
"notion": {
"slots": "find is a slot in python and a bespoke command in typescript (notion/find.ts). Both pass stat=None, so the -mtime behavior matches; only the layer differs."
}
},
"command_io_aliases": {
"python": {
"hf_buckets": "hf"
}
},
"commands": {
"grep": {
"by_resource": {
"github": [
"has_provision"
]
},
"reason": "TypeScript has no github grep provision. Python's is a bespoke cost model that walks the index to sum matched bytes and read ops, and it reaches IndexCacheStore internals, so porting it needs its own change rather than riding along with the parity gate."
}
},
"language_only_resources": {
"opfs": "Browser-only OPFS backend. Python has no browser runtime, so there is nothing to mirror."
},
"resource_capabilities": {
"github": {
"supports_snapshot": "TypeScript records the blob SHA as a snapshot fingerprint; python stamps the same SHA in core/github/stat.py but does not declare SUPPORTS_SNAPSHOT, so no drift check fires. Left to the snapshot redesign (#721) rather than flipped here, because turning it on changes what a python snapshot records."
},
"lancedb": {
"caches_reads": "TypeScript computes it per mount from the URI scheme (remote tables cache, local ones do not); python has no such branch and never caches. A value, not a table, so there is nothing to single-source."
}
},
"resource_expansions": {
"python": {
"hf_buckets": [
"hf_buckets",
"hf_datasets",
"hf_models",
"hf_spaces"
]
}
},
"unconstructible_resources": {
"browser": {
"databricks_volume": "Registers commands in the browser bundle but has no browser registry factory. Both it and jaeger are pure HTTP, so the omission looks accidental rather than a runtime limit \u2014 confirm the intended browser scope before wiring them up.",
"history": "See python: the history view mount is workspace-internal.",
"jaeger": "Registers commands in the browser bundle but has no browser registry factory. See databricks_volume."
},
"node": {
"history": "See python: the history view mount is workspace-internal."
},
"python": {
"history": "The /.bash_history view mount is created by the workspace itself and is never named in YAML or a snapshot, so it registers commands without a build_resource entry."
}
},
"variant_resource_facts": {
"capabilities": {},
"command_io": {}
}
}