Skip to content

Commit f2b3b1c

Browse files
authored
Merge branch 'main' into fix/issue-94620-telegram-eaddr
2 parents c68b5df + 410a952 commit f2b3b1c

71 files changed

Lines changed: 2740 additions & 2381 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.agents/skills/claw-score/SKILL.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ out of this repo. If a score needs private evidence, use the redacted
3030
completeness-instruction paths.
3131
- Feature `coverageIds` are ANDed proof targets, not aliases. A feature may
3232
list multiple IDs when each ID proves part of one capability.
33+
- Coverage IDs use dotted `namespace.behavior` form, with lowercase
34+
alphanumeric/dash segments. Profile, surface, and category IDs may remain
35+
dashed or dotted.
3336
- Keep categories and feature names unique, product-shaped, and broader than raw
3437
coverage IDs. Do not promote generic IDs into standalone feature names.
3538
- Avoid duplicate coverage-ID bundles under different feature names in one

CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ Docs: https://docs.openclaw.ai
3333

3434
### Complete contribution record
3535

36-
This audited record covers the complete v2026.6.8..HEAD history: 373 merged PRs. The generation manifest also supplies direct commits as editorial input; the grouped notes above prioritize user impact.
36+
This audited record covers the complete v2026.6.8..HEAD~1 history: 375 merged PRs. The generation manifest also supplies direct commits as editorial input; the grouped notes above prioritize user impact.
3737

3838
#### Pull requests
3939

@@ -410,6 +410,8 @@ This audited record covers the complete v2026.6.8..HEAD history: 373 merged PRs.
410410
- **PR #94118** [codex] Fix Telegram rich local Markdown link hrefs. Related #94117. Thanks @dankarization and @obviyus.
411411
- **PR #94646** refactor(sqlite): land database-first memory and proxy alignment. Thanks @vincentkoc.
412412
- **PR #94658** test(sqlite): use shared temp directory helper. Thanks @vincentkoc.
413+
- **PR #92135** fix(openai-embedding): preserve openai/ prefix for non-native base URLs. Related #92124. Thanks @xialonglee and @Kambrian.
414+
- **PR #93737** refactor: add session maintenance transaction seam. Thanks @jalehman.
413415

414416
## 2026.6.8
415417

docs/concepts/qa-e2e-automation.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ selected-category counts and missing coverage IDs; the individual evidence
5959
entries remain the source of truth for the tests, coverage roles, and results.
6060
Taxonomy feature coverage IDs are exact proof targets, not aliases. Primary
6161
scenario coverage fulfills matching IDs; secondary coverage stays advisory.
62+
Coverage IDs use dotted `namespace.behavior` form with lowercase
63+
alphanumeric/dash segments; profile, surface, and category IDs may still use
64+
the existing dashed or dotted taxonomy IDs.
6265
Slim evidence omits per-entry `execution` and sets `evidenceMode: "slim"`;
6366
`smoke-ci` defaults to slim, and `--evidence-mode full` restores full entries:
6467

docs/gateway/doctor.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,7 @@ That stages grounded durable candidates into the short-term dreaming store while
397397
- **State dir permissions**: verifies writability; offers to repair permissions (and emits a `chown` hint when owner/group mismatch is detected).
398398
- **macOS cloud-synced state dir**: warns when state resolves under iCloud Drive (`~/Library/Mobile Documents/com~apple~CloudDocs/...`) or `~/Library/CloudStorage/...` because sync-backed paths can cause slower I/O and lock/sync races.
399399
- **Linux SD or eMMC state dir**: warns when state resolves to an `mmcblk*` mount source, because SD or eMMC-backed random I/O can be slower and wear faster under session and credential writes.
400+
- **Linux volatile state dir**: warns when state resolves to `tmpfs` or `ramfs`, because sessions, credentials, config, and SQLite state with its WAL/journal sidecars will disappear on reboot. Docker `overlay` mounts are intentionally not flagged because their writable layers persist across host reboots while the container remains.
400401
- **Session dirs missing**: `sessions/` and the session store directory are required to persist history and avoid `ENOENT` crashes.
401402
- **Transcript mismatch**: warns when recent session entries have missing transcript files.
402403
- **Main session "1-line JSONL"**: flags when the main transcript has only one line (history is not accumulating).

extensions/qa-lab/src/coverage-report.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ const TEST_EXECUTABLE_COVERAGE_ID = "channels.dm";
1414
const TEST_BROWSER_CATEGORY_ID = "browser-control-ui-and-webchat.browser-ui";
1515
const TEST_BROWSER_COVERAGE_ID = "ui.control";
1616
const TEST_WEBCHAT_COVERAGE_ID = "ui.webchat";
17+
const DOTTED_COVERAGE_ID_PATTERN = /^[a-z0-9][a-z0-9-]*(?:\.[a-z0-9][a-z0-9-]*)+$/;
1718

