Skip to content

feat(storage): add durable managed dependency artifact authority - #3

Closed
zhiiw wants to merge 52 commits into
mainfrom
codex/managed-dependency-storage-authority
Closed

zhiiw wants to merge 52 commits into
mainfrom
codex/managed-dependency-storage-authority

Conversation

@zhiiw

@zhiiw zhiiw commented Aug 9, 2026

Copy link
Copy Markdown
Owner

Summary

Introduces the durable storage authority for Maka-owned dependency artifacts. This slice owns publication, immutable receipts, leases, garbage collection, and crash convergence for dependency trees. It has no Runtime Host composition or production tool consumer.

Primary invariant

An artifact may be published only after the producer filesystem capability has been revoked, the authority-owned copy has been sealed, and its receipt can be committed. Active or pending leases prevent collection.

  • Owner: managed dependency storage authority
  • Atomicity boundary: authority-owned artifact publication + constrained SQLite receipt
  • Failure state: unpublished staging is collectable; receipt/artifact mismatch fails closed
  • Rollback: remove this storage authority without changing the existing workspace execution path

Stack

  1. This PR: durable dependency artifact authority
  2. constrained npm producer
  3. bundled npm runtime attestation
  4. cancellable managed admission authority
  5. production managed inspection task + crash/replay proof

Verification

Focused storage tests cover duplicate owners, acquire/close races, producer inode revocation, tree sealing, readonly artifacts, leases, and GC.

中文说明

本切片只引入 Maka 自有依赖产物的 durable storage authority,负责依赖树发布、不可变 receipt、lease、GC 与崩溃收敛;不接 Runtime Host,也不提供生产工具入口。

主要不变量:只有在 producer 的文件系统能力被撤销、内容复制到 authority 自有 inode、完整树完成 seal,并且 receipt 可提交后,artifact 才能发布。active/pending lease 期间绝不能被 GC 删除。

堆叠顺序:本 PR → 受约束 npm producer → bundled npm attestation → 可取消 managed admission → 生产 managed inspection 与 crash/replay 证明。

…nges (apache#2474)

* ci(test): auto-enable storage stress rounds for WAL recovery race changes

Refs apache#2388.

apache#2459 gated the 12-round fresh-WAL race amplification behind
MAKA_STORAGE_STRESS, but sqlite-recovery-concurrency.test.ts was not in
STORAGE_STRESS_FILES, so CI never re-enabled the amplified rounds even when
the recovery race surface itself changed. Add the test, its spawned worker
fixture, and sqlite-runtime-store.ts (the store the race exercises) to the
stress set, matching how the other multi-process storage probes are wired.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ac5rv6WUKWtMZgQb5QPN16

* ci(test): cover the WAL race's production owners and pin the stress routing

Review follow-up: the amplified race path runs through
acquireOperationalStateDatabase(), so operational-state-store.ts and
sqlite-runtime-schema.ts own the fresh-WAL initialization, locking, and
migration it exercises. Add both to STORAGE_STRESS_FILES, and extend the
planner test's stress table with all five WAL-race paths so the routing
contract stays executable.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ac5rv6WUKWtMZgQb5QPN16

* ci(test): trigger storage stress on every migration the WAL race executes

Review follow-up: acquireOperationalStateDatabase() runs the migrations
owned by the six sqlite-*-schema modules inside the amplified fresh-WAL
race, so all six join STORAGE_STRESS_FILES and the planner's stress table.
sqlite-runtime-store.ts leaves the set - the amplified operational_open_only
branch never constructs it - and a negative planner case pins that boundary.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ac5rv6WUKWtMZgQb5QPN16

---------

Co-authored-by: Claude <noreply@anthropic.com>
@zhiiw
zhiiw force-pushed the codex/managed-dependency-storage-authority branch from 708acc1 to 6b9943a Compare August 9, 2026 02:59
M4n5ter and others added 28 commits August 9, 2026 11:24
…2548)

