From pkos
Internal skill — ingests producer-owned exchange artifacts from PKOS .exchange directories, converts them into canonical vault notes, and prepares summary projections for downstream systems.
npx claudepluginhub n0rvyn/indie-toolkit --plugin pkosThis skill uses the workspace's default tool permissions.
`ingest-exchange` is the PKOS-side bridge between producer plugins and the vault.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
Uses ctx7 CLI to fetch current library docs, manage AI coding skills (install/search/generate), and configure Context7 MCP for AI editors.
ingest-exchange is the PKOS-side bridge between producer plugins and the vault.
For product-lens, the producer writes structured artifacts under:
~/Obsidian/PKOS/.exchange/product-lens/
This skill:
It does not re-run the upstream analysis.
Reference script:
pkos/skills/ingest-exchange/scripts/ingest_exchange.py
Recommended dry-run:
python3 pkos/skills/ingest-exchange/scripts/ingest_exchange.py \
--source pkos/examples/exchange/product-lens/reprioritize/2026-04-12-repo-reprioritize-appa.md \
--vault-root /tmp/pkos-test \
--dry-run
Recommended sandbox write test:
python3 pkos/skills/ingest-exchange/scripts/ingest_exchange.py \
--source pkos/examples/exchange/product-lens/reprioritize/2026-04-12-repo-reprioritize-appa.md \
--vault-root /tmp/pkos-test
Recommended Notion payload dry-run:
python3 pkos/skills/ingest-exchange/scripts/ingest_exchange.py \
--source pkos/examples/exchange/product-lens/reprioritize/2026-04-12-repo-reprioritize-appa.md \
--vault-root /tmp/pkos-test \
--notion-dry-run
Parse from user input:
--producer NAME: filter to one producer such as product-lens--intent INTENT: filter to one exchange subdirectory--source PATH: ingest one explicit artifact path instead of scanning the exchange tree--dry-run: show placement decisions only--sync-notion: after note write, call the product-lens Notion sync script--notion-dry-run: after note write, print the Notion payload without calling the API--notion-database-id: override the configured Notion summary database idTrack ingestion state in:
~/Obsidian/PKOS/.state/exchange-ingest.yaml
Suggested shape:
artifacts:
"/absolute/path/to/artifact.md":
imported_at: "2026-04-12T10:00:00"
checksum: "..."
status: "imported"
note_type: "verdict"
note_path: "30-Projects/AppA/Verdicts/2026-04-12-AppA-verdict.md"
superseded_notes:
- "30-Projects/AppA/Verdicts/2026-04-01-AppA-verdict.md"
last_sync: "2026-04-12T10:00:00"
If the state file does not exist, initialize it with an empty artifacts map.
If --source PATH is provided:
Otherwise scan .exchange/ for producer directories.
For product-lens, expected subdirectories are:
portfolio-scanprogress-pulsereprioritizerecent-feature-reviewverdict-refreshSkip artifacts already recorded in exchange-ingest.yaml unless the checksum changed.
Use this repository sample when you need a concrete artifact shape during design or dry-run reasoning:
pkos/examples/exchange/product-lens/reprioritize/2026-04-12-repo-reprioritize-appa.md
Treat it as a reference sample only. Do not write imported state for repository examples unless the user explicitly asks for a simulated state entry.
For each artifact confirm:
type = product-lens-exchangeproducer = product-lensintent existsdecision existsIf validation fails:
Map producer intents to note types:
| Intent | Final Note Type |
|---|---|
portfolio_scan | signal |
project_progress_pulse | signal |
repo_reprioritize | verdict |
recent_feature_review | feature-review |
verdict_refresh | verdict |
PKOS owns final placement.
Recommended locations:
signal → ~/Obsidian/PKOS/30-Projects/{project}/Signals/verdict → ~/Obsidian/PKOS/30-Projects/{project}/Verdicts/feature-review → ~/Obsidian/PKOS/30-Projects/{project}/Feature Reviews/For portfolio-level artifacts that span many projects:
~/Obsidian/PKOS/30-Projects/_Portfolio/File naming rules:
signal → YYYY-MM-DD-{project}-signal.mdverdict → YYYY-MM-DD-{project}-verdict.mdfeature-review → YYYY-MM-DD-{project}-{feature-slug}-feature-review.mdProject identifier rules:
project if present after normalization_PortfolioAdd or normalize:
typesource = product-lenscreatedtagsrelatedstatusproducer_intentdecisionconfidenceexchange_source with the original artifact pathprojection_status = pending when notion_sync_requested = trueFrontmatter normalization should preserve the original created date from the artifact, not overwrite it with ingestion time.
Before writing a new canonical note, search the target project folder for older notes of the same type:
typeprojectproducer_intent when presentRules:
signal: do not supersede automatically; many signals may coexistverdict: mark older active notes as superseded when the new note answers the same project-level questionfeature-review: supersede only when the same feature slug is reviewed againWhen supersession happens:
replaces: links in the new noteexchange-ingest.yamlWrite final vault notes only after schema validation succeeds.
If --dry-run, print:
and stop before writing.
Dry-run output format:
PKOS Exchange Dry Run
Artifact: {source path}
Producer: {producer}
Intent: {intent}
Note type: {signal|verdict|feature-review}
Target: {vault path}
Supersedes: {none|list}
Projection: {pending|not-requested}
Update exchange-ingest.yaml.
If a downstream Notion summary sync is requested:
projection_status: pending--notion-dry-run is passed, print the generated Notion payload for inspection--sync-notion is passed, call sync_product_lens_notion.pyRequired state fields per artifact entry:
imported_atchecksumstatusnote_typenote_pathsuperseded_notesStatus values:
importedfailed_validationfailed_writeskipped_unchanged