OpenFief Give your AI agents a fief, not the kingdom.

Status

Every decision with the requirements derived from it, whether code implements them, and whether tests verify them.

Generated on every build from DESIGN.md and kibi’s coverage of its requirements. A requirement counts as built when a kibi symbol implements it, and as tested when a test is linked to it. kibi’s requirements report shows each requirement with its evidence.

45%12%33%10%Decisions by statusBuilt and tested [27]Partly built [7]Not built [20]No requirement in kibi [6]
45%12%33%10%Decisions by statusBuilt and tested [27]Partly built [7]Not built [20]No requirement in kibi [6]

2. Scope#

DecisionSummaryRequirementsBuiltTestedStatus
D-1The first iteration is M0 only: tracker and Polish imports, with no AI models and no agents.000No requirement in kibi
D-31M0 has no time-box.000No requirement in kibi
D-5The core is licensed AGPL-3.0, the plugin contracts and SDK Apache-2.0, and contributions carry a DCO sign-off.000No requirement in kibi

3.1 System of record and views#

DecisionSummaryRequirementsBuiltTestedStatus
D-2OpenFief’s own core is the system of record for transactions, tax lots and valuations.201Not built
D-3M0 ships two view plugins: a very simple built-in UI as the default, and Ghostfolio auto-push.200Not built
D-4The Ghostfolio plugin runs a reconcile loop.300Not built
D-64How the Ghostfolio plugin syncs, given how Ghostfolio behaves:400Not built
D-6OpenFief’s public API is read-only REST/JSON with an OpenAPI spec, versioned /v1, covering accounts, transactions, tax lots, holdings and …413Partly built
D-50The read API (D-6) is defined in protobuf with HTTP annotations, like the plugin contracts (D-11).111Built and tested
D-30The built-in UI draws two charts in M0: allocation (by asset class, currency, broker or sleeve) and value over time, which starts at …212Partly built

3.2 Getting data in#

