Skip to content

[Decision] A restart puts seeded records back: a customer's edit to a seeded row is overwritten by the next boot #30081

Closed

Description

@objectstack-fleet

epic:#26676#1 · zhuangjianguo · session_cdb7a717def74e719988f089fbaa18ff

The maintainer: 「等我决定的都要立卡,并且从业务的角度给我具体解释和我沟通」 (2026-11-04). Measured by the seat on main 63b86b385d, on the example CRM unless noted. No domain:* label is set: triage routes this card.

The question

A package ships starter records with mode: 'upsert', the spec's default. Each boot loads them again by externalId, so an edit a customer made to one of those rows goes back to the shipped value, silently. Is that what a seed should do once a customer owns the data?

Governing text: packages/spec/src/data/seed.zod.ts:170 (mode default upsert), :205 (env default includes prod), :61-62 (a column policy create writes a column only when the row is created). ADR-0131 ("declared is code, no seeding") covers metadata, not this business data.

Measured

  • On the CRM, Acme — Q3 Platform Renewal's probability was edited to 75 in the running app and read 75.
  • After restarting the dev backend it read 70, the seed's value, and updated_at was the boot time. A record not in the seed (Eval Test Opp 1102) kept its edit.
  • Every seeded opportunity's updated_at moves at each boot, so 更新于 reads minutes ago on rows nobody touched.

This was measured on objectstack dev only. The seat did not measure a production serve boot or an upgrade, so whether a production customer loses edits this way is unverified. The env default and the replay comments suggest it can happen. Measure it first.

Options

  • A. Create-only by default: a replay inserts missing rows and leaves existing ones alone. An author who wants reset behaviour says so explicitly.
  • B. Keep upsert, change the examples: examples use ignore or the column policy.
  • C. Keep as is, and document it.

Recommendation: measure production, then A

四轴分析

实际业务需求。 客户改了预置的客户、产品、配置类记录,升级或重启后被改回去,而且没有任何提示。这是最难被原谅的一类问题:数据悄悄丢了,往往很久才发现。

项目长远合理性。 种子是「开始用的初始数据」,一旦交给客户,数据就归客户。A 符合这个归属。B 只治示例,默认值还在坑人。

防 AI 写错。 AI 写种子常按示例或默认值。A 让默认值是安全的;要覆盖时必须明说。

创业阶段不扩散。 这是修正默认行为,不是加能力。但它是破坏性的默认值变更,已发布的包如果依赖覆盖行为会受影响,要先量一下有没有这样的包。

棱 A B C
业务 强 中 弱
长远 强 弱 弱
防错 强 中 弱
不扩散 中 强 强

Re-check

git grep -n "SeedMode.default('upsert')" origin/main -- packages/spec/src/data/seed.zod.ts

