Sync SharedContracts with DomRange/Structural selector shapes
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 15s

Mirror citation-engine contract updates for non-PDF anchoring (EANCH-WP-0003).
This commit is contained in:
tegwick 2026-07-09 09:18:46 +02:00
parent 57d64c6416
commit e087949642

View file

@ -148,6 +148,37 @@ StructuralSelector heading/section/AST path
FragmentSelector exported fragment / deep link (export-only) FragmentSelector exported fragment / deep link (export-only)
``` ```
Field shapes (non-PDF selectors, EANCH-WP-0003):
```ts
type DomNodePath = readonly number[];
interface DomRangeSelector {
type: "DomRangeSelector";
startPath: DomNodePath;
startOffset: number;
endPath: DomNodePath;
endOffset: number;
}
interface StructuralPathSegment {
kind: "heading" | "section" | "block";
index: number;
level?: number;
label?: string;
}
interface StructuralSelector {
type: "StructuralSelector";
path: readonly StructuralPathSegment[];
startOffset: number;
endOffset: number;
}
```
`StructureMap` on `DocumentRepresentation` maps canonical-text spans to
structural paths. Ingest may omit it; viewer adapters populate at selection time.
**Selector redundancy rule:** when an annotation is created, the system stores **Selector redundancy rule:** when an annotation is created, the system stores
*all selector types that are available* for that document representation, not *all selector types that are available* for that document representation, not
just one. Resolution tries them in order of expected confidence and stops at just one. Resolution tries them in order of expected confidence and stops at
@ -218,8 +249,32 @@ interface DocumentViewerAdapter {
} }
``` ```
MVP delivers a single `PDFViewerAdapter`. HTML and Markdown adapters are MVP delivers a single `PDFViewerAdapter`. HTML and Markdown adapters ship in
deferred. `evidence-anchor/dom`.
`SelectionCapture` is a discriminated union:
```ts
interface PdfSelectionCapture {
kind: "pdf";
text: string;
page: number;
rects: readonly NormalizedRect[];
boundingRect?: NormalizedRect;
}
interface DomSelectionCapture {
kind: "dom";
text: string;
startPath: DomNodePath;
startOffset: number;
endPath: DomNodePath;
endOffset: number;
structuralPath?: readonly StructuralPathSegment[];
}
type SelectionCapture = PdfSelectionCapture | DomSelectionCapture;
```
--- ---