Introduce the Provider interface, ProviderBase/ProviderFactory, and source-set
helpers; own provider discovery and lookup at the root; and add the
legacy-call shim scan that gates provider files.
fix(parser): cover Aider, OMP, Reasonix in migration manifest
These agents live in the registry but were absent from the provider
migration manifest, so ValidateProviderMigrationModes failed once the
registry began enforcing that every agent has a mode. They remain on the
legacy path here; later stack commits migrate them to concrete providers
and flip these entries to provider-authoritative.
fix(sync): keep shadow provider discovery observational
Shadow provider mode must not add provider-only work or satisfy source lookups that the legacy runtime would miss. Otherwise a migration comparison can change live sync behavior before the provider becomes authoritative.\n\nProvider-authoritative discovery now reports discovery failures as sync failures and suppresses the provider completion watermark for that run, preserving the next incremental pass. The shim scan also keeps pending exemptions honest by failing stale entries while ignoring provider-owned selector methods.\n\nValidation: go test -tags "fts5" ./internal/parser -run 'TestProviderFilesDoNotReferenceLegacyEntrypoints' -count=1; go test -tags "fts5" ./internal/sync -run 'Test(DiscoverProviderSourcesOnlyRunsAuthoritativeProviders|SyncAllProviderDiscoveryFailureSkipsFinishedWatermark|FindSourceFileFallsBackToAuthoritativeNonFileProvider|ClassifyProviderChangedPath|ProcessFileShadow|ProcessFileProviderAuthoritative|ProviderVirtualSourceBackedByEvent)' -count=1; go test -tags "fts5" ./internal/parser ./internal/sync -count=1; go vet ./...; git diff --check
docs(parser): clarify provider freshness contract
The facade spec still described successful parses as eligible for a clean skip-cache entry, which conflicts with the no-schema-change data-version model and can leave unchanged sessions stale after parser upgrades.\n\nDocument stored changed-path hints explicitly and keep successful unchanged-source freshness tied to DB metadata plus parser data version, reserving skipped_files for retry, failure, and explicit skip cases.\n\nValidation: go test -tags "fts5" ./internal/parser -run 'TestProviderFilesDoNotReferenceLegacyEntrypoints' -count=1; git diff --check. mdformat ran via commit hook.
docs(parser): pin provider source identity semantics
The facade contract needs to say exactly which provider source key is persisted because the migration intentionally avoids a schema change. Without that rule, providers could diverge between SourceRef, SourceFingerprint, and sessions.file_path identities.\n\nAlso define capability conformance by meaningful field presence so unsupported zero-value fields are treated consistently in provider tests.\n\nValidation: git diff --check. mdformat is unavailable on PATH, but the commit hook ran.
style(docs): mdformat provider dual-run harness plan
Adds the first implementation slice for the parser provider facade: the provider and factory contract, config snapshots, source/fingerprint/parse/incremental outcome types, zero-value ProviderBase optional methods, typed unsupported-feature errors, generated capability enum support, and a transitional factory registry that mirrors the current AgentDef registry.
This does not move sync dispatch or parser execution yet. The legacy factories intentionally return unsupported parse errors so later stacked branches can replace them provider group by provider group, with interface invariants documented at the package boundary for source identity, parse error semantics, and capability declarations.