1819
function testMaturityTaxonomy(params?: {
1920
categoryId?: string;
@@ -138,6 +139,11 @@ describe("qa coverage report", () => {
138139
expect(inventory.scorecardTaxonomy.evidenceRefCount).toBeGreaterThan(0);
139140
expect(inventory.scorecardTaxonomy.scenarioCoverageIdCount).toBeGreaterThan(0);
140141
expect(inventory.scorecardTaxonomy.unknownCoverageIdCount).toBe(0);
142+
expect(
143+
inventory.scorecardTaxonomy.categories
144+
.flatMap((category) => category.coverageIds)
145+
.every((coverageId) => DOTTED_COVERAGE_ID_PATTERN.test(coverageId)),
146+
).toBe(true);
141147
expect(inventory.scorecardTaxonomy.validationIssues.length).toBeGreaterThan(0);
142148
expect(
143149
inventory.scorecardTaxonomy.validationIssues.some((issue) =>

extensions/qa-lab/src/evidence-gallery.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ describe("evidence gallery", () => {
198198
surface: "web-ui",
199199
},
200200
{
201-
coverageIds: ["cli-entrypoint"],
201+
coverageIds: ["cli.entrypoint"],
202202
runner: {
203203
availability: "local",
204204
command: "pnpm openclaw qa suite --scenario ux-matrix-evidence-dashboard",
@@ -274,7 +274,7 @@ describe("evidence gallery", () => {
274274
title: "UX Matrix: cli / error-state",
275275
source: { path: "scripts/ux-matrix/dashboard.ts" },
276276
},
277-
coverage: [{ id: "status-snapshots", role: "primary" }],
277+
coverage: [{ id: "cli.status-snapshots", role: "primary" }],
278278
execution: {
279279
runner: "ux-matrix-dashboard",
280280
environment: {
@@ -359,7 +359,7 @@ describe("evidence gallery", () => {
359359
{
360360
artifactKinds: [],
361361
artifactPaths: [],
362-
coverageIds: ["cli-entrypoint"],
362+
coverageIds: ["cli.entrypoint"],
363363
runner: {
364364
availability: "local",
365365
command: "pnpm openclaw qa suite --scenario ux-matrix-evidence-dashboard",

extensions/qa-lab/src/evidence-summary.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ describe("evidence summary", () => {
346346
id: "control-ui.browser-run",
347347
title: "Control UI browser workflow",
348348
sourcePath: "ui/control-ui.e2e.test.ts",
349-
primaryCoverageIds: ["control-ui.browser"],
349+
primaryCoverageIds: ["ui.control"],
350350
docsRefs: ["docs/concepts/qa-e2e-automation.md"],
351351
codeRefs: ["ui/"],
352352
},
@@ -374,7 +374,7 @@ describe("evidence summary", () => {
374374
},
375375
coverage: [
376376
{
377-
id: "control-ui.browser",
377+
id: "ui.control",
378378
role: "primary",
379379
},
380380
],

extensions/qa-lab/src/scenario-catalog.test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ function listScenarioMarkdownPaths(dir = "qa/scenarios"): string[] {
2525
}
2626

2727
describe("qa scenario catalog", () => {
28+
const dottedCoverageIdPattern = /^[a-z0-9][a-z0-9-]*(?:\.[a-z0-9][a-z0-9-]*)+$/;
29+
2830
it("keeps repo-backed scenarios YAML-only", () => {
2931
expect(listScenarioMarkdownPaths()).toStrictEqual([]);
3032
});
@@ -74,6 +76,17 @@ describe("qa scenario catalog", () => {
7476
.filter((scenario) => !(scenario.coverage?.primary.length ?? 0))
7577
.map((scenario) => scenario.id),
7678
).toStrictEqual([]);
79+
expect(
80+
pack.scenarios.every(
81+
(scenario) =>
82+
(scenario.coverage?.primary ?? []).every((coverageId) =>
83+
dottedCoverageIdPattern.test(coverageId),
84+
) &&
85+
(scenario.coverage?.secondary ?? []).every((coverageId) =>
86+
dottedCoverageIdPattern.test(coverageId),
87+
),
88+
),
89+
).toBe(true);
7790
expect(readQaScenarioById("memory-recall").coverage?.primary).toContain("memory.recall");
7891
});
7992

extensions/qa-lab/src/scenario-catalog.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,8 @@ const qaScenarioExecutionSchema = z.union([
8787
const qaCoverageIdSchema = z
8888
.string()
8989
.trim()
90-
.regex(/^[a-z0-9]+(?:[.-][a-z0-9]+)*$/, {
91-
message: "coverage ids must use lowercase dotted or dashed tokens",
90+
.regex(/^[a-z0-9][a-z0-9-]*(?:\.[a-z0-9][a-z0-9-]*)+$/, {
91+
message: "coverage ids must use lowercase dotted tokens",
9292
});
9393

9494
const qaCoverageIdListSchema = z.array(qaCoverageIdSchema).min(1);

extensions/qa-lab/src/scorecard-taxonomy.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,14 @@ const qaScorecardIdSchema = z
1111
.string()
1212
.trim()
1313
.regex(/^[a-z0-9]+(?:[.-][a-z0-9]+)*$/, {
14-
message: "scorecard and coverage ids must use lowercase dotted or dashed tokens",
14+
message: "scorecard ids must use lowercase dotted or dashed tokens",
15+
});
16+
17+
const qaCoverageIdSchema = z
18+
.string()
19+
.trim()
20+
.regex(/^[a-z0-9][a-z0-9-]*(?:\.[a-z0-9][a-z0-9-]*)+$/, {
21+
message: "coverage ids must use lowercase dotted tokens",
1522
});
1623

1724
function isRepoRootRelativeRef(value: string) {
@@ -31,7 +38,7 @@ const qaScorecardProfileSchema = z.object({
3138

3239
const qaMaturityFeatureSchema = z.object({
3340
name: z.string().trim().min(1),
34-
coverageIds: z.array(qaScorecardIdSchema).default([]),
41+
coverageIds: z.array(qaCoverageIdSchema).default([]),
3542
description: z.string().trim().min(1).optional(),
3643
});
3744

0 commit comments

Comments
 (0)