ddcore 0.17
0.17.0 — 2026-09-22
Breaking
- The document key is now
idinstead ofname, everywhere: the column, filters,fields,orderBy,titleField/searchFields,BaseDoc.idin the SDK,doc.idin controllers and form scripts, the REST routes (/api/resource/{doctype}/{id},/api/print/…/{id},/api/comments|versions|assignments|shares/{doctype}/{id},PATCH /api/notifications/{id}), the request bodies of assignments, shares and workflow ({ doctype, id, … },?doctype=…&id=…), the rename body ({ "id": … }), link titles (?ids=), the upload field (doc_id), global search hits, the realtimedoc_updatepayload, the webhook envelope'sdata.id, and the MCP toolsget_doc,update_doc,delete_doc,submit_doc,cancel_docandcall_method. The desk's document route is/app/<workspace>/<doctype>/<id>. There is no alias: a filter, field list or SQL that still saysnamefails on an unknown field or column, butdoc.namereadsundefinedwithout an error, andtscdoes not flag it. On an existing database the nextddcore migraterenames the column on every DocType table before anything else runs, so every patch —beforeSchemaorafterSchema— seesid; primary keys, Single checks and indexes follow on their own, andmigrate --dry-runpreviews it. App code must sayidwherever it meant the key:doc.id,ddcore.getDoc(doctype, id),filters: { id: … },fields: ["id"],"count(id) as n", raw SQL in patches and reports.nameis now an ordinary fieldname an app may declare; declaring it does not bring the old key back. Update apps'ddcore:range to>=0.17.0once they have been through their code and their patches, run or not: a 0.17 binary warns about any app whose range still reaches below it. The step-by-step checklist, including what fails silently, isdocs/agent/upgrade-0.17.md(ddcore://docs/upgrade-0.17). - The fields that held another document's key follow:
reference_name→reference_id(Comment, ToDo, Email Delivery, Webhook Delivery, notifications),share_name→share_id(Document Share),attached_to_name→attached_to_id(File),target_name→target_id(Audit Event), and Version'sdocname→doc_id.migraterenames them, their indexes included; filters and reports that name them must use the new names. - The vocabulary around the key follows it:
namingon a DocType isidGeneration(sameseries,field,hash,prompt,format), thenaming_seriesfield isid_series,nameLabelisidLabel, anddefineListView(…, { nameColumn: false })is{ idColumn: false }. The list's leading column is headed "ID" by default. A Vault field's key template says{id}where it said{name}; a template still saying{name}is refused at load unless the DocType declares a field calledname. Keys already stored in the vault are values and do not move. ddcore export(NDJSON and CSV) writes the key as anidcolumn, and the attachment manifest'snameisid; a consumer of those files must read the new column. A backup taken before 0.17 restores as it was and is brought up by the migrateddcore restoreruns; with--no-migrate,--smokenow says to runddcore migrateinstead of failing on the column.