ADR: framework#2277 (ADR-0070, Proposed). This card tracks the cross-repo rollout.
Problem (from a business-user Studio dogfood pass)
Authored metadata can end up orphaned (package_id = null) with no container to delete/export — "a pile of loose metadata, how do I clean it up?". Root cause: no package-first contract. Stopgaps shipped: framework#2252 (coerce-to-null), objectui#1946 (Local scope). We adopt the Airtable base model: create/select a writable package (base) first; author into it; manage/delete/export by base.
Current state per surface (assessment)
Rollout checklist
Open questions (see ADR)
- Auto-provision one "My workspace" base on first authoring (one-click) vs always explicit create?
allowOrgOverride in single-tenant: keep overlay for surgical tweaks vs "fork to base" for substantial changes?
- Delete-cascade: also delete object records, or schema only? (ties to data-lifecycle/retention)
- Base naming vs stable id (
app.<slug>).
Repos: framework (kernel, ADR), ../objectui (Studio), ../cloud (service-ai-studio).
ADR: framework#2277 (ADR-0070, Proposed). This card tracks the cross-repo rollout.
Problem (from a business-user Studio dogfood pass)
Authored metadata can end up orphaned (
package_id = null) with no container to delete/export — "a pile of loose metadata, how do I clean it up?". Root cause: no package-first contract. Stopgaps shipped: framework#2252 (coerce-to-null), objectui#1946 (Local scope). We adopt the Airtable base model: create/select a writable package (base) first; author into it; manage/delete/export by base.Current state per surface (assessment)
@objectstack/objectqlsaveMetaItem): coerces code-pkg runtime writes tonull(fix(objectql): don't stamp runtime-authored metadata into a loaded code package #2252) → creates orphans.../objectui): selector defaults to a code pkg / null bucket;PackagesPagecan create a writable pkg but the create flow doesn't require one; chore(spec): prune 7 dead field governance/compliance props (dead-surface plan) #1946 surfaces the null bucket.../cloudservice-ai-studio): most advanced —resolvePackageId(metadata-tools.ts:268-328) rejects read-only pkgs (:319), hascreate_package/set_active_package/apply_blueprint, but auto-defaults tocom.workspace(:304) instead of requiring a base.Rollout checklist
isWritablePackagepredicate + reject runtime creates with no writable target (code: 'writable_package_required'); evolve fix(objectql): don't stamp runtime-authored metadata into a loaded code package #2252 coerce-to-null → redirect/reject.@objectstack/objectqlprotocol.saveMetaItem.PackagesPagedialog); selector defaults to a writable base, never null/code-pkg; new items bound to active base.../objectui.../cloudservice-ai-studio: drop auto-com.workspacefallback (metadata-tools.ts:304) +applyDraftre-bind (:568-573); require active package (error →create_package/set_active_package);apply_blueprintrequires package context; updatemetadata-authoring-skill.ts/solution-design-skill.tsprompts.registry.uninstallPackageto writable-base delete), export, snapshot (ADR-0067), duplicate.nullrows; then remove fix(objectql): don't stamp runtime-authored metadata into a loaded code package #2252/chore(spec): prune 7 dead field governance/compliance props (dead-surface plan) #1946 stopgaps.@objectstack/dogfoodcoverage: create→bind→publish→editable→discoverable→delete-cascade, per surface.Open questions (see ADR)
allowOrgOverridein single-tenant: keep overlay for surgical tweaks vs "fork to base" for substantial changes?app.<slug>).Repos:
framework(kernel, ADR),../objectui(Studio),../cloud(service-ai-studio).