From 31826982e6882eb1e6bc26c77000cd3e7d657e97 Mon Sep 17 00:00:00 2001 From: vasily Date: Wed, 14 Oct 2026 20:35:36 +0800 Subject: [PATCH] feat: broaden ingest triage and add review flags --- README.md | 2 +- contracts/catalog-v1.json | 48 +++++++++++++++++ contracts/schemas/ProjectRecord.schema.json | 19 +++++++ contracts/service-v1.json | 29 +++++++++- manifest.json | 60 +++++++++++---------- pipelines/ingest.md | 9 ++-- protocols/CONTRIBUTIONS.md | 4 +- skills/kb-ingest/SKILL.md | 4 +- 8 files changed, 137 insertions(+), 38 deletions(-) diff --git a/README.md b/README.md index f2d4e2e..30da01d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # GEWU local research-agent pack -Version 0.15.0. Local service contract, checkpoint helper, pasted-text/transcript intake, scoped project-lens reads and workspace installer are bound; native-host installation and pilot workflows remain unverified. +Version 0.16.0. Adds four default research lenses, non-blocking ingest-review flags, project-scoped feedback guidance and optional Jev relevance scoring; native-host installation and pilot workflows remain unverified. This pack contains the [agent profile](AGENTS.md), Claude harness pointer ([CLAUDE.md](CLAUDE.md)), shared protocols, four skills and separate pipeline procedures. An existing local host supplies the model and tools. There is no standalone agent engine here. diff --git a/contracts/catalog-v1.json b/contracts/catalog-v1.json index e27a02c..9b5ec0f 100644 --- a/contracts/catalog-v1.json +++ b/contracts/catalog-v1.json @@ -106,6 +106,14 @@ "http" ] }, + { + "capability": "credential:admin", + "mutates_knowledge": false, + "name": "admin_update_account", + "transports": [ + "http" + ] + }, { "capability": "credential:admin", "mutates_knowledge": false, @@ -138,6 +146,14 @@ "http" ] }, + { + "capability": "credential:admin", + "mutates_knowledge": false, + "name": "admin_update_credential", + "transports": [ + "http" + ] + }, { "capability": "credential:admin", "mutates_knowledge": false, @@ -170,6 +186,14 @@ "http" ] }, + { + "capability": "project:admin", + "mutates_knowledge": false, + "name": "project_update_content", + "transports": [ + "http" + ] + }, { "capability": "project:admin", "mutates_knowledge": false, @@ -195,6 +219,22 @@ "mcp" ] }, + { + "capability": "ingest:review", + "mutates_knowledge": false, + "name": "ingest_review_list", + "transports": [ + "http" + ] + }, + { + "capability": "ingest:review", + "mutates_knowledge": false, + "name": "ingest_review_decide", + "transports": [ + "http" + ] + }, { "capability": "knowledge:read", "mutates_knowledge": false, @@ -385,6 +425,14 @@ "mcp" ] }, + { + "capability": "ingest:review", + "mutates_knowledge": false, + "name": "ingest_review_create", + "transports": [ + "mcp" + ] + }, { "capability": "owner:review", "mutates_knowledge": false, diff --git a/contracts/schemas/ProjectRecord.schema.json b/contracts/schemas/ProjectRecord.schema.json index 0f54972..372364b 100644 --- a/contracts/schemas/ProjectRecord.schema.json +++ b/contracts/schemas/ProjectRecord.schema.json @@ -71,6 +71,25 @@ "title": "Project Id", "type": "string" }, + "research_lenses": { + "default": [ + "technical", + "conceptual", + "cultural-historical", + "financial-market" + ], + "items": { + "enum": [ + "technical", + "conceptual", + "cultural-historical", + "financial-market" + ], + "type": "string" + }, + "title": "Research Lenses", + "type": "array" + }, "schema_version": { "const": 1, "default": 1, diff --git a/contracts/service-v1.json b/contracts/service-v1.json index b04a5e9..ee85503 100644 --- a/contracts/service-v1.json +++ b/contracts/service-v1.json @@ -1,6 +1,6 @@ { "api_version": "v1", - "catalog_sha256": "75b8ebb3a1255b4d2ab7a81a277977dde65b34501af4d4f11a1b918b316d98ac", + "catalog_sha256": "8c721bdb8b78e50606d4d479d716076f1f609ecb908fb32c10b7eaccc06eb04e", "contract_id": "gewu.service.v1", "contract_version": 1, "operations": [ @@ -203,6 +203,14 @@ "transports": [ "mcp" ] + }, + { + "capability": "ingest:review", + "mutates_knowledge": false, + "name": "ingest_review_create", + "transports": [ + "mcp" + ] } ], "record_schemas": [ @@ -232,7 +240,7 @@ }, { "path": "schemas/ProjectRecord.schema.json", - "sha256": "6b64f935e1b9cdbb71e086c1510d75e58600207f84469247653441caed9e7348" + "sha256": "f69f0987b556f3aa9aa71d310a890cb4a46de790360356b31aae572659c6f1eb" }, { "path": "schemas/ProposalReceipt.schema.json", @@ -771,6 +779,23 @@ }, "name": "neighbors" }, + { + "description": "Persist a source-bound follow-up flag for human relevance feedback.", + "input_schema": { + "properties": { + "review_json": { + "title": "Review Json", + "type": "string" + } + }, + "required": [ + "review_json" + ], + "title": "ingest_review_createArguments", + "type": "object" + }, + "name": "ingest_review_create" + }, { "description": "Archive explicitly supplied UTF-8 text and return its source candidate.", "input_schema": { diff --git a/manifest.json b/manifest.json index b5b86d0..1b9ead9 100644 --- a/manifest.json +++ b/manifest.json @@ -1,6 +1,6 @@ { "pack_id": "gewu-research", - "pack_version": "0.15.0", + "pack_version": "0.16.0", "manifest_version": "1.0.0", "status": "local-contract-and-checkpoint-bound-hosts-not-qualified", "execution": "existing-local-agent-host", @@ -10,7 +10,7 @@ "contract_id": "gewu.service.v1", "contract_version": 1, "path": "contracts/service-v1.json", - "sha256": "0bdeb121e4cca3df36c97d24e8144b87fb36215f6afce58b187708ecf0fdb32d", + "sha256": "5e6eabc607788638c1e71bb8eb4a294d33cdd4c623e70d533e4e9f0c9b730bc1", "scope": "Generated local MCP tool input schemas and v1 record schemas; native host workflows remain NOT RUN." } ], @@ -28,10 +28,10 @@ "skills": [ { "id": "kb-ingest", - "version": "0.1.0", + "version": "0.2.0", "entry": "skills/kb-ingest/SKILL.md", "pipeline": "pipelines/ingest.md", - "pipeline_version": "0.1.0" + "pipeline_version": "0.2.0" }, { "id": "kb-query", @@ -73,8 +73,8 @@ "requires_contracts": [ "gewu.protocol.evidence@0.1.0", "gewu.protocol.scope@0.1.0", - "gewu.protocol.contributions@0.1.0", - "gewu.skill.kb-ingest@0.1.0", + "gewu.protocol.contributions@0.2.0", + "gewu.skill.kb-ingest@0.2.0", "gewu.skill.kb-query@0.1.0", "gewu.skill.kb-curate@0.1.0", "gewu.skill.kb-synthesize@0.2.0" @@ -85,6 +85,7 @@ "proposal:read", "proposal:submit", "proposal:withdraw", + "ingest:review", "run:read", "run:write", "service:diagnostics" @@ -136,10 +137,10 @@ "module_id": "contributions", "kind": "protocol", "entry": "protocols/CONTRIBUTIONS.md", - "implementation_version": "0.3.0", + "implementation_version": "0.4.0", "provided_contract": { "id": "gewu.protocol.contributions", - "version": "0.1.0" + "version": "0.2.0" }, "requires_contracts": [ "gewu.local-checkpoint@0.1.0" @@ -149,6 +150,7 @@ "proposal:read", "proposal:submit", "proposal:withdraw", + "ingest:review", "run:read", "run:write", "service:diagnostics" @@ -157,29 +159,30 @@ "compatible_checkpoint_contracts": [ "gewu.local-checkpoint@0.1.0" ], - "sha256": "0cb815b00b5ea65200eedaa211f7ac6dd47b87431d8ac0567a15fa6ae8cd6cea", + "sha256": "4c5b6169daf675866355265d598a0338b67fd9b819862031cd24d66753ea7b05", "hash_encoding": "utf8-no-bom-lf" }, { "module_id": "kb-ingest", "kind": "skill", "entry": "skills/kb-ingest/SKILL.md", - "implementation_version": "0.3.0", + "implementation_version": "0.4.0", "provided_contract": { "id": "gewu.skill.kb-ingest", - "version": "0.1.0" + "version": "0.2.0" }, "requires_contracts": [ "gewu.protocol.evidence@0.1.0", "gewu.protocol.scope@0.1.0", - "gewu.protocol.contributions@0.1.0", - "gewu.pipeline.kb-ingest-pipeline@0.1.0" + "gewu.protocol.contributions@0.2.0", + "gewu.pipeline.kb-ingest-pipeline@0.2.0" ], "required_service_capabilities": [ "proposal:evaluate", "proposal:read", "proposal:submit", "proposal:withdraw", + "ingest:review", "run:read", "run:write" ], @@ -187,28 +190,29 @@ "compatible_checkpoint_contracts": [ "gewu.local-checkpoint@0.1.0" ], - "sha256": "7c0436077d8f2227e6e8ce56b3910ae77c27c5af91a0546775d4aec46565d708", + "sha256": "b6193c5017a820fa6d50f1595bb40aa74f7439b98fa85082def1ca3991319c88", "hash_encoding": "utf8-no-bom-lf" }, { "module_id": "kb-ingest-pipeline", "kind": "pipeline", "entry": "pipelines/ingest.md", - "implementation_version": "0.2.0", + "implementation_version": "0.3.0", "provided_contract": { "id": "gewu.pipeline.kb-ingest-pipeline", - "version": "0.1.0" + "version": "0.2.0" }, "requires_contracts": [ "gewu.protocol.evidence@0.1.0", "gewu.protocol.scope@0.1.0", - "gewu.protocol.contributions@0.1.0" + "gewu.protocol.contributions@0.2.0" ], "required_service_capabilities": [ "proposal:evaluate", "proposal:read", "proposal:submit", "proposal:withdraw", + "ingest:review", "run:read", "run:write" ], @@ -216,7 +220,7 @@ "compatible_checkpoint_contracts": [ "gewu.local-checkpoint@0.1.0" ], - "sha256": "a3cf7589e1c220e0cb1d5c8b23c4312c0e4af642a21bdcd7ff3a89ba0883bda7", + "sha256": "2942147e529b30a4ed92c9d17c5a9262328de31ec1cc584737c8b6eb9c103f71", "hash_encoding": "utf8-no-bom-lf" }, { @@ -231,7 +235,7 @@ "requires_contracts": [ "gewu.protocol.evidence@0.1.0", "gewu.protocol.scope@0.1.0", - "gewu.protocol.contributions@0.1.0", + "gewu.protocol.contributions@0.2.0", "gewu.pipeline.kb-query-pipeline@0.1.0" ], "required_service_capabilities": [ @@ -256,7 +260,7 @@ "requires_contracts": [ "gewu.protocol.evidence@0.1.0", "gewu.protocol.scope@0.1.0", - "gewu.protocol.contributions@0.1.0" + "gewu.protocol.contributions@0.2.0" ], "required_service_capabilities": [ "knowledge:read" @@ -280,7 +284,7 @@ "requires_contracts": [ "gewu.protocol.evidence@0.1.0", "gewu.protocol.scope@0.1.0", - "gewu.protocol.contributions@0.1.0", + "gewu.protocol.contributions@0.2.0", "gewu.pipeline.kb-curate-pipeline@0.1.0" ], "required_service_capabilities": [ @@ -311,7 +315,7 @@ "requires_contracts": [ "gewu.protocol.evidence@0.1.0", "gewu.protocol.scope@0.1.0", - "gewu.protocol.contributions@0.1.0" + "gewu.protocol.contributions@0.2.0" ], "required_service_capabilities": [ "knowledge:read", @@ -341,7 +345,7 @@ "requires_contracts": [ "gewu.protocol.evidence@0.1.0", "gewu.protocol.scope@0.1.0", - "gewu.protocol.contributions@0.1.0", + "gewu.protocol.contributions@0.2.0", "gewu.pipeline.kb-synthesize-pipeline@0.2.0" ], "required_service_capabilities": [ @@ -366,7 +370,7 @@ "requires_contracts": [ "gewu.protocol.evidence@0.1.0", "gewu.protocol.scope@0.1.0", - "gewu.protocol.contributions@0.1.0" + "gewu.protocol.contributions@0.2.0" ], "required_service_capabilities": [ "knowledge:read" @@ -393,7 +397,7 @@ "compatible_checkpoint_contracts": [ "gewu.local-checkpoint@0.1.0" ], - "sha256": "5dae6ad10a6fc8e5ba55a39d9d41376b49426f193f48ede1522f30c2a8c6d387", + "sha256": "5032436c257a203a36be6f093b7ae5db61a844060963ba25f855b0ef2af0f422", "hash_encoding": "utf8-no-bom-lf" }, { @@ -431,7 +435,7 @@ "compatible_checkpoint_contracts": [ "gewu.local-checkpoint@0.1.0" ], - "sha256": "0bdeb121e4cca3df36c97d24e8144b87fb36215f6afce58b187708ecf0fdb32d", + "sha256": "5e6eabc607788638c1e71bb8eb4a294d33cdd4c623e70d533e4e9f0c9b730bc1", "hash_encoding": "utf8-no-bom-lf" }, { @@ -449,7 +453,7 @@ "compatible_checkpoint_contracts": [ "gewu.local-checkpoint@0.1.0" ], - "sha256": "75b8ebb3a1255b4d2ab7a81a277977dde65b34501af4d4f11a1b918b316d98ac", + "sha256": "8c721bdb8b78e50606d4d479d716076f1f609ecb908fb32c10b7eaccc06eb04e", "hash_encoding": "utf8-no-bom-lf" }, { @@ -512,6 +516,6 @@ "snapshot": { "algorithm": "sha256", "scope": "modules array serialized as UTF-8 JSON with sorted keys and compact separators", - "digest": "941ed03a201721658945b2120bc09e131ac8b4386a52c86f5aad47a449a590bd" + "digest": "279a2c16bb5e94110311fab44d9b2e79657342c49ab49b669e64298aaa5a37df" } } diff --git a/pipelines/ingest.md b/pipelines/ingest.md index 494aa54..eb018d5 100644 --- a/pipelines/ingest.md +++ b/pipelines/ingest.md @@ -1,16 +1,17 @@ # Ingestion pipeline -Version 0.2.0. Host-executed procedure for `kb-ingest`; not a background scheduler. Follow the contribution protocol for budgets, checkpoints and retry identity. +Version 0.3.0. Host-executed procedure for `kb-ingest`; not a background scheduler. Follow the contribution protocol for budgets, checkpoints and retry identity. | Stage | Input | Output / checkpoint | Gate | | --- | --- | --- | --- | -| Context | User-selected material, explicit project and `get_project_context` lens | Objective, authorized project lens, scope, run identity and pinned pack versions | Required tools/schema are available; otherwise report blocked. | +| Context | User-selected material, explicit project and `get_project_context` lens | Objective, authorized project lens including four default research lenses and saved guidance, scope, run identity and pinned pack versions | Required tools/schema are available; otherwise report blocked. | | Capture | Explicitly selected local files, user-pasted text or an allowlisted public URL | Verified artifact digest, stable source ID, content-bound revision ID, metadata candidate and extraction availability | Use the connector for local files, `source_capture_text` for explicitly supplied UTF-8 text/Markdown (maximum 1 MB), or `source_capture_url` for a configured public host. Pasted text requires a stable capture ID and source key, and returns an archived artifact, extraction and candidate marked `pasted-text`; retry with the same ID and identical inputs after uncertainty, since changed inputs conflict. The service retains at most 1,024 private capture receipts. The capture does not register the source. The connector returns a typed `source_candidate`; `.vtt` and `.srt` files are parsed into cue-timed blocks and tagged `transcript`. Cite the precise cue times together with the quote span. The connector can record a declared NotebookLM export provenance for supported text, Markdown or PDF files, but does not verify that provenance; omit `source_revision_id` to derive a revision from file identity, content digest and its durable retry checkpoint, or supply a stable revision ID when resuming an existing workflow. Submit candidates through `proposal_submit`; staging alone does not register a source. Failed fetches return a `capture-failed` candidate without artifact bytes; register it only when a bookmark is useful. PDF extraction currently requires the supported Linux sandbox. HTML citations refer to visible extracted text, not markup-byte offsets. | -| Triage | Source plus project lens | Included sections and skip/defer reasons | Bound the batch; preserve coverage. | +| Triage | Source plus project lens and four default lenses (technical, conceptual, cultural-historical, financial-market) | Included sections, explicit clear-exclusion reasons and review flags | Treat lenses as coverage prompts, not quotas. Historical, philosophical, cultural or commercial evidence is not automatically out of scope. Exclude only clearly unrelated or unavailable material, or user-excluded topics. Continue normal evidence-backed proposal processing for plausible material; add `ingest_review_create` as a follow-up notification/filter flag when human relevance review would help. | | Extract | Included sections and immutable maps | Atomic proposal draft with field-level evidence | Exact quotes/locators; no invented revisions. | | Assess | Assertion/evidence bindings | Support judgments, assessor/run and rationale | Unsupported/unavailable claims remain drafts. | | Evaluate | Complete bounded bundle and base revision | `proposal_evaluate` findings and eligible status | Evaluation is read-only; it does not reserve an ID or store the proposal. | | Submit | Evaluated bounded bundle and stable proposal identity | `proposal_submit` outcome and eventual receipt | Every affected domain's policy applies; protected decisions remain external. | -| Report | `proposal_status`, receipts and coverage records | Accepted/held work, index state, limitations and resume point | Never equate upload, evaluation or partial acceptance with complete processing. | +| Human review | Stored review flag and authorized editor/admin decision | Include, exclude or defer feedback; optionally saved project/lens guidance | The flag never blocks proposal evaluation/submission or marks knowledge accepted. Decisions are feedback only. Save reusable guidance only on explicit reviewer opt-in. | +| Report | `proposal_status`, receipts, review flags and coverage records | Accepted/held work, review notifications, index state, limitations and resume point | Never equate upload, evaluation, review-flag creation or partial acceptance with complete processing. | Resume calls `source_upload_status` or `proposal_status` using the exact checkpointed ID and revision before returning to a stage. Changed assertion/evidence invalidates assessment and later stages. Correct only actionable findings; repeated identical failure stops for diagnosis. Pipeline instructions may be replaced independently of the skill's extraction criteria if these input/output and recovery obligations remain valid. diff --git a/protocols/CONTRIBUTIONS.md b/protocols/CONTRIBUTIONS.md index ee4ce9c..9ebecda 100644 --- a/protocols/CONTRIBUTIONS.md +++ b/protocols/CONTRIBUTIONS.md @@ -2,7 +2,9 @@ Before a connected workflow, call `diagnostics` and compare the discovered MCP tool names and input schemas with `contracts/service-v1.json`; its catalog digest and record-schema hashes pin the local GEWU v1 contract. Diagnostics reports the authenticated role, authorized projects/capabilities, explicit selected scope, source-transfer limits, service/catalog versions and canonical/index revisions without returning credentials or principal IDs. `connection_status=authenticated` proves only this call; `workflow_status=not_verified` means native workflow acceptance remains separate. The MCP tool inventory must match exactly. If tools are absent or schemas differ, stop before mutation and report the drift. `proposal_evaluate` is the deterministic preflight; the service's `proposal_submit` response remains authoritative. Owner decisions use a separate owner transport and are not available to agents. Runs are agent-owned, explicitly scoped service records; they do not schedule work or grant capability. -`list_projects` exposes authorized IDs, and `get_project_context` returns the selected authorized project's north star, key questions, watch list and taxonomy extensions without exposing its autonomy policy. Use this tool for ingest/curation context; keep objective and scope explicit and never infer authority from a folder or project name. +`list_projects` exposes authorized IDs, and `get_project_context` returns the selected authorized project's north star, key questions, watch list, taxonomy extensions, research lenses and explicitly saved ingest guidance without exposing its autonomy policy. Projects default to technical, conceptual, cultural-historical and financial-market lenses. These are coverage prompts, not quotas. Use this context for ingest/curation; keep objective and scope explicit and never infer authority from a folder or project name. + +When available, `ingest_review_create` stores a source-bound review flag. Submit it after or alongside normal proposal processing, never as a reason to wait on human review before evaluating/submitting plausible findings. Bind it to the durable run and an extraction owned by the submitting agent and granted project; the exact excerpt and locator must match the staged extraction. A queue entry is a notification/filter and feedback record, not a proposal, source registration, acceptance result or publication. Human reviewers may confirm relevance, mark it irrelevant or defer feedback. Reusable project guidance is added to future context only when a human explicitly saves a rule. If the review operation is absent, preserve and report plausible uncertain material rather than silently deferring it. Current capability gaps that must be reported when relevant: retrieval is lexical only; URL capture requires an exact operator-allowlisted public host. URL and selected-file intake support UTF-8 text/Markdown/HTML and PDF; selected `.vtt` and `.srt` files are parsed into timestamped cues and tagged `capture_method=transcript`. Transcript evidence must cite the exact text span and matching cue start/end milliseconds. `source_capture_text` accepts explicitly supplied UTF-8 plain text or Markdown up to 1 MB. It requires a stable capture ID, stores the completed metadata candidate in a private bounded receipt journal, returns the same candidate for an exact retry, and conflicts if the same ID is reused with changed inputs. Source records distinguish URL fetch, local-file, transcript, declared NotebookLM-export and pasted-text capture methods; the NotebookLM label does not verify export provenance. HTML citations refer to the visible-text extraction, not markup-byte offsets. PDF extraction is qualified only on Linux in a sandbox; scanned PDFs return `PDF_NO_TEXT`. Failed URL captures can be registered as artifact-free references, and source records include publisher, author, publication date, license and reliability fields. supplied NotebookLM exports, Windows/macOS PDF extraction, native host workflows and real-source location checks remain unqualified. There are no vector/hybrid search or project-export/import operations. Duplicate review can nominate exact entity name/alias matches only within the caller-readable explicit scope; it does not merge records. Reversible merge, protected owner decisions, promotion and synthesis-dependency warnings remain unavailable. Do not describe these as implemented merely because a pipeline or record schema can represent related data. diff --git a/skills/kb-ingest/SKILL.md b/skills/kb-ingest/SKILL.md index 6a489cb..6053d73 100644 --- a/skills/kb-ingest/SKILL.md +++ b/skills/kb-ingest/SKILL.md @@ -6,8 +6,8 @@ description: Process explicitly selected sources for a GEWU project into evidenc Read the pack's [evidence](../../protocols/EVIDENCE.md), [scope](../../protocols/SCOPE.md) and [contribution](../../protocols/CONTRIBUTIONS.md) protocols, then use the [ingestion pipeline](../../pipelines/ingest.md). -Inputs are the selected source(s), explicit project and the user's research objective. Use `get_project_context` for the selected project’s authoritative north star, key questions, watch list and taxonomy extensions. The tool requires project read permission and does not expose the autonomy policy. Verify the supported tool/schema contract. Use the connector for local byte transfer; it returns a typed source metadata candidate without exposing the selected path or bytes. Selected `.vtt` and `.srt` files produce timestamped transcript cues; cite exact cue start/end times and the quote span. A declared NotebookLM export label is metadata only and is not export verification. For text explicitly pasted by the user, use `source_capture_text` with a stable capture ID and source key; it accepts UTF-8 plain text or Markdown up to 1 MB, archives and extracts it, and returns a typed candidate marked `capture_method=pasted-text`. Retry uncertain calls with the same capture ID and identical inputs; changed input under that ID conflicts. It does not register the candidate. `source_capture_url` fetches only operator-allowlisted public hosts and stages supported text, Markdown, HTML or PDF bytes; it also returns a source metadata candidate but does not register it. Submit candidates with the normal typed proposal flow, and use `capture-failed` candidates only as bookmarks, never as factual evidence. URL source IDs follow the sanitized URL; local source IDs follow the connector's configured file ID; pasted-text source IDs are derived from the supplied stable key and revision IDs include the content digest. PDF extraction currently requires Linux bubblewrap, Poppler and prlimit. Unsupported formats and unavailable parsers must be reported without inventing an extraction. If the service is unavailable, report the blocked stage and only prepare an unaccepted local draft when that work was requested. +Inputs are the selected source(s), explicit project and the user's research objective. Use `get_project_context` for the project's north star, key questions, watch list, taxonomy extensions, research lenses and saved ingest guidance. Every project defaults to four research lenses: technical, conceptual, cultural-historical and financial-market. Treat these as coverage prompts, not quotas. Verify the supported tool/schema contract, including `ingest_review_create` when borderline-review intake is available. Use the connector for local byte transfer; it returns a typed source metadata candidate without exposing the selected path or bytes. Selected `.vtt` and `.srt` files produce timestamped transcript cues; cite exact cue start/end times and the quote span. A declared NotebookLM export label is metadata only and is not export verification. For text explicitly pasted by the user, use `source_capture_text` with a stable capture ID and source key; it accepts UTF-8 plain text or Markdown up to 1 MB, archives and extracts it, and returns a typed candidate marked `capture_method=pasted-text`. Retry uncertain calls with the same capture ID and identical inputs; changed input under that ID conflicts. It does not register the candidate. `source_capture_url` fetches only operator-allowlisted public hosts and stages supported text, Markdown, HTML or PDF bytes; it also returns a source metadata candidate but does not register it. Submit candidates with the normal typed proposal flow, and use `capture-failed` candidates only as bookmarks, never as factual evidence. URL source IDs follow the sanitized URL; local source IDs follow the connector's configured file ID; pasted-text source IDs are derived from the supplied stable key and revision IDs include the content digest. PDF extraction currently requires Linux bubblewrap, Poppler and prlimit. Unsupported formats and unavailable parsers must be reported without inventing an extraction. If the service is unavailable, report the blocked stage and only prepare an unaccepted local draft when that work was requested. -Extract useful atomic assertions, problems, techniques or cases with their conditions. Preserve the service's exact source/extraction/location bindings. Map each factual field to evidence; assess semantic support separately. Record triage exclusions and skipped/deferred sections. Optimize for useful coverage rather than maximum note count. +Extract useful atomic assertions, problems, techniques or cases with their conditions across all four lenses where the source contains relevant material. Consider cultural history, philosophical context and market/financial evidence as project data when they explain the project's origins, concepts, adoption, audience, costs or viability; they are not automatically peripheral. First try to connect uncertain material to the north star, a key question, a saved rule or one of the lenses. Exclude only clearly unrelated material, unavailable evidence, or material the user explicitly excluded. Do not defer a section merely because its relevance is indirect, non-technical or historical. Continue normal evidence-backed proposal evaluation/submission for all plausible useful findings. Also submit a bounded `ingest_review_create` follow-up flag with the exact extraction excerpt/locator, lens, summary and reason when a human should review the relevance or categorization; this flag is persisted for notification/filtering and must not block or change proposal submission. If available, the backend's Jev score is a relevance signal, not a gate or evidence assessment. When a reviewer decides, record the feedback and apply reusable project guidance only when the reviewer explicitly opts in. Preserve the service's exact source/extraction/location bindings. Map each factual field to evidence; assess semantic support separately. Record clear exclusions and genuinely skipped/deferred sections. Optimize for useful coverage rather than maximum note count. Submit bounded bundles under the affected project/shared policies. Repair actionable findings without weakening evidence, changing scope to evade policy or assuming owner authority. Resume uncertain calls through status lookup. Report accepted node IDs and receipts, pending/rejected work, archive/extraction limits and actual coverage. A successful upload or schema check is not a completed ingestion.