Eidos

Eidos File 1.0 文件格式

Eidos File 是扩展名为 .eidos 的 SQLite 3 Application File。唯一规范文本是 Eidos File 1.0, 中文参考译本位于同一规范目录。

文件身份

属性
扩展名.eidos
Media typeapplication/vnd.eidos+sqlite3
SQLite headerSQLite format 3\0
PRAGMA application_id0x45494453EIDS
PRAGMA user_version1
eidos__meta.format_version1.0

Reader 必须同时验证这些身份和唯一 eidos__meta 行。SQLite、API、JSON 与 CSV 中 所有持久 ID 都使用同一种 RFC 9562 UUIDv7 表示:小写、带连字符的 36-character TEXT COLLATE BINARY。BLOB、大写、花括号、URN 与 32-character 形式都不是 canonical ID。连接必须开启 foreign_keys 并关闭 trusted_schema

Canonical layout

project.eidos
├── eidos__meta
├── eidos__features
├── eidos__tables
├── eidos__fields
├── eidos__relation_fields
├── eidos__formula_fields
├── eidos__lookup_fields
├── eidos__views
└── 用户命名的 STRICT, WITHOUT ROWID tables

eidos__tables.nameeidos__fields.name 是 display name,physical_name 是真实 SQLite identifier。新建或明确重命名时,中文、空格、标点和 SQL keyword 都直接作为带引号的物理名;SQLite identifier collision 和保留的系统 Field 名才追加 稳定 UUID suffix。Table display name 以 sqlite_eidos__x__ 开头时, 使用已经冻结的可读 fallback t__<前-8-ID-hex>__<display-name>(碰撞时按规范 扩展),因此物理对象不会落入保留 namespace。 同一 Table 内 Field name 按 SQLite NOCASE 唯一。

User table 与值

每张用户 Table 都是 STRICT, WITHOUT ROWID,并包含:

"_id"         TEXT COLLATE BINARY PRIMARY KEY CHECK(length("_id") = 36)
"_created_at" TEXT NOT NULL
"_updated_at" TEXT NOT NULL

hidden SQLite rowid 不是 Eidos identity。每张 Table 恰好一个 Record Label Field,但规范不要求固定 TitleName Field。

FieldCanonical stored value
Text、URLTEXTNULL
Numberfinite REALNULL
IntegerINTEGERNULL
date、datetime规范化 TEXTNULL
Checkbox01NULL
Selectoption name TEXT
Multi-selectordered unique JSON string array
Fileordered JSON object array
JSONcanonical JSON text
Forward Relationordered unique JSON UUID array

date 必须是准确的 YYYY-MM-DD。datetime 以及所有 created_at / updated_at 必须使用固定 UTC 形式 YYYY-MM-DDTHH:MM:SS.sssZ。API 与 CSV 输入若带时区偏移, 写入前必须归一化为 UTC;除非调用方明确要求有损转换,否则拒绝亚毫秒精度。 固定宽度字符串使用 SQLite BINARY 顺序,因此字节序就是时间顺序。

Option 没有 ID 或独立 value table。可选展示 catalog 位于 settings_json{ "options": [{ "name", "color" }] }。Catalog 外的 raw cell value 仍是有效数据。

File item 必须包含 canonical UUIDv7 id、非空 name、RFC 6838 mediaTypeuri,以及使用非负 int64 十进制字符串表示的 size。未知成员必须 保留。相对 URI 从 Eidos File 所在目录解析,使用 /,不能是绝对路径,也不能通过 .. 逃逸;同时允许 HTTPS URI。二进制内容不保存在 SQLite cell 中;资产存在性、 授权、传输、解析与垃圾回收属于 Adapter 职责。

Relation、Formula 与 Lookup

forward Relation 是真实 JSON source column;subtype metadata 保存 target Table、 cardinality 与 restrict / detach / preserve delete policy。inverse Relation 是 virtual reverse projection,不保存 mirror column 或 global edge table。

Formula source 中 Field reference 始终使用当前准确 name 的双引号形式:

"Estimate" * 1.2
coalesce("Project budget", 0)

Field rename 解析 Formula,只重写 reference nodes,不修改 string literals。 Formula、Lookup 与 inverse Relation 都是 virtual;全文件 Field-ID dependency graph 必须无环,Runtime 只按请求的 transitive dependencies 做 set-based evaluation。

Query 与写入

View query_json / layout_json 使用 Field ID。projection、filter、multi-sort、 keyset paging、group 与 statistics 共用同一套 live logical values,包括 Formula 和 Lookup。

每个 logical mutation 必须在一个 transaction 内校验 expected revision、更新 canonical state、验证 invariant,并令 eidos__meta.revision 恰好加一;失败时完整 rollback。

generated index、resolved label、compiled plan 与 cache 都是可丢弃的 Host-private state,不能成为解释 .eidos 文件的必要条件。

字段能力矩阵

字段能力矩阵是一份可交互的自包含 .eidos 样本——不是截图,也不是另一张需要手工 同步的 HTML 表。在 Eidos File Web 编辑器中通过 选择模板 → 字段能力矩阵 打开,你可以在其中搜索、下载或编辑副本。

Feature negotiation 与 extension

Feature support 是大小写敏感的准确 (name, version) tuple;版本不隐含 SemVer 兼容。遇到不支持或无效的 required feature 时,Reader 和 Writer 都不能声称 canonical conformance。未知 optional state 必须按字节语义保留,否则 Writer 必须 拒绝写入。

第三方 object 与 feature 使用 x__<vendor>__* namespace,每个 extension object 都必须有匹配的 feature declaration。Extension 不能新增 eidos__* object,不能向 core 或 user table 添加 trigger,不能遮蔽用户 physical name,也不能重新解释 core raw value。

相关指南