Evidence Collection (ev-collection)
Phase 1 materializes and compiles the evidence lake. It is the foundation for star verification, adversarial audit, and link validation.
Type-First Evidence Lake Contract (#1148)
The evidence lake is type-first. The primary working set is evidence/by-type/<canonical-evidence-type>.md. Legacy evidence/tier_*.md files may still be emitted as coexistence artifacts, but they are not the semantic routing key.
Multi-Target Peer-Review Source Packets (#1418)
If one real peer-review source URL covers multiple named skills, materialize a temporary peer-review partition before compile instead of cloning intake rows or editing canonical evidence artifacts:
python evidence/scripts/peer_review_source_packets.py \
--manifest /path/to/manifest.json \
--by-type-dir /tmp/ev1418/by-type
This helper is peer-review-only, writes scratch peer-review.md, and emits one row per reviewed skill even when the same URL legitimately appears under each target. Reject strength/scoring fields anywhere in the packet (trustNumber, grade, class, tier, level, stars, rank). Do not commit scratch manifests or generated partitions without human approval.
What Phase 1 does
- Reads active source inputs, collector channels, and named-skill evidence rows.
- Normalizes evidence row types, including legacy aliases such as
repo → repo-own and github-stars → github-stars-own.
- Writes deterministic primary partitions under
evidence/by-type/.
- Compiles
evidence/unified_evidence_lake.md from by-type partitions.
- May emit
evidence/tier_*.md only for coexistence with older scripts.
Commands
python evidence/scripts/generate_source_dump.py \
--output-dir evidence \
--by-type-dir evidence/by-type
python evidence/scripts/compile_data_lake.py \
--sources evidence/by-type \
--lake evidence
For deterministic temp-dir validation or tests, add --skip-live-stars and --no-legacy-tiers to generate_source_dump.py. Do not commit generated lake artifacts unless a human gate explicitly approves them.
Pre-registry intake candidates (#1786)
A skill proposed by an intake isn't in registry/named/ yet, so the default Phase 1 read (registry markdown + gaia.json) never sees its rows — there was previously no way to run Phases 1-4 on exactly the rows an L4-approved intake is meant to gate. Feed a candidate manifest in alongside the registry:
python evidence/scripts/generate_source_dump.py \
--output-dir evidence \
--by-type-dir evidence/by-type \
--candidate-manifest /tmp/intake-candidates.json
Manifest shape — a JSON (or .jsonl) file, one of:
- an object with a
candidates / entries / rows list,
- a bare JSON array,
- JSONL records (one JSON object per line,
.jsonl extension).
Each entry is a skill-shaped dict, the same shape a named skill's own frontmatter carries:
{
"id": "contributor/candidate-skill",
"name": "Candidate Skill",
"contributor": "contributor",
"genericSkillRef": "generic-skill-id",
"evidence": [
{"type": "repo-own", "source": "https://github.com/contributor/tool", "date": "2026-09-01", "notes": "..."}
]
}
id is required; genericSkillRef is optional (only needed to inherit generic-level evidence rows). Candidate rows merge into the same by-type partitions, deduped and normalized identically to a registered skill's own evidence — they are visually indistinguishable in the output except by id. A candidate with no level field lands in the default tier bucket; that is cosmetic bucketing only and confers no rank.
To validate a candidate's URLs before or without a full Phase 1 run, evidence/scripts/validate_sources.py --manifest <path> accepts the identical manifest shape — see /ev-link-validation.
Canonical source URL by evidence type (#1787)
Each evidence type has one canonical URL shape; using the wrong shape breaks that type's scoring inputs or collides with same-source dedup unexpectedly. See docs/agents/curation-guidelines.md §5 for the full table (repo-own, github-stars-own, proxy-containment, verifier-attestation, benchmark-result, arxiv, peer-review, self-attestation, social-signal, npm-downloads, fusion-recipe). Note: same-source dedup is (type, url)-keyed — two rows collapse only when they share BOTH the same type AND the same canonical URL; a repo-own row and a github-stars-own row at the identical URL are different keys and both count independently.
Completion Criteria
evidence/by-type/<type>.md is current and is the primary downstream input.
evidence/unified_evidence_lake.md was compiled from by-type files, not stale tier files.
- Collector rows are not re-parsed by default when by-type files exist, avoiding duplicate ingestion from coexistence dual-writes.