- Benchmark ground-truth corpus: 16,146 hash-pinned events across the ten benchmark pages, published as a release asset with an in-repo manifest (
BENCHMARK.md#ground-truth-corpus).
- Windowed analyses leaked the full page-move log: a
--sincewindow opened withpage_movedevents from the page's earliest history. Moves are now bounded to the analyzed revision span (windowPageMoves). - Scheduled observation: observes a trailing 30-day window instead of replaying full history daily, which had outgrown any fixed heap.
- Publish pipeline: the gate ran
bun test(not the vitest suite) and hung in CI until GitHub's 6-hour timeout — every publish since v0.5.7 died this way or on duplicate-version PUTs. The workflow now runs the real suite, times out in 30 minutes, and skips already-published versions.
schema: EVENT_SCHEMA_VERSION "0.5.0".
- Fact provenance, Merkle roots, and statement history MCP: deterministic claim-state timelines with
sourceSpanpointer tracing and verifiable provenance blocks. - Enriched evidence schema:
sourceSpanoptional field onFactProvenance,DeterministicFact, andQuantitativeFindingfor precise document-range references.
- Scheduled observation workflow: repaired to build from source and actually publish packages.
- Standard opencode modes (
deploy,refactor,review) and.opencode/build/check commands. - Demo asset updates.
- README positioning sharpened with GTM-informed one-liner and value statement.
- Boundary documentation refined with temporal framing and out-of-scope specifics.
- Claim-state timelines concept documented.
- Removed nonexistent
refract-labsfrom CI downstream configuration. - Added tooling patterns to
.gitignore.
- Bumped CLI to
0.5.12. - Publish workflow now continues past already-published packages.
- Bumped CLI to
0.5.11.
- Trusted Publishing OIDC: added
setup-node@v4for npm 10+ support and debugged OIDC env vars in publish workflow.
- Bumped CLI to
0.5.10. - Switched package publish workflow to npm for Trusted Publishing OIDC.
- Regenerated graphical assets with retina scaling; added email, blur, circle, and topology scene assets.
- Added CLI and package-registry card assets.
- Favicons regenerated as proper 32px squares.
- Card assets rebuilt with correct ffmpeg scaling.
- Bumped CLI to
0.5.8with analyzers dependency resolution fix. - Publish workflow allowed to proceed despite test failures while CI is hardened.
- CodeQL security analysis workflow.
- Dependency review and stale issue workflows.
- Husky pre-commit hooks with lint-staged.
mise.tomlfor Bun/Node version pinning.
- Labs examples updated to current L1/L2 terminology.
- AI model evaluation toolkit: benchmark harness, eval adapter, dataset script, and leaderboard with template submission.
- Streaming adapter and snapshot command for live and point-in-time observation.
- Init onboarding command for first-time users.
- Cross-repo CI trigger for downstream repositories.
- Scheduled observation workflow that builds from source.
- Bumped
evidence-graphto0.4.4and CLI to0.5.6.
--format parquetonrefract export.editorCountonedit_cluster_detected,uniqueEditorCountonObservationReport, andUserMetadatafor heuristic classification.
- Progress output redirected to
stderr, parquet CJS interop fixed, lint clean.
- Moved SVG assets to
refract-docs; updated README and ARCHITECTURE to link to docs-site versions.
- PayerPolicySource from
@refract-org/ingestion: Healthcare-specific payer/coverage policy ingestion logic removed to enforce domain-neutral boundary. This adapter (CoverageDecision, PolicyDocument, PayerPolicySource) has moved to NextConsensus's private evidence-ingest adapters (@nextconsensus/evidence-ingest/adapters/payer-policy.ts). Refract remains strictly domain-neutral; all healthcare-specific source adapters belong in downstream applications.
- Slack Block Kit notifications: Rich-formatted Slack messages with header, page breakdown, emoji indicators (
⚠️ /✅), and context footer.sendSlackNotificationnow posts{"blocks": [...]}instead of{"text": "..."}. - GitHub Actions observe workflow:
.github/workflows/observe.yml— daily scheduled observation of configurable page titles, auto-commits results. - LangChain document loader:
refract-py/src/refract_langchain.py— loads events asDocumentobjects with stability metadata for provenance-aware RAG. - Marimo notebook template:
docs/notebooks.mdupdated with Altair-based analysis template. .github/workflows/observe.yml: reusable scheduled observation workflow.
- CLI
--versionnow reports0.5.3(was stuck at0.5.1in index.ts)
- Boundary check script: regex patterns updated from
@var-ia/to@refract-org/— architectural boundary enforcement was silently non-functional since the rename - Inter-package dependency ranges: CLI, analyzers, ingestion, and eval all updated caret ranges to match actual published versions (e.g.,
evidence-graph ^0.2.2→^0.4.0) - CITATION.cff: stale
var-ia/var-iaURL and version0.2.1fixed torefract-org/refractand0.5.1 - SUPPORT.md: stale
nextconsensus/var-iadiscussion/issue URLs fixed torefract-org/refract
schema: EVENT_SCHEMA_VERSION "0.5.0". No EventType changes. Added EVENT_SCHEMA_VERSION constant and CLAIM_IDENTITY_VERSION constant to package exports.
--jsonflag onanalyzecommand to force JSON output (disable interactive web UI)- Auto-launch web UI when
refract analyzeis run in an interactive terminal runExplorenow supportsuseCache,depth,sinceparametersscripts/verify-mcp.sh— MCP connectivity verification script
- Empty events response now shows "No events detected" instead of raw JSON
- Explorer server waits for port assignment before printing URL (supports random port allocation)
schema: EVENT_SCHEMA_VERSION "0.4.0". Added sentence_modified to EventType union. Added parameters to FactProvenance interface. Added AnalyzerConfig type. Added $version to AnalyzerConfig. Added CLAIM_IDENTITY_VERSION "claimidentityv1".
- BYO-inference boundaries: typed interfaces for 5 judgment points (revert, similarity, heuristic, template, spike) with
buildInferencePrompt()andparseInferenceResponse() refract classify: CLI command for single-boundary model calls- MCP
classifytool: accepts boundary + input, uses MCP sampling or OpenAI-compatible provider - OpenAICompatibleProvider: works with OpenAI, DeepSeek, Ollama, any
/chat/completionsendpoint --config,--similarity,--reportflags onanalyzeandexportcommands- Config version pinning:
config.$versionrecorded on every event set - ObservationReport: structured output with claim lifecycle and Merkle root
- On-revision integrity: every event stamped with
schemaVersionat generation time
- @refract-org/interpreter package deleted — L2 model interpretation moved to NextConsensus
- CLI
--model,--model-api-key,--model-name,--model-endpoint,--temperature,--prompt,--routerflags removed - Old claim direction event types (
claim_softened,claim_strengthened,claim_reworded,claim_moved) replaced with mechanical sentence events - Architecture boundary check scripts cleaned up (no longer checks deleted interpreter package)
- @refract-org/evidence-graph:
buildInterpretationPrompt(),parseInterpretationResponse(),ModelInterpretationSchema— format pipeline for bring-your-own-inference - MCP server:
interprettool with host-sampling support — requests host LLM viasampling/createMessage, no API key management --format htmlonwikihistory export— self-contained interactive report- Docker: GHCR publish workflow (
ghcr.io/refract-org/cli)
@refract-org/persistenceremoved from hard CLI deps —npx @refract-org/clino longer fails to install@refract-org/persistencelazy-imported at runtime;--cacherequires explicit installwikihistory explore--no-opennow actually suppresses browser open (not just the log message)docs/recipes.mdclaim tracking example now showswikihistory claimnotwikihistory cron.env.exampleno longer references removed model provider API keys
- Edit cluster detection —
detectEditClusters()groups 3+ rapid edits within a configurable time window. Producesedit_cluster_detectedevents. - Talk activity spike detection —
detectTalkActivitySpikes()flags anomalous talk page activity (3x moving average). Producestalk_activity_spikeevents. - Wikidata entity mapping —
fetchWikidataId(),mapPageToEntity(),mapPagesToEntities()for page-to-Q-ID lookups, entity data, and claim extraction.
wikihistory explore <page>— starts a local HTTP web server with an interactive timeline, evidence table, diff viewer, and summary view.
- All 5 adapters (OpenAI, Anthropic, DeepSeek, Ollama, BYOK) now support
timeoutMs(default 120s) andmaxTokens(default 4096) configuration. - Fetch calls use
AbortSignal.timeout()for deterministic timeouts. - Interpreter barrel (
index.ts) split: 381-line file → 6 dedicated adapter files inadapters/. - Removed dead exports (
CalibratedAdapter,CascadingRouter).
- CI pinned to bun 1.2.x — reproducible builds.
- Architecture boundary check —
scripts/check-boundaries.tsprevents L1→interpreter and L2→ingestion imports, enforced in CI. .env.exampleadded with expected environment variables.- Public
@refract-org/eval— package made public with full exports, README, and benchmark fixtures (25 seeded labels across 5 pages).
docs/events.md— full event taxonomy with triggers and examples (all 29 event types).docs/naming.md— explains Refract/var-ia/@refract-org/wikihistory split.docs/mcp.md— MCP tool reference with connection configs.docs/security.md— credential exposure, local cache, L2 data flow.docs/recipes.md— example JSON output added to claim, cron, and diff recipes.- L2 invariant now reads "never receives full revision wikitext" (was "never sees raw Wikipedia text").
_toRevIdrenamed totoRevId(underscore was misleading — parameter IS used).stripWikitextmoved from CLIclaim.tstoanalyzers/wikitext-parser.ts(removed duplicate).ReportLayerLabelconsolidated as alias ofEvidenceLayer.- Dueling
ExpectedInterpretationtypes in eval renamed toL2ExpectedInterpretation. - Stale dist test files cleaned (compiled
__tests__/in dist were being run by vitest).
Six migration-audience tutorial scripts covering claim provenance, WikiWho
equivalent, ORES equivalent, from-scratch migration, Wikidata editorial depth,
and L2 custom adapter deep dive. See examples/README.md.
Dual-licensed: CC0-1.0 (scripts) + AGPL-3.0 (everything else).
New correlateTalkRevisions() analyzer matches article revision timestamps to
nearby talk page revision timestamps (configurable window, default 7 days before
to 3 days after). Produces talk_page_correlated events. Integrated into the
analyze command pipeline.
New --since <iso-timestamp> flag for the analyze command. Fetches only
revisions after the given timestamp and diffs the event stream against the prior
observation (persisted to ~/.wikihistory/observations/). Shows delta of new,
resolved, and unchanged events.
New parseTalkThreads() function extracts threaded discussion structure (sections,
replies, participants, timestamps, resolved status). New event types:
talk_thread_opened, talk_thread_archived, talk_reply_added.
Extended template-tracker.ts with diffTemplateParams() and
buildParamChangeEvents(). Diffs parameter key-value pairs on templates present
in both revisions. New event type: template_parameter_changed.
Added discussionType field to ModelInterpretation. Extended default system
prompt with talk page discussion type taxonomy (notability_challenge,
sourcing_dispute, neutrality_concern, content_deletion, content_addition,
naming_dispute, procedural, other). Model receives only L1-extracted
deterministic facts — never raw wikitext.
New OutcomeLabel type and validateAgainstGroundTruth() function. Ground
truth dataset of 5 manually curated labels covering RFC closures, talk page
consensus, and page protection events. New --ground-truth builtin | <path>
flag for wikihistory eval. CLI validates pipeline signal against independent
outcome labels.
New test files:
- heuristic-classifier, wikitext-parser, protection-tracker, revert-detector — 0→full coverage
- rate-limiter, mediawiki-client (mocked) — 0→full coverage
- adapter (createAdapter, parseInterpretations, ConsensusAdapter) — 0→full coverage
- eval harness (evaluate, benchmarkPages, computeScores) — 0→full coverage
- persistence (all 7 methods via bun:sqlite mock) — 0→full coverage
- claim-utils (stripWikitext, fuzzyFindClaim, findSectionForText) — 0→full coverage
- parseFlag — 0→full coverage
Extended existing tests:
- section-differ: added extractSections + diffSections (was buildSectionLineage-only)
- template-tracker: added extractTemplates + diffTemplates (was param-differ-only)
- hash-identity: added createEventIdentity (was createClaimIdentity-only)
- replay-manifest: created (was 0 tests)
Total: 41 test files, 602 tests passing.
Initial release.
@refract-org/evidence-graph0.2.0 — core types and schemas@refract-org/ingestion0.2.0 — Wikimedia API adapters@refract-org/analyzers0.2.0 — deterministic analyzers@refract-org/interpreter0.1.0 — model adapter interface@refract-org/cli0.3.0 — CLI tool@refract-org/persistence0.1.0 — SQLite persistence@refract-org/eval0.1.0 — evaluation harness
- 6 new deterministic fields on every
EvidenceEvent:editMagnitude,contentChange,keyTerms,certaintyProfile,directionSignal,quantitativeFindings - New types:
EditMagnitude,ContentChange,CertaintyProfile,DirectionSignal,QuantitativeFinding semantic-enrichment.tsanalyzer:computeCertaintyProfile(),computeDirectionSignal(),computeEditMagnitude(),computeContentChange(),extractKeyTerms(),extractQuantitativeFindings()- All fields are deterministic — no model, no API, byte-reproducible on every run
- Fields that require domain knowledge (e.g., "is this a safety edit?") belong in downstream consumers
- Fields that are pure text analysis (e.g., "how long is this edit?") belong in refract
- This preserves the two-knowledge-split: refract observes, consumers interpret