惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Project Zero
Project Zero
GbyAI
GbyAI
Y
Y Combinator Blog
Google DeepMind News
Google DeepMind News
小众软件
小众软件
The GitHub Blog
The GitHub Blog
阮一峰的网络日志
阮一峰的网络日志
J
Java Code Geeks
WordPress大学
WordPress大学
Microsoft Security Blog
Microsoft Security Blog
IT之家
IT之家
F
Fortinet All Blogs
博客园 - 【当耐特】
H
Hackread – Cybersecurity News, Data Breaches, AI and More
P
Proofpoint News Feed
Schneier on Security
Schneier on Security
C
Cybersecurity and Infrastructure Security Agency CISA
L
LINUX DO - 热门话题
Spread Privacy
Spread Privacy
O
OpenAI News
V
V2EX
博客园 - 三生石上(FineUI控件)
AI
AI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Stack Overflow Blog
Stack Overflow Blog
P
Privacy International News Feed
Microsoft Azure Blog
Microsoft Azure Blog
Blog — PlanetScale
Blog — PlanetScale
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Jina AI
Jina AI
H
Help Net Security
L
LINUX DO - 最新话题
Application and Cybersecurity Blog
Application and Cybersecurity Blog
T
Tenable Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Cisco Talos Blog
Cisco Talos Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
博客园 - 叶小钗
V
Vulnerabilities – Threatpost
C
Cisco Blogs
D
Darknet – Hacking Tools, Hacker News & Cyber Security
酷 壳 – CoolShell
酷 壳 – CoolShell
Hacker News: Ask HN
Hacker News: Ask HN
S
Security @ Cisco Blogs
S
Securelist
T
The Blog of Author Tim Ferriss
Apple Machine Learning Research
Apple Machine Learning Research
美团技术团队
雷峰网
雷峰网
V2EX - 技术
V2EX - 技术

Recent Commits to openclaw:main