* fix(desktop): stabilize session lifecycle mutations

* test(desktop): isolate side chat dismissal lifecycle
* test(storybook): report daily review bounds

* fix(desktop): bound settings selector menus
npm run dev only tsc --build tsconfig.lib.json. After the Runtime Host
cutover, desktop main imports @maka/runtime-host/protocol at runtime, but
that package was missing from the lib graph — stale dist then crashed
Electron with missing named exports such as
decodeExternalSessionCatalogQueryInput.
DESIGN.md is read by agents as much as by people, so a line that has gone
stale is worse than a line that was never written — it gets adopted as fact.
Two kinds of line in this file cannot stay true, and both are removed here.

FIRST: prose that describes the current state of the migration.

  - §3's One Colorspace exception, "until T4 unified it"
  - §4's --ring-soft, "was called --shadow-minimal-flat until T4"
  - §5's Floating Recipe, "currently enforced ... a transitional implementation"
  - §11's wash ban, "T4 migrated fourteen such sites ... the rest are debt"
  - §3's link rule, "--link currently resolves to raw --accent"

This branch is its own evidence for why. An earlier revision of it documented
the srgb exception, the shadow-minimal-flat rename and the unenforced Floating
Recipe as open items; apache#2536 closed all three the same day, and every one of
those lines had to be rewritten before this could land. A spec that tracks
progress has to be rebased against progress.

The rules themselves are unchanged and read stronger without the timestamps:
the ladder derives in one space, --ring-soft is a border, the recipe binds
every portal including Astryx's own. Where a rule and the code genuinely
disagree, that belongs in an issue, not in a clause hedging the rule.

SECOND: values and inventories that source already owns.

  - The surface pixel table and the ink contrast columns. Their caption
    claimed the contract tests held them; ink-ladder-contract pins two
    structural invariants and no number.
  - The seven-alias legacy surface list, which the file's own last Don't
    forbids copying in. Its one load-bearing fact — --background is the card
    fill, not the page color — moves into §2's opening sentence.

Frontmatter stays. It is the machine-readable half of the DESIGN.md
convention, and its consumer is the agent reading it rather than a build
script, so the fix for a wrong entry is to correct it, not to delete the
block.

And the assertions that were simply wrong:

  - The radius table listed a 4px inner tier and a 16px page tier. Neither
    exists: --radius-inner resolves to 6px and --radius-page to 28px. Removed
    from the table and from the frontmatter. What replaces them is the
    relationship those rows were hiding — control/card/container are the same
    numbers as Astryx inner/element/container — now an Astryx column plus the
    Two-Name Rule, which says the pairs agree today as independent literals
    and can still be split by an upstream bump.
  - "There is no info status semantic" fused the color families with the dot
    semantics. --info is live in eleven palettes; what has no info is
    StatusSemantic. Read as written it told the next reader to delete a token
    the source deliberately keeps. Split across §8 and §9.
  - Astryx's Badge and StatusDot carry fixed literals from the neutral theme,
    so an Astryx info pill and Maka's --info are unrelated blues. Recorded.
  - Astryx's Text color="secondary" is not this ladder's secondary: it reads
    --color-text-secondary, a fixed literal outside the bridged containers and
    --muted-foreground inside them. Three results for one word, with live call
    sites on both sides.
  - §1 said maka-tokens.css owns "the Astryx bridge". It owns one third of it.
  - §7 listed Heading 1-5, omitting heading-6 and large.
  - §4's --border-strong and §9's scrollbar thumb contradicted each other.
    Reconciled on §9's side, since T5 shipped the thumb.

248 -> 238 lines. Doc-only; no token or product CSS changes.
* feat(code-mode): serialize cell execution

* chore: align AI SDK for CodeMode

* feat(code-mode): replace Self with QuickJS

* fix(code-mode): fail closed across tool boundaries

* fix(licenses): fail closed on embedded upgrades