Activity

  1. objectstack-fleet commented on Nov 4, 2026

    @objectstack-fleet
    ContributorAuthor

    epic:#26676#1 · zhuangjianguo · session_cdb7a717def74e719988f089fbaa18ff

    The maintainer, 2026-11-04: 「30079这种不是应该在元数据应用中自己去开发自定义操作吗?你的意见是批量换负责人放到内核吗?其他全部同意」.

    Ruling: measure production first, then option A. First measure a production serve boot and a package upgrade: does a replay overwrite a customer's edit to a seeded row? If it does, make create-only the default: a replay inserts missing rows and leaves existing ones alone, and an author who wants reset behaviour declares it. If production does not overwrite, report that here and stop. Before changing the default, list which shipped packages rely on the overwrite. needs-user-decision is removed; triage routes this card.

  2. objectstack-fleet commented on Nov 4, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: first-touch audit · p1 kept · domain:spec · 2026-11-04T12:59Z

    ⛔ Not a claim.

    • Read fresh. A seed's default mode: 'upsert' replays at each boot and puts a customer's edit to a seeded row back, silently. Ruled: measure a production serve boot and an upgrade first, then make create-only the default (A). Possible silent data loss, so p1 kept.
    • Routed to domain:spec, which owns the default (packages/spec/src/data/seed.zod.ts). The measurement and the loader are the domain:server half, which the PR names. A changed default is breaking, so the PR carries its ADR-0087 disposition, and a census of the shipped packages that rely on the overwrite.

    Generated by Claude Code

  3. objectstack-fleet commented on Nov 4, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-support-ai · session_01WGufzfgvGexKn9vLHsy89K

    Claim: PM loop round 13 (p1)
    Session: session_01WGufzfgvGexKn9vLHsy89K
    Account: os-support-ai
    Branch: the card thread's own claude/project-thread-* branch, named in the dev's hand-back and restated in a later claim (a measured platform exception to claude/issue-30081-…)
    Worktree: objectstack-issue-30081
    Domain: domain:spec
    Seat: domain:spec#3
    File surface: phase 1 is measurement only, with no code change: a production serve boot and a package upgrade, reporting whether a replay overwrites a customer's edit to a seeded row. Phase 2 runs only if it does: packages/spec/src/data/seed.zod.ts (the mode default), the default-changes ledger, the ADR-0087 disposition, the seed loader if it restates the default, docs and examples, and a census of the shipped packages that rely on the overwrite.
    Container & model: M, mode:thread, model: TIER_DEFAULT, effort: xhigh
    Clause-②: yes (narrowing in phase 2: a changed default, breaking; phase 1 is measurement only and changes nothing)
    Metadata-protocol: phase 2: changed default (the dev measures the kind with check-changeset-no-major)
    Responsibility: the seed loader's upsert replay writes the seeded columns back over the customer's edit | per-column applyOn: 'create' (#25761) covers it only where the author opted in | every package that ships seeds without a mode; measured on the CRM dev boot, prod unmeasured
    Thread-read: 6631261755
    Premise: holds on dev. At origin/main f6f663a8, SeedSchema.mode is SeedMode.default('upsert') and env defaults to ['prod','dev','test']. The card measured the overwrite on objectstack dev only, and production is unverified.
    Human floor: ruling 6631016988: measure production first; if it does not overwrite, report that and stop. If it does, make create-only the default (a replay inserts missing rows and leaves existing ones), and an author who wants reset behaviour declares it. List the shipped packages that rely on the overwrite before changing the default.
    Serial constraints cleared: no open PR touches seed.zod.ts or the seed loader.

  4. objectstack-fleet commented on Nov 4, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-support-ai · session_01WGufzfgvGexKn9vLHsy89K

    Claim: PM loop round 13 (p1), restated with the branch
    Session: session_01WGufzfgvGexKn9vLHsy89K
    Account: os-support-ai
    Branch: claude/project-thread-2k4081 (the card thread's own branch, a measured platform exception to claude/issue-30081-…), off origin/main f68b47ca
    Worktree: objectstack-issue-30081
    Domain: domain:spec
    Seat: domain:spec#3
    File surface: phase 1 is measurement only, with no code change: a production serve boot and a package upgrade, reporting whether a replay overwrites a customer's edit to a seeded row. Phase 2 runs only if it does: packages/spec/src/data/seed.zod.ts (the mode default), the default-changes ledger, the ADR-0087 disposition, the seed loader if it restates the default, docs and examples, and a census of the shipped packages that rely on the overwrite.
    Container & model: M, mode:thread, model: TIER_DEFAULT, effort: xhigh
    Clause-②: yes (narrowing in phase 2: a changed default, breaking; phase 1 is measurement only and changes nothing)
    Metadata-protocol: phase 2: changed default (the dev measures the kind with check-changeset-no-major)
    Responsibility: the seed loader's upsert replay writes the seeded columns back over the customer's edit | per-column applyOn: 'create' (#25761) covers it only where the author opted in | every package that ships seeds without a mode; measured on the CRM dev boot, prod unmeasured
    Thread-read: 6632277675
    Premise: holds on dev. At origin/main f6f663a8, SeedSchema.mode is SeedMode.default('upsert') and env defaults to ['prod','dev','test']. The card measured the overwrite on objectstack dev only, and production is unverified.
    Human floor: ruling 6631016988: measure production first; if it does not overwrite, report that and stop. If it does, make create-only the default (a replay inserts missing rows and leaves existing ones), and an author who wants reset behaviour declares it. List the shipped packages that rely on the overwrite before changing the default.
    Serial constraints cleared: no open PR touches seed.zod.ts or the seed loader.

  5. objectstack-fleet commented on Nov 4, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-support-ai · session_01WGufziyEchnN2d8EyH3Jc6

    Stamp: 2026-11-04T14:25Z

    Phase 1 measurement: production overwrites a customer's edit to a seeded row

    Verdict: yes. On a production boot, the replay writes the seeded value back over a customer's API edit. It does so on every restart and on both package-upgrade paths measured. Phase 1 changed no code.

    Tree: objectstack-ai/objectstack f68b47ca, branch claude/project-thread-2k4081, full build 119/119. Every boot ran the built CLI (packages/cli/bin/run.js) with NODE_ENV unset, as a customer would, and the CLI defaulted it to production (boot log: this process: NODE_ENV=production). Each run used a fresh SQLite home.

    Fixture: one object, seedprobe_product (name, price, note), and one seed dataset with no mode and externalId: 'name': Widget (10, shipped) and Gadget (20, shipped). The customer edit was PATCH /api/v1/data/seedprobe_product/ID with { price: 99, note: 'customer edit' }, sent as the first signed-up account (the platform admin). It answered 200 and read back as 99.

    # Path After the edit After the replay What the replay logged
    A1 os start --artifact ./dist/objectstack.json, then a restart on the same home Widget 99 / customer edit Widget 10 / shipped [Seeder] Seed loading complete {"inserted":0,"updated":1,"skipped":1,"errored":0}
    A2 os serve (directory holding only dist/objectstack.json), then a restart Widget 99 / customer edit Widget 10 / shipped same counts
    B1 Boot artifact upgraded from 1.0.0 to 1.1.0 (the two artifacts differ only in manifest.version): os start --artifact, same home Widget 99 / customer edit Widget 10 / shipped updated":1,"skipped":1
    B2 os package install ./art-1.0.0.json, edit, then os package install ./art-1.1.0.json (managed, air-gapped), both into one running os start Widget 99 / customer edit Widget 10 / shipped [MarketplaceInstallLocal] inline seed for com.qa.seedprobe: inserted=0 updated=1 skipped=1 errors=0
    B2r The B2 runtime: edit again, then restart Widget 99 / customer edit Widget 99 kept rehydrated com.qa.seedprobe@1.1.0, and no seed ran

    updated_at: in A1, Widget's updated_at moved from its edit time 2026-11-04T14:19:26Z to boot 2's seed time 2026-11-04T14:19:36Z. Gadget was never edited and kept its updated_at: the loader's no-op check (isNoOpReplay) skips a row whose seeded columns already match. So in this fixture only the edited row moved. I did not re-measure the card's CRM reading that every seeded opportunity's updated_at moves at each boot. That seed carries cel date values, and this fixture has none.

    The customer gets no signal. The replay logs at info, and os start defaults to warn. The banner reads Seeds: com.qa.seedprobe 2 rows on both boots. On the upgrade, os package install prints Package installed … Version: 1.1.0 and says nothing about rewritten rows.

    Where the replay runs, and when (f68b47ca)

    1. Every boot, single-tenant: packages/runtime/src/app-plugin.ts:1899 (runInlineSeed). It builds its request at :1916 with defaultMode: 'upsert' (:1919), calls seedLoader.load at :1925, and runs from AppPlugin.start (:2105) on every boot of os dev, os start, os serve or an embedded host. Only two things skip it: skipSeedData (an os migrate planning boot, :1883), or an organization wall in force (:1891), in which case the per-organization replay (item 4) runs instead.
    2. Environment: the loader resolves the environment from NODE_ENV (packages/metadata-protocol/src/seed-loader.ts:917 calls resolveEnvConfig at :3403, and production maps to prod). The env default ['prod','dev','test'] (packages/spec/src/data/seed.zod.ts:205) then lets the dataset through in production.
    3. The write: seed-loader.ts:1196 takes dataset.mode. On upsert, a matched row is updated (decideWriteAction :3075, writeRecord :3009) unless isNoOpReplay finds every seeded column equal. A customer edit to a seeded column makes them unequal, so the row is rewritten.
    4. Per-organization replay: the seed-replayer service (app-plugin.ts:1795, upsert at :1817). Under a walled posture it runs on each sys_organization insert, once per new organization, not on every boot. Not measured.
    5. Package install and upgrade: packages/cloud-connection/src/marketplace-install-local-plugin.ts:2352 (install, seedNow: true) and :3847 (the reseed endpoint). Both go through runInlineSeed, which loads with upsert at :4645. The boot rehydrate passes seedNow: false (:1229) and seeds only when every seeded object is empty (maybeHealSampleData), which B2r confirms.
    6. Publishing a seed metadata item: packages/metadata-protocol/src/protocol-publish-batch.ts:100 (upsert at :115), and the route fallback applyPublishedSeeds in packages/runtime/src/domains/packages.ts:3839 (upsert at :3967). Each publish replays the seed. Not measured.
    7. Dev hot reload: app-plugin.ts:2296 (upsert at :2343). Development only, and new objects only.

    Readings that bear on phase 2 (nothing changed)

    • ignore is already create-only in the loader. It skips a matched row and inserts a missing one (seed-loader.ts:3023 and :3080). On this reading, phase 2 needs no new mode value.
    • The compiled artifact writes the default in. os build stored "mode": "upsert" and "env": ["prod","dev","test"] in dist/objectstack.json for a dataset that declared neither. A package built before the change keeps replaying with upsert until it is rebuilt. Artifacts and install-ledger entries already stored are the ADR-0087 stored-row question.
    • config.defaultMode is never reached on a parsed request. SeedLoaderRequestSchema.seeds parses each seed through SeedSchema (packages/spec/src/data/seed-loader.zod.ts:526), whose default fills mode, so defaultMode (:245) never applies. Six call sites still restate defaultMode: 'upsert': app-plugin.ts:1817, :1919 and :2343; packages.ts:3967; protocol-publish-batch.ts:115; and marketplace-install-local-plugin.ts:4645.
    • The CRM example states mode: 'upsert' on its datasets (examples/app-crm/src/data/index.ts:12 and the datasets after it), so changing the default alone would not change the CRM's replay. That belongs to the phase 2 census.

    Not measured: drivers other than SQLite; the per-organization replay under a walled posture; a catalog install (os package install com.x); and a publish of a seed draft.

    Phase 1 stops here. Phase 2 waits for the seat's go.


    Generated by Claude Code

  6. objectstack-fleet commented on Nov 4, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-support-ai · session_01WGufzfgvGexKn9vLHsy89K

    Phase 2 go, under ruling 6631016988. The phase 1 measurement (6633189577) shows that production overwrites. A customer's edit to a seeded row goes back to the seed value on every restart under os start and os serve, and on both upgrade paths measured (a boot-artifact bump and os package install). The customer gets no signal. So the ruling's condition is met, and option A proceeds.

    Seat's contract look, binding on phase 2:

    1. The new default is ignore. The loader already treats it as create-only (seed-loader.ts:3023, :3080), so no new mode value is added. Rewrite the mode describe and docblock to say that a replay inserts missing rows and leaves existing rows alone. An author who wants reset behaviour declares mode: 'upsert', or uses applyOn per column.
    2. One default, stated once. The six call sites that restate defaultMode: 'upsert' stop restating it: app-plugin.ts:1817, :1919, :2343; packages.ts:3967; protocol-publish-batch.ts:115; marketplace-install-local-plugin.ts:4645. SeedLoaderConfig.defaultMode follows the SeedSchema default. No site may keep its own 'upsert' fallback.
    3. Built artifacts already stored. A package built before this change carries "mode": "upsert" in its dist, and the loader cannot tell that value from an authored one. ⛔ Don't add a conversion that guesses (project memory objectstack-spec-default-removal-ripples). The disposition states that such a package keeps today's replay until it is rebuilt. It says so in the changeset, the D3 entry and the default-changes row. A pin shows an explicit upsert row still replaying.
    4. Census. List every in-tree seed that relies on the overwrite, with a reason for each. The CRM example is the card's own reproduction and states mode: 'upsert' explicitly. Its customer-owned business data (accounts, opportunities and the like) drops the explicit mode and takes the new default. A dataset keeps upsert only if it is reference data the package must keep refreshed, with the reason in a comment.
    5. Pins. A seed with no mode: a customer edit survives a replay, a missing row is inserted, and an untouched row's updated_at does not move. An explicit upsert still writes back. The install-local reseed path follows the new default.
    6. Declarations: Clause-②: yes (narrowing). The changeset level and Metadata-protocol are measured by check-changeset-no-major. The ADR-0087 disposition is required.

    Not in scope: the env default, os build baking parsed defaults into dist (report it as a finding if it matters), and the per-organization replay beyond following the same default.

    Posted 2026-11-04T14:27Z.

  7. objectstack-fleet commented on Nov 4, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-support-ai · session_01WGufziyEchnN2d8EyH3Jc6
    os-dev-report

    {
      "issue": 30081,
      "status": "done",
      "branch": "claude/project-thread-2k4081",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30152",
      "head": "6353695e8fc8d49c15c3299b9ec2cfb4642fd85e",
      "session": "session_01WGufziyEchnN2d8EyH3Jc6",
      "premise_still_valid": true,
      "summary": "Phase 1 (comment 6633189577): production overwrites — os start / os serve restarts, a boot-artifact upgrade and an os package install upgrade each wrote the seeded value back over a customer API edit, silently. Phase 2 per contract look 6633227800: SeedSchema.mode defaults to `ignore` (no new mode value; the loader already treats ignore as create-only). SeedLoaderConfig.defaultMode IS SeedSchema.shape.mode (one default, stated once). The six restated `defaultMode: 'upsert'` sites are gone (app-plugin.ts x3, domains/packages.ts, protocol-publish-batch.ts, marketplace-install-local-plugin.ts runInlineSeed), and the save door reads SeedSchema.shape.mode.parse(undefined) instead of its own 'upsert' fallback. Declared: 3 DEFAULT_CHANGES_BY_MAJOR[18] rows (Seed:mode, SeedLoaderConfig:defaultMode, SeedLoaderRequest:config) and D3 semantic entry seed-mode-default-create-only; built-artifact disposition ('keeps today's replay until rebuilt', no conversion) stated in the changeset, the D3 entry, the ledger rows and the mode TSDoc. Census: CRM 5, showcase 18, todo 1 explicit-upsert datasets dropped (all business/starter data; none kept as reference data); no platform package ships a seed. Docs: seed-data.mdx, examples.mdx, stack.zod.ts data docblock. Changeset: spec/runtime/metadata-protocol/cloud-connection minor, Clause-② yes (narrowing), Metadata-protocol semantic, adr-0087 marker.",
      "tests": "Pins: runtime seed-default-create-only-replay.integration.test.ts (real SqlDriver+ObjectQL, request parsed with no mode of its own): no-mode dataset across a v2 replay keeps the customer edit, inserts the added record, leaves the untouched row's value and updated_at (Date faked per step); control mode:'upsert' writes back and moves updated_at. Ablation (ablation-replace, SeedMode.default('ignore')->('upsert')): 2 failed | 1 passed (control holds), restored blob == HEAD. cloud-connection reseed pin parses the captured request with the real SeedLoaderRequestSchema (mode-less -> ignore, declared upsert kept, no config.defaultMode); ablation restoring defaultMode:'upsert' in runInlineSeed: reseed pin + heal test fail, restored. A first ablation anchored inside a // comment was vacuous (15/15 green) and is not counted. Spec: omitted mode -> ignore, authored modes kept, defaultMode == seed default, parsed request dataset -> ignore. Suites under os-verify-lock: spec 810 files/24395 tests, metadata-protocol 312 (+4 skipped), cloud-connection 68/824, organizations 18, objectql seed 11, cli seed 6, examples crm 7 / showcase 46 / todo 8: green; runtime 540/541 — seed-datasets.test.ts asserted the per-org replayer's restated defaultMode:'upsert', updated in 6353695e (7/7). At 6353695e: spec test:repo 90 files/1539 tests green.",
      "gates": "dispatch-gates --commands: 114 derived at 6353695e, run serially with the PR body as GITHUB_EVENT_PATH. 113 exit 0; check-plugin-teardown-shape --self-test exit 3 (shallow clone) -> exit 0 after git fetch origin 621a4876. dispatch-gates --ran: 114 derived, 114 run, 0 NOT-MEASURED, 0 UNRUN, exit 0. Body-reading gates rerun on the final body: check-changeset-no-major (LEVEL AXIS: yes (narrowing) + semantic, no moved package at patch), check-adr-0087-registration (registered seed-mode-default-create-only), check-closing-keyword-parity, check-issue-citations: exit 0. check:generated green after gen:docs. No merge of main needed: merge-tree clean, 4 commits behind.",
      "dogfood_battery": "run — one os-verify-lock command at 6353695e: pnpm build 119/119 (726s), spec test:repo green (469s), @objectstack/dogfood test 417 passed | 3 skipped files, 3462 passed | 28 skipped tests (1609s), exit 0.",
      "mcp_calls": "3 reads, 0 writes: phase 1 issue_read get + get_comments on #30081; phase 2 issue_read get_comments on #30081 (to confirm comment ids). Other reads: unauthenticated REST GETs via curl (actions runs, pulls), check-prior-rulings --card 30081.",
      "api_writes": "relay comment x1 in phase 1 (measurement 6633189577 via post-stamped); relay pr_create x1 (#30152: dispatch exited 6 UNCONFIRMED after 90 s with the queue busy; not re-sent; run 41868925350 concluded success; body read back byte-identical, 12022 bytes, draft, no assignees, no reviewers, no labels); relay comment x1 (this report). No assignee, reviewer or label written.",
      "writes": "git push x4 (a fifth was refused locally by check:commit-card-trailers and sent nothing); relay comment x2 (phase 1 measurement, this report); relay pr_create x1",
      "deviations": [
        "Census applied the contract look's keep-upsert-only-with-a-reason rule to every in-tree seed, not only the CRM: showcase (18) and todo (1) business datasets also dropped explicit upsert; none qualified as reference data.",
        "Skills-docs owes more lines than the order named: skills/objectstack-data/references/seeds.md:36, :52, :63, :160, evals/hooks-security-seeds-datasources.json:37, and skills/objectstack-platform/SKILL.md:377 — listed in the PR body, not edited (Tier H, lane paused).",
        "Three unpublished commits first carried `Refs #30081`; the pre-push check:commit-card-trailers refused them, and they were reworded before any publish (no published history rewritten).",
        "PR opened without assignees and without a review request (os-dev rule 2); the seat hands it over.",
        "Worktree /home/claude/objectstack-issue-30081 kept for a review round."
      ],
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "`os build` writes the parsed seed (defaulted `mode`/`env` included) into dist/objectstack.json, so a default move reaches a package only after a rebuild and a stored artifact's `\"mode\":\"upsert\"` is indistinguishable from an authored one. Follow-up candidate: stop baking a defaulted seed `mode` into the artifact.",
        "The six restated defaultMode:'upsert' sites were already dead for parsed requests (SeedLoaderRequestSchema fills each dataset's mode), so removing them changes no behaviour by itself; the default move is what does."
      ]
    }

    Generated by Claude Code

  8. objectstack-fleet commented on Nov 4, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-support-ai · session_01WGufzfgvGexKn9vLHsy89K

    Accepted: PR #30152, head 585143c7. The ACCEPT is 6637960689; the contract reviews are 6636509452 (FAIL, text-only) and 6637909502 (PASS), all on the PR. It lands through the merge queue.

  9. objectstack-fleet commented on Nov 4, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-support-ai · session_01WGufzfgvGexKn9vLHsy89K

    Landed: PR #30152 merged at fc869c24. A seed dataset with no mode now defaults to ignore: a replay inserts missing rows and leaves existing rows as the customer holds them. An explicit mode: 'upsert' keeps today's reset behaviour. Packages built or installed before this change keep replaying with their baked upsert until they are rebuilt and re-installed, as the changeset states. The card closed by Fixes, and the seat removes pm:dispatched.

    Carried:

    • The skills lines owed while the skills lane is paused (listed in the PR body).
    • os build bakes parsed defaults into dist: an out-of-scope finding, not yet carded.

    Posted 2026-11-04T18:28Z.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions