Compare commits
5
Commits
6adc5a0d35
...
65bc8a9422
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
65bc8a9422 | ||
|
|
3b1b40f8b3 | ||
|
|
f3c5417b8b | ||
|
|
ea5fa236ea | ||
|
|
1e5beb5fc2 |
No files matched your search
@@ -23,7 +23,9 @@ Choose a focused skill; load only its applicable protocol and pipeline files:
|
|||||||
|
|
||||||
## Availability and reporting
|
## Availability and reporting
|
||||||
|
|
||||||
Check the installed manifest and compare the discovered MCP names and input schemas with `contracts/service-v1.json`. This pack is bound to the local GEWU v1 contract, but native host workflows are NOT RUN. Do not invent commands or assume another host's custom tools exist. If required tools are unavailable or differ from the pinned contract, stop before mutation and identify the blocked stage; prepare local drafts only when requested and label them unaccepted.
|
For a connected workflow, use MCP discovery and `diagnostics` to confirm the available tools, their advertised input schemas, role, capabilities and scope. Those discovered schemas are authoritative for this session. Routine ingestion does not require reading `manifest.json`, `service-v1.json`, record schemas, README sections or helper-script source to rediscover tools. If a required tool is absent or an advertised schema produces a concrete mismatch, stop before mutation; inspect only the relevant pinned contract entry to diagnose that mismatch, then report it if unresolved. Use the host's native file listing and viewing tools for workspace inventory and pack instructions; do not invoke shell commands just to list files. This pack is bound to the local GEWU v1 contract, but native host workflows are NOT RUN. Do not invent commands or assume another host's custom tools exist. If required tools are unavailable, identify the blocked stage; prepare local drafts only when requested and label them unaccepted.
|
||||||
|
|
||||||
|
For Antigravity, call MCP tools using the schemas attached to discovered tools. Do not read generated per-tool JSON files from the CLI's local MCP cache; they duplicate those schemas. Open one only after a concrete argument validation error. Do not inspect installer state or helper-script implementation during routine ingestion.
|
||||||
|
|
||||||
Knowledge changes go through typed MCP proposals. Local artifacts under `Drafts/` and `Runs/` support work but are not accepted knowledge. Only a service acceptance receipt establishes acceptance. Keep credentials and source bodies out of status summaries; do not claim a cloud-backed host keeps all content local.
|
Knowledge changes go through typed MCP proposals. Local artifacts under `Drafts/` and `Runs/` support work but are not accepted knowledge. Only a service acceptance receipt establishes acceptance. Keep credentials and source bodies out of status summaries; do not claim a cloud-backed host keeps all content local.
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# GEWU local research-agent pack
|
# GEWU local research-agent pack
|
||||||
|
|
||||||
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.
|
Version 0.20.6. Adds proposal grouping by semantic learning, guards against placeholder proposal probes, provides server-side canonical digest preparation, and stores compact run pins in the installation receipt. Includes explicit shared-scope requirements, agent-side duplicate checks, bounded citation reads and per-source budget checkpoints. Client-pilot findings now feed the checkpoint and citation protocols.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
@@ -21,7 +21,7 @@ The pack supports Claude through the [CLAUDE.md](CLAUDE.md) harness pointer. Whe
|
|||||||
|
|
||||||
1. **Instruction discovery:** Use the marked root routing block to load the canonical profile in `.agents/gewu/AGENTS.md`, its shared protocols, and applicable `kb-*` skills.
|
1. **Instruction discovery:** Use the marked root routing block to load the canonical profile in `.agents/gewu/AGENTS.md`, its shared protocols, and applicable `kb-*` skills.
|
||||||
2. **MCP integration:** Configure the host's project MCP entry for the authenticated Streamable HTTP endpoint, normally `<service-url>/mcp`. Native host setup is not yet qualified.
|
2. **MCP integration:** Configure the host's project MCP entry for the authenticated Streamable HTTP endpoint, normally `<service-url>/mcp`. Native host setup is not yet qualified.
|
||||||
3. **Execution model:** Compare discovered tools and schemas with `contracts/service-v1.json`, then use declared MCP operations such as `search`, `source_capture_url`, `source_capture_text`, `proposal_evaluate`, `proposal_submit` and `proposal_status`. There are no generic `query` or `propose` tools.
|
3. **Execution model:** Use MCP discovery for the current tool list and argument schemas, then call declared operations such as `search`, `source_capture_url`, `source_capture_text`, `proposal_prepare`, `proposal_evaluate`, `proposal_submit` and `proposal_status`. Consult the pinned contract only to diagnose a concrete missing-tool or schema mismatch. There are no generic `query` or `propose` tools.
|
||||||
|
|
||||||
## Setting up a project directory
|
## Setting up a project directory
|
||||||
|
|
||||||
|
|||||||
@@ -377,6 +377,14 @@
|
|||||||
"mcp"
|
"mcp"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"capability": "proposal:evaluate",
|
||||||
|
"mutates_knowledge": false,
|
||||||
|
"name": "proposal_prepare",
|
||||||
|
"transports": [
|
||||||
|
"mcp"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"capability": "proposal:evaluate",
|
"capability": "proposal:evaluate",
|
||||||
"mutates_knowledge": false,
|
"mutates_knowledge": false,
|
||||||
|
|||||||
@@ -0,0 +1,277 @@
|
|||||||
|
{
|
||||||
|
"$defs": {
|
||||||
|
"FacetLabelProposal": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"definition": {
|
||||||
|
"maxLength": 500,
|
||||||
|
"minLength": 1,
|
||||||
|
"title": "Definition",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"facet": {
|
||||||
|
"enum": [
|
||||||
|
"tags",
|
||||||
|
"audience",
|
||||||
|
"use_for",
|
||||||
|
"domain"
|
||||||
|
],
|
||||||
|
"title": "Facet",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"schema_version": {
|
||||||
|
"const": 1,
|
||||||
|
"default": 1,
|
||||||
|
"title": "Schema Version",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"value": {
|
||||||
|
"maxLength": 100,
|
||||||
|
"minLength": 1,
|
||||||
|
"title": "Value",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"facet",
|
||||||
|
"value",
|
||||||
|
"definition"
|
||||||
|
],
|
||||||
|
"title": "FacetLabelProposal",
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"Locator": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"block_id": {
|
||||||
|
"maxLength": 128,
|
||||||
|
"minLength": 1,
|
||||||
|
"pattern": "^[a-zA-Z0-9][a-zA-Z0-9._:-]*$",
|
||||||
|
"title": "Block Id",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"end": {
|
||||||
|
"exclusiveMinimum": 0,
|
||||||
|
"title": "End",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"kind": {
|
||||||
|
"enum": [
|
||||||
|
"text_span",
|
||||||
|
"pdf_page_span",
|
||||||
|
"transcript_timestamp_span"
|
||||||
|
],
|
||||||
|
"title": "Kind",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"page": {
|
||||||
|
"anyOf": [
|
||||||
|
{
|
||||||
|
"minimum": 1,
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "null"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default": null,
|
||||||
|
"title": "Page"
|
||||||
|
},
|
||||||
|
"schema_version": {
|
||||||
|
"const": 1,
|
||||||
|
"default": 1,
|
||||||
|
"title": "Schema Version",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"start": {
|
||||||
|
"minimum": 0,
|
||||||
|
"title": "Start",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"time_end_ms": {
|
||||||
|
"anyOf": [
|
||||||
|
{
|
||||||
|
"minimum": 0,
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "null"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default": null,
|
||||||
|
"title": "Time End Ms"
|
||||||
|
},
|
||||||
|
"time_start_ms": {
|
||||||
|
"anyOf": [
|
||||||
|
{
|
||||||
|
"minimum": 0,
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "null"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default": null,
|
||||||
|
"title": "Time Start Ms"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"kind",
|
||||||
|
"block_id",
|
||||||
|
"start",
|
||||||
|
"end"
|
||||||
|
],
|
||||||
|
"title": "Locator",
|
||||||
|
"type": "object"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"candidate_audience": {
|
||||||
|
"default": [],
|
||||||
|
"items": {
|
||||||
|
"maxLength": 100,
|
||||||
|
"minLength": 1,
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"maxItems": 3,
|
||||||
|
"title": "Candidate Audience",
|
||||||
|
"type": "array"
|
||||||
|
},
|
||||||
|
"candidate_domain": {
|
||||||
|
"default": [],
|
||||||
|
"items": {
|
||||||
|
"maxLength": 100,
|
||||||
|
"minLength": 1,
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"maxItems": 3,
|
||||||
|
"title": "Candidate Domain",
|
||||||
|
"type": "array"
|
||||||
|
},
|
||||||
|
"candidate_facet_labels": {
|
||||||
|
"default": [],
|
||||||
|
"items": {
|
||||||
|
"$ref": "#/$defs/FacetLabelProposal"
|
||||||
|
},
|
||||||
|
"maxItems": 14,
|
||||||
|
"title": "Candidate Facet Labels",
|
||||||
|
"type": "array"
|
||||||
|
},
|
||||||
|
"candidate_tags": {
|
||||||
|
"default": [],
|
||||||
|
"items": {
|
||||||
|
"maxLength": 100,
|
||||||
|
"minLength": 1,
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"maxItems": 5,
|
||||||
|
"title": "Candidate Tags",
|
||||||
|
"type": "array"
|
||||||
|
},
|
||||||
|
"candidate_use_for": {
|
||||||
|
"default": [],
|
||||||
|
"items": {
|
||||||
|
"maxLength": 100,
|
||||||
|
"minLength": 1,
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"maxItems": 3,
|
||||||
|
"title": "Candidate Use For",
|
||||||
|
"type": "array"
|
||||||
|
},
|
||||||
|
"excerpt": {
|
||||||
|
"maxLength": 4000,
|
||||||
|
"minLength": 1,
|
||||||
|
"title": "Excerpt",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"extraction_id": {
|
||||||
|
"pattern": "^[a-f0-9]{64}$",
|
||||||
|
"title": "Extraction Id",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"lens": {
|
||||||
|
"enum": [
|
||||||
|
"technical",
|
||||||
|
"conceptual",
|
||||||
|
"cultural-historical",
|
||||||
|
"financial-market"
|
||||||
|
],
|
||||||
|
"title": "Lens",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"locator": {
|
||||||
|
"$ref": "#/$defs/Locator"
|
||||||
|
},
|
||||||
|
"project_id": {
|
||||||
|
"maxLength": 128,
|
||||||
|
"minLength": 1,
|
||||||
|
"pattern": "^[a-zA-Z0-9][a-zA-Z0-9._:-]*$",
|
||||||
|
"title": "Project Id",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"relevance": {
|
||||||
|
"default": "borderline",
|
||||||
|
"enum": [
|
||||||
|
"borderline",
|
||||||
|
"low"
|
||||||
|
],
|
||||||
|
"title": "Relevance",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"relevance_rationale": {
|
||||||
|
"maxLength": 2000,
|
||||||
|
"minLength": 1,
|
||||||
|
"title": "Relevance Rationale",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"review_id": {
|
||||||
|
"maxLength": 128,
|
||||||
|
"minLength": 1,
|
||||||
|
"pattern": "^[a-zA-Z0-9][a-zA-Z0-9._:-]*$",
|
||||||
|
"title": "Review Id",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"run_id": {
|
||||||
|
"maxLength": 128,
|
||||||
|
"minLength": 1,
|
||||||
|
"pattern": "^[a-zA-Z0-9][a-zA-Z0-9._:-]*$",
|
||||||
|
"title": "Run Id",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"schema_version": {
|
||||||
|
"const": 1,
|
||||||
|
"default": 1,
|
||||||
|
"title": "Schema Version",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"source_revision_id": {
|
||||||
|
"maxLength": 128,
|
||||||
|
"minLength": 1,
|
||||||
|
"pattern": "^[a-zA-Z0-9][a-zA-Z0-9._:-]*$",
|
||||||
|
"title": "Source Revision Id",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"summary": {
|
||||||
|
"maxLength": 2000,
|
||||||
|
"minLength": 1,
|
||||||
|
"title": "Summary",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"review_id",
|
||||||
|
"project_id",
|
||||||
|
"run_id",
|
||||||
|
"source_revision_id",
|
||||||
|
"extraction_id",
|
||||||
|
"locator",
|
||||||
|
"excerpt",
|
||||||
|
"lens",
|
||||||
|
"summary",
|
||||||
|
"relevance_rationale"
|
||||||
|
],
|
||||||
|
"title": "IngestReviewCreate",
|
||||||
|
"type": "object"
|
||||||
|
}
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
{
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"decision": {
|
||||||
|
"enum": [
|
||||||
|
"include",
|
||||||
|
"exclude",
|
||||||
|
"defer"
|
||||||
|
],
|
||||||
|
"title": "Decision",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"decision_id": {
|
||||||
|
"maxLength": 128,
|
||||||
|
"minLength": 1,
|
||||||
|
"pattern": "^[a-zA-Z0-9][a-zA-Z0-9._:-]*$",
|
||||||
|
"title": "Decision Id",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"guidance_rule": {
|
||||||
|
"anyOf": [
|
||||||
|
{
|
||||||
|
"maxLength": 1000,
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "null"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default": null,
|
||||||
|
"title": "Guidance Rule"
|
||||||
|
},
|
||||||
|
"rationale": {
|
||||||
|
"maxLength": 2000,
|
||||||
|
"minLength": 1,
|
||||||
|
"title": "Rationale",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"review_id": {
|
||||||
|
"maxLength": 128,
|
||||||
|
"minLength": 1,
|
||||||
|
"pattern": "^[a-zA-Z0-9][a-zA-Z0-9._:-]*$",
|
||||||
|
"title": "Review Id",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"save_as_guidance": {
|
||||||
|
"default": false,
|
||||||
|
"title": "Save As Guidance",
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"schema_version": {
|
||||||
|
"const": 1,
|
||||||
|
"default": 1,
|
||||||
|
"title": "Schema Version",
|
||||||
|
"type": "integer"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"decision_id",
|
||||||
|
"review_id",
|
||||||
|
"decision",
|
||||||
|
"rationale"
|
||||||
|
],
|
||||||
|
"title": "IngestReviewDecision",
|
||||||
|
"type": "object"
|
||||||
|
}
|
||||||
@@ -0,0 +1,479 @@
|
|||||||
|
{
|
||||||
|
"$defs": {
|
||||||
|
"JevFacetOptionScore": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"label": {
|
||||||
|
"maxLength": 100,
|
||||||
|
"minLength": 1,
|
||||||
|
"title": "Label",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"label_id": {
|
||||||
|
"anyOf": [
|
||||||
|
{
|
||||||
|
"maxLength": 128,
|
||||||
|
"minLength": 1,
|
||||||
|
"pattern": "^[a-zA-Z0-9][a-zA-Z0-9._:-]*$",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "null"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default": null,
|
||||||
|
"title": "Label Id"
|
||||||
|
},
|
||||||
|
"probability": {
|
||||||
|
"maximum": 1,
|
||||||
|
"minimum": 0,
|
||||||
|
"title": "Probability",
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"schema_version": {
|
||||||
|
"const": 1,
|
||||||
|
"default": 1,
|
||||||
|
"title": "Schema Version",
|
||||||
|
"type": "integer"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"label",
|
||||||
|
"probability"
|
||||||
|
],
|
||||||
|
"title": "JevFacetOptionScore",
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"JevFacetResolution": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"added_to_project": {
|
||||||
|
"default": false,
|
||||||
|
"title": "Added To Project",
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"choice_confidence": {
|
||||||
|
"maximum": 1,
|
||||||
|
"minimum": 0,
|
||||||
|
"title": "Choice Confidence",
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"facet": {
|
||||||
|
"enum": [
|
||||||
|
"tags",
|
||||||
|
"audience",
|
||||||
|
"use_for",
|
||||||
|
"domain"
|
||||||
|
],
|
||||||
|
"title": "Facet",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"fit_probability": {
|
||||||
|
"maximum": 1,
|
||||||
|
"minimum": 0,
|
||||||
|
"title": "Fit Probability",
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"new_probability": {
|
||||||
|
"maximum": 1,
|
||||||
|
"minimum": 0,
|
||||||
|
"title": "New Probability",
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"option_probabilities": {
|
||||||
|
"default": [],
|
||||||
|
"items": {
|
||||||
|
"$ref": "#/$defs/JevFacetOptionScore"
|
||||||
|
},
|
||||||
|
"maxItems": 6,
|
||||||
|
"title": "Option Probabilities",
|
||||||
|
"type": "array"
|
||||||
|
},
|
||||||
|
"rank": {
|
||||||
|
"maximum": 20,
|
||||||
|
"minimum": 1,
|
||||||
|
"title": "Rank",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"schema_version": {
|
||||||
|
"const": 1,
|
||||||
|
"default": 1,
|
||||||
|
"title": "Schema Version",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"selected_label": {
|
||||||
|
"anyOf": [
|
||||||
|
{
|
||||||
|
"maxLength": 100,
|
||||||
|
"minLength": 1,
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "null"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default": null,
|
||||||
|
"title": "Selected Label"
|
||||||
|
},
|
||||||
|
"selected_label_id": {
|
||||||
|
"anyOf": [
|
||||||
|
{
|
||||||
|
"maxLength": 128,
|
||||||
|
"minLength": 1,
|
||||||
|
"pattern": "^[a-zA-Z0-9][a-zA-Z0-9._:-]*$",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "null"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default": null,
|
||||||
|
"title": "Selected Label Id"
|
||||||
|
},
|
||||||
|
"selected_new_label": {
|
||||||
|
"default": false,
|
||||||
|
"title": "Selected New Label",
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"value": {
|
||||||
|
"maxLength": 100,
|
||||||
|
"minLength": 1,
|
||||||
|
"title": "Value",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"facet",
|
||||||
|
"value",
|
||||||
|
"fit_probability",
|
||||||
|
"new_probability",
|
||||||
|
"choice_confidence",
|
||||||
|
"rank"
|
||||||
|
],
|
||||||
|
"title": "JevFacetResolution",
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"JevFacetScore": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"facet": {
|
||||||
|
"enum": [
|
||||||
|
"tags",
|
||||||
|
"audience",
|
||||||
|
"use_for",
|
||||||
|
"domain"
|
||||||
|
],
|
||||||
|
"title": "Facet",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"probability": {
|
||||||
|
"maximum": 1,
|
||||||
|
"minimum": 0,
|
||||||
|
"title": "Probability",
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"schema_version": {
|
||||||
|
"const": 1,
|
||||||
|
"default": 1,
|
||||||
|
"title": "Schema Version",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"value": {
|
||||||
|
"maxLength": 100,
|
||||||
|
"minLength": 1,
|
||||||
|
"title": "Value",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"facet",
|
||||||
|
"value",
|
||||||
|
"probability"
|
||||||
|
],
|
||||||
|
"title": "JevFacetScore",
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"Locator": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"block_id": {
|
||||||
|
"maxLength": 128,
|
||||||
|
"minLength": 1,
|
||||||
|
"pattern": "^[a-zA-Z0-9][a-zA-Z0-9._:-]*$",
|
||||||
|
"title": "Block Id",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"end": {
|
||||||
|
"exclusiveMinimum": 0,
|
||||||
|
"title": "End",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"kind": {
|
||||||
|
"enum": [
|
||||||
|
"text_span",
|
||||||
|
"pdf_page_span",
|
||||||
|
"transcript_timestamp_span"
|
||||||
|
],
|
||||||
|
"title": "Kind",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"page": {
|
||||||
|
"anyOf": [
|
||||||
|
{
|
||||||
|
"minimum": 1,
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "null"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default": null,
|
||||||
|
"title": "Page"
|
||||||
|
},
|
||||||
|
"schema_version": {
|
||||||
|
"const": 1,
|
||||||
|
"default": 1,
|
||||||
|
"title": "Schema Version",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"start": {
|
||||||
|
"minimum": 0,
|
||||||
|
"title": "Start",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"time_end_ms": {
|
||||||
|
"anyOf": [
|
||||||
|
{
|
||||||
|
"minimum": 0,
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "null"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default": null,
|
||||||
|
"title": "Time End Ms"
|
||||||
|
},
|
||||||
|
"time_start_ms": {
|
||||||
|
"anyOf": [
|
||||||
|
{
|
||||||
|
"minimum": 0,
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "null"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default": null,
|
||||||
|
"title": "Time Start Ms"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"kind",
|
||||||
|
"block_id",
|
||||||
|
"start",
|
||||||
|
"end"
|
||||||
|
],
|
||||||
|
"title": "Locator",
|
||||||
|
"type": "object"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"created_at": {
|
||||||
|
"format": "date-time",
|
||||||
|
"title": "Created At",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"excerpt": {
|
||||||
|
"maxLength": 4000,
|
||||||
|
"minLength": 1,
|
||||||
|
"title": "Excerpt",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"extraction_id": {
|
||||||
|
"pattern": "^[a-f0-9]{64}$",
|
||||||
|
"title": "Extraction Id",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"jev_facet_resolutions": {
|
||||||
|
"default": [],
|
||||||
|
"items": {
|
||||||
|
"$ref": "#/$defs/JevFacetResolution"
|
||||||
|
},
|
||||||
|
"maxItems": 20,
|
||||||
|
"title": "Jev Facet Resolutions",
|
||||||
|
"type": "array"
|
||||||
|
},
|
||||||
|
"jev_facet_scores": {
|
||||||
|
"default": [],
|
||||||
|
"items": {
|
||||||
|
"$ref": "#/$defs/JevFacetScore"
|
||||||
|
},
|
||||||
|
"maxItems": 20,
|
||||||
|
"title": "Jev Facet Scores",
|
||||||
|
"type": "array"
|
||||||
|
},
|
||||||
|
"jev_lens": {
|
||||||
|
"anyOf": [
|
||||||
|
{
|
||||||
|
"enum": [
|
||||||
|
"technical",
|
||||||
|
"conceptual",
|
||||||
|
"cultural-historical",
|
||||||
|
"financial-market"
|
||||||
|
],
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "null"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default": null,
|
||||||
|
"title": "Jev Lens"
|
||||||
|
},
|
||||||
|
"jev_lens_confidence": {
|
||||||
|
"anyOf": [
|
||||||
|
{
|
||||||
|
"maximum": 1,
|
||||||
|
"minimum": 0,
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "null"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default": null,
|
||||||
|
"title": "Jev Lens Confidence"
|
||||||
|
},
|
||||||
|
"jev_model": {
|
||||||
|
"anyOf": [
|
||||||
|
{
|
||||||
|
"maxLength": 100,
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "null"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default": null,
|
||||||
|
"title": "Jev Model"
|
||||||
|
},
|
||||||
|
"jev_relation_probability": {
|
||||||
|
"anyOf": [
|
||||||
|
{
|
||||||
|
"maximum": 1,
|
||||||
|
"minimum": 0,
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "null"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default": null,
|
||||||
|
"title": "Jev Relation Probability"
|
||||||
|
},
|
||||||
|
"lens": {
|
||||||
|
"enum": [
|
||||||
|
"technical",
|
||||||
|
"conceptual",
|
||||||
|
"cultural-historical",
|
||||||
|
"financial-market"
|
||||||
|
],
|
||||||
|
"title": "Lens",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"locator": {
|
||||||
|
"$ref": "#/$defs/Locator"
|
||||||
|
},
|
||||||
|
"project_id": {
|
||||||
|
"maxLength": 128,
|
||||||
|
"minLength": 1,
|
||||||
|
"pattern": "^[a-zA-Z0-9][a-zA-Z0-9._:-]*$",
|
||||||
|
"title": "Project Id",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"relevance": {
|
||||||
|
"default": "borderline",
|
||||||
|
"enum": [
|
||||||
|
"borderline",
|
||||||
|
"low"
|
||||||
|
],
|
||||||
|
"title": "Relevance",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"relevance_rationale": {
|
||||||
|
"maxLength": 2000,
|
||||||
|
"minLength": 1,
|
||||||
|
"title": "Relevance Rationale",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"review_id": {
|
||||||
|
"maxLength": 128,
|
||||||
|
"minLength": 1,
|
||||||
|
"pattern": "^[a-zA-Z0-9][a-zA-Z0-9._:-]*$",
|
||||||
|
"title": "Review Id",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"run_id": {
|
||||||
|
"maxLength": 128,
|
||||||
|
"minLength": 1,
|
||||||
|
"pattern": "^[a-zA-Z0-9][a-zA-Z0-9._:-]*$",
|
||||||
|
"title": "Run Id",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"schema_version": {
|
||||||
|
"const": 1,
|
||||||
|
"default": 1,
|
||||||
|
"title": "Schema Version",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"source_revision_id": {
|
||||||
|
"maxLength": 128,
|
||||||
|
"minLength": 1,
|
||||||
|
"pattern": "^[a-zA-Z0-9][a-zA-Z0-9._:-]*$",
|
||||||
|
"title": "Source Revision Id",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"status": {
|
||||||
|
"default": "needs-user-review",
|
||||||
|
"enum": [
|
||||||
|
"needs-user-review",
|
||||||
|
"included",
|
||||||
|
"excluded",
|
||||||
|
"deferred"
|
||||||
|
],
|
||||||
|
"title": "Status",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"submitted_by": {
|
||||||
|
"maxLength": 128,
|
||||||
|
"minLength": 1,
|
||||||
|
"pattern": "^[a-zA-Z0-9][a-zA-Z0-9._:-]*$",
|
||||||
|
"title": "Submitted By",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"summary": {
|
||||||
|
"maxLength": 2000,
|
||||||
|
"minLength": 1,
|
||||||
|
"title": "Summary",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"review_id",
|
||||||
|
"project_id",
|
||||||
|
"run_id",
|
||||||
|
"source_revision_id",
|
||||||
|
"extraction_id",
|
||||||
|
"locator",
|
||||||
|
"excerpt",
|
||||||
|
"lens",
|
||||||
|
"summary",
|
||||||
|
"relevance_rationale",
|
||||||
|
"submitted_by",
|
||||||
|
"created_at"
|
||||||
|
],
|
||||||
|
"title": "IngestReviewItem",
|
||||||
|
"type": "object"
|
||||||
|
}
|
||||||
@@ -1,5 +1,151 @@
|
|||||||
{
|
{
|
||||||
"$defs": {
|
"$defs": {
|
||||||
|
"ProjectFacetLabel": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"aliases": {
|
||||||
|
"default": [],
|
||||||
|
"items": {
|
||||||
|
"maxLength": 100,
|
||||||
|
"minLength": 1,
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"maxItems": 20,
|
||||||
|
"title": "Aliases",
|
||||||
|
"type": "array"
|
||||||
|
},
|
||||||
|
"canonical_label": {
|
||||||
|
"maxLength": 100,
|
||||||
|
"minLength": 1,
|
||||||
|
"title": "Canonical Label",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"created_at": {
|
||||||
|
"format": "date-time",
|
||||||
|
"title": "Created At",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"definition": {
|
||||||
|
"maxLength": 500,
|
||||||
|
"minLength": 1,
|
||||||
|
"title": "Definition",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"facet": {
|
||||||
|
"enum": [
|
||||||
|
"tags",
|
||||||
|
"audience",
|
||||||
|
"use_for",
|
||||||
|
"domain"
|
||||||
|
],
|
||||||
|
"title": "Facet",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"jev_fit_probability": {
|
||||||
|
"anyOf": [
|
||||||
|
{
|
||||||
|
"maximum": 1,
|
||||||
|
"minimum": 0,
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "null"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default": null,
|
||||||
|
"title": "Jev Fit Probability"
|
||||||
|
},
|
||||||
|
"jev_model": {
|
||||||
|
"anyOf": [
|
||||||
|
{
|
||||||
|
"maxLength": 100,
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "null"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default": null,
|
||||||
|
"title": "Jev Model"
|
||||||
|
},
|
||||||
|
"jev_new_probability": {
|
||||||
|
"anyOf": [
|
||||||
|
{
|
||||||
|
"maximum": 1,
|
||||||
|
"minimum": 0,
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "null"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default": null,
|
||||||
|
"title": "Jev New Probability"
|
||||||
|
},
|
||||||
|
"label_id": {
|
||||||
|
"maxLength": 128,
|
||||||
|
"minLength": 1,
|
||||||
|
"pattern": "^[a-zA-Z0-9][a-zA-Z0-9._:-]*$",
|
||||||
|
"title": "Label Id",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"merged_into": {
|
||||||
|
"anyOf": [
|
||||||
|
{
|
||||||
|
"maxLength": 128,
|
||||||
|
"minLength": 1,
|
||||||
|
"pattern": "^[a-zA-Z0-9][a-zA-Z0-9._:-]*$",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "null"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default": null,
|
||||||
|
"title": "Merged Into"
|
||||||
|
},
|
||||||
|
"origin_review_id": {
|
||||||
|
"anyOf": [
|
||||||
|
{
|
||||||
|
"maxLength": 128,
|
||||||
|
"minLength": 1,
|
||||||
|
"pattern": "^[a-zA-Z0-9][a-zA-Z0-9._:-]*$",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "null"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default": null,
|
||||||
|
"title": "Origin Review Id"
|
||||||
|
},
|
||||||
|
"schema_version": {
|
||||||
|
"const": 1,
|
||||||
|
"default": 1,
|
||||||
|
"title": "Schema Version",
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"status": {
|
||||||
|
"default": "active",
|
||||||
|
"enum": [
|
||||||
|
"active",
|
||||||
|
"merged",
|
||||||
|
"retired"
|
||||||
|
],
|
||||||
|
"title": "Status",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"label_id",
|
||||||
|
"facet",
|
||||||
|
"canonical_label",
|
||||||
|
"definition",
|
||||||
|
"created_at"
|
||||||
|
],
|
||||||
|
"title": "ProjectFacetLabel",
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
"ProjectStatus": {
|
"ProjectStatus": {
|
||||||
"enum": [
|
"enum": [
|
||||||
"active",
|
"active",
|
||||||
@@ -38,6 +184,15 @@
|
|||||||
"title": "Description",
|
"title": "Description",
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
|
"facet_labels": {
|
||||||
|
"default": [],
|
||||||
|
"items": {
|
||||||
|
"$ref": "#/$defs/ProjectFacetLabel"
|
||||||
|
},
|
||||||
|
"maxItems": 2000,
|
||||||
|
"title": "Facet Labels",
|
||||||
|
"type": "array"
|
||||||
|
},
|
||||||
"key_questions": {
|
"key_questions": {
|
||||||
"items": {
|
"items": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"api_version": "v1",
|
"api_version": "v1",
|
||||||
"catalog_sha256": "8c721bdb8b78e50606d4d479d716076f1f609ecb908fb32c10b7eaccc06eb04e",
|
"catalog_sha256": "872d3bf0647f9ec1a3f0e6d3d994fe03076b78bb7468cf3a24218d4b8ca8b075",
|
||||||
"contract_id": "gewu.service.v1",
|
"contract_id": "gewu.service.v1",
|
||||||
"contract_version": 1,
|
"contract_version": 1,
|
||||||
"operations": [
|
"operations": [
|
||||||
@@ -156,6 +156,14 @@
|
|||||||
"mcp"
|
"mcp"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"capability": "proposal:evaluate",
|
||||||
|
"mutates_knowledge": false,
|
||||||
|
"name": "proposal_prepare",
|
||||||
|
"transports": [
|
||||||
|
"mcp"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"capability": "proposal:evaluate",
|
"capability": "proposal:evaluate",
|
||||||
"mutates_knowledge": false,
|
"mutates_knowledge": false,
|
||||||
@@ -230,6 +238,18 @@
|
|||||||
"path": "schemas/ExtractionRecord.schema.json",
|
"path": "schemas/ExtractionRecord.schema.json",
|
||||||
"sha256": "5b7c6c8a46696736ef90fca1b1eac6d17dd9918ed12e9c212a776651b0c31937"
|
"sha256": "5b7c6c8a46696736ef90fca1b1eac6d17dd9918ed12e9c212a776651b0c31937"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"path": "schemas/IngestReviewCreate.schema.json",
|
||||||
|
"sha256": "0db108b90265d2089ce8df3d2734865a13f7abb1dfba85058b9bbec5fcac426d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "schemas/IngestReviewDecision.schema.json",
|
||||||
|
"sha256": "5f62ad3fd8035130cb5e31141eeef1f83acc55727246bc7bf82b43fca6697a9f"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "schemas/IngestReviewItem.schema.json",
|
||||||
|
"sha256": "5cf759227279a87552bc2f43d4545a68c00a8702afce87b2088bc6f276a85f27"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"path": "schemas/KnowledgeNode.schema.json",
|
"path": "schemas/KnowledgeNode.schema.json",
|
||||||
"sha256": "62efb24c24967c2339c1ba605fa498ffa54459b027b6236421f30f2c4f9437ce"
|
"sha256": "62efb24c24967c2339c1ba605fa498ffa54459b027b6236421f30f2c4f9437ce"
|
||||||
@@ -240,7 +260,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "schemas/ProjectRecord.schema.json",
|
"path": "schemas/ProjectRecord.schema.json",
|
||||||
"sha256": "f69f0987b556f3aa9aa71d310a890cb4a46de790360356b31aae572659c6f1eb"
|
"sha256": "bba7461c640c05734f668fd1568b6a80b2c9569e81c3efd289875aff46a168da"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "schemas/ProposalReceipt.schema.json",
|
"path": "schemas/ProposalReceipt.schema.json",
|
||||||
@@ -1150,7 +1170,7 @@
|
|||||||
"name": "source_extract"
|
"name": "source_extract"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"description": "Read a bounded normalized text slice and its source offset map.",
|
"description": "Read a bounded normalized text slice and optionally its original-source offset map.",
|
||||||
"input_schema": {
|
"input_schema": {
|
||||||
"properties": {
|
"properties": {
|
||||||
"block_id": {
|
"block_id": {
|
||||||
@@ -1161,6 +1181,11 @@
|
|||||||
"title": "Extraction Id",
|
"title": "Extraction Id",
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
|
"include_original_mapping": {
|
||||||
|
"default": false,
|
||||||
|
"title": "Include Original Mapping",
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
"length": {
|
"length": {
|
||||||
"title": "Length",
|
"title": "Length",
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
@@ -1203,6 +1228,23 @@
|
|||||||
},
|
},
|
||||||
"name": "proposal_submit"
|
"name": "proposal_submit"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"description": "Fill canonical evidence and payload digests without storing the proposal.",
|
||||||
|
"input_schema": {
|
||||||
|
"properties": {
|
||||||
|
"proposal_json": {
|
||||||
|
"title": "Proposal Json",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"proposal_json"
|
||||||
|
],
|
||||||
|
"title": "proposal_prepareArguments",
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"name": "proposal_prepare"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"description": "Evaluate one bounded proposal without storing or publishing it.",
|
"description": "Evaluate one bounded proposal without storing or publishing it.",
|
||||||
"input_schema": {
|
"input_schema": {
|
||||||
|
|||||||
+32
-32
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"pack_id": "gewu-research",
|
"pack_id": "gewu-research",
|
||||||
"pack_version": "0.16.0",
|
"pack_version": "0.20.6",
|
||||||
"manifest_version": "1.0.0",
|
"manifest_version": "1.0.0",
|
||||||
"status": "local-contract-and-checkpoint-bound-hosts-not-qualified",
|
"status": "local-contract-and-checkpoint-bound-hosts-not-qualified",
|
||||||
"execution": "existing-local-agent-host",
|
"execution": "existing-local-agent-host",
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
"contract_id": "gewu.service.v1",
|
"contract_id": "gewu.service.v1",
|
||||||
"contract_version": 1,
|
"contract_version": 1,
|
||||||
"path": "contracts/service-v1.json",
|
"path": "contracts/service-v1.json",
|
||||||
"sha256": "5e6eabc607788638c1e71bb8eb4a294d33cdd4c623e70d533e4e9f0c9b730bc1",
|
"sha256": "bd60a522baffb3ec2824676d550f17591c5d2faf9d028db4eb23252785cacd4d",
|
||||||
"scope": "Generated local MCP tool input schemas and v1 record schemas; native host workflows remain NOT RUN."
|
"scope": "Generated local MCP tool input schemas and v1 record schemas; native host workflows remain NOT RUN."
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -28,10 +28,10 @@
|
|||||||
"skills": [
|
"skills": [
|
||||||
{
|
{
|
||||||
"id": "kb-ingest",
|
"id": "kb-ingest",
|
||||||
"version": "0.2.0",
|
"version": "0.6.0",
|
||||||
"entry": "skills/kb-ingest/SKILL.md",
|
"entry": "skills/kb-ingest/SKILL.md",
|
||||||
"pipeline": "pipelines/ingest.md",
|
"pipeline": "pipelines/ingest.md",
|
||||||
"pipeline_version": "0.2.0"
|
"pipeline_version": "0.4.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "kb-query",
|
"id": "kb-query",
|
||||||
@@ -65,7 +65,7 @@
|
|||||||
"module_id": "profile",
|
"module_id": "profile",
|
||||||
"kind": "profile",
|
"kind": "profile",
|
||||||
"entry": "AGENTS.md",
|
"entry": "AGENTS.md",
|
||||||
"implementation_version": "0.2.0",
|
"implementation_version": "0.3.0",
|
||||||
"provided_contract": {
|
"provided_contract": {
|
||||||
"id": "gewu.profile.profile",
|
"id": "gewu.profile.profile",
|
||||||
"version": "0.1.0"
|
"version": "0.1.0"
|
||||||
@@ -73,8 +73,8 @@
|
|||||||
"requires_contracts": [
|
"requires_contracts": [
|
||||||
"gewu.protocol.evidence@0.1.0",
|
"gewu.protocol.evidence@0.1.0",
|
||||||
"gewu.protocol.scope@0.1.0",
|
"gewu.protocol.scope@0.1.0",
|
||||||
"gewu.protocol.contributions@0.2.0",
|
"gewu.protocol.contributions@0.4.0",
|
||||||
"gewu.skill.kb-ingest@0.2.0",
|
"gewu.skill.kb-ingest@0.6.0",
|
||||||
"gewu.skill.kb-query@0.1.0",
|
"gewu.skill.kb-query@0.1.0",
|
||||||
"gewu.skill.kb-curate@0.1.0",
|
"gewu.skill.kb-curate@0.1.0",
|
||||||
"gewu.skill.kb-synthesize@0.2.0"
|
"gewu.skill.kb-synthesize@0.2.0"
|
||||||
@@ -94,7 +94,7 @@
|
|||||||
"compatible_checkpoint_contracts": [
|
"compatible_checkpoint_contracts": [
|
||||||
"gewu.local-checkpoint@0.1.0"
|
"gewu.local-checkpoint@0.1.0"
|
||||||
],
|
],
|
||||||
"sha256": "b91fe559d5023e4fca71177f8bfe8d25eda067ed7db12692542237fabbe239a7",
|
"sha256": "ce5c36aa8d985ff7e889d1c58278d03ee0f3f199f3d8f8158b6cec79b49559a3",
|
||||||
"hash_encoding": "utf8-no-bom-lf"
|
"hash_encoding": "utf8-no-bom-lf"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -112,7 +112,7 @@
|
|||||||
"compatible_checkpoint_contracts": [
|
"compatible_checkpoint_contracts": [
|
||||||
"gewu.local-checkpoint@0.1.0"
|
"gewu.local-checkpoint@0.1.0"
|
||||||
],
|
],
|
||||||
"sha256": "4de60c95fddabd94223df0bad3cd2090b04d6e7a484488c8ea300a9e181246e6",
|
"sha256": "94fb3d58a9534ab3c4ee35ba890825a21a65438e7d7e911544764d28de8c3503",
|
||||||
"hash_encoding": "utf8-no-bom-lf"
|
"hash_encoding": "utf8-no-bom-lf"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -137,10 +137,10 @@
|
|||||||
"module_id": "contributions",
|
"module_id": "contributions",
|
||||||
"kind": "protocol",
|
"kind": "protocol",
|
||||||
"entry": "protocols/CONTRIBUTIONS.md",
|
"entry": "protocols/CONTRIBUTIONS.md",
|
||||||
"implementation_version": "0.4.0",
|
"implementation_version": "0.7.0",
|
||||||
"provided_contract": {
|
"provided_contract": {
|
||||||
"id": "gewu.protocol.contributions",
|
"id": "gewu.protocol.contributions",
|
||||||
"version": "0.2.0"
|
"version": "0.4.0"
|
||||||
},
|
},
|
||||||
"requires_contracts": [
|
"requires_contracts": [
|
||||||
"gewu.local-checkpoint@0.1.0"
|
"gewu.local-checkpoint@0.1.0"
|
||||||
@@ -159,23 +159,23 @@
|
|||||||
"compatible_checkpoint_contracts": [
|
"compatible_checkpoint_contracts": [
|
||||||
"gewu.local-checkpoint@0.1.0"
|
"gewu.local-checkpoint@0.1.0"
|
||||||
],
|
],
|
||||||
"sha256": "4c5b6169daf675866355265d598a0338b67fd9b819862031cd24d66753ea7b05",
|
"sha256": "e9fe2f910dc3a84bd34e03b7ef974852ed8f697d5f23d667654745ebef76ff89",
|
||||||
"hash_encoding": "utf8-no-bom-lf"
|
"hash_encoding": "utf8-no-bom-lf"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"module_id": "kb-ingest",
|
"module_id": "kb-ingest",
|
||||||
"kind": "skill",
|
"kind": "skill",
|
||||||
"entry": "skills/kb-ingest/SKILL.md",
|
"entry": "skills/kb-ingest/SKILL.md",
|
||||||
"implementation_version": "0.4.0",
|
"implementation_version": "0.11.0",
|
||||||
"provided_contract": {
|
"provided_contract": {
|
||||||
"id": "gewu.skill.kb-ingest",
|
"id": "gewu.skill.kb-ingest",
|
||||||
"version": "0.2.0"
|
"version": "0.6.0"
|
||||||
},
|
},
|
||||||
"requires_contracts": [
|
"requires_contracts": [
|
||||||
"gewu.protocol.evidence@0.1.0",
|
"gewu.protocol.evidence@0.1.0",
|
||||||
"gewu.protocol.scope@0.1.0",
|
"gewu.protocol.scope@0.1.0",
|
||||||
"gewu.protocol.contributions@0.2.0",
|
"gewu.protocol.contributions@0.4.0",
|
||||||
"gewu.pipeline.kb-ingest-pipeline@0.2.0"
|
"gewu.pipeline.kb-ingest-pipeline@0.5.0"
|
||||||
],
|
],
|
||||||
"required_service_capabilities": [
|
"required_service_capabilities": [
|
||||||
"proposal:evaluate",
|
"proposal:evaluate",
|
||||||
@@ -190,22 +190,22 @@
|
|||||||
"compatible_checkpoint_contracts": [
|
"compatible_checkpoint_contracts": [
|
||||||
"gewu.local-checkpoint@0.1.0"
|
"gewu.local-checkpoint@0.1.0"
|
||||||
],
|
],
|
||||||
"sha256": "3985cc41a7405ce9076f57229d63380cb18fb57c1c6b615a7014e717d6172eb6",
|
"sha256": "d09c3bdae82c7d17e4fa9b61e759284cf0cb533f03d29b1829893ad570568002",
|
||||||
"hash_encoding": "utf8-no-bom-lf"
|
"hash_encoding": "utf8-no-bom-lf"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"module_id": "kb-ingest-pipeline",
|
"module_id": "kb-ingest-pipeline",
|
||||||
"kind": "pipeline",
|
"kind": "pipeline",
|
||||||
"entry": "pipelines/ingest.md",
|
"entry": "pipelines/ingest.md",
|
||||||
"implementation_version": "0.3.0",
|
"implementation_version": "0.6.0",
|
||||||
"provided_contract": {
|
"provided_contract": {
|
||||||
"id": "gewu.pipeline.kb-ingest-pipeline",
|
"id": "gewu.pipeline.kb-ingest-pipeline",
|
||||||
"version": "0.2.0"
|
"version": "0.5.0"
|
||||||
},
|
},
|
||||||
"requires_contracts": [
|
"requires_contracts": [
|
||||||
"gewu.protocol.evidence@0.1.0",
|
"gewu.protocol.evidence@0.1.0",
|
||||||
"gewu.protocol.scope@0.1.0",
|
"gewu.protocol.scope@0.1.0",
|
||||||
"gewu.protocol.contributions@0.2.0"
|
"gewu.protocol.contributions@0.4.0"
|
||||||
],
|
],
|
||||||
"required_service_capabilities": [
|
"required_service_capabilities": [
|
||||||
"proposal:evaluate",
|
"proposal:evaluate",
|
||||||
@@ -220,7 +220,7 @@
|
|||||||
"compatible_checkpoint_contracts": [
|
"compatible_checkpoint_contracts": [
|
||||||
"gewu.local-checkpoint@0.1.0"
|
"gewu.local-checkpoint@0.1.0"
|
||||||
],
|
],
|
||||||
"sha256": "2942147e529b30a4ed92c9d17c5a9262328de31ec1cc584737c8b6eb9c103f71",
|
"sha256": "045bad113be7e1a6e8f7ea0646c5bd083ced299745abb2a099e574a5f41c5916",
|
||||||
"hash_encoding": "utf8-no-bom-lf"
|
"hash_encoding": "utf8-no-bom-lf"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -235,7 +235,7 @@
|
|||||||
"requires_contracts": [
|
"requires_contracts": [
|
||||||
"gewu.protocol.evidence@0.1.0",
|
"gewu.protocol.evidence@0.1.0",
|
||||||
"gewu.protocol.scope@0.1.0",
|
"gewu.protocol.scope@0.1.0",
|
||||||
"gewu.protocol.contributions@0.2.0",
|
"gewu.protocol.contributions@0.4.0",
|
||||||
"gewu.pipeline.kb-query-pipeline@0.1.0"
|
"gewu.pipeline.kb-query-pipeline@0.1.0"
|
||||||
],
|
],
|
||||||
"required_service_capabilities": [
|
"required_service_capabilities": [
|
||||||
@@ -260,7 +260,7 @@
|
|||||||
"requires_contracts": [
|
"requires_contracts": [
|
||||||
"gewu.protocol.evidence@0.1.0",
|
"gewu.protocol.evidence@0.1.0",
|
||||||
"gewu.protocol.scope@0.1.0",
|
"gewu.protocol.scope@0.1.0",
|
||||||
"gewu.protocol.contributions@0.2.0"
|
"gewu.protocol.contributions@0.4.0"
|
||||||
],
|
],
|
||||||
"required_service_capabilities": [
|
"required_service_capabilities": [
|
||||||
"knowledge:read"
|
"knowledge:read"
|
||||||
@@ -284,7 +284,7 @@
|
|||||||
"requires_contracts": [
|
"requires_contracts": [
|
||||||
"gewu.protocol.evidence@0.1.0",
|
"gewu.protocol.evidence@0.1.0",
|
||||||
"gewu.protocol.scope@0.1.0",
|
"gewu.protocol.scope@0.1.0",
|
||||||
"gewu.protocol.contributions@0.2.0",
|
"gewu.protocol.contributions@0.4.0",
|
||||||
"gewu.pipeline.kb-curate-pipeline@0.1.0"
|
"gewu.pipeline.kb-curate-pipeline@0.1.0"
|
||||||
],
|
],
|
||||||
"required_service_capabilities": [
|
"required_service_capabilities": [
|
||||||
@@ -315,7 +315,7 @@
|
|||||||
"requires_contracts": [
|
"requires_contracts": [
|
||||||
"gewu.protocol.evidence@0.1.0",
|
"gewu.protocol.evidence@0.1.0",
|
||||||
"gewu.protocol.scope@0.1.0",
|
"gewu.protocol.scope@0.1.0",
|
||||||
"gewu.protocol.contributions@0.2.0"
|
"gewu.protocol.contributions@0.4.0"
|
||||||
],
|
],
|
||||||
"required_service_capabilities": [
|
"required_service_capabilities": [
|
||||||
"knowledge:read",
|
"knowledge:read",
|
||||||
@@ -345,7 +345,7 @@
|
|||||||
"requires_contracts": [
|
"requires_contracts": [
|
||||||
"gewu.protocol.evidence@0.1.0",
|
"gewu.protocol.evidence@0.1.0",
|
||||||
"gewu.protocol.scope@0.1.0",
|
"gewu.protocol.scope@0.1.0",
|
||||||
"gewu.protocol.contributions@0.2.0",
|
"gewu.protocol.contributions@0.4.0",
|
||||||
"gewu.pipeline.kb-synthesize-pipeline@0.2.0"
|
"gewu.pipeline.kb-synthesize-pipeline@0.2.0"
|
||||||
],
|
],
|
||||||
"required_service_capabilities": [
|
"required_service_capabilities": [
|
||||||
@@ -370,7 +370,7 @@
|
|||||||
"requires_contracts": [
|
"requires_contracts": [
|
||||||
"gewu.protocol.evidence@0.1.0",
|
"gewu.protocol.evidence@0.1.0",
|
||||||
"gewu.protocol.scope@0.1.0",
|
"gewu.protocol.scope@0.1.0",
|
||||||
"gewu.protocol.contributions@0.2.0"
|
"gewu.protocol.contributions@0.4.0"
|
||||||
],
|
],
|
||||||
"required_service_capabilities": [
|
"required_service_capabilities": [
|
||||||
"knowledge:read"
|
"knowledge:read"
|
||||||
@@ -397,7 +397,7 @@
|
|||||||
"compatible_checkpoint_contracts": [
|
"compatible_checkpoint_contracts": [
|
||||||
"gewu.local-checkpoint@0.1.0"
|
"gewu.local-checkpoint@0.1.0"
|
||||||
],
|
],
|
||||||
"sha256": "5032436c257a203a36be6f093b7ae5db61a844060963ba25f855b0ef2af0f422",
|
"sha256": "ae6322408732b4883e84adb06b87126598f035d1fcaef66c7b48a8dd0e2a743d",
|
||||||
"hash_encoding": "utf8-no-bom-lf"
|
"hash_encoding": "utf8-no-bom-lf"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -435,7 +435,7 @@
|
|||||||
"compatible_checkpoint_contracts": [
|
"compatible_checkpoint_contracts": [
|
||||||
"gewu.local-checkpoint@0.1.0"
|
"gewu.local-checkpoint@0.1.0"
|
||||||
],
|
],
|
||||||
"sha256": "5e6eabc607788638c1e71bb8eb4a294d33cdd4c623e70d533e4e9f0c9b730bc1",
|
"sha256": "bd60a522baffb3ec2824676d550f17591c5d2faf9d028db4eb23252785cacd4d",
|
||||||
"hash_encoding": "utf8-no-bom-lf"
|
"hash_encoding": "utf8-no-bom-lf"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -453,7 +453,7 @@
|
|||||||
"compatible_checkpoint_contracts": [
|
"compatible_checkpoint_contracts": [
|
||||||
"gewu.local-checkpoint@0.1.0"
|
"gewu.local-checkpoint@0.1.0"
|
||||||
],
|
],
|
||||||
"sha256": "8c721bdb8b78e50606d4d479d716076f1f609ecb908fb32c10b7eaccc06eb04e",
|
"sha256": "872d3bf0647f9ec1a3f0e6d3d994fe03076b78bb7468cf3a24218d4b8ca8b075",
|
||||||
"hash_encoding": "utf8-no-bom-lf"
|
"hash_encoding": "utf8-no-bom-lf"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -509,13 +509,13 @@
|
|||||||
"compatible_checkpoint_contracts": [
|
"compatible_checkpoint_contracts": [
|
||||||
"gewu.local-checkpoint@0.1.0"
|
"gewu.local-checkpoint@0.1.0"
|
||||||
],
|
],
|
||||||
"sha256": "953d5c615f0954470bd2ee3a7a22fa40a2efecab8715bb6158d69d49a6a448ce",
|
"sha256": "fbc1d51e5c8f6ecd24db219ca149a38b7995c11d38923c58c2b7f46e0614a4f9",
|
||||||
"hash_encoding": "utf8-no-bom-lf"
|
"hash_encoding": "utf8-no-bom-lf"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"snapshot": {
|
"snapshot": {
|
||||||
"algorithm": "sha256",
|
"algorithm": "sha256",
|
||||||
"scope": "modules array serialized as UTF-8 JSON with sorted keys and compact separators",
|
"scope": "modules array serialized as UTF-8 JSON with sorted keys and compact separators",
|
||||||
"digest": "1f782aee6890de50e3928e7edc14eb2f959d8e0e05641cbd16d12b2edb3211d1"
|
"digest": "5e22d9688aa0d977eda0cb2fde8d5dc9687baf30c731940f36b4e30fc0fab7ab"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+5
-2
@@ -1,14 +1,17 @@
|
|||||||
# Ingestion pipeline
|
# Ingestion pipeline
|
||||||
|
|
||||||
Version 0.3.0. Host-executed procedure for `kb-ingest`; not a background scheduler. Follow the contribution protocol for budgets, checkpoints and retry identity.
|
Version 0.5.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 |
|
| Stage | Input | Output / checkpoint | Gate |
|
||||||
| --- | --- | --- | --- |
|
| --- | --- | --- | --- |
|
||||||
| 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. |
|
| 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. |
|
| 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. |
|
||||||
|
| Budget checkpoint | Current source stage and run budget | Per-source coverage checkpoint, remaining file/section plan and resume point | Process one source at a time. Use metadata to target relevant bounded slices; retain concise notes and exact evidence excerpts, not full source text. Checkpoint after each source. If quota or tool budget is near exhaustion, save the exact resume point and report remaining coverage without dropping a research lens. |
|
||||||
| 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. |
|
| 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. |
|
| Duplicate check | Candidate findings and explicit readable project/shared scope | Existing-node candidates, reuse/update decision, or explicit unresolved-review flag | Before creating a node, run multiple lexical searches over its title, distinctive terms and likely synonyms, then inspect plausible matches with `get_node`. Reuse the stable node ID and preserve supported content for a true update; do not create a second node when it represents the same concept. Keep materially distinct conditions as distinct records. The backend flags exact entity name/alias matches only and does not deduplicate other node types. |
|
||||||
|
| Extract | Included sections and immutable maps | Atomic proposal draft with field-level evidence | Read captured source text with bounded `source_extraction_block` calls, using exact extraction and block IDs; inspect relevant pages/sections even when the host cannot directly open a PDF. Use the normalized text and offsets returned by the service for exact quotes/locators. Record partial/unavailable coverage; upload or extraction alone is not analysis. |
|
||||||
| Assess | Assertion/evidence bindings | Support judgments, assessor/run and rationale | Unsupported/unavailable claims remain drafts. |
|
| Assess | Assertion/evidence bindings | Support judgments, assessor/run and rationale | Unsupported/unavailable claims remain drafts. |
|
||||||
|
| Proposal grouping | Assessed findings across captured sources | Small, coherent learning bundles with source dependencies | Treat documents as capture/provenance units and proposals as semantic learning units. Group by one project question or a tightly related set of findings, combining evidence across files when it supports the same learning. Do not create one proposal per file or one oversized proposal for the whole packet. Keep unrelated learnings separate so each can be evaluated, retried, reviewed and accepted independently. Include each new source candidate as `register_source` in the first proposal that cites it; after acceptance makes that revision readable, later proposals cite the accepted revision without registering it again. |
|
||||||
| 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. |
|
| 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. |
|
| Submit | Evaluated bounded bundle and stable proposal identity | `proposal_submit` outcome and eventual receipt | Every affected domain's policy applies; protected decisions remain external. |
|
||||||
| 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. |
|
| 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. |
|
||||||
|
|||||||
@@ -1,18 +1,42 @@
|
|||||||
# Contributions and run recovery
|
# Contributions and run recovery
|
||||||
|
|
||||||
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.
|
Before a connected workflow, call `diagnostics` and use MCP discovery to confirm the required tools and their advertised input schemas. The schemas discovered from the active server are authoritative for this session. Do not open `manifest.json`, `contracts/service-v1.json`, record schemas, the README or helper-script source just to verify tool availability, arguments or checkpoint behavior. If a required tool is absent or a discovered schema causes a concrete mismatch, stop before mutation and inspect only the relevant pinned contract entry; report the drift if that does not resolve it. 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. `proposal_evaluate` is the deterministic preflight for one complete, real proposal. Never probe it with a placeholder payload, zero digest or guessed identity; never call `proposal_status` with a fabricated proposal ID. 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.
|
||||||
|
|
||||||
|
## Build attributable proposals
|
||||||
|
|
||||||
|
Use the stable principal ID assigned to the configured agent credential. The credential must have the `agent` role and grants for every affected project. Set `ProposalRevision.proposer_id`, each proposed node's `agent_id`, and each claim assessment's `assessor_id` to that principal ID. Do not substitute a model name, harness name or human display name. Diagnostics intentionally omits principal IDs; obtain the expected ID from the credential's operator-provided configuration, never guess it. If the identity is unknown or the service rejects attribution, stop and report the mismatch rather than changing IDs speculatively.
|
||||||
|
|
||||||
|
## Register sources and bind evidence
|
||||||
|
|
||||||
|
Capture tools stage and archive source material but do not register its source record. Before evaluating a proposal that cites a newly captured source, include the exact returned `source_candidate` as a `register_source` operation in the same proposal, or confirm that the source revision was already accepted and is readable. Use the candidate's exact `revision_id` as each citation's `source_revision_id`, and the capture's returned `extraction_id`; do not synthesize or copy IDs from another capture. A source operation and a node operation may be evaluated together.
|
||||||
|
|
||||||
|
Every source registration affects both the shared-source policy and each project in `source.ingested_for`; therefore proposal scope must set `include_shared=true` and explicitly include the project(s), and the agent credential must be authorized for that scope. A project-only scope is invalid for a newly registered source even if it is relevant only to that project.
|
||||||
|
|
||||||
|
Before creating a new node, search the explicit project and shared scope with multiple lexical queries: the proposed title, distinctive terms, aliases and likely synonyms. Inspect plausible matches with `get_node`. If the finding belongs to an existing node, preserve its stable ID and supported content when proposing an evidence-backed update; do not create a second node for the same concept. Keep materially different populations, time periods, settings, mechanisms or conclusions distinct. Similarity is only a review cue. The backend flags exact entity name/alias matches but does not detect duplicate notes, cases, concepts or datapoints; if likely duplicates remain unresolved after search, submit a non-blocking review flag and do not create another node yet.
|
||||||
|
|
||||||
|
Finalize claim text, evidence and locators, then call the read-only `proposal_prepare` MCP tool with the complete draft proposal. It fills each claim's exact typed `assertion_path`, assertion digest, evidence digests and final payload digest, and returns prepared `proposal_json`. Use that JSON unchanged for `proposal_evaluate`; after any edit, call `proposal_prepare` again. It does not evaluate, store or submit the proposal. Do not run shell commands or manually hash proposal content. If `proposal_prepare` is unavailable, stop before evaluation and report that deterministic digest preparation is missing.
|
||||||
|
|
||||||
|
`proposal_prepare` applies the canonical GEWU digest rules: UTF-8 canonical JSON, Unicode preserved, sorted keys, no insignificant whitespace and no NaN values. It binds assertions to normalized exact claim text, hashes complete evidence objects and hashes the final typed operations. Its server result is authoritative for dependent digest fields.
|
||||||
|
|
||||||
|
The proposal envelope must include `schema_version`, `proposal_id`, `revision`, `initiating_project_id`, `scope`, `base_commit`, `payload_digest`, `proposer_id`, `run_id` and `operations`. `proposal_prepare` fills dependent digests; it does not invent the run, scope, principal, base revision or proposal metadata. Do not add unsupported envelope fields such as `created_at` or `reason`. For a PDF citation, use `locator.kind="pdf_page_span"` and the page from the extraction block; `text_span` is for non-PDF text and cannot include a page. Do not call `proposal_evaluate` unless `proposal_prepare` returns `status="prepared"`; evaluate only its returned `proposal_json` unchanged. If preparation returns `status="invalid"`, correct the named issue and retry once. Never probe preparation with `{}` or another incomplete draft.
|
||||||
|
|
||||||
|
A claim's `assessment` uses the GEWU fields `assessment_id`, `assertion_digest`, `evidence_digests`, `assessor_id`, `run_id`, `method`, `status` and `rationale`. Do not add guessed fields such as `support_level`, `confidence` or `assessed_at`; `proposal_prepare` reports typed validation issues but does not translate another schema.
|
||||||
|
|
||||||
`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.
|
`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.
|
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.
|
||||||
|
|
||||||
|
The `ingest_review_create` MCP tool takes one `review_json` string, not review fields as top-level tool arguments. Its request requires `review_id`, `project_id`, `run_id`, `source_revision_id`, `extraction_id`, `locator`, `excerpt`, `lens`, `summary` and `relevance_rationale`; use `candidate_facet_labels` for defined label candidates. The field is `relevance_rationale`, not `reason`. A call invokes advisory Jev relevance/lens and facet judgments when configured and returns any `jev_facet_resolutions`; it is not a prerequisite for ordinary proposal acceptance. Use this call when a label needs explicit Jev normalization or human categorization review, and treat its saved item as a non-blocking notification.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
Use read tools for retrieval and typed MCP proposals for contributions. Source upload completion establishes a staged artifact, not an accepted source. Treat policy acceptance and index visibility as separate outcomes. Corrections append revisions; accepted records are corrected through new linked proposals.
|
Use read tools for retrieval and typed MCP proposals for contributions. Source upload completion establishes a staged artifact, not an accepted source. Treat policy acceptance and index visibility as separate outcomes. Corrections append revisions; accepted records are corrected through new linked proposals.
|
||||||
|
|
||||||
Create the service run with `run_create` before capture or proposal submission. Persist returned run identity and operation input digests in the private local checkpoint, then append service checkpoints with `run_checkpoint`; `run_status` is authoritative after uncertain calls and returns the latest revision. Each update uses `expected_revision`; retry the same checkpoint unchanged after uncertainty. The local helper remains a private host-side recovery mirror and is useful when offline. Checkpoints include pack/skill/pipeline versions and hashes, explicit project/shared scope and lens, source/extraction references, stage, output hashes, included/excluded/skipped coverage, pending side effects and last receipt. The helper rejects credential/source-body fields and verifies pinned module hashes on resume. The pack does not provide a host scheduler.
|
Create the service run with `run_create` before capture or proposal submission. Persist returned run identity and operation input digests in the private local checkpoint, then append service checkpoints with `run_checkpoint`; `run_status` is authoritative after uncertain calls and returns the latest revision. Each update uses `expected_revision`; retry the same checkpoint unchanged after uncertainty. The local helper remains a private host-side recovery mirror and is useful when offline. Checkpoints include pack/skill/pipeline versions and hashes, explicit project/shared scope and lens, source/extraction references, stage, output hashes, included/excluded/skipped coverage, pending side effects and last receipt. The helper rejects credential/source-body fields and verifies pinned module hashes on resume. The pack does not provide a host scheduler.
|
||||||
|
|
||||||
Use the checkpoint contract in the [pack README](../README.md) and resolve the module registry in the manifest. Record its snapshot digest and every applicable module's contract ID/version and file hash, including the profile and shared protocols. Verify those hashes before resuming; a mismatch requires the original snapshot or an explicitly revalidated successor run.
|
Create the service run immediately after diagnostics, project context and explicit scope, before source transfer or proposal work. `run_create` takes `request_json`; supply a JSON object with `run_id`, `objective`, `scope`, `lens`, `pack_id`, `pack_version`, `pack_snapshot_digest` and `module_pins`. Use the compact `run_pins` object in `.agents/gewu-install.json` for the four pack fields; the installer writes the required `module_id`, `implementation_version` and `sha256` for every module there. Do not inspect the manifest, run schemas or helper implementation to reconstruct these values. If `run_pins` is absent, inspect only the manifest's pack identifiers, snapshot digest and module entries. Persist the returned run identity and operation input digests in the private local checkpoint after the service run exists, then append service checkpoints with `run_checkpoint`; `run_status` is authoritative after uncertain calls and returns the latest revision. Each update uses `expected_revision`; retry the same checkpoint unchanged after uncertainty. The `sources` field is an array of objects with `source_revision_id` and `status` (`selected`, `captured`, `extracted`, `unavailable` or `failed`); include `artifact_sha256` and `extraction_id` when known. Do not store source revision IDs as bare strings. Checkpoints include explicit project/shared scope and lens, stage, output hashes, included/excluded/skipped coverage, pending side effects and last receipt. The helper rejects credential/source-body fields and verifies pinned module hashes on resume. The pack does not provide a host scheduler.
|
||||||
|
|
||||||
|
Both `run_create` and `run_checkpoint` take one `request_json` string containing their complete request object. A checkpoint object must include `run_id` and the exact current `expected_revision` from `run_status`, plus `stage`; include source references as objects and a coverage object. Do not send checkpoint fields as top-level MCP arguments or omit the run identity/revision. Update local checkpoint files only through the host's approved file tools; if those tools are unavailable, the service checkpoint is authoritative and must still be recorded.
|
||||||
|
|
||||||
When upload completion is uncertain, call `source_upload_status` with the saved upload ID and resume only from its verified offsets. When proposal submission is uncertain, call `proposal_status` with the same proposal ID and revision. If accepted, reuse the returned receipt and do not resubmit. If evaluated but not accepted, inspect findings; if withdrawn, that proposal revision cannot be submitted. Never generate a fresh proposal ID to hide network uncertainty. Resume from preserved artifacts and service receipts; changed content requires a new proposal revision. Do not rerun a model and assume it reproduces the same output.
|
When upload completion is uncertain, call `source_upload_status` with the saved upload ID and resume only from its verified offsets. When proposal submission is uncertain, call `proposal_status` with the same proposal ID and revision. If accepted, reuse the returned receipt and do not resubmit. If evaluated but not accepted, inspect findings; if withdrawn, that proposal revision cannot be submitted. Never generate a fresh proposal ID to hide network uncertainty. Resume from preserved artifacts and service receipts; changed content requires a new proposal revision. Do not rerun a model and assume it reproduces the same output.
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
Read exact source revisions and immutable extraction maps supplied by the service. Bind each factual assertion or field to source/extraction IDs, location, quote and assertion digest under the published schema. For node claims, use the exact `claims[n].text`, `assumptions[n].text` or `limitations[n].text` assertion path that owns the statement; claim IDs must be unique across all three groups. A local extraction may help prepare a draft; it cannot impersonate the service's archived revision or locator map.
|
Read exact source revisions and immutable extraction maps supplied by the service. Bind each factual assertion or field to source/extraction IDs, location, quote and assertion digest under the published schema. For node claims, use the exact `claims[n].text`, `assumptions[n].text` or `limitations[n].text` assertion path that owns the statement; claim IDs must be unique across all three groups. A local extraction may help prepare a draft; it cannot impersonate the service's archived revision or locator map.
|
||||||
|
|
||||||
|
Capture does not register a source. For new captures, use the exact returned source candidate in a `register_source` proposal operation, or cite a source revision already accepted and readable in GEWU. Cite the capture's exact source revision and extraction IDs. Finish the assertion text and evidence set before computing bindings: evidence `assertion_digest` and assessment `assertion_digest` bind to the normalized exact claim text, while assessment `evidence_digests` bind to the complete final evidence objects. If text or evidence changes, recompute all dependent digests and the containing proposal payload digest as described in [the contribution protocol](CONTRIBUTIONS.md#register-sources-and-bind-evidence).
|
||||||
|
|
||||||
Record material assumptions and limitations as their own evidence-backed claim groups. Do not bury them in a summary or infer them from conditions on an edge. Each statement needs its own support assessment bound to its exact assertion and evidence, and it appears separately in the read interface. If the source does not establish a proposed assumption or limitation, keep it explicitly unsupported or omit it.
|
Record material assumptions and limitations as their own evidence-backed claim groups. Do not bury them in a summary or infer them from conditions on an edge. Each statement needs its own support assessment bound to its exact assertion and evidence, and it appears separately in the read interface. If the source does not establish a proposed assumption or limitation, keep it explicitly unsupported or omit it.
|
||||||
|
|
||||||
Quote occurrence, semantic support, source reliability, model confidence and freshness are different assessments. A matching quote does not establish that the number, unit, population or qualifiers support the assertion. Record support rationale and the actual assessor. Routine same-agent assessment is allowed when policy permits; do not describe it as independent human review.
|
Quote occurrence, semantic support, source reliability, model confidence and freshness are different assessments. A matching quote does not establish that the number, unit, population or qualifiers support the assertion. Record support rationale and the actual assessor. Routine same-agent assessment is allowed when policy permits; do not describe it as independent human review.
|
||||||
|
|||||||
+53
-2
@@ -42,13 +42,18 @@ def _safe_regular(path: Path) -> bool:
|
|||||||
|
|
||||||
|
|
||||||
def _validated_state(state: object) -> dict[str, Any]:
|
def _validated_state(state: object) -> dict[str, Any]:
|
||||||
if not isinstance(state, dict) or set(state) != {
|
base_keys = {
|
||||||
"format",
|
"format",
|
||||||
"mode",
|
"mode",
|
||||||
"pack_path",
|
"pack_path",
|
||||||
"files",
|
"files",
|
||||||
"routes",
|
"routes",
|
||||||
}:
|
}
|
||||||
|
if (
|
||||||
|
not isinstance(state, dict)
|
||||||
|
or not base_keys.issubset(state)
|
||||||
|
or set(state) - base_keys - {"run_pins"}
|
||||||
|
):
|
||||||
raise ValueError("unrecognized GEWU installation state")
|
raise ValueError("unrecognized GEWU installation state")
|
||||||
if (
|
if (
|
||||||
state.get("format") != "gewu-install-state@1"
|
state.get("format") != "gewu-install-state@1"
|
||||||
@@ -82,6 +87,38 @@ def _validated_state(state: object) -> dict[str, Any]:
|
|||||||
or not re.fullmatch(r"[a-f0-9]{64}", route["block_sha256"])
|
or not re.fullmatch(r"[a-f0-9]{64}", route["block_sha256"])
|
||||||
):
|
):
|
||||||
raise ValueError("GEWU installation routes are invalid")
|
raise ValueError("GEWU installation routes are invalid")
|
||||||
|
if "run_pins" in state:
|
||||||
|
pins = state["run_pins"]
|
||||||
|
if not isinstance(pins, dict) or set(pins) != {
|
||||||
|
"pack_id",
|
||||||
|
"pack_version",
|
||||||
|
"pack_snapshot_digest",
|
||||||
|
"module_pins",
|
||||||
|
}:
|
||||||
|
raise ValueError("GEWU run pins are invalid")
|
||||||
|
if (
|
||||||
|
not isinstance(pins.get("pack_id"), str)
|
||||||
|
or not pins["pack_id"]
|
||||||
|
or not isinstance(pins.get("pack_version"), str)
|
||||||
|
or not pins["pack_version"]
|
||||||
|
or not isinstance(pins.get("pack_snapshot_digest"), str)
|
||||||
|
or not re.fullmatch(r"[a-f0-9]{64}", pins["pack_snapshot_digest"])
|
||||||
|
or not isinstance(pins.get("module_pins"), list)
|
||||||
|
or not pins["module_pins"]
|
||||||
|
):
|
||||||
|
raise ValueError("GEWU run pins are invalid")
|
||||||
|
for module in pins["module_pins"]:
|
||||||
|
if (
|
||||||
|
not isinstance(module, dict)
|
||||||
|
or set(module) != {"module_id", "implementation_version", "sha256"}
|
||||||
|
or not isinstance(module.get("module_id"), str)
|
||||||
|
or not module["module_id"]
|
||||||
|
or not isinstance(module.get("implementation_version"), str)
|
||||||
|
or not module["implementation_version"]
|
||||||
|
or not isinstance(module.get("sha256"), str)
|
||||||
|
or not re.fullmatch(r"[a-f0-9]{64}", module["sha256"])
|
||||||
|
):
|
||||||
|
raise ValueError("GEWU run pins are invalid")
|
||||||
return state
|
return state
|
||||||
|
|
||||||
|
|
||||||
@@ -159,6 +196,7 @@ def install(workspace: Path, source: Path = PACK_ROOT, mode: str = "integrated")
|
|||||||
|
|
||||||
# Prepare all bytes and validate the destinations before mutating the workspace.
|
# Prepare all bytes and validate the destinations before mutating the workspace.
|
||||||
copied = {name: path.read_bytes() for name, path in source_files.items()}
|
copied = {name: path.read_bytes() for name, path in source_files.items()}
|
||||||
|
manifest = json.loads(copied["manifest.json"])
|
||||||
route_originals = {
|
route_originals = {
|
||||||
name: target.read_bytes() if target.exists() else None for name, target in targets.items()
|
name: target.read_bytes() if target.exists() else None for name, target in targets.items()
|
||||||
}
|
}
|
||||||
@@ -171,6 +209,19 @@ def install(workspace: Path, source: Path = PACK_ROOT, mode: str = "integrated")
|
|||||||
"mode": mode,
|
"mode": mode,
|
||||||
"pack_path": PACK_DIR.as_posix(),
|
"pack_path": PACK_DIR.as_posix(),
|
||||||
"files": {name: digest(content) for name, content in copied.items()},
|
"files": {name: digest(content) for name, content in copied.items()},
|
||||||
|
"run_pins": {
|
||||||
|
"pack_id": manifest["pack_id"],
|
||||||
|
"pack_version": manifest["pack_version"],
|
||||||
|
"pack_snapshot_digest": manifest["snapshot"]["digest"],
|
||||||
|
"module_pins": [
|
||||||
|
{
|
||||||
|
"module_id": module["module_id"],
|
||||||
|
"implementation_version": module["implementation_version"],
|
||||||
|
"sha256": module["sha256"],
|
||||||
|
}
|
||||||
|
for module in manifest["modules"]
|
||||||
|
],
|
||||||
|
},
|
||||||
"routes": {
|
"routes": {
|
||||||
name: {
|
name: {
|
||||||
"block_sha256": digest(route_blocks[name]),
|
"block_sha256": digest(route_blocks[name]),
|
||||||
|
|||||||
@@ -6,8 +6,26 @@ 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).
|
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 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.
|
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. Confirm required tools and arguments from MCP discovery and `diagnostics`; use the schema attached to each discovered tool. For Antigravity, do not open generated MCP cache JSON files or read future tool schemas in advance. Create the service run after diagnostics and project context; use `run_pins` from `.agents/gewu-install.json` as defined in CONTRIBUTIONS.md. If a required tool is absent or a call produces a concrete schema mismatch, inspect only that tool's pinned contract entry and report unresolved drift before mutation. 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. Add each new source's exact candidate as `register_source` in the proposal that cites it, or verify the source was already registered and readable. Use the candidate's `revision_id` and capture's `extraction_id`; never invent or substitute these IDs. 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 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. Include the same evidence-backed candidate `tags`, `audience`, `use_for` and `domain` labels you proposed for the associated knowledge, up to five per facet (20 total); reuse project vocabulary when suitable and omit uncertain candidates. If available, Jev assesses relevance, lens and each proposed facet label in one advisory call. Use these probabilities to focus human review; they are not a gate, evidence assessment, or instruction to silently rewrite accepted knowledge. 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.
|
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. When human relevance/categorization feedback or explicit Jev label normalization is needed, call `ingest_review_create` with a single `review_json` string, the complete `IngestReviewCreate` fields, and the exact extraction excerpt/locator. The required rationale field is `relevance_rationale`, not `reason`; include `review_id` and `extraction_id`. This persists a non-blocking notification and never blocks the evidence-backed proposal flow.
|
||||||
|
|
||||||
|
Before building each proposal, use the principal ID assigned to the configured agent credential for `proposer_id`, node `agent_id` and assessment `assessor_id`; do not use the model or harness name. If the operator has not provided that principal ID, stop before preparing or evaluating a proposal; diagnostics intentionally omits it. The proposal envelope requires `schema_version`, `proposal_id`, `revision`, `initiating_project_id`, `scope`, `base_commit`, `payload_digest`, `proposer_id`, `run_id` and `operations`. Use the current canonical revision from diagnostics as `base_commit`; do not add unsupported envelope fields. Finalize claim text, evidence and locators, then call `proposal_prepare` with the complete draft. It fills dependent digests but does not invent metadata or correct an invalid citation locator. For PDF evidence use `locator.kind="pdf_page_span"` with the extraction block's page; `text_span` cannot include a page. Proceed only when the tool returns `status="prepared"`, and pass its returned `proposal_json` unchanged to evaluation. If it returns `status="invalid"`, correct only the named issue and retry once. Do not probe it with an empty or incomplete proposal. If the tool is unavailable or rejects a corrected proposal, stop and report the concrete error.
|
||||||
|
|
||||||
|
Use the input schema advertised for each MCP tool. If a call rejects its arguments, inspect only that tool's advertised/pinned schema, correct the arguments and retry once; do not probe unrelated tools or read the entire schema directory. Do not test proposal tools with invented IDs, placeholder identities, zero digests or incomplete payloads. Evaluate only the complete proposal for this learning unit; use `proposal_status` only for its real proposal ID and revision.
|
||||||
|
|
||||||
|
For `tags`, `audience`, `use_for` and `domain`, inspect the `facet_labels` catalog returned by `get_project_context`. Reuse a canonical project label when its meaning fits; do not create spelling, phrasing or singular/plural variants. Propose only useful, evidence-backed labels, with at most five tags and three labels in each other facet (14 total). Prefer `candidate_facet_labels` entries shaped as `{facet, value, definition}` so a genuinely new concept has a concise, distinguishing definition (500 characters max). Legacy `candidate_tags`, `candidate_audience`, `candidate_use_for` and `candidate_domain` fields remain valid for labels that do not need a definition. Leave uncertain labels out. Jev compares agent-proposed candidates with the closest project labels and chooses an existing label or the `new_label` option; it does not invent the proposed label text. The backend may add only a distinct new candidate that Jev ranks in that facet's configured top N (tags: up to five; other facets: up to three) and that clears its fit, new-label and confidence thresholds. An existing-label match is reused rather than duplicated. For the associated proposal, use Jev's selected canonical existing label for that facet. Use a new candidate as a project vocabulary label only when `added_to_project` is true; otherwise omit it from the proposal facets and leave its evidence-backed finding intact. Treat returned `jev_facet_resolutions` as the recorded decision; never claim a label was added unless `added_to_project` is true. Label promotion requires the server's local embedding model and Jev configuration; without them the candidate remains only a review signal. Label decisions only normalize facets; they do not gate evidence assessment, proposal submission or acceptance.
|
||||||
|
|
||||||
|
If available, Jev also assesses relevance and lens in the same advisory call. Facet-label comparison runs through `ingest_review_create`; use the returned `jev_facet_resolutions` as the recorded decision, then put the selected canonical existing label on the associated proposal. Use a new label only when `added_to_project` is true. Use saved Jev scores to focus human review; they are not evidence assessment or an instruction to silently rewrite accepted knowledge. 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.
|
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.
|
||||||
|
|
||||||
|
Every `register_source` operation affects both the source's `ingested_for` project policy and the shared-source policy. Set proposal scope `include_shared=true` as well as the project scope, even when the source is relevant only to one project. Confirm the credential authorizes both. If shared scope or authorization is unavailable, stop and report the missing policy/capability; do not submit a project-only bundle that will fail scope validation.
|
||||||
|
|
||||||
|
For a captured source, use the returned extraction status and block metadata to plan review. Read source text through bounded `source_extraction_block` calls using the exact `extraction_id` and `block_id`; inspect relevant slices across all pages/sections, including PDFs that the host's file reader cannot open. Read a slice large enough to include a complete relevant sentence, then copy a concise contiguous quote exactly from its normalized text and use the returned offset. At most one adjacent slice should be needed to complete a citation; do not issue repeated offset probes to chase quote boundaries. If PDF layout splits a sentence across columns, use a shorter contiguous excerpt that still supports the assertion or report the citation limitation. The default response contains normalized text and its offset but omits the large original-source mapping; set `include_original_mapping=true` only when an original-text span is needed. Citation quote and locator offsets bind to the normalized extraction either way. Record partial or unavailable extraction coverage explicitly. Do not infer that a source was analyzed just because upload and extraction succeeded.
|
||||||
|
|
||||||
|
Before creating a new node, search the explicit project and shared scope using its proposed title plus distinctive terms, aliases and alternate phrasings. Search likely synonyms separately when title search is inconclusive, then inspect candidate nodes and claims with `get_node`. Search is lexical, so use more than one query. If a finding belongs to an existing node, preserve its stable `node_id` and existing supported content when proposing an evidence-backed update; do not mint another ID for the same concept. Keep separate nodes when populations, time periods, settings, mechanisms or conclusions materially differ. Similarity is a review cue, not proof of identity; if the distinction remains uncertain, create a non-blocking review flag and do not create a second node until resolved. The current backend only flags exact entity name/alias matches; it does not detect duplicate notes, cases, concepts or datapoints for you.
|
||||||
|
|
||||||
|
Manage context and provider budget across the whole packet. Process one source at a time, use extraction metadata to target relevant slices rather than fetching every character, and retain concise section notes plus exact evidence excerpts instead of full source text. Checkpoint coverage after each source. If the provider/tool budget is nearly exhausted, checkpoint the current file and report the remaining files/sections for continuation; do not reduce cost by dropping a research lens or deferring cultural-historical or financial-market material.
|
||||||
|
|
||||||
|
Treat documents as capture/provenance units and proposals as semantic learning units. Group a proposal around one project question or one tightly related set of findings, and combine evidence from multiple documents when it supports the same learning. Do not make one proposal per file or one oversized bundle for the entire packet. Keep unrelated learnings separate so each can be evaluated, retried, reviewed and accepted independently. Include each new source candidate in the first proposal that cites it; after its source revision is accepted and readable, later learning proposals cite that revision without registering it again.
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
import importlib.util
|
||||||
|
import json
|
||||||
|
import sys
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
||||||
|
PACK_ROOT = Path(__file__).resolve().parents[1]
|
||||||
|
INSTALL_PATH = PACK_ROOT / "scripts" / "install.py"
|
||||||
|
spec = importlib.util.spec_from_file_location("gewu_install", INSTALL_PATH)
|
||||||
|
assert spec and spec.loader
|
||||||
|
gewu_install = importlib.util.module_from_spec(spec)
|
||||||
|
sys.modules[spec.name] = gewu_install
|
||||||
|
spec.loader.exec_module(gewu_install)
|
||||||
|
|
||||||
|
|
||||||
|
def test_install_receipt_contains_service_run_pins(tmp_path: Path) -> None:
|
||||||
|
workspace = tmp_path / "project"
|
||||||
|
state = gewu_install.install(workspace, PACK_ROOT, "dedicated")
|
||||||
|
manifest = json.loads((PACK_ROOT / "manifest.json").read_text(encoding="utf-8"))
|
||||||
|
|
||||||
|
assert state["run_pins"] == {
|
||||||
|
"pack_id": manifest["pack_id"],
|
||||||
|
"pack_version": manifest["pack_version"],
|
||||||
|
"pack_snapshot_digest": manifest["snapshot"]["digest"],
|
||||||
|
"module_pins": [
|
||||||
|
{
|
||||||
|
"module_id": module["module_id"],
|
||||||
|
"implementation_version": module["implementation_version"],
|
||||||
|
"sha256": module["sha256"],
|
||||||
|
}
|
||||||
|
for module in manifest["modules"]
|
||||||
|
],
|
||||||
|
}
|
||||||
|
assert gewu_install._validated_state(state) == state
|
||||||
|
|
||||||
|
installed_state = json.loads(
|
||||||
|
(workspace / gewu_install.STATE_PATH).read_text(encoding="utf-8")
|
||||||
|
)
|
||||||
|
assert installed_state["run_pins"] == state["run_pins"]
|
||||||
|
gewu_install.uninstall(workspace)
|
||||||
|
|
||||||
|
|
||||||
|
def test_uninstall_accepts_legacy_install_receipt(tmp_path: Path) -> None:
|
||||||
|
workspace = tmp_path / "project"
|
||||||
|
state = gewu_install.install(workspace, PACK_ROOT, "dedicated")
|
||||||
|
state.pop("run_pins")
|
||||||
|
(workspace / gewu_install.STATE_PATH).write_text(
|
||||||
|
json.dumps(state), encoding="utf-8"
|
||||||
|
)
|
||||||
|
|
||||||
|
gewu_install.uninstall(workspace)
|
||||||
Reference in new issue
Block a user