* fix(code-mode): bound execution admission
…#2574)

Keep only real blocking patches (blank UA-CH, ai-sdk tool-call tracker).
Product code uses stock ChatToolCalls + Astryx Button for linked sessions,
and remounts ChatLayout on session switch instead of conversationKey.

Shell sidebar shares the canvas base so the floating plate gap is not a
third colour. Remove patch-guard tests and the floating-recipe CSS hook.
* fix(runtime): recover idle provider streams

* test(runtime): bound idle stream recovery

* fix(runtime): keep retry step identity current

* fix(runtime): keep idle recovery fail-closed

* fix(runtime): close idle replay safety gaps
* fix(headless): accept canonical trajectory refs

* fix(headless): preserve token usage provenance

* fix(headless): timestamp settled benchmark events

* fix(headless): require explicit final usage evidence

* fix(headless): derive usage provenance at producers

* fix(headless): keep incomplete usage provisional

* fix(headless): downgrade unsettled native usage

* test(headless): mark harness fixtures as final

* refactor(headless): clarify usage reconciliation

* fix(headless): retain error response usage
…he#2584)

* fix(desktop): restore composer drafts after apache#2574 remount

Drop the session-keyed ChatLayout remount that wiped the in-composer
draft Map, and point patch-era e2e/story selectors at stock Astryx DOM.

* fix(desktop): sticky tool-call rows on stock ChatToolCalls DOM

apache#2574 dropped the data-slot patch; nested sticky CSS still targeted it, so
expanded call headers scrolled away. Bind sticky to role=button instead.
* fix(ui): restore conversation-safe Astryx seams

* fix(code-mode): start admitted tools without deferral

* test(code-mode): remove scheduler-dependent assertions
* ci: reduce Storybook to render smoke

* ci: skip Electron E2E for Storybook-only changes
* test: drop Astryx DOM geometry and CSS string contracts

Remove suites that pinned vendor class names, sticky px offsets, List
aria-label, and CSS-grep structure after apache#2574 dropped ceremonial patches.
Keep product journeys, classifier logic, and the real blank-UA-CH patch gate.

* test: drop more layout geometry and vendor class pins

Second pass: Daily Review bounds play, Astryx Skeleton class checks,
astryx-codeblock markup matches, MCP field Y-order, and workbar CSS
pixel widths. Keep accessible values, journeys, and product signals.

* fix(ci): allowlist Astryx tool-call and CodeBlock CSS hooks

Removing test greps for astryx-chat-tool-calls / astryx-codeblock made
check-dead-css treat product CSS overrides as dead. Mark them as runtime
themeProps classes like the other Astryx hooks.

* test(e2e): slash desktop suite to core product journeys

Drop flaky/geometry/vendor-heavy specs (quote-companion, mermaid layout,
mention grammar, workbar resize, providers/MCP/onboarding surfaces, etc.).
Keep send+IME, draft survival, skill revision drafts, blank-UA-CH help,
settings theme shell, and artifact list navigation. Prune unused fixtures.

* fix(e2e): drop unused e2eHomeDir export after suite cull

Knip typecheck failed: skill-delete e2e was the last consumer.
)

* feat(runtime-host): add local standalone service

* fix(runtime-host): harden standalone service boundaries

* test(runtime-host): assert local framing independently
* feat(ui): align high-traffic chrome with Astryx primitives

Scan product surfaces against the Astryx wiki (Design / API-Styling /
Theming / Container Padding) and close high-severity gaps: composer
actions, inspector filter, import dialog source/rows, plan execution
expand, and workbar launcher menu now use published Astryx components.
Bring control min-heights onto the 28/32/36 rhythm and add a structural
alignment gate with inventory docs.

* fix(ui): correct a11y contracts after Astryx chrome pass

- Workbar launcher: keep AT text on aria-description, not Item description
- Disabled launcher rows target [aria-disabled] from Astryx Item menuitems
- Import session pick uses listbox/option so rows stay keyboard-activatable
- Selected import rows style aria-selected/aria-current, not aria-pressed
- Inventory and height gate name skeleton rows, not the module page bar

* fix(ui): keep import session rows keyboard-reachable

Drop the listbox/option parent-role path that forced selected-only tabIndex
and left every option at -1 when nothing was selected. Item without a parent
role renders a real button for onClick, so rows are focusable after catalog
load. Tighten the alignment gate to reject the trap pattern.

* docs(ui): file-level Astryx inventory for every product surface

Replace family-batch claims with one inventory row per on-disk product
.tsx/.css under renderer and packages/ui. Generator analyzes raw controls
and Astryx usage; coverage gate and tests enforce path-set equality with disk.

* fix(docs): claim Astryx usage only from imports and JSX

Stop matching component names in comments. The surface inventory analyzer
now binds names from @astryxdesign/core (and narrow @maka/ui re-exports)
and counts only JSX tags using those bindings. Regenerated inventory and
added a regression test for comment-only false positives.

* feat(ui): replace remaining product controls with Astryx primitives

Quote chips, prompt-rail ticks, titlebar rename, and workbar tabs now use
Button/IconButton/TextInput instead of raw HTML. Product CSS only strips
control chrome where the surface needs chip/rail/tab geometry.

* feat(ui): finish Astryx empty/loading surfaces and clear inventory blockers

Replace remaining hand-rolled empty and loading chrome with EmptyState,
Spinner, and Banner; drop noise comments; regenerate surface inventory
to 0 blockers.

* feat(ui): align residual empty/loading/error after full surface audit

Deep-read all product settings, shell, module, and packages/ui surfaces.
Convert remaining hand-rolled error/empty/loading chrome to Banner,
EmptyState, and Spinner; document intentional exceptions and backlog.

* fix(ui): repair Astryx migration regressions from adversarial review

Restore workbar launcher Enter/Space activation, quote-chip overflow
measure on the clipped text node, tab accessible names that include
counts, unsupported-artifact meta, and custom-pet loading empty state.

* fix(ui): type ChatSurfaceLayout conversationKey after main rebase

Main switches sessions via conversationKey (Astryx patch). Explicitly
declare and forward the prop so desktop typecheck no longer depends on
ComponentProps seeing only the stock ChatLayout destructure list.

* style: biome-format Astryx inventory scripts for CI typecheck job

The CI typecheck workflow runs biome format checks; keep inventory
generators and gates formatted so the job can proceed past format.

* fix(ui): remove dead CSS left by Astryx empty/error migrations

Drop unused preview/import/launcher/connection helpers and the unused
warning-wash-strong tokens so check-dead-css stays at baseline 0.
…e#2590)

Full-stack frontend analysis after apache#2580: architecture smells with
severities, remaining Astryx gaps beyond raw controls, and a ranked
P0–P3 backlog. Regenerated surface inventory baseline (0 blockers).
* ci: cut wall-clock via impact gates and single e2e job

- Skip Storybook and Electron e2e for packages/ui (and renderer) unit-test-only paths; keep product-source gates.
- Collapse dual e2e shards plus a separate alignment job into one e2e job that reuses install and the built renderer for the CDP audit.

* style: format ci-test-plan unit assertion for biome

CI format:check rejected the multi-line assert.equal added for the
packages/ui product e2e gate.
…ache#2593)

* fix(ui): close Astryx review debt for elevation, rhythm, and primitives

Align plan/agent-graph plates to surface-raised without stacked shadows,
map status washes to design tokens, fix the four inventory polish heights
to the 28/32/36 control rhythm, and adopt Toolbar/Kbd/Heading/Link on the
remaining chrome gaps. Refresh inventory baseline to 0 polish.

* fix(ui): repair browser Toolbar flex and Kbd chrome after review

