diff --git a/docs/persistence-catalog.i18n.yaml b/docs/persistence-catalog.i18n.yaml
index c4161b2c5b..0e5675948a 100644
--- a/docs/persistence-catalog.i18n.yaml
+++ b/docs/persistence-catalog.i18n.yaml
@@ -2,5 +2,5 @@
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write docs/persistence-catalog.md
-persistence-catalog.md: 99bd075eeabde138bcf258340a42380995bff5cb
-persistence-catalog.zh.md: a2ed30012e3ed70c1190ed3a64cdc9639a24109b
+persistence-catalog.md: 4f8f9cee3d7139bd829eb155628d727e6451c772
+persistence-catalog.zh.md: 49417f7247dcf86172cc64a8dc4ff6539c43e906
diff --git a/docs/persistence-catalog.md b/docs/persistence-catalog.md
index 99bd075eea..4f8f9cee3d 100644
--- a/docs/persistence-catalog.md
+++ b/docs/persistence-catalog.md
@@ -3128,7 +3128,7 @@ Sources: [`packages/session/session-title/src/types.ts:30`](../packages/session/
| Property | Presence | Type |
|---|---|---|
| `kind` | required | `"provider"` |
-| `model` | optional | [`packages/session/session-title/src/types.ts#SessionTitleModelProvenance`](#persistence-type-packagessessionsession-titlesrctypestssessiontitlemodelprovenance) |
+| `model` | optional | [`packages/session/session-title/src/types.ts#SessionTitleModelIdentity`](#persistence-type-packagessessionsession-titlesrctypestssessiontitlemodelidentity) |
| `provider` | required | `string` |
@@ -3260,7 +3260,7 @@ Sources: [`packages/subagent/tool-subagent/src/model-selection-state.ts:17`](../
SHA-256: `ba77b58995e36f14bb13886b0493d0a1a63d5db10b1a6cd9f6ac65a72cf832ec`
-Array of [`packages/session/session-title/src/types.ts#SessionTitleModelProvenance`](#persistence-type-packagessessionsession-titlesrctypestssessiontitlemodelprovenance).
+Array of [`packages/session/session-title/src/types.ts#SessionTitleModelIdentity`](#persistence-type-packagessessionsession-titlesrctypestssessiontitlemodelidentity).
@@ -5528,7 +5528,7 @@ Sources: [`packages/session/session-title-llm/src/index.ts:27`](../packages/sess
| `maxTokens` | required | `number` |
| `messageSeqs` | required | [`SessionEventEnvelope[38].sourceEventSeqs`](#persistence-type-sessioneventenvelope38sourceeventseqs) |
| `messages` | required | [`event:session/title-llm-request.data.messages`](#persistence-type-eventsessiontitle-llm-requestdatamessages) |
-| `route` | required | [`packages/session/session-title/src/types.ts#SessionTitleModelProvenance`](#persistence-type-packagessessionsession-titlesrctypestssessiontitlemodelprovenance) |
+| `route` | required | [`packages/session/session-title/src/types.ts#SessionTitleModelIdentity`](#persistence-type-packagessessionsession-titlesrctypestssessiontitlemodelidentity) |
| `system` | required | `string` |
| `titleProvider` | required | `string` |
@@ -5546,9 +5546,9 @@ Sources: [`packages/session/session-title/src/types.ts:41`](../packages/session/
| `source` | required | [`packages/session/session-title/src/types.ts#SessionTitleSource`](#persistence-type-packagessessionsession-titlesrctypestssessiontitlesource) |
| `title` | required | `string` |
-
+
-### `packages/session/session-title/src/types.ts#SessionTitleModelProvenance`
+### `packages/session/session-title/src/types.ts#SessionTitleModelIdentity`
SHA-256: `07e1a58c58b593f507b8e7f25723bb0aa42baae6e00f5ecfddf28cb1e64d3235`
diff --git a/docs/persistence-catalog.zh.md b/docs/persistence-catalog.zh.md
index a2ed30012e..49417f7247 100644
--- a/docs/persistence-catalog.zh.md
+++ b/docs/persistence-catalog.zh.md
@@ -3130,7 +3130,7 @@ SHA-256: `b81e9de81a481b24e1e1f9adf038bfc59e57b4f35ce62f8f1e45284186f4f812`
| 属性 | 存在性 | 类型 |
|---|---|---|
| `kind` | 必需 | `"provider"` |
-| `model` | 可选 | [`packages/session/session-title/src/types.ts#SessionTitleModelProvenance`](#persistence-type-packagessessionsession-titlesrctypestssessiontitlemodelprovenance) |
+| `model` | 可选 | [`packages/session/session-title/src/types.ts#SessionTitleModelIdentity`](#persistence-type-packagessessionsession-titlesrctypestssessiontitlemodelidentity) |
| `provider` | 必需 | `string` |
@@ -3262,7 +3262,7 @@ SHA-256: `0d47a8f3d847243c4488e755ad4cab7a04ac5d4621b9c81865524cf3f4d8536f`
SHA-256: `ba77b58995e36f14bb13886b0493d0a1a63d5db10b1a6cd9f6ac65a72cf832ec`
-[`packages/session/session-title/src/types.ts#SessionTitleModelProvenance`](#persistence-type-packagessessionsession-titlesrctypestssessiontitlemodelprovenance) 的数组。
+[`packages/session/session-title/src/types.ts#SessionTitleModelIdentity`](#persistence-type-packagessessionsession-titlesrctypestssessiontitlemodelidentity) 的数组。
@@ -5530,7 +5530,7 @@ SHA-256: `08936f7648f573f7539800e1ec2852fbbcba05e1a20487a1e5acf2a0fce1e2de`
| `maxTokens` | 必需 | `number` |
| `messageSeqs` | 必需 | [`SessionEventEnvelope[38].sourceEventSeqs`](#persistence-type-sessioneventenvelope38sourceeventseqs) |
| `messages` | 必需 | [`event:session/title-llm-request.data.messages`](#persistence-type-eventsessiontitle-llm-requestdatamessages) |
-| `route` | 必需 | [`packages/session/session-title/src/types.ts#SessionTitleModelProvenance`](#persistence-type-packagessessionsession-titlesrctypestssessiontitlemodelprovenance) |
+| `route` | 必需 | [`packages/session/session-title/src/types.ts#SessionTitleModelIdentity`](#persistence-type-packagessessionsession-titlesrctypestssessiontitlemodelidentity) |
| `system` | 必需 | `string` |
| `titleProvider` | 必需 | `string` |
@@ -5548,9 +5548,9 @@ SHA-256: `b56f6a885da3dc394c69a3e3cc5c0cfc4da15601b63fda4989eee8f40efc5be4`
| `source` | 必需 | [`packages/session/session-title/src/types.ts#SessionTitleSource`](#persistence-type-packagessessionsession-titlesrctypestssessiontitlesource) |
| `title` | 必需 | `string` |
-
+
-### `packages/session/session-title/src/types.ts#SessionTitleModelProvenance`
+### `packages/session/session-title/src/types.ts#SessionTitleModelIdentity`
SHA-256: `07e1a58c58b593f507b8e7f25723bb0aa42baae6e00f5ecfddf28cb1e64d3235`
diff --git a/docs/persistence-schema.json b/docs/persistence-schema.json
index e31f4b5865..4d502ac415 100644
--- a/docs/persistence-schema.json
+++ b/docs/persistence-schema.json
@@ -13686,7 +13686,7 @@
]
},
"names": [
- "packages/session/session-title/src/types.ts#SessionTitleModelProvenance",
+ "packages/session/session-title/src/types.ts#SessionTitleModelIdentity",
"packages/subagent/tool-subagent/src/model-selection.ts#AllowedModelRoute"
],
"sources": [
diff --git a/scripts/persistence-schema-model.ts b/scripts/persistence-schema-model.ts
index a674a0f039..f12213b9f1 100644
--- a/scripts/persistence-schema-model.ts
+++ b/scripts/persistence-schema-model.ts
@@ -45,7 +45,7 @@ export interface PersistenceRoot {
readonly schema: CanonicalSchema
}
-/** One reachable structural type and its non-fingerprinted source provenance. */
+/** One reachable structural type and its non-fingerprinted source declaration metadata. */
export interface PersistenceType {
readonly digest: string
readonly schema: CanonicalSchema
diff --git a/scripts/persistence-schema.spec.ts b/scripts/persistence-schema.spec.ts
index 3c26622e4e..7f81efe18c 100644
--- a/scripts/persistence-schema.spec.ts
+++ b/scripts/persistence-schema.spec.ts
@@ -185,7 +185,7 @@ interface SessionEventMap {
expect(detail?.sources).toEqual(['packages/domain/payload/src/detail.ts:2'])
})
- it('keeps shared scalar provenance at real aliases and omits plain property references', () => {
+ it('keeps shared scalar declaration metadata at real aliases and omits plain property references', () => {
const root = fixture([
'type Label = string',
"type Done = 'done'",
diff --git a/scripts/persistence-schema.ts b/scripts/persistence-schema.ts
index 95db5dce0e..2120b0874c 100644
--- a/scripts/persistence-schema.ts
+++ b/scripts/persistence-schema.ts
@@ -15,7 +15,7 @@ import {
type SchemaProperty,
} from './persistence-schema-model.ts'
-interface Provenance {
+interface DeclarationMetadata {
readonly names: Set
readonly sources: Set
}
@@ -204,7 +204,7 @@ function validateReachableDeclarations(
class SchemaExtractor {
readonly nodes: SchemaNode[] = []
private readonly cache = new Map()
- private readonly provenance = new Map()
+ private readonly declarationMetadata = new Map()
private readonly checker: ts.TypeChecker
@@ -387,11 +387,11 @@ class SchemaExtractor {
const schema = canonicalizeSchema(this.nodes, id)
const digest = schemaDigest(schema)
const item = types.get(digest) ?? { schema, names: new Set(), sources: new Set() }
- const provenance = this.provenance.get(id)
- for (const name of provenance?.names ?? []) item.names.add(name)
- for (const source of provenance?.sources ?? []) item.sources.add(source)
+ const declarationMetadata = this.declarationMetadata.get(id)
+ for (const name of declarationMetadata?.names ?? []) item.names.add(name)
+ for (const source of declarationMetadata?.sources ?? []) item.sources.add(source)
const kind = schema.nodes[0]?.kind
- if (kind !== 'primitive' && kind !== 'literal' && (provenance === undefined || provenance.names.size === 0)) {
+ if (kind !== 'primitive' && kind !== 'literal' && (declarationMetadata === undefined || declarationMetadata.names.size === 0)) {
for (const path of paths.get(id) ?? []) item.names.add(path)
}
types.set(digest, item)
@@ -409,7 +409,7 @@ class SchemaExtractor {
}
private record(id: number, type: ts.Type): void {
- const item = this.provenance.get(id) ?? { names: new Set(), sources: new Set() }
+ const item = this.declarationMetadata.get(id) ?? { names: new Set(), sources: new Set() }
const declarations = new Set([
...this.declarationSources.get(type) ?? [],
...type.aliasSymbol?.declarations ?? [],
@@ -424,7 +424,7 @@ class SchemaExtractor {
const position = source.getLineAndCharacterOfPosition(declaration.getStart())
item.sources.add(`${file}:${String(position.line + 1)}`)
}
- this.provenance.set(id, item)
+ this.declarationMetadata.set(id, item)
}
private fail(type: ts.Type, site: ts.Node, reason: string): never {
diff --git a/scripts/render-persistence-schema.ts b/scripts/render-persistence-schema.ts
index 02f872bdd0..62bf5a4b78 100644
--- a/scripts/render-persistence-schema.ts
+++ b/scripts/render-persistence-schema.ts
@@ -144,7 +144,7 @@ function definition(entry: TypeDisplay, entries: ReadonlyMap