kbforge
Agent-first knowledge bases, forged from your systems of record.
The Open Knowledge Format
(OKF) v0.1 standardizes the artifact at rest — markdown concept files, frontmatter,
index.md, log.md. It says nothing about how those bundles get produced: how you
pull from a wiki or a CMDB, how you tell a real change from an export timestamp jittering,
how a claim stays traceable to its source, and how an update reaches main without a human
losing an afternoon to review.
kbforge is the missing half — the production protocol.
| Layer | Standardized by |
|---|---|
| Artifact format | OKF v0.1 |
| Production protocol — connectors, canonicalization, diff, provenance, publish | kbforge |
| Serving protocol | MCP |
"Agent-first" is a checkable claim, not a downstream hope. kbforge stays a producer — the agent connects over MCP, which kbforge doesn't own — but every publish is gated on four agent-facing artifact laws (facet well-formedness, link resolvability, anchor presence, freshness legibility), plus a projection↔files coherence check so nothing ships unvalidated. That gate is what puts the frontmatter, links, and provenance an agent's serving layer needs into the artifact. What each law enforces at full versus reduced strength (and the paths to full strength) is spelled out honestly in architecture.md §4.4 and the artifact-contract spec §5.1.
Status
Alpha — a working walking skeleton. The deterministic core runs end to end with no
credentials: two built-in connectors (local_files, git_commits), canonicalization
with a stability law, a replay-safe mirror and diff, the §4.4 validator gate, and a
dry-run publisher, plus change detection, the no-op rule, and incremental sync via a
real cursor, all exercised by the test suite. Two credentialed publishers, GitHub and
GitLab, are also available (opt-in via --publisher, token from an env var). Synthesis ships in
two forms: a deterministic stub (the default, no LLM) and an opt-in grounded LLM
synthesizer (--synthesizer llm, via the kbforge[llm] extra).
Not built yet: a credentialed system-of-record connector. See
docs/architecture.md for the full map.
Quickstart
pip install kbforge
kbforge list # show available connectors
kbforge run \
--connector local_files \
--set path=./docs \
--mirror .kbforge/mirror --out .kbforge/out --state .kbforge/state
Re-running with no source change is a no-op — no merge request is opened. Point
--connector git_commits --set repo=. at a git repository to sync commit history
incrementally instead. Config values are YAML-typed, so --set max_commits=50 is an
integer and --set 'ignore_globs=[drafts]' is a list.
To synthesize real prose instead of the deterministic stub, install the LLM extra and select the synthesizer (config values are YAML-typed; the API key comes from an env var, never the CLI):
pip install "kbforge[llm]"
export OPENROUTER_API_KEY=... # or point --llm-set api_base=... at a gateway
kbforge run --connector local_files --set path=./docs \
--synthesizer llm --llm-set model=deepseek/deepseek-v4-flash \
--mirror .kbforge/mirror --out .kbforge/out --state .kbforge/state
The synthesizer reaches models through a LiteLLM provider, so OpenRouter and a self-hosted LiteLLM gateway share one config path.
Publishing to GitHub or GitLab
The default publisher writes the proposal to a local directory. To open a real pull request or merge request instead, select a forge publisher and give it a repo. The token comes from an env var, never the CLI:
export GITHUB_TOKEN=... # or GITLAB_TOKEN
kbforge run --connector local_files --set path=./docs \
--publisher github --publish-set repo=acme/knowledge-base \
--mirror .kbforge/mirror --out .kbforge/out --state .kbforge/state
Both publishers accept the same config: repo (required), base (default: the
repo's default branch), base_path (a subdirectory, default: repo root),
branch (default: sync/<system>), title, api_base (point it at GitHub
Enterprise or a self-managed GitLab), and token_env.
kbforge maintains one long-lived sync branch and one open review request per source system: a later run force-updates that branch and edits the existing PR/MR rather than opening a second one. Two consequences worth knowing:
- Manual commits pushed onto the sync branch are discarded by the next run.
- Concepts deleted from the source are not deleted from the target repo; files absent from a run are inherited from the base branch.
kbforge never merges. No publisher has a merge method.
Design stance
The core ships zero credentialed connectors and zero CI logic. The two built-in
connectors need no credentials and serve as references; real systems of record are
plugins, discovered through the kbforge.connectors (and kbforge.publishers)
entry-point group without editing kbforge — deployments are separate, private
repositories. The interface is the product.
# in a third-party package's pyproject.toml — discovered automatically once installed
[project.entry-points."kbforge.connectors"]
myservice = "my_package:connector"
A complete worked example — a credentialed GitHub Issues connector (~160 lines) with
token auth, pagination, and a real incremental cursor — is in
examples/github-issues-connector/.
The pipeline order — fetch → normalize → mirror → diff → scope → synthesize → validate → publish — is deliberately not pluggable, and neither are the no-op rule or the never-auto-merge rule. Those are the trust guarantees; making them pluggable would make them optional. Plugins extend stages. They cannot reorder or remove them.
Documentation
docs/architecture.md— package architecture, the Pluggy hookspecs, the connector protocol and its canonicalization laws, the fixed pipeline, and the conformance test kit.docs/context/knowledge-base-design.md— the system kbforge was extracted from: an OKF knowledge base for application managers served over MCP, including the security model and a literature review.docs/design/2026-07-18-agent-facing-artifact-contract-design.md— why the artifact contract exists and how the four emit-side laws are enforced.docs/design/2026-07-19-agentic-ingest-design.md— the roadmap for agentic fetch, the refresh model, and KB bootstrap.docs/design/2026-07-18-datacontract-bridge-design.md— how kbforge bridges toagentic-data-contractsvia the OKF bundle (future, cross-project).CHANGELOG.md— release history.
Related projects
kbforge is one of three contracts for agents, split by seam:
- ai-agent-contracts — the formal spine: resource, temporal, and lifecycle contracts (the seven-tuple kbforge maps onto).
- agentic-data-contracts — the consumption half for structured data: domain-driven governance enforced at query time. kbforge is the production half for unstructured knowledge; both independently converged on making freshness legible to the agent.
Development
uv sync --all-extras --dev # create the venv and install
prek install # ruff + ty on every commit
uv run pytest
The default suite never touches the network. Tests that call a real external
service are marked live and skipped unless you pass --run-live.
The forge publishers have a live suite because their offline tests can only
assert what we meant to send — a real forge is the only thing that can say
the intent was right. It needs a throwaway repo on each forge and the two CLIs
(gh, glab) authenticated; each run writes under a fresh live/<run-id>/
prefix, so nothing accumulates and no repo is ever deleted.
GITHUB_TOKEN=$(gh auth token) \
GITLAB_TOKEN=$(glab config get token --host gitlab.com) \
KBFORGE_LIVE_GITHUB_REPO=you/kbforge-live-test \
KBFORGE_LIVE_GITLAB_REPO=you/kbforge-live-test \
uv run pytest tests/test_forge_live.py --run-live
License
MIT
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file kbforge-0.3.0.tar.gz.
File metadata
- Download URL: kbforge-0.3.0.tar.gz
- Upload date:
- Size: 169.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2b2c9d9a74ab544d49ec420f27f48c9db4cdbecf62d12e6b4cdf7db6a45461a5
|
|
| MD5 |
19a92232f9a56173db300d6f07ac054a
|
|
| BLAKE2b-256 |
510a66fda127d40b753b592a857da3c45d7adc2ea733bd43f9f4b454fefe268e
|
Provenance
The following attestation bundles were made for kbforge-0.3.0.tar.gz:
Publisher:
ci.yml on flyersworder/kbforge
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
kbforge-0.3.0.tar.gz -
Subject digest:
2b2c9d9a74ab544d49ec420f27f48c9db4cdbecf62d12e6b4cdf7db6a45461a5 - Sigstore transparency entry: 2245180461
- Sigstore integration time:
-
Permalink:
flyersworder/kbforge@6aa7d4311e74202c99c3217fc883503f376b8f79 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/flyersworder
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@6aa7d4311e74202c99c3217fc883503f376b8f79 -
Trigger Event:
release
-
Statement type:
File details
Details for the file kbforge-0.3.0-py3-none-any.whl.
File metadata
- Download URL: kbforge-0.3.0-py3-none-any.whl
- Upload date:
- Size: 40.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
98937a61f0e449042bb7cf108c1ddc96e70ef13f2626dd883c056d66b98bcbd4
|
|
| MD5 |
7bb359fbb4d5554c44c7c60bac3084ca
|
|
| BLAKE2b-256 |
1f797c5bd2b39ca06e2f0b649cd90c6ca3a84ec6f2bad4fee399fc9979d33e67
|
Provenance
The following attestation bundles were made for kbforge-0.3.0-py3-none-any.whl:
Publisher:
ci.yml on flyersworder/kbforge
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
kbforge-0.3.0-py3-none-any.whl -
Subject digest:
98937a61f0e449042bb7cf108c1ddc96e70ef13f2626dd883c056d66b98bcbd4 - Sigstore transparency entry: 2245181033
- Sigstore integration time:
-
Permalink:
flyersworder/kbforge@6aa7d4311e74202c99c3217fc883503f376b8f79 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/flyersworder
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@6aa7d4311e74202c99c3217fc883503f376b8f79 -
Trigger Event:
release
-
Statement type: