Commit Graph

145 Commits

Author SHA1 Message Date
Peter Steinberger
76a236da5f fix(ci): harden release validation gates (#108798)
* fix(ci): harden release validation gates

* fix(apns): keep tombstones in strict SQLite schema

* fix(ci): isolate PR publication transport
2026-07-16 03:21:08 -07:00
Alix-007
47dd90c5ea fix(ci): bound Android SDK downloads (#108723) 2026-07-16 02:12:07 -07:00
Alix-007
5cd9243465 fix(ci): bound Windows Testbox phone-home requests (#108755) 2026-07-16 01:57:53 -07:00
Alix-007
ea3ac194f4 fix(ci): bound Mantis runner IP discovery (#108699) 2026-07-16 01:50:22 -07:00
Alix-007
e0394c2ab4 fix(ci): bound native tool downloads (#108685)
* fix(ci): bound native tool downloads

* fix(ci): bound historical SwiftFormat downloads

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 01:44:30 -07:00
Peter Steinberger
a7d5386896 improve: speed up ring-zero QA smoke (#108694)
* ci: speed up ring-zero QA smoke

* ci: scope QA sticky cache to Docker lane

* ci: keep QA dependency setup on actions cache

* test: restore modern Docker QA proof
2026-07-16 01:12:40 -07:00
Alix-007
3912cf38b9 fix(ci): bound workflow ShellCheck download (#108672) 2026-07-16 00:56:27 -07:00
Sash Zats
0960d07d8e ci: gate PR edit automation by changed field (#95010)
* ci: gate PR edit automation by changed field

* ci: include title edits in ClawSweeper dispatch gate

* ci: refine PR edit automation gates

Co-authored-by: Sash Zats <sash@zats.io>

* test(ci): require boolean workflow matcher

Co-authored-by: Sash Zats <sash@zats.io>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 00:42:14 -07:00
Peter Steinberger
a6125b7868 perf(ci): split QA smoke into four profile parts and time tsdown invocations (#108638) 2026-07-15 22:41:02 -07:00
Peter Steinberger
6252f9b1f7 improve(ci): speed warm Node shards with sticky bind mount (#108386)
* perf(ci): bind sticky dependency disk into test shards

* chore(ci): restore workflow guard coverage

* perf(ci): skip pnpm install on exact sticky hits

* fix(ci): require stock layout for sticky dependencies

* perf(ci): bypass pnpm for test shard launches

* fix(ci): declare direct shard runner command

* fix(ci): bypass pnpm in warm shard builds

* fix(ci): invalidate sticky deps on pnpm config

* ci: document sticky failure guard
2026-07-15 15:41:24 -07:00
Peter Steinberger
4c667aac88 fix(release): harden frozen target validation (#108296)
* fix(release): harden frozen scenario planning

Co-authored-by: Dallin Romney <dallinromney@gmail.com>

* fix(release): omit unsupported scenario-only lanes

Co-authored-by: Dallin Romney <dallinromney@gmail.com>

* fix(release): fail closed on malformed target scenarios

Co-authored-by: Dallin Romney <dallinromney@gmail.com>

* fix(release): report unsupported frozen lanes

Co-authored-by: Dallin Romney <dallinromney@gmail.com>

* fix(release): defer frozen survivor inspection

Co-authored-by: Dallin Romney <dallinromney@gmail.com>

* fix(release): report partial survivor omissions

Co-authored-by: Dallin Romney <dallinromney@gmail.com>

* fix(ci): fetch shard fallback from workflow commit

Co-authored-by: Dallin Romney <dallinromney@gmail.com>

* fix(release): gate frozen scenario omissions

Co-authored-by: Dallin Romney <dallinromney@gmail.com>

* test(release): auto-clean frozen target temp dirs

Co-authored-by: Dallin Romney <dallinromney@gmail.com>

* fix(ci): satisfy frozen validation workflow lint

Co-authored-by: Dallin Romney <dallinromney@gmail.com>

---------

Co-authored-by: Dallin Romney <dallinromney@gmail.com>
2026-07-15 06:31:07 -07:00
Dallin Romney
043e4d1ec4 fix(release): validate frozen targets with current workflows (#108189)
* fix(release): support frozen validation targets

* fix(release): filter frozen-target upgrade scenarios
2026-07-15 04:28:17 -07:00
Peter Steinberger
57761ebe8c perf(ci): balance node test shards and gate heavy CI lanes by changed scope (#108091) 2026-07-15 01:16:47 -07:00
Peter Steinberger
2e73cff6ca fix(maint): keep PR maintenance delta-only (#108018)
* fix(maint): keep fork prep sync delta-only

* fix(ci): use exact merge parent for PR diffs

* fix(ci): pass docs diff base through environment

* test(ci): cover environment-mediated docs base
2026-07-14 22:49:33 -07:00
Peter Steinberger
202b04925c fix(ci): fetch exact PR base before history (#107674) 2026-07-14 10:12:40 -07:00
Peter Steinberger
f81f9d8570 chore: enforce max-lines suppression ratchet (#107315)
* ci: enforce max-lines suppression ratchet

* chore: prune stale max-lines suppression

* fix: close max-lines ratchet enforcement gaps

* fix: harden max-lines ratchet checks

* fix(ci): satisfy max-lines ratchet checks

* style: format max-lines declarations

* fix(ci): match oxlint suppression grammar

* test: isolate max-lines git fixtures

* chore: prune resolved max-lines debt

* test: skip newline path fixture on Windows

* fix: harden max-lines suppression ratchet

* chore: refresh max-lines baseline

* fix: close max-lines ratchet bypasses

* fix: derive ratchet base from PR merge tree

* fix: support older Git in staged ratchet

* fix: align max-lines declarations and baseline

* chore: refresh max-lines baseline for current main

* fix: exclude generated wizard locales from max-lines

* chore: prune resolved max-lines debt
2026-07-14 09:27:02 -07:00
Peter Steinberger
47d37804a8 improve(ui): catch i18n catalog drift locally (#107253)
* ci(ui): verify i18n catalogs locally

* fix(ui): preserve scoped i18n sync errors

* refactor(ui): share i18n raw-copy verifier

* test(ui): cover i18n lint gate

* fix(ui): route lint threads to oxlint
2026-07-14 01:12:36 -07:00
Peter Steinberger
f4b7a19624 fix: avoid remote boxes for focused validation (#107166)
* fix: avoid remote boxes for focused validation

* fix: preserve explicit remote proof routing

* fix: delegate when local diff refs are unavailable
2026-07-14 00:53:17 -07:00
Peter Steinberger
606e2f5dba fix(ci): stop unrelated main updates from forcing PR rebases (#107050)
* fix(ci): stop unrelated main updates from forcing PR rebases

* docs(ci): document reusable aggregate proof

* docs(ci): clarify immutable gate success

* chore(ci): refresh stalled PR head
2026-07-14 00:01:01 -07:00
Peter Steinberger
df5097b6e7 fix(native): keep platform validation warning-free (#107101)
* build(android): keep Gradle warning-free

* ci(native): pin XcodeGen tooling

* test(macos): avoid concurrency warnings
2026-07-13 22:33:12 -07:00
Peter Steinberger
70833dab7f ci: scope PR Node tests to changed targets (#106633)
* ci: scope PR Node tests to changed targets

* ci: bound targeted Node test plans

* test: cover changed path manifest input

* fix(ui): preserve model providers lazy boundary

* ci: cover public SDK re-export consumers

* ci: reject unresolved changed test targets

* ci: cover public SDK wrapper imports

* ci: preserve global checks in targeted plans

* docs(ci): clarify targeted boundary coverage

* test(plugins): declare computed runtime dependencies
2026-07-13 15:26:02 -07:00
Peter Steinberger
458746e1c2 chore(ci): enforce changed-file TypeScript LOC ratchet (#106387)
* ci: enforce changed-file TypeScript LOC ratchet

* ci: derive release-gate LOC base from PR

* test(ci): exclude repository test helpers from LOC ratchet

* ci: validate LOC ratchet on PR merge tree

* style: format release maintainer skill

* ci: run LOC ratchet for fast-only changes

* fix(ci): harden LOC ratchet comparisons

* fix(ci): cover native TypeScript in LOC ratchet

* fix(ci): compare LOC against tested merge tree

* test(ci): cover LOC manifest routing
2026-07-13 07:20:32 -07:00
Peter Steinberger
4b6575636f fix(ci): finalize control UI locale artifacts 2026-07-13 12:12:51 +01:00
Peter Steinberger
e2ed58efec fix(ci): publish native generated locales 2026-07-13 11:41:15 +01:00
Peter Steinberger
b1ce84b079 ci: reduce Blacksmith registrations for pull requests (#106146) 2026-07-13 01:32:25 -07:00
Peter Steinberger
0ab7e2569b fix(ci): preserve pinned manual checkout 2026-07-13 03:42:26 -04:00
Vincent Koc
f33ab243cf fix(sqlite): reject runtimes vulnerable to WAL corruption (#106065)
* fix(sqlite): require WAL-reset-safe Node runtime

* docs(sqlite): document safe Node runtime floor

* fix(sqlite): defer runtime library validation until use

* fix(ci): align startup memory with Node 24.15
2026-07-13 13:59:00 +08:00
Peter Steinberger
dce8eed0b9 ci(deadcode): restore enforced unused-export ratchet (#105826)
* ci(deadcode): restore export ratchet

* chore(deadcode): refresh export baseline

* refactor(sessions): remove obsolete patch writer

* refactor(deadcode): classify current export residue

* fix(deadcode): preserve exported signature types

* chore(deadcode): sync export baseline after rebase

* chore(deadcode): classify pairing test exports

* fix(ci): refresh plugin SDK declaration budget
2026-07-12 19:58:38 -07:00
Vincent Koc
2c06dfdd2f fix(ci): keep unused exports advisory (#105704)
* fix(ci): preserve frozen deadcode contracts

* fix(ci): keep unused exports advisory
2026-07-13 05:47:05 +08:00
Peter Steinberger
22f183f8cb ci: isolate legacy QA smoke invocations (#105340)
* ci: isolate legacy QA smoke invocations

* docs(agents): record PR review recommendation
2026-07-12 12:52:31 +01:00
Peter Steinberger
a20314d6cc ci: preserve frozen Android build contract (#105299) 2026-07-12 11:48:02 +01:00
Peter Steinberger
7bb59c4511 ci: pin release validation Go toolchain (#105270) 2026-07-12 11:02:04 +01:00
Peter Steinberger
265ca345a1 ci: pin frozen iOS formatter (#105242)
* ci: pin frozen iOS formatter

* docs: clarify release CI dispatch

* ci: preserve frozen iOS formatter path

* style: format CI workflow guard
2026-07-12 10:49:26 +01:00
Peter Steinberger
e0f45bfbf0 feat(tooling): enforce indexed access checks in root tests (#105223)
* feat(tooling): enforce indexed access checks in root tests

* style(tooling): clarify scoped package guard
2026-07-12 10:42:07 +01:00
Peter Steinberger
d79373fa14 ci: bound legacy QA smoke compatibility (#105213) 2026-07-12 10:15:33 +01:00
Peter Steinberger
acc57e4145 ci: isolate frozen Control UI tests (#105208) 2026-07-12 10:06:23 +01:00
Peter Steinberger
91ca35ba58 ci: make locale parity advisory before release (#105140) 2026-07-12 09:11:57 +01:00
Peter Steinberger
096cb91175 feat(tooling): enforce noUncheckedIndexedAccess in core and ui lanes (NUIA phase 3c) (#104981)
* fix(ui): make indexed access explicit across the Control UI

Burns down all 322 ui-lane noUncheckedIndexedAccess errors: untrusted
markdown/diff/patch parsing gets miss-tolerant guards (renderer rules
degrade to empty output instead of throwing mid-render), accumulators
use canonical sparse initialization, DOM lookups stay null-guarded, and
length-checked constructions carry named invariants.

* feat(tooling): enforce noUncheckedIndexedAccess in the core and ui lanes

Flips the flag on for tsconfig.core.json and tsconfig.ui.json (covering
src, all packages including the two deferred ones, and ui) and retires
the strict-ratchet lane wholesale: config, script, projects reference,
check/CI wiring, changed-lane routing, and sync test. The assertion-ban
oxlint override stays as an independent surface.
2026-07-12 06:36:36 +01:00
Peter Steinberger
176647aa84 ci: gate frozen QA smoke by capability (#105006) 2026-07-12 06:32:26 +01:00
Peter Steinberger
b163dbb97d ci: harden current and frozen release checks (#104956)
* test(qa): wait for complete process pid fixture

* style(qa): format pid readiness predicate

* test(sqlite): allow schema version pragma

* ci: install target playwright for frozen UI checks
2026-07-11 22:08:49 -07:00
Peter Steinberger
a79554c281 ci: bound QA smoke profile runtime (#104909) 2026-07-11 20:41:18 -07:00
Peter Steinberger
4e50f1ebc2 ci: allow frozen UI fixture headroom (#104805) 2026-07-11 17:14:06 -07:00
Peter Steinberger
fb08d3b631 ci: avoid retries in frozen UI tests (#104790) 2026-07-11 16:46:04 -07:00
Peter Steinberger
08498f9828 ci: pass frozen UI test options to Vitest (#104758) 2026-07-11 15:54:44 -07:00
Peter Steinberger
ce671c3513 ci: honor frozen target tool versions (#104740) 2026-07-11 15:35:05 -07:00
Peter Steinberger
7772d798dd fix(ci): stabilize frozen target checks (#104728) 2026-07-11 15:09:29 -07:00
Josh Lehman
0a8e3604ba refactor: flip sessions and transcripts to sqlite storage (#98236)
* refactor(sessions): migrate runtime storage to sqlite

* test(sessions): fix sqlite CI regressions

* test(sessions): align remaining sqlite fixtures

* fix(codex): require sqlite trajectory recorder

* test(sessions): align orphan recovery sqlite fixture

* test(sessions): align sqlite rebase fixtures

* fix(sessions): finish current-main integration of the sqlite flip

Resolve the whole-store SDK removal across its owner boundary: drop the
loadSessionStore re-export and the registry whole-store wrappers, wire
hasTrackedActiveSessionRun into gateway chat, complete the
preserveLockedHarnessIds cleanup contract, flip the codex thread-history
import to storePath targets, and port remaining main-side tests from
file-store helpers to session accessor reads.

* chore: drop committed pebbles log, revert plugin-inspector bump, refresh generated docs

Remove the 1.8k-line .pebbles/events.jsonl work log from the branch, restore
the plugin-inspector advisory lane to main's pinned 0.3.10 so the supply-chain
bump gets its own review, and regenerate docs_map, the plugin SDK API baseline,
and the export-surface ratchet for the merged tree.

* feat(sessions): keep archived transcripts by default with zstd cold storage

Codex-style retention: deleting or resetting a session archives its
transcript as a zstd-compressed JSONL artifact (plain when the runtime
lacks node:zlib zstd) and keeps it until the disk budget evicts oldest
first. resetArchiveRetention now governs both deleted and reset archives
and defaults to keep; maxDiskBytes defaults to 2gb so retention stays
bounded, with archives evicted before live sessions. The cron reaper
follows the same knob instead of deleting archives on its own timer.

* fix(state): converge agent DB migration lineages and bound database growth

Merge coherence: run both structure-gated legacy memory-schema repairs
(flip-lineage drop, main-lineage identity rebuild) before the flip
migration so pre-flip v1/v2 and pre-merge flip v1/v4 databases all
converge, and hoist foreign_keys=OFF outside the schema transaction
where the pragma was silently ignored and the v1 sessions rebuild
cascade-deleted session_entries.

Growth guards: fresh agent DBs enable auto_vacuum=INCREMENTAL, WAL
maintenance releases freed pages in bounded passes (never a blocking
full VACUUM), and doctor reports state/agent DB bloat from freelist
stats.

* fix(codex): resolve the store path for thread-history import via the SDK

The supervision catalog passed the legacy sessionFile locator to the
storePath-targeted transcript mirror; resolve the agent store path with
the session-store SDK helper instead of a runtime-object seam so test
fakes and headless callers need no extra surface. Drop the obsolete
missing-session-id preprocessing case: sessions rows are NOT NULL on
session_id and upsert repairs id-less patches at write time.

* fix(sessions): fail safe on malformed disk-budget config and doctor stat errors

A malformed explicit maxDiskBytes disables the budget instead of
falling back to the destructive 2gb default the user never chose, and
the doctor bloat check skips databases whose paths stat-fail instead of
aborting doctor.

* fix(sessions): complete sqlite conflict translations

* test(sqlite): align hardening checks with maintenance

* test(sessions): inspect compressed transcript archives

* fix(tests): await session seeds and drop unused helpers flagged by CI lint

The five unawaited writeSessionStoreSeed calls raced their SQLite seeds
against the assertions, failing compact shards; the bloat probe drops a
useless initializer and the merged tests drop now-unused helpers.

* test(sessions): type legacy proof events directly

* test(sessions): align hardening contracts

* perf(sessions): read usage transcript sizes from SQL aggregates

Usage/cost scans walked every session and materialized every transcript
event just to re-stringify it for a byte estimate — the #86718 stall
class reborn on the DB. readTranscriptStatsSync sums stored JSON bytes
in SQLite without loading a single row.

* fix(sessions): re-root foreign-root transcript paths onto the current sessions dir

Restored backups, moved OPENCLAW_STATE_DIR, and rehearsal copies carry
absolute sessionFile paths from the old root; the containment fallback
kept those foreign paths, so migration read (and would archive) files in
the original root and reported local copies missing. Re-root the
canonical agents/<id>/sessions suffix onto the current dir when the file
exists there; genuine cross-root layouts still fall through unchanged.

* test(agents): seed harness admission through sqlite

* fix(sqlite): close agent db on pragma setup failure

* fix(doctor): compact and retrofit incremental auto-vacuum after session import

The migration is the sanctioned offline window: post-import compact
reclaims import churn and applies auto_vacuum=INCREMENTAL to databases
created before the fresh-DB pragma existed, so runtime maintenance can
release pages in bounded passes on every install.

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-11 14:50:37 -07:00
Peter Steinberger
dbdc61e897 fix(ci): validate frozen release candidates safely (#104697)
* fix(ci): validate frozen release candidates safely

* test(ci): align release workflow types

* fix(ci): validate frozen release tags safely
2026-07-11 14:10:41 -07:00
Peter Steinberger
fa664fa2a5 fix(ci): skip absent frozen-target protocol guard (#104674) 2026-07-11 13:11:29 -07:00
Peter Steinberger
e686693732 feat(tooling): adopt noUncheckedIndexedAccess via a strict-ratchet lane (phase 1) (#104577)
* feat(tooling): add noUncheckedIndexedAccess strict-ratchet lane

* fix(packages): make indexed access explicit across ratchet packages

Burns down all 65 noUncheckedIndexedAccess errors in the seven ratchet
packages with behavior-identical restructuring (iteration, charAt/slice,
regex-group guards, validated hextet tuple). net-policy invariant
violations now throw instead of failing open. Adds
@openclaw/normalization-core/expect (expectDefined/first/last) with
subpath export and tests. memory-host-sdk fixes kept but the package
stays out of the lane: it re-exports core src/** so the flag would apply
transitively to all of core.

* fix(lint): keep .oxlintrc.json strict-JSON parseable for extension lint wrappers
2026-07-11 10:26:12 -07:00