DecisionSummaryRequirementsBuiltTestedStatus
D-7Reading of GR-3: connectors get data from each institution by whatever works (a broker API where one exists, files or other means …111Built and tested
D-8The core project ships only connectors that comply with the institution’s terms.100Not built
D-9M0 data paths: XTB through uploaded xStation export files; treasury bonds through manual lot entry (series, quantity, purchase date) with …312Partly built
D-22Prices come from a market-data connector plugin where the user brings the API key (D-51); IBKR Flex prices serve as a cross-check.200Not built
D-51The first market-data connector uses EODHD.100Not built
D-23Accounts are seeded from each broker’s current lot-level positions (opening lots), with transactions from go-live.222Built and tested
D-24XTB in M0 covers real stocks and ETFs only.300Not built

3.3 Ledger and valuation#

DecisionSummaryRequirementsBuiltTestedStatus
D-18The source of truth is an append-only, versioned transaction log.555Built and tested
D-19Double-entry postings across cash, position, fee, withholding-tax and FX accounts.111Built and tested
D-20Every amount keeps its original currency.434Partly built
D-62Totals, charts and the model comparison are shown in the reporting currency: a setting whose default comes from the jurisdiction pack, PLN …100Not built
D-21Prices are end of day in M0.111Built and tested
D-25Which bond value counts in totals is configurable; the default is net-if-redeemed-today (after the early-redemption fee and Belka tax, no …222Built and tested
D-33Besides D-19’s accounts, each account has an equity ledger account per currency: the counterpart for deposits, withdrawals and opening lots.222Built and tested
D-34Selling part of a lot rounds the consumed cost to two decimal places, half-even, and the lot keeps the exact remainder, so consumed plus …333Built and tested
D-35An instrument needs an ISIN with a valid check digit plus a venue symbol.222Built and tested
D-36Valuations are stored rows derived from the transaction log, prices, FX rates and index readings, and can be rebuilt from them at any time.1099Partly built
D-37Where a treasury bond’s issue letter and the issuer’s published daily interest tables or worked examples disagree, OpenFief follows the …333Built and tested

3.4 Model portfolio#

DecisionSummaryRequirementsBuiltTestedStatus
D-52The model portfolio is optional and off by default; while it is off, it appears nowhere in the UI or the read API.200Not built
D-53The model’s performance is a backtest: its value is computed from end-of-day prices as far back as every target has data, rebalanced to the …200Not built
D-54M0 shows the historical max drawdown of the model and of each target: the worst fall from a peak to a later trough over its whole history, …100Not built
D-61Next to the model, the portfolio’s line is its time-weighted return: daily returns from valuations, chained across deposits and …100Not built

3.5 Runtime and plugins#

DecisionSummaryRequirementsBuiltTestedStatus
D-10OpenFief is Kubernetes-oriented: it is built for, and deployed on, Kubernetes.000No requirement in kibi
D-11The core is written in Go.313Partly built
D-12Any conformant Kubernetes cluster; no reference platform.000No requirement in kibi
D-13An operator manages plugins through a Plugin custom resource, from M0.111Built and tested
D-55The operator manages plugin workloads only and never touches money.100Not built
D-14PostgreSQL via CloudNativePG, and no NATS in M0.000No requirement in kibi
D-15The operator is namespace-scoped: a Role in the openfief namespace only.111Built and tested
D-16Plugin permissions are split into the Plugin resource (what the vendor requests) and a PluginGrant (what the user approved).333Built and tested
D-17Plugin images must be pinned by digest, and their signatures are verified with cosign.111Built and tested
D-32Plugin egress goes through an egress proxy built on Stripe’s Smokescreen, embedded as a Go library.555Built and tested
D-63The egress proxy embeds Smokescreen through BuildProxy inside OpenFief’s own HTTP server; StartWithConfig would exit the process on …222Built and tested

3.6 Plugin distribution and installation#

DecisionSummaryRequirementsBuiltTestedStatus
D-42A plugin’s manifest is embedded in its image, as a label on the image config.111Built and tested
D-43One catalog, a file in this repository released with the product, lists the first-party and verified plugins.211Partly built
D-44A verified plugin is one whose version the author reviewed: its catalog entry pins the publisher’s signed image digest and the publisher’s …111Built and tested
D-45The operator trusts three kinds of signer: OpenFief’s CI, the publishers pinned in the catalog, and signers the owner adds.111Built and tested
D-46Plugins are installed with the openfief CLI.200Not built
D-47Plugin upgrades are always manual, even when the permissions are unchanged.100Not built
D-48Each install is a separately named instance with its own config, secrets, grant and egress allow-list.111Built and tested
D-49The core calls connectors: a connector serves a Connect service for syncing and for importing files, and the core owns the schedules, …333Built and tested
D-56The operator verifies every plugin image’s signature itself before deploying it, so a Plugin applied through GitOps or plain kubectl …222Built and tested
D-57An image without a valid signature from a trusted signer is never deployed, and there is no override.111Built and tested
D-58Uninstalling an instance deletes its workload, grant, secrets and egress allow-list.101Not built

3.7 Security: tracking and imports#

DecisionSummaryRequirementsBuiltTestedStatus
D-26People log in with passkeys (WebAuthn), built in.200Not built
D-27Plugins authenticate to the core with projected ServiceAccount tokens (audience openfief-core).222Built and tested
D-59Only the core may call a plugin.111Built and tested
D-28OpenFief ships no Ingress and no tunnel.301Not built
D-60OpenFief installs with no hostname.200Not built
D-29Credentials are Kubernetes Secrets, fed by whatever the user already runs (External Secrets Operator, Vault, SOPS and so on).222Built and tested

Other requirements#

Requirements that come from the development rules or from agents’ own modeling rather than from one decision, grouped by the area in their ID.

AreaRequirementsBuiltTested
AUTO622
connector111
core666
demo777
docs644
ibkrflex666
identity555
ingest161616
kernel555
ledger282828
operator101010
pl777
plugins333233
portfolio666
sdk777
tooling221721
valuation222222
views121112

Generated from the repository at build time; it cannot go stale.