Address adversarial findings: keep address field in Toolbar start slot
with a flex grow row, drop product shadow on quote companion composer,
and stop wrapping Astryx Kbd in a second pill.
* feat(runtime-host): add authenticated WebSocket access

* fix(runtime-host): harden WebSocket access boundaries
)

* fix(runtime): preserve compaction projection after overflow

* style(runtime): format compaction planner
YayoiNanoka and others added 23 commits August 9, 2026 20:34
* fix(runtime): preserve full access in plan mode

* fix(runtime): carry full access through plan previews
* feat(desktop): consume task submission readiness

* chore: retrigger CI

* fix(desktop): align readiness with send authority

* fix(desktop): bind readiness to send owner
* feat(runtime-host): own project catalog

* fix(runtime-host): preserve project membership consistency
…pache#2608)

* feat(runtime-host): preserve capability providers across reconnect

* fix(runtime-host): fence superseded capability connections
* ci(windows): scope baseline by affected surface

* fix(ci): preserve scoped Windows smoke evidence

* chore: retrigger Windows release check
* feat: route DeepSeek V4 Flash through ApplyPatch

* refactor: declare apply patch protocols on providers

* fix: preserve apply patch execution facts

* fix: preserve cross-profile patch history

* fix: route child editing through tool alternatives

* test: cover routed apply patch contracts

* fix: stop cancelled apply patch batches

* fix: preserve all apply patch replay facts

* fix: snapshot resolved child tools
…tes (apache#2615)

* fix(oauth,desktop): recover stuck xAI login and stale connection deletes

Supersede in-progress Host OAuth when the user starts login again so SuperGrok
authorization is not blocked after the browser already approved. Retry connection
delete on connection_stale and map conflict errors to actionable Chinese UX copy.

* fix(desktop): harden connection delete error paths

Narrow idempotent delete to missing connections only, fix RemoveCatalogConnectionResult exhaustiveness for typecheck, and cover invalid slug rejection.

* fix(oauth): serialize starts and preserve admitted grants on supersede

Queue concurrent oauth.login.start admissions so supersede cannot dual-open
active logins, wait out deferred polls/commits instead of dropping tokens,
and fix misleading error toast plus locale-safe delete stale copy.

* style: format oauth-coordinator supersede tests for biome
* fix(desktop): restore slash command discovery

* fix(desktop): harden slash command discovery

* fix(desktop): centralize slash command routing

* test(desktop): verify slash context compaction
* feat: make changes panel Git-authoritative

* feat: simplify Git changes workbar

* refactor: reduce changes panel to branch facts

* fix: clarify Git change summaries

* refactor: align changes panel with Astryx IDE

* fix: keep review styles within owned hooks

* fix: compare branch changes from merge base

* fix: make Git changes review resilient
* ci: retry transient Electron downloads

* ci: classify Electron retries from structured causes

---------

Co-authored-by: sdxiaomage <sdxiaomage@users.noreply.github.com>
* fix(desktop): hide session chrome behind settings

* fix(desktop): settle shell state before settings
* fix: render subagent sessions as compact rows

* test: strengthen subagent session row contracts
* feat(runtime-host): recover clients across host restarts

* fix(runtime-host): close reconnect recovery gaps

* fix(runtime-host): reject stale desktop candidates
@zhiiw
zhiiw force-pushed the codex/managed-dependency-storage-authority branch from 6b9943a to 0d1f349 Compare August 10, 2026 00:48
@zhiiw

zhiiw commented Aug 30, 2026

Copy link
Copy Markdown
Owner Author

Closed as an obsolete extraction/integration slice. The current delivery path is the merged Gitoxide foundation followed by #40 -> #41 -> #42. This PR remains available as design and implementation history.

中文说明

该 PR 属于旧 extraction/integration 栈,现已失去独立合并价值。当前交付路径是已合并的 Gitoxide 基础,然后依次审查 #40#41#42。这里继续保留设计、实现与审查历史。

@zhiiw zhiiw closed this Aug 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.