test: merge chat side-result checks · openclaw/openclaw@ddd2c2a test: merge cron history checks · openclaw/openclaw@f7eb746 test: merge responsive navigation shell checks · openclaw/openclaw@c2e4b47 docs(changelog): add codex oauth fixes · openclaw/openclaw@628e6cd test: merge navigation routing cases · openclaw/openclaw@5d8cecb Tests: mock channel registry bundled fallback · openclaw/openclaw@2b08233 Secrets: avoid broad web search discovery for single plugin config · openclaw/openclaw@a464f59 test: merge config view browser checks · openclaw/openclaw@20cf511 fix(status): align oauth health with runtime · openclaw/openclaw@eed7116 feat: add macOS screen snapshots for monitor preview (#67954) thanks … · openclaw/openclaw@f377db1 fix: report shared auth scopes in hello-ok (#67810) thanks @BunsDev · openclaw/openclaw@0b6c39b Auto-reply: avoid eager bundled route fallback · openclaw/openclaw@3ea1bf4 Tests: narrow session binding contract setup · openclaw/openclaw@54e4e16 fix(macOS): enable undo/redo in webchat composer text input (#34962) · openclaw/openclaw@00951dc Tests: speed up channel setup promotion · openclaw/openclaw@82b529a Docs: refresh agent instructions · openclaw/openclaw@5775fe2 fix(auth): serialize OAuth refresh across agents to fix #26322 (#67876) · openclaw/openclaw@8e79080 test: allow ollama public surface boundary test · openclaw/openclaw@7d4f1a6 Docs: add test performance guardrails · openclaw/openclaw@89706d3 Tests: restore context-engine usage proof · openclaw/openclaw@e4c4f95 Tests: slim context engine runtime coverage · openclaw/openclaw@74c198f ci: retry failed custom checkouts · openclaw/openclaw@0ee5baf test: trim duplicate provider auth onboarding cases · openclaw/openclaw@1ffc02e matrix: fix sessions_spawn --thread subagent session spawning (#67643) · openclaw/openclaw@1ce2596 test: reduce auth choice fixture churn · openclaw/openclaw@857b9cd test: mock health status config boundaries · openclaw/openclaw@9d5ab4a test: mock onboard config io boundary · openclaw/openclaw@299694d test: mock legacy state plugin boundaries · openclaw/openclaw@2713089 test: mock channel install boundaries · openclaw/openclaw@b945248 test: mock doctor preview channel boundaries · openclaw/openclaw@b1a3ad4 test: trim doctor command hotspots · openclaw/openclaw@c66f16a test: isolate agent auth and spawn hotspots · openclaw/openclaw@9285935 test: stabilize MCP startup disposal race · openclaw/openclaw@dd9d2eb test: merge browser contract server suites · openclaw/openclaw@5817a76 test: narrow ollama provider discovery setup · openclaw/openclaw@a0d9598 build: declare qa-lab aimock runtime dependency · openclaw/openclaw@24431e5 test: speed up safe-bins exec harness · openclaw/openclaw@ee856ab test: preserve tool helpers in embedded runner mocks · openclaw/openclaw@acd86a0 refactor: move memory embeddings into provider plugins · openclaw/openclaw@77e6e4c test: reuse system-run temp fixtures · openclaw/openclaw@7e9ff0f test: trim hotspot wait overhead · openclaw/openclaw@12a59b0 Check: avoid duplicate boundary prep · openclaw/openclaw@baf11b8 test: reduce hotspot fixture overhead · openclaw/openclaw@3a59edd feat(ui): overhaul settings and slash command UX (#67819) thanks @Bun… · openclaw/openclaw@2cfb660 QA Matrix: exit cleanly on failure · openclaw/openclaw@42805d2 QA Matrix: isolate scenario coverage · openclaw/openclaw@7e659e1 Matrix: refresh crypto bootstrap state · openclaw/openclaw@94081d8 QA Lab: add provider registry · openclaw/openclaw@bb7e982 Matrix: add plugin changelog · openclaw/openclaw@4acab55 test: trim more hotspot overhead · openclaw/openclaw@f485311 test: trim remaining hotspot tests · openclaw/openclaw@6ba8626 test: narrow hotspot mocks · openclaw/openclaw@dbc8179 test: isolate gemini embedding request helpers · openclaw/openclaw@cd330f5 test: trim memory and mcp hotspots · openclaw/openclaw@fd48dfa test: slim provider registry mocks · openclaw/openclaw@2e08c77 test: harden Parallels update smoke · openclaw/openclaw@1a98090 feat: default Anthropic to Opus 4.7 · openclaw/openclaw@628b454 fix: harden node-host shell payload mutability checks · openclaw/openclaw@75c551e fix: land node-host approval binding for native binaries (#66731) (th… · openclaw/openclaw@29919bb CI: add daily schedule to CodeQL workflow (#67645) · openclaw/openclaw@69d25f5 fix(gateway): capture config hash after plugin auto-enable to prevent… · openclaw/openclaw@8c11210 fix: repair sanitized replay tool results before send (#67620) (thank… · openclaw/openclaw@c3c7a99 fix: restrict HTML timeout short-circuit to transient statuses · openclaw/openclaw@de129a6 fix: keep TUI watchdog bound to active run (#67401) (thanks @xantorres) · openclaw/openclaw@3525273 Gateway/skills: dedupe skills prefix-match + drop dead fallback on log · openclaw/openclaw@d7f489f Extensions/lmstudio: back off inference preload after consecutive fai… · openclaw/openclaw@b555214 TUI/streaming: add watchdog that resets the activity indicator after … · openclaw/openclaw@f44ab20 Agents/tool-loop: enable unknown-tool stream guard by default · openclaw/openclaw@36ed367 Gateway/skills: invalidate session skills snapshot on config write · openclaw/openclaw@b23d59a fix: classify HTML provider error pages correctly (#67642) (thanks @s… · openclaw/openclaw@e588e90 fix(skills): remove unused model-usage import (#67641) · openclaw/openclaw@55f05df docs(changelog): credit codex fix superseded PRs · openclaw/openclaw@e485f24 fix(openai-codex): normalize stale transport metadata in resolution a… · openclaw/openclaw@90801ba CI: pin Docker-related GitHub Actions (#67632) · openclaw/openclaw@f697b01 Android: modernize WebView and discovery API usage (#67627) · openclaw/openclaw@44a6e50 fix(deps): bump hono to 4.12.14 and @hono/node-server to 1.19.14 (GHS… · openclaw/openclaw@fbccc18 fix(deps): bump dompurify to 3.4.0 (#67614) · openclaw/openclaw@2c2dc00 CI: add explicit permissions to all workflow jobs (fixes code-scannin… · openclaw/openclaw@01b7516 fix: register bundled TTS providers and route overrides correctly (#6… · openclaw/openclaw@6ea3cdd fix: align host tilde paths with OS home (#62804) (thanks @stainlu) · openclaw/openclaw@ecfaf64 fix: flush creds queue before reconnect socket open (#67464) (thanks … · openclaw/openclaw@405c63f fix: strip standalone <function> tool call tags from visible text (#6… · openclaw/openclaw@78df859 fix(agents): preserve cli session metadata before transcript persist … · openclaw/openclaw@898fd04 docs(changelog): move cli transcript entry · openclaw/openclaw@c1817c6 fix(agents): normalize cli transcript api field · openclaw/openclaw@3a3fae0 docs(changelog): note cli transcript persistence · openclaw/openclaw@6c343f1 fix(agents): persist cli transcript turns · openclaw/openclaw@b8ef507 fix(msteams): harden security-sensitive flows (#65841) · openclaw/openclaw@c56b56e [Dashboard] Fix exec approval modal overflow for long command content… · openclaw/openclaw@053c5b0 Docs: remove QA changelog entry · openclaw/openclaw@7fd5771 QA: fix private runtime source loading (#67428) · openclaw/openclaw@d5933af docs(gateway): correct protocol.md schema path, hello-ok example, aut… · openclaw/openclaw@489404d CI: pin Node 22 runners to 22.18.0 · openclaw/openclaw@4ffa621 models.authStatus: normalize provider ids + tighten env-backed escape… · openclaw/openclaw@f2fdb9d Update CHANGELOG.md · openclaw/openclaw@7694a92 test(parallels): clean up npm update guard jobs · openclaw/openclaw@045ea7b Plugins: prefer scanDir override paths · openclaw/openclaw@b2974da fix(dreaming): default storage.mode to "separate" so phase blocks sto… · openclaw/openclaw@8c392f0 fix(memory-core): skip dreaming transcript ingestion via session stor… · openclaw/openclaw@a1b01f0 fix: dedupe replayed exec.finished node events (#67281) · openclaw/openclaw@5dcf526
test: clarify oc-path resolver assertions · openclaw/openclaw@2003728
steipete · 2026-05-08 · via Recent Commits to openclaw:main

@@ -11,82 +11,89 @@

1111

* 5. parse → emit → parse is fixpoint

1212

* 6. hostile inputs do not throw at parse time

1313

*/

14-

import { describe, expect, it } from 'vitest';

15-

import { inferKind } from '../../dispatch.js';

16-

import { emitMd } from '../../emit.js';

17-

import { setMdOcPath } from '../../edit.js';

18-

import { resolveMdOcPath } from '../../resolve.js';

19-

import { emitJsonc } from '../../jsonc/emit.js';

20-

import { setJsoncOcPath } from '../../jsonc/edit.js';

21-

import { resolveJsoncOcPath } from '../../jsonc/resolve.js';

22-

import { parseJsonc } from '../../jsonc/parse.js';

23-

import { emitJsonl } from '../../jsonl/emit.js';

24-

import { setJsonlOcPath } from '../../jsonl/edit.js';

25-

import { resolveJsonlOcPath } from '../../jsonl/resolve.js';

26-

import { parseJsonl } from '../../jsonl/parse.js';

27-

import { parseOcPath } from '../../oc-path.js';

28-

import { parseMd } from '../../parse.js';

14+

import { describe, expect, it } from "vitest";

15+

import { inferKind } from "../../dispatch.js";

16+

import { setMdOcPath } from "../../edit.js";

17+

import { emitMd } from "../../emit.js";

18+

import { setJsoncOcPath } from "../../jsonc/edit.js";

19+

import { emitJsonc } from "../../jsonc/emit.js";

20+

import { parseJsonc } from "../../jsonc/parse.js";

21+

import { resolveJsoncOcPath } from "../../jsonc/resolve.js";

22+

import { setJsonlOcPath } from "../../jsonl/edit.js";

23+

import { emitJsonl } from "../../jsonl/emit.js";

24+

import { parseJsonl } from "../../jsonl/parse.js";

25+

import { resolveJsonlOcPath } from "../../jsonl/resolve.js";

26+

import { parseOcPath } from "../../oc-path.js";

27+

import { parseMd } from "../../parse.js";

28+

import { resolveMdOcPath } from "../../resolve.js";

292930-

describe('wave-22 cross-kind property invariants', () => {

31-

const mdRaw = '---\nname: x\n---\n\n## Boundaries\n\n- enabled: true\n';

30+

describe("wave-22 cross-kind property invariants", () => {

31+

const mdRaw = "---\nname: x\n---\n\n## Boundaries\n\n- enabled: true\n";

3232

const jsoncRaw = '// h\n{ "k": 1, "n": [1,2,3] }\n';

3333

const jsonlRaw = '{"a":1}\n\nbroken\n{"b":2}\n';

343435-

it('P-01 round-trip parse → emit is byte-stable across all kinds', () => {

35+

it("P-01 round-trip parse → emit is byte-stable across all kinds", () => {

3636

expect(emitMd(parseMd(mdRaw).ast)).toBe(mdRaw);

3737

expect(emitJsonc(parseJsonc(jsoncRaw).ast)).toBe(jsoncRaw);

3838

expect(emitJsonl(parseJsonl(jsonlRaw).ast)).toBe(jsonlRaw);

3939

});

404041-

it('P-02 resolve is non-mutating across all kinds', () => {

41+

it("P-02 resolve is non-mutating across all kinds", () => {

4242

const md = parseMd(mdRaw).ast;

4343

let before = JSON.stringify(md);

44-

resolveMdOcPath(md, parseOcPath('oc://X/[frontmatter]/name'));

45-

resolveMdOcPath(md, parseOcPath('oc://X/boundaries'));

44+

resolveMdOcPath(md, parseOcPath("oc://X/[frontmatter]/name"));

45+

resolveMdOcPath(md, parseOcPath("oc://X/boundaries"));

4646

expect(JSON.stringify(md)).toBe(before);

47474848

const jsonc = parseJsonc(jsoncRaw).ast;

4949

before = JSON.stringify(jsonc);

50-

resolveJsoncOcPath(jsonc, parseOcPath('oc://X/k'));

51-

resolveJsoncOcPath(jsonc, parseOcPath('oc://X/n.0'));

50+

resolveJsoncOcPath(jsonc, parseOcPath("oc://X/k"));

51+

resolveJsoncOcPath(jsonc, parseOcPath("oc://X/n.0"));

5252

expect(JSON.stringify(jsonc)).toBe(before);

53535454

const jsonl = parseJsonl(jsonlRaw).ast;

5555

before = JSON.stringify(jsonl);

56-

resolveJsonlOcPath(jsonl, parseOcPath('oc://X/L1'));

57-

resolveJsonlOcPath(jsonl, parseOcPath('oc://X/$last'));

56+

resolveJsonlOcPath(jsonl, parseOcPath("oc://X/L1"));

57+

resolveJsonlOcPath(jsonl, parseOcPath("oc://X/$last"));

5858

expect(JSON.stringify(jsonl)).toBe(before);

5959

});

606061-

it('P-03 unresolvable set never throws across all kinds', () => {

62-

const ocPath = parseOcPath('oc://X/totally.missing.path');

63-

expect(() =>

64-

setMdOcPath(parseMd(mdRaw).ast, ocPath, 'x'),

65-

).not.toThrow();

66-

expect(() =>

61+

it("P-03 unresolvable set never throws across all kinds", () => {

62+

const ocPath = parseOcPath("oc://X/totally.missing.path");

63+

expect(setMdOcPath(parseMd(mdRaw).ast, ocPath, "x")).toEqual({

64+

ok: false,

65+

reason: "not-writable",

66+

});

67+

expect(

6768

setJsoncOcPath(parseJsonc(jsoncRaw).ast, ocPath, {

68-

kind: 'string',

69-

value: 'x',

69+

kind: "string",

70+

value: "x",

7071

}),

71-

).not.toThrow();

72-

expect(() =>

72+

).toEqual({

73+

ok: false,

74+

reason: "unresolved",

75+

});

76+

expect(

7377

setJsonlOcPath(parseJsonl(jsonlRaw).ast, ocPath, {

74-

kind: 'string',

75-

value: 'x',

78+

kind: "string",

79+

value: "x",

7680

}),

77-

).not.toThrow();

81+

).toEqual({

82+

ok: false,

83+

reason: "unresolved",

84+

});

7885

});

798680-

it('P-04 inferKind aligns with the parser actually used', () => {

81-

expect(inferKind('AGENTS.md')).toBe('md');

82-

expect(inferKind('SOUL.md')).toBe('md');

83-

expect(inferKind('config.jsonc')).toBe('jsonc');

84-

expect(inferKind('plugins.json')).toBe('jsonc');

85-

expect(inferKind('events.jsonl')).toBe('jsonl');

86-

expect(inferKind('audit.ndjson')).toBe('jsonl');

87+

it("P-04 inferKind aligns with the parser actually used", () => {

88+

expect(inferKind("AGENTS.md")).toBe("md");

89+

expect(inferKind("SOUL.md")).toBe("md");

90+

expect(inferKind("config.jsonc")).toBe("jsonc");

91+

expect(inferKind("plugins.json")).toBe("jsonc");

92+

expect(inferKind("events.jsonl")).toBe("jsonl");

93+

expect(inferKind("audit.ndjson")).toBe("jsonl");

8794

});

889589-

it('P-05 parse → emit → parse is fixpoint across all kinds', () => {

96+

it("P-05 parse → emit → parse is fixpoint across all kinds", () => {

9097

const md1 = emitMd(parseMd(mdRaw).ast);

9198

const md2 = emitMd(parseMd(md1).ast);

9299

expect(md1).toBe(md2);

@@ -100,54 +107,52 @@ describe('wave-22 cross-kind property invariants', () => {

100107

expect(jl1).toBe(jl2);

101108

});

102109103-

it('P-06 hostile inputs do not throw at parse time across all kinds', () => {

110+

it("P-06 hostile inputs do not throw at parse time across all kinds", () => {

104111

const hostile = [

105-

'\x00\x01\x02 binary garbage',

112+

"\x00\x01\x02 binary garbage",

106113

'{ "unclosed":',

107-

'## heading without anything',

108-

'\n\n\n\n\n',

114+

"## heading without anything",

115+

"\n\n\n\n\n",

109116

];

110117

for (const raw of hostile) {

111-

expect(() => parseMd(raw)).not.toThrow();

112-

expect(() => parseJsonc(raw)).not.toThrow();

113-

expect(() => parseJsonl(raw)).not.toThrow();

118+

expect(parseMd(raw).ast.raw).toBe(raw);

119+

expect(

120+

parseJsonc(raw).diagnostics.every((diagnostic) => diagnostic.severity === "error"),

121+

).toBe(true);

122+

expect(parseJsonl(raw).ast.raw).toBe(raw);

114123

}

115124

});

116125117-

it('P-07 resolver returns null for paths past valid kinds (no throw)', () => {

118-

const overlong = parseOcPath('oc://X/a/b/c.d.e.f.g.h');

119-

expect(() => resolveMdOcPath(parseMd(mdRaw).ast, overlong)).not.toThrow();

120-

expect(() => resolveJsoncOcPath(parseJsonc(jsoncRaw).ast, overlong)).not.toThrow();

121-

expect(() => resolveJsonlOcPath(parseJsonl(jsonlRaw).ast, overlong)).not.toThrow();

126+

it("P-07 resolver returns null for paths past valid kinds", () => {

127+

const overlong = parseOcPath("oc://X/a/b/c.d.e.f.g.h");

128+

expect(resolveMdOcPath(parseMd(mdRaw).ast, overlong)).toBeNull();

129+

expect(resolveJsoncOcPath(parseJsonc(jsoncRaw).ast, overlong)).toBeNull();

130+

expect(resolveJsonlOcPath(parseJsonl(jsonlRaw).ast, overlong)).toBeNull();

122131

});

123132124-

it('P-08 set-then-resolve produces the value just written (jsonc)', () => {

133+

it("P-08 set-then-resolve produces the value just written (jsonc)", () => {

125134

const ast = parseJsonc('{ "k": 1 }').ast;

126-

const r = setJsoncOcPath(ast, parseOcPath('oc://X/k'), {

127-

kind: 'number',

135+

const r = setJsoncOcPath(ast, parseOcPath("oc://X/k"), {

136+

kind: "number",

128137

value: 42,

129138

});

130139

if (r.ok) {

131-

const m = resolveJsoncOcPath(r.ast, parseOcPath('oc://X/k'));

132-

if (m?.kind === 'object-entry') {

133-

expect(m.node.value).toEqual({ kind: 'number', value: 42 });

140+

const m = resolveJsoncOcPath(r.ast, parseOcPath("oc://X/k"));

141+

if (m?.kind === "object-entry") {

142+

expect(m.node.value).toEqual({ kind: "number", value: 42 });

134143

}

135144

}

136145

});

137146138-

it('P-09 verbs are deterministic — same input twice produces same output', () => {

147+

it("P-09 verbs are deterministic — same input twice produces same output", () => {

139148

expect(emitMd(parseMd(mdRaw).ast)).toBe(emitMd(parseMd(mdRaw).ast));

140-

expect(emitJsonc(parseJsonc(jsoncRaw).ast)).toBe(

141-

emitJsonc(parseJsonc(jsoncRaw).ast),

142-

);

143-

expect(emitJsonl(parseJsonl(jsonlRaw).ast)).toBe(

144-

emitJsonl(parseJsonl(jsonlRaw).ast),

145-

);

149+

expect(emitJsonc(parseJsonc(jsoncRaw).ast)).toBe(emitJsonc(parseJsonc(jsoncRaw).ast));

150+

expect(emitJsonl(parseJsonl(jsonlRaw).ast)).toBe(emitJsonl(parseJsonl(jsonlRaw).ast));

146151

});

147152148-

it('P-10 inferKind returns null for unknown extensions', () => {

149-

expect(inferKind('binary.bin')).toBeNull();

150-

expect(inferKind('no-ext')).toBeNull();

151-

expect(inferKind('archive.tar.gz')).toBeNull();

153+

it("P-10 inferKind returns null for unknown extensions", () => {

154+

expect(inferKind("binary.bin")).toBeNull();

155+

expect(inferKind("no-ext")).toBeNull();

156+

expect(inferKind("archive.tar.gz")).toBeNull();

152157

});

153158

});