Files
openclaw/docs/.generated
Jesse Merhi d7627d6f4c refactor(prompt): use plain inbound context labels and drop system-tag sanitizer (#112000)
* refactor(prompt): plain inbound context labels with a provenance marker

Replaces trust-worded inbound context labels ("(untrusted metadata)",
"(untrusted, for context)") with plain labels plus a fixed provenance
marker suffix appended to every OpenClaw-injected context header.

Detection keys on the marker, not label text, so strippers stay correct
across UI, TUI, replay, /trace segmentation, memory recall, and the Swift
chat preprocessor. Drops sanitizeInboundSystemTags in favor of the marker
boundary plus trusted system-prompt narration.

Renames the untrusted-named plugin SDK context identifiers to
channel-provenance names, keeping deprecated aliases registered for
removal after 2026-09-08.

Adds `openclaw doctor --fix` migrations that rewrite legacy inbound
labels in stored SQLite transcripts and purge legacy envelope-
contaminated LanceDB recall rows.

* fix(ci): resolve gate failures for plain inbound context labels

- doctor sqlite readers: open read-only connections via openNodeSqliteDatabase
  so the Kysely connection-boundary guardrail holds; unexport the now-internal
  transcript snapshot type (Knip unused-export gate).
- compat registry: split the record table into registry-records.ts and
  plugin-sdk-subpath-records.ts. The new compat record pushed registry.ts past
  the 700-line oxlint cap; suppressions are disallowed, so follow the existing
  sibling record-module pattern. Public exports and PluginCompatCode literals
  unchanged.
- acp-runtime test: assert current finalization behavior (newline normalization
  only). The bracket de-fang and System: rewrite it expected were removed with
  sanitizeInboundSystemTags; forged system lines are neutralized at the
  system-event queue, the single chokepoint feeding the System:-per-line render.
- regenerate docs_map and the plugin SDK API baseline manifest.

* fix(prompt): harden inbound context label migration and drop in-band sanitizer

Review follow-ups on the plain-label + provenance-marker change:

- Remove src/security/system-tags.ts. Rewriting inbound text to neutralize
  look-alike `System:`/`[System]` markers corrupted legitimate user text and is
  not a real injection boundary; role separation plus external-content wrapping
  is. Explicit product decision, recorded at the system-event queue.
- Narrow the LanceDB legacy-row purge so it cannot delete benign memories. It
  now requires a complete known legacy sentinel line, a legacy label followed by
  a fenced JSON body, or the complete legacy external-content header. The prior
  predicates matched ordinary prose such as `Notes (untrusted metadata):`, and
  deletion is irreversible.
- Make explicit-empty canonical ChannelStructuredContext win over the deprecated
  alias via a present/absent result instead of collapsing `[]` to undefined.
- Keep `\r?` in the active-memory doctor rule. It is the only rule spanning the
  header's line break, migrated assistant rows skip newline normalization, and
  without it the marked-header replace wins and the body strips to empty. Added
  a CRLF regression test.
- Fix stale comments that described removed behavior, and cover the Swift
  prose-block strip path.

Claude-Session: https://claude.ai/code/session_01WNzsPddQmxy9Y7jKD4wAxH
2026-07-27 11:27:53 +10:00
..

Generated Docs Artifacts

SHA-256 files are tracked drift-detection artifacts. Full generated snapshots remain local inspection artifacts.

Tracked (committed to git):

  • config-baseline.sha256 — hashes of config baseline JSON artifacts.
  • config-baseline.counts.json — maximum entry counts for each config baseline kind.
  • plugin-sdk-api-baseline.sha256 — one hash per Plugin SDK entrypoint.
  • sqlite-session-transcript-schema-baseline.sha256 — hash of the sessions/transcripts SQLite schema baseline.

Local only (gitignored):

  • config-baseline.json, config-baseline.core.json, config-baseline.channel.json, config-baseline.plugin.json
  • plugin-sdk-api-baseline.json, plugin-sdk-api-baseline.jsonl
  • .artifacts/sqlite-session-transcript-schema-baseline.sql

Do not edit any of these files by hand.

  • Regenerate config baseline: pnpm config:docs:gen
  • Validate config baseline: pnpm config:docs:check
  • Regenerate Plugin SDK API baseline: pnpm plugin-sdk:api:gen
  • Validate Plugin SDK API contract manifest: pnpm plugin-sdk:api:check

The Plugin SDK manifest hashes each entrypoint independently. PRs changing separate public modules therefore update separate records instead of racing to overwrite one whole-surface checksum. Concurrent changes to the same entrypoint remain a real merge conflict and require regeneration against combined source.

  • Regenerate SQLite sessions/transcripts schema baseline: pnpm sqlite:sessions-schema:gen
  • Validate SQLite sessions/transcripts schema baseline: pnpm sqlite:sessions